我在调试一个程序有错误,请指点!procedure TF_main.Add_record(person_id:String);
var
  counter:Integer;
  yearmonth:String;
begin
  if i_fixed.Checked then
    yearmonth:='0000000'
  else
    yearmonth:=i_yearmonth.Text;
  //获取计数
  with DM_main.T_counter do
  begin
    Close;
    Filter:='ID=''R''';
    Open;
    counter:=FieldValues['COUNTER_VALUE'];
    Inc(counter);
    Edit;
    FieldValues['COUNTER_VALUE']:=counter;
    Post;
    Close;
  end;
  with DM_main.Q_add_salary_other do
  begin
    Close;
    Params[0].Value:=counter;
    Params[1].Value:=yearmonth;
    Params[2].Value:=person_id;
    Params[3].Value:=IntToStr(i_type.ItemIndex);
    Params[4].Value:=i_name.Text;
    Params[5].Value:=i_money.Value;
    Params[6].Value:=i_description.Text;
 错误2   ExecSQL;
  end;
end;procedure TF_main.B_add_personClick(Sender: TObject);
begin
  if DM_main.Database.Connected
    and (Length(i_name.Text)>0)
    and (Length(i_person_name.Text)>0) then
  begin
    Add_record(i_person_id.Text);
    With DM_main do
    begin
      T_salary_1.Refresh;
      T_salary_2.Refresh;
      T_salary_3.Refresh;
      T_salary_4.Refresh;
    end;
  end;
end;procedure TF_main.B_add_listClick(Sender: TObject);
var
  i,n:integer;
begin
  With DM_main do
  begin
    if Database.Connected
      and Q_person_list.Active then
    begin
      With Q_person_list do
      begin
        n:=RecordCount;
        Gauge1.Progress:=0;
        i:=0;
        First;
        while not Eof do
        begin
          Add_record(FieldValues['ID']);
   错误1      Next;
          Inc(i);
          Gauge1.Progress:=(100*i) div n;
        end;
      end;
      T_salary_1.Refresh;
      T_salary_2.Refresh;
      T_salary_3.Refresh;
   错误3   T_salary_4.Refresh;
    end;
  end;
end;procedure TF_main.M_statClick(Sender: TObject);
var
  MyInifile:Tinifile;
  Rate_overtime, Money_errand, Money_late, Money_absent:Integer;
  i,n:Integer;
  counter:Integer;
  yearmonth,person,add_detail,sub_detail:String;
  basic, bonus, add_total, sub_total, total, temp:Single;
