//2.按统计分类计算明细费用 
    with ADOQuery_RbdmxBzcz do 
    begin 
      Close; 
      SQL.Clear; 
      SQL.Add('Select * from Sf_RbdMxBZCZT where 0>1'); 
      Open; 
    end; 
    with TADOQuery.Create(nil) do 
    try 
      Connection := ADOConnection_Zhsf; 
      Close; 
   //这段就是一个sql查询,大家可以不必要看 
      Sql.Clear; 
      Sql.Add('Select left(mx.XmDm,1) XmDm, '); 
      if Param_sf_410 then //410-按收入所属科室/分片进行结帐(1-是) 
        Sql.Add(' Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc TjXmMc, ') 
      else 
        Sql.Add(' Mx.TjXmMc TjXmMc, '); 
      Sql.Add('  Coalesce(Mx.BZ_CZ, ''0'') BZ_CZ, Coalesce(sf.Bz_FkFs, ''0'') bz_Fkfs,'); 
      Sql.Add('  Sum(Coalesce(Mx.Je,0)) Je '); 
      Sql.Add('From Sf_ShoufeiInfomx Mx '); 
      Sql.Add(' Left Join Sf_ShoufeiInfo Sf On (Mx.Sfid=Sf.Sfid) '); 
      Sql.Add('Where Sf.Bz_Sf = ''1'' and Sf.Bz_jz = ''0'' '); 
      Sql.Add(Format(' and Sf.Sfrq Between ''%s'' and ''%s''', [mDate1, mDate2])); 
      Sql.Add(Format(' and Sf.Sfrdm=''%s''', [p_RyDm])); 
      if vStrfkfs <>'-' then 
        SQl.Add(Format(' and sf.BZ_fkfs =''%s''', [vStrfkfs])); 
      if vWorkMode='1' then//非正常模式 
        SQl.Add(' and ((sf.sflb=''1'' and sf.BZ_Mode =''1'') or sf.sflb <>''1'')') 
      else 
        SQl.Add(' and (sf.Bz_Mode is null or sf.BZ_Mode=''0'')'); 
      SQl.Add('Group By Coalesce(Mx.BZ_CZ, ''0''), Coalesce(sf.Bz_FkFs, ''0''), left(mx.XmDm,1), '); 
      if Param_sf_410 then //410-按收入所属科室/分片进行结帐(1-是) 
      begin 
        SQl.Add('  Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc '); 
        SQl.Add('order by Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc, left(mx.XmDm,1), Coalesce(Mx.BZ_CZ, ''0'')'); 
      end else 
      begin 
        SQl.Add('  Mx.TjXmMc '); 
        SQl.Add('order by left(mx.XmDm,1), mx.TjXmMc, Coalesce(Mx.BZ_CZ, ''0'')'); 
      end;       Open; 
      First; 
      while not Eof do//你之前从数据库中检索出来了若干条记录,保存在数据集中,Eof指的是数据集的最后 
      begin 
     //这个if是不是从上面的sql中查询出的je字段不为空时,执行下面的语句 
        if FieldByName('Je').AsFloat <> 0 then//这句吗?这是delphi中去的数据集中记录的方式,取的就是数据集中当前记录的值,AsFloat就是说取出的值是Float类型的,比如说,如果你想把数据集中的记录一条一条的取出来,就可以用一个循环,从数据集的第一条开始到最后一条,      
     begin 
     //这句看不太懂。我知道这是从Select * from Sf_RbdMxBZCZT where 0>1中的Sf_RbdMxBZCZT表里查询TjXmMc字段值与上面那段sql查询出来的TjXmMc里的值作比较,当不相等时就执行下面的语句。就添加,否则就是修改,可是ADOQuery_RbdmxBzcz不是一个结果集吗?奇怪用if. 
          if not ADOQuery_RbdmxBzcz.Locate('TjXmMc', FieldByName('TjXmMc').AsString, []) then 
          begin 
            ADOQuery_RbdmxBzcz.Append; 
            ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm; 
            ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId; 
            ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1; 
            ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString; 
            ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString; 
            ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString; 
          end else 
            ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是          //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额 
          ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat := 
            ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat; 
          if FieldByName('BZ_FkFs').AsString = '1' then//支票 
          begin 
            mZpje := mZpje + FieldByName('Je').AsFloat; 
            ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat := 
              ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat; 
          end else 
          begin 
            mXjje := mXjje + FieldByName('Je').AsFloat; 
            ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat := 
              ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat; 
          end; 
          ADOQuery_RbdmxBzcz.Post; 
        end; 
        Next; 
      end; 
      mZje := mXjje + mZpJe;//总金额=现金金额+支票金额 
    finally 
      Free; 
    end; 

