with Query1 do 
   begin
     Close;
     SQL.Clear;
     SQL.Add('select b.item_code, b.spec, b.thick, b.width, b.weight, .cif_pric ');
     SQL.Add(' , b.cuff_sect, a.change_rate, b.duty_mony from ptet004 a, ptet005 b ');
     SQL.Add(' where a.invo_date between :from_date and :to_date ');
     SQL.Add(' and a.invo_no = b.invo_no ');
     sql.add(' order by 1,2,3,4 ');
     Parambyname('from_date').Asdate := g_from;
     Parambyname('to_date').Asdate := g_to;
     Open;
     ProgressBar1.Max := Recordcount;
     First;
     while not eof do
      begin
        m_amount := 0.00;
        Query3.Close;
        Query3.ParamByName('gubn').Asstring := '1';
        Query3.ParamByName('fin_yymm').Asstring := MaskEdit1.Text;
        Query3.ParamByName('fin_gubn').Asstring := '11';
        Query3.ParamByName('fin_kind').Asstring := fieldbyname('item_code').Asstring;
        Query3.ParamByName('spec').Asstring := fieldbyname('spec').Asstring;
        Query3.ParamByName('thick').Asfloat := fieldbyname('thick').Asfloat;
        Query3.ParamByName('width').Asfloat := fieldbyname('width').Asfloat;
        Query3.Open;
        if Query3.RecordCount <> 1 then
           begin
             Query3.Append;
             Query3gubn.Value := '1';
             Query3fin_yymm.Value := MaskEdit1.Text;
             Query3fin_gubn.Value := '11';
             Query3fin_kind.Value := fieldbyname('item_code').Asstring;
             Query3spec.Value := fieldbyname('spec').Asstring;
             Query3thick.Value := fieldbyname('thick').Asfloat;
             Query3width.Value := fieldbyname('width').Asfloat;
             Query3weight.Value := fieldbyname('weight').Asinteger;
             if fieldbyname('cuff_sect').Asstring = 'D' then
                begin
                  Query3amount.Value  := strtofloat(formatfloat('########0.00',
                                (fieldbyname('cif_pric').Asfloat
                               * fieldbyname('change_rate').Asfloat)));                  Query3amount.Value  :=  Query3amount.Value + fieldbyname('duty_mony').Asfloat;
                end
             else
                Query3amount.Value  := fieldbyname('cif_pric').Asfloat + fieldbyname('duty_mony').Asfloat;             Query3price.Value := strtofloat(formatfloat('#####0.00',(Query3amount.Value
                   / Query3weight.Value)));
             Query3in_date.Value := date;
             Query3in_user.Value := ParamStr(1);
             Query3.Post;
           end
        else
           begin
             Query3.Edit;
             Query3weight.Value := Query3weight.Value + fieldbyname('weight').Asinteger;
             if fieldbyname('cuff_sect').Asstring = 'D' then
                begin
                  Query3amount.Value := Query3amount.Value +
                                 strtofloat(formatfloat('########0.00',
                                (fieldbyname('cif_pric').Asfloat
                               * fieldbyname('change_rate').Asfloat)+
                                 fieldbyname('duty_mony').Asfloat));
                end
             else
                Query3amount.Value := Query3amount.Value +
                    fieldbyname('cif_pric').Asfloat + fieldbyname('duty_mony').Asfloat;
             Query3price.Value := strtofloat(formatfloat('#####0.00',(Query3amount.Value
                   / Query3weight.Value)));
             Query3.Post;
           end;
        ProgressBar1.StepBy(1);
        Next;
      end;
   end;
这段程序向query3中插入纪录时总出现唯一索引重复插不进去,可是通过检查query1中的纪录没有数据问题(用pb和sql测试) ,作为条件在query3中检索的条件列为query3的唯一索引。
实际情况应为query1中的第五行在插入到query3时应该检索到一条唯一索引相同的纪录,应该recordcount = 1 的情况(else),将相关数值累加更新query3中现有纪录,可是现在检索不到query3中的这条纪录,执行了 recordcount <> 1 的情况,这时就发生了唯一索引重复的错误。不知小妹说清楚了没有,情况紧急还请大侠们帮忙!!!

解决方案 »

  1.   

    query3的索引列是哪个字段?是什么数据库?
      

  2.   

    Query3.ParamByName('gubn').Asstring := '1';
            Query3.ParamByName('fin_yymm').Asstring := MaskEdit1.Text;
            Query3.ParamByName('fin_gubn').Asstring := '11';
            Query3.ParamByName('fin_kind').Asstring := fieldbyname'item_code').Asstring;
            Query3.ParamByName('spec').Asstring := fieldbyname('spec').Asstring;
            Query3.ParamByName('thick').Asfloat := fieldbyname('thick').Asfloat;
            Query3.ParamByName('width').Asfloat := fieldbyname('width').Asfloat;是这些字段,是informix数据库
      

  3.   

    InforMix有没有事件监视器,跟踪程序都执行了那些Sql语句的工具啊?
    有的话把跟踪到的Sql语句查询一下,看看有什么问题?
      

  4.   

    我刚刚接手,对informix的调试环境还不太熟
      

  5.   

    query3的sql语句:select * from ptft401 where gubn = :gubn
     and fin_yymm = :fin_yymm and fin_gubn = :fin_gubn
     and fin_kind = :fin_kind and spec = :spec
     and thick = :thick and width = :width
      

  6.   

    奇怪呀奇怪
    还是把Query3的Sql语句帖出来看看吧。这东西难说清楚,要是在场的话就很容易搞定了。
      

  7.   

    sql语句在上边,已经贴出来了
      

  8.   

    或者是delphi本身的dbe问题呢?
      

  9.   

    有可能是数据库本身的问题,要是那样就郁闷啦,InforMix不熟
      

  10.   

    delphi本身的dbe问题呢?可能性不大,D6装了update 2应该就没问题了。
      

  11.   

    晕啊,这年头了还玩D4,那D4也有update包啊,装上试试吧。
      

  12.   

    有人说尽量不用recordcount,说效率不高,会不会是这个原因读不出记录呢?
      

  13.   

    recordcount没有关系。
    什么破老板嘛,炒了呀的。
      

  14.   

    会不会是ptft401表里面的数据有的是有些特殊字符的?
      

  15.   

    没有都是非常正规的,奇怪的是用pb和sql实现(新建表)没有问题
      

  16.   

    Query3.RecordCount可能总是返回-1
      

  17.   

    那就用 if Query3.fieldByName('fin_gubn').Asstring='' then
      

  18.   

    找到了根源,并不是插入的问题,而是检索不出库中要找的那条记录,才造成插入重复的错误,问题在于检索不出库中的记录。但是用pb作没有问题,会不会是delphi环境的问题?
      

  19.   


    检索不出?!这不可能吧?这应该与“delphi环境的问题”无关!!!总之,研究!!!!!!
      

  20.   

    我把检索条件一个一个的执行发现到 thick 字段时检索就出来了,他在库中的类型是decimal(5,2),而delphi中只能用asfloat对应,是不是这个地方出了问题