最近在做一个小程序,源程序如下:
 // 取单据的明细项目
    with qrysaveKC do
    begin
      Close;
      sql.Clear;
      SQL.Add('SELECT YLBM,YLGG,GRSL FROM yl_rKDJ WHERE DJBH=:DJBH');
      ParamByName('djbh').AsString := qrydh.fieldbyname('djbh').AsString;
      Open;
    end;
//将单据中明细项目的出库数量从库存表中对应减去
    qrysaveKC.First;
    while not qrysaveKC.eof do
    begin
      with qrydjh do
      begin
        Close;
        sql.Add('update YCL_dtkc set kcsl=kcsl-:grsl where YLBM=:bh and YLgg=:gg');
        ParamByName('bh').AsString := qrysaveKC.fieldbyname('YLBM').AsString;
        parambyname('gg').AsString := qrysaveKC.fieldbyname('YLgg').AsString;
        parambyname('GRSL').asfloat := qrysaveKC.fieldbyname('GRSL').AsFloat;
        ExecSQL;
      end;
      qrysaveKC.Next;
    end;
    
现在的问题是如果单据有多条记录的话,总是最后一条记录将对应的库存表中减去两次
比如当前库存中记录为:
名称  规格  数量
A     1     0
B     1     0
当前单据记录为:
名称  规格  数量
A     1     10
B     1     10
执行该源码后库存表记录应该为:
名称  规格  数量
A     1     -10
B     1     -10
但是关键问题是执行该代码后库存表记录成了:
A     1     -10
B     1     -20
我跟踪程序每条明细确实只减了一次,真的郁闷,求各位大侠帮忙!不胜感激!

解决方案 »

  1.   

    // 取单据的明细项目
      with qrysaveKC do
      begin
      Close;
      sql.Clear;
      SQL.Add('SELECT YLBM,YLGG,GRSL FROM yl_rKDJ WHERE DJBH=:DJBH');
      ParamByName('djbh').AsString := qrydh.fieldbyname('djbh').AsString;
      Open;
      end;
    //将单据中明细项目的出库数量从库存表中对应减去
      qrysaveKC.First;
      while not qrysaveKC.eof do
      begin
      with qrydjh do
      begin
      Close;
      sql.Clear;//改为这样看看  
      sql.Add('update YCL_dtkc set kcsl=kcsl-:grsl where YLBM=:bh and YLgg=:gg');
      ParamByName('bh').AsString := qrysaveKC.fieldbyname('YLBM').AsString;
      parambyname('gg').AsString := qrysaveKC.fieldbyname('YLgg').AsString;
      parambyname('GRSL').asfloat := qrysaveKC.fieldbyname('GRSL').AsFloat;
      ExecSQL;
      end;
      qrysaveKC.Next;
      end;
      

  2.   

      qrysaveKC.First;
      while not qrysaveKC.eof do
      begin
      with qrydjh do
      begin
      Close;
      sql.clear;
      sql.Add('update YCL_dtkc set kcsl=kcsl-:grsl where YLBM=:bh and YLgg=:gg');
      ParamByName('bh').AsString := qrysaveKC.fieldbyname('YLBM').AsString;
      parambyname('gg').AsString := qrysaveKC.fieldbyname('YLgg').AsString;
      parambyname('GRSL').asfloat := qrysaveKC.fieldbyname('GRSL').AsFloat;
      ExecSQL;
      end;
      qrysaveKC.Next;
      end;
      

  3.   

    try...
    qrysaveKC.First;
      while not qrysaveKC.eof do
      begin
      with qrydjh do
      begin
      Close;
      sql.clear;//加上這句看看
      sql.Add('update YCL_dtkc set kcsl=kcsl-:grsl where YLBM=:bh and YLgg=:gg');
      ParamByName('bh').AsString := qrysaveKC.fieldbyname('YLBM').AsString;
      parambyname('gg').AsString := qrysaveKC.fieldbyname('YLgg').AsString;
      parambyname('GRSL').asfloat := qrysaveKC.fieldbyname('GRSL').AsFloat;
      ExecSQL;
      end;
      qrysaveKC.Next;
      end;
      

  4.   

    while not qrysaveKC.eof do
      begin
      with qrydjh do
      begin
        Close;
        sql.clear;//加上這句看看
         sql.Add('update YCL_dtkc set kcsl=kcsl-:grsl where YLBM=:bh and YLgg=:gg');
        ParamByName('bh').AsString := qrysaveKC.fieldbyname('YLBM').AsString;
        parambyname('gg').AsString := qrysaveKC.fieldbyname('YLgg').AsString;
        parambyname('GRSL').asfloat := qrysaveKC.fieldbyname('GRSL').AsFloat;
        ExecSQL;
      end;
        Next;
      end;
      

  5.   

    非常感谢,是我自己不细心,确实是少了SQL.CLEAR这句,大脑缺氧了。。呵呵,感谢CSDN上的兄弟,在我遇到问题的时候,总是热心帮助。