解决方案 »

  1.   

              if not ADOQuery_RbdmxBzcz.Locate('TjXmMc', FieldByName('TjXmMc').AsString, []) then 
              begin 
                ADOQuery_RbdmxBzcz.Append; 
                ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm; 
                ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId; 
                ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1; 
                ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString; 
                ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString; 
                ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString; 
              end else 
                ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是           //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额 
              ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat := 
                ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat; 
              if FieldByName('BZ_FkFs').AsString = '1' then//支票 
              begin 
                mZpje := mZpje + FieldByName('Je').AsFloat; 
                ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat := 
                  ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat; 
              end else 
              begin 
                mXjje := mXjje + FieldByName('Je').AsFloat; 
                ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat := 
                  ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat; 
              end; 
              ADOQuery_RbdmxBzcz.Post; 
            end; 
            Next; 
          end; 
          mZje := mXjje + mZpJe;//总金额=现金金额+支票金额 
        finally 
          Free; 
        end; 
    我搞不懂了.如果ADOQuery_RbdmxBzcz.Post之前的是修改,那
          if not ADOQuery_RbdmxBzcz.Locate('TjXmMc', FieldByName('TjXmMc').AsString, []) then 
              begin 
                ADOQuery_RbdmxBzcz.Append; 
                ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm; 
                ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId; 
                ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1; 
                ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString; 
                ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString; 
                ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString; 
    上面这段也是修改?不是添加一条新的记录吗?下面的else就只包含ADOQuery_RbdmxBzcz.Edit;这一句话,还是包含了直到ADOQuery_RbdmxBzcz.Post;end;这里结束? 
              end else 
                ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是           //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额 
              ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat := 
                ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat; 
              if FieldByName('BZ_FkFs').AsString = '1' then//支票 
              begin 
                mZpje := mZpje + FieldByName('Je').AsFloat; 
                ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat := 
                  ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat; 
              end else 
              begin 
                mXjje := mXjje + FieldByName('Je').AsFloat; 
                ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat := 
                  ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat; 
              end; 
              ADOQuery_RbdmxBzcz.Post; 
            end; 
            Next; 
          end; 
          mZje := mXjje + mZpJe;//总金额=现金金额+支票金额 
        finally 
          Free; 
        end; 
      

  2.   

    ADOQuery_RbdmxBzcz.Append; 是增加一条记录
    ADOQuery_RbdmxBzcz.Edit;是修改一条记录
    在数据库操作中,增加和修改最终都需要一条ADOQuery_RbdmxBzcz.Post以把修改提交给数据库,我看了一下,那段程序是做了一个判断,符合一种条件就增加一条记录,否则修改当前记录,两个操作公用了一个ADOQuery_RbdmxBzcz.Post,这样些够乱的!
      

  3.   

    总结一下:
    修改操作:
    ADOQuery_RbdmxBzcz.Edit;
    赋值语句,,
    ADOQuery_RbdmxBzcz.Post;插入操作:
    ADOQuery_RbdmxBzcz.Append;
    赋值语句,,
    ADOQuery_RbdmxBzcz.Post;你按这个结构对照一下就清楚了