本帖最后由 drsheldoncooper 于 2010-09-28 10:04:12 编辑

解决方案 »

  1.   

    不太明白你说的。
    如果仅仅是想在更新的时候动态的在Edit中显示金额求和的话,在更新后,用一个adoquery,
    with adoquery do
    begin
      sql.clear;
      sql.text := 'select sum(金额) from table';
      open;
    end;
    if not adoquery.IsEmpty then edit1.text := adoquery.fields.field[0].asstring;
      

  2.   


    我说的更新是指在缓存中更新,但还没有上存到数据库,所以搜索数据库的数据不是我现在dbgrid上的数据。
      

  3.   

    1.可用SQL處理;
    2.用語句去寫它的相關事件...
      

  4.   


    调用SQL语句好象会有2个问题。1、查找的对象,也就是from的问题。更新只是在缓存中更新,如果from 表名,只是数据库中原来的数据,不是现在更新后的数据。2、如果每次更新数据都保存到数据库中,那么每一次修改都要完成 保存数据、重新查询、重新定位记录 的过程,系统开销也很大。
      

  5.   

    記錄未提交前,不能執行遍歷,否則會自動提交。如果你想字段一修改,馬上顯示sum總和,那麼應該在 TField.OnChange事件中寫代碼。FieldSum , //這個值你在數據集 Open 通過遍歷時取得.
    TField.OnChange 事件 :FieldSum := FieldSum + (Field.Value - Field.OldValue) ; 就這樣做就行了。
      

  6.   


    这种方法我也曾经考虑,但Field修改一次按上面的方法计算正确,但第2次修改时,field.oldvalue还是那个field.oldvalue,结果就不正确了,最典型的例子:field.oldvalue是3,2次Field.Value都是4,实际上2次FieldSum应该不变,但按上式计算就改变了。
    现在想来可以设一个数组存放每一条记录的Field.Value,在下次计算中就能作为field.oldvalue使用,但不知道数组元素的序号和记录的序号怎么对应呢?
      

  7.   

    你可以解決這個問題的.只要多想一想
    TField.OnChange 事件 :tempSum := FieldSum + (Field.Value - Field.OldValue) ; 
    Label1.Caption := tempSum ; DataSet.AfterCancel DataSet.AfterPost AfterDelete 事件更新加總值....調試一下,就能得到你想要的所見即所得.