begin
  //读取参数
  MyInifile:=Tinifile.Create(ExtractFilePath(Paramstr(0))+'formula.ini');
  Rate_overtime:=MyInifile.ReadInteger('Formula', 'OverTime', 150);
  Money_errand:=MyInifile.ReadInteger('Formula', 'Errand', 100);
  Money_late:=MyInifile.ReadInteger('Formula', 'Late', 10);
  Money_absent:=MyInifile.ReadInteger('Formula', 'Absent', 50);
  yearmonth:=i_yearmonth.Text;
  With DM_main do
  begin
    //获取员工列表
    with Q_person_list_all do
    begin
      Open;
      n:=RecordCount;
      i:=0;
      Gauge1.Progress:=0;
      First;
      while not Eof do
      begin
      //统计员工工资
        person:=FieldValues['ID'];
        add_detail:='';
        sub_detail:='';
        basic:=0;
        bonus:=0;
        add_total:=0;
        sub_total:=0;
        total:=0;
        //基本工资
        with Q_salary_base do
        begin
          Close;
          Params.ParamValues['PERSON']:=person;
          Open;
          basic:=FieldValues['SALARY'];
          Close;
        end;
        //获取员工出勤记录,计算相关工资额
        with Q_attendance_stat do
        begin
          Close;
          Params.ParamValues['PERSON']:=person;
          Params.ParamValues['YEARMONTH']:=yearmonth;
          Open;
          basic:=basic*FieldValues['WORK_HOUR'];
          temp:=basic*FieldValues['OVER_HOUR']*Rate_overtime/100;
          if temp>0 then
          begin
            add_total:=add_total+temp;
            add_detail:='加班费:'+FloatToStrF(temp, ffFixed, 5, 1)+';';
          end;
          temp:=Money_errand*FieldValues['ERRAND_HDAY'];
          if temp>0 then
          begin
            add_total:=add_total+temp;
            add_detail:='差旅费:'+FloatToStrF(temp, ffFixed, 5, 1)+';';
          end;
          temp:=Money_late*(FieldValues['LATE_TIMES']+FieldValues['EARLY_TIMES'])
               +Money_absent*FieldValues['ABSENT_TIMES'];
          if temp>0 then
          begin
            sub_total:=sub_total+temp;
            sub_detail:='误工费:'+FloatToStrF(temp, ffFixed, 5, 1)+';';
          end;
          Close;
        end;
        With Q_salary_other do
        begin
          //统计奖金记录
          Close;
          Params.ParamValues['YEARMONTH']:=yearmonth;
          Params.ParamValues['PERSON']:=person;
          Params.ParamValues['TYPE']:='0';
          Open;
          First;
          while not Eof do
          begin
            bonus:=bonus+FieldValues['MONEY'];
            Next;
          end;
          //统计福利记录
          Close;
          Params.ParamValues['TYPE']:='1';
          Open;
          First;
          while not Eof do
          begin
            temp:=FieldValues['MONEY'];
            add_total:=add_total+temp;
            add_detail:=add_detail+FieldValues['NAME']+':'
                        +FloatToStrF(temp, ffFixed, 5, 1)+';';
            Next;
          end;
          //统计津贴记录
          Close;
          Params.ParamValues['TYPE']:='2';
          Open;
          First;
          while not Eof do
          begin
            temp:=FieldValues['MONEY'];
            add_total:=add_total+temp;
            add_detail:=add_detail+FieldValues['NAME']+':'
                        +FloatToStrF(temp, ffFixed, 5, 1)+';';
            Next;
          end;
           //统计扣发记录
          Close;
          Params.ParamValues['TYPE']:='3';
          Open;
          First;
          while not Eof do
          begin
            temp:=FieldValues['MONEY'];
            sub_total:=sub_total+temp;
            sub_detail:=sub_detail+FieldValues['NAME']+':'
                        +FloatToStrF(temp, ffFixed, 5, 1)+';';
            Next;
          end;
          Close;
        end;
        total:=basic+bonus+add_total-sub_total;
        if total<0 then total:=0;
        //插入工资记录
        with T_add_salary do
        begin
          Close;
          Filter:='YEARMONTH='''+yearmonth+''' AND PERSON='''
                 +person+'''';
          Filtered:=True;
          Open;
          if RecordCount=0 then
          begin
            //获取计数
            with T_counter do
            begin
              Close;
              Filter:='ID=''Y''';
              Open;
              counter:=FieldValues['COUNTER_VALUE'];
              Inc(counter);
              Edit;
              FieldValues['COUNTER_VALUE']:=counter;
              Post;
              Close;
            end;
            AppendRecord([counter, yearmonth, person, basic, bonus,
                add_detail, add_total, sub_detail, sub_total, total]);
          end
          else
          begin
            Edit;
            FieldValues['BASIC']:=basic;
            FieldValues['BONUS']:=bonus;
            FieldValues['ADD_DETAIL']:=add_detail;
            FieldValues['ADD_TOTAL']:=add_total;
            FieldValues['SUB_DETAIL']:=sub_detail;
            FieldValues['SUB_TOTAL']:=sub_total;
            FieldValues['TOTAL']:=total;
            Post;
          end;
          Close;
        end;
        Inc(i);
        Gauge1.Progress:=(100*i) div n;
        Next;
      end;//下一个员工
    end;
  end;
end;procedure TF_main.DBGrid1DblClick(Sender: TObject);
begin
  if DM_main.Q_person_list.Active then
    i_person_id.Text:=DM_main.Q_person_list['ID'];
end;procedure TF_main.i_yearmonthChange(Sender: TObject);
begin
  try
    if DM_main.Database.Connected then
    begin
      F_report.PHeader.Caption:=i_yearmonth.Text+'月度工资报表';
      DM_main.Q_salary_list.Close;
      DM_main.Q_salary_list.Params.ParamValues['YEARMONTH']:=i_yearmonth.Text;
      DM_main.Q_salary_list.Open;
    end;
  except
    //
  end;
end;end.错误提示:invaild variant type conversion

解决方案 »

  1.   

    很简单,这是Query不知道你数据的类型,只要在Query中知道每个字段的数据类型就行了
      

  2.   

    对不起,刚才打错字了。只要在Query中设定每个字段的数据类型就行了
      

  3.   

    Query中的SQL有问题吧  带参数的SQL语句有问题
    我现在闲着没有事干,把项目跟数据库发过来 我帮你调  要重分相谢
    [email protected]/[email protected]
      

  4.   

    参数类型不一致也可能产生错误  我觉得在带参数的SQL语句中有问题哦
    query1.SQL.Clear ;
    query1.SQL.Add('select * from parts where partno>=:edit1');
    query1.SQL.Add (' and partno <=:edit2');
    query1.Params[0].Value :=strtoint(edit1.Text) ;
    query1.Params[1].Value :=strtoint(edit2.Text) ;
    query1.Open;
      

  5.   

    我也感觉是带参的SQL语句有问题,但我不知道怎么该。
    你能够详细具体的帮我改一下吗?分数不是问题!谢谢!
      

  6.   

    我是一名学生,在做论文。我参照的例子是
    人民邮电大学出版社的《Delphi 6数据库系统开发实例导航》的第七章的工资管理系统
    要是你还是没发调你可以到书店看看这本书,OK!谢谢了。