DBGridEh1里某行的“应收余额”=上一行的“应收余额”+本行的“应收增加”-本行的“应收减少”
procedure TFormWldz.DBGridEh1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
var
  i:integer;
begin
  for i:=0 to (Sender as TDBGridEh).Columns.Count-1 do
  begin
    (Sender as TDBGridEh).Columns[6].FieldName:=floattostr(strtofloat(ADOQuery1.FieldByName('je').AsString)-strtofloat(ADOQuery1.FieldByName('je2').AsString));
  end;
end;这样写没有提示错误,但也没有结果出来啊,我知道写错了,因为这样写 也没有取上一行的值。 

解决方案 »

  1.   

    要知道DBGridEh1DrawColumnCell此事件是何时触发的,不要从DataSet里读值那样不对,可以从GIRD的结点里读取处理
      

  2.   

    (Sender as TDBGridEh).Columns[6].FieldName
    你把结果赋值给FieldName干嘛?FieldName只是相应的DataSet里面的字段。
      

  3.   

    當前行數-1就是上一行的值啊。。dbgrideh移动记录的时候不会牵动后台数据集指针的。 
    所以你要获取某个字段的value的话可以直接通过 
    ColumnXX.EditValue来获取 
    如果你要循环所有dbgrideh内容那么可以通过 
    DataController对象来进行循环。 
      

  4.   

    用SQL吧  看看这个贴子,里边有这个思想的
    http://topic.csdn.net/u/20100925/09/7040b0ed-5aed-4d60-9b0c-42bb4b63b1dc.html
      

  5.   

    程序里每次都处理效率不高,而SQL里处理后好点,
    谁能帮我写个SQL函数处理呢?
      

  6.   

    用临时表计算,再绑定DBGridEh1
      

  7.   

    这种类似的问题我做过,是先用sql写好了,在往dbgrid里添加的
      

  8.   

    最简单的是用SQL触发器来处理,程序只管显示数据集就行了,不要什么都让程序来计算
      

  9.   

       用ADO的 ltBatchOptimistic方式 , 或使用内存表(如TClientDataSet), 取用SQL回数据后,遍历一次数据集,自行更改所需要的字段.这样也很快的, 用SQL处理也可以,只是服务器负荷就大了.这种计算放客户端计算好些.
      

  10.   

    Columns[6].FieldName ?有问题。
    你的应收余额列是什么列,普通列与数据库字段关联的话,在修改之前需要将adoquery转入edit状态。