我把计算效率的方法放在数据集的AfterOpen 事件后能实现效率计算,但是用dbgrideh本地过滤功能后,合计值能根据过滤条件更新,效率计算则失效了。。我把下面的代码放在数据集的AfterScroll 事件后能根据过滤条件更新效率,但是速度让人难以接受。
请教下达人们有没有更好的实现方法。// 所有数值类型的字段表格Footer自动设定Sum功能
  for i := 0 to dbgDetail.Columns.Count - 1 do    // Iterate
  begin
    if dbgDetail.Columns[i].Visible = False then Continue;    if dbgDetail.Columns[i].Field.DataType in [ ftSmallint, ftInteger, ftWord,
      ftFloat, ftCurrency, ftLargeint] then
    begin
      (dbgDetail.Columns[qryDetail.Fields[i].Index]
        as TDBGridColumnEh).Footer.ValueType := fvtSum;
    end;
    //根据合计值计算效率
    if (i>2) and (dbgDetail.Columns[i-1].FieldName='FACT_HOUR')and (dbgDetail.Columns[i-2].FieldName='PRE_HOUR') then
     begin
       (dbgDetail.Columns[i] as TDBGridColumnEh).Footer.ValueType := fvtStaticText;
       (dbgDetail.Columns[i] as TDBGridColumnEh).Footer.Value :='效率';
       Ffact:=(dbgDetail.Columns[i-1] as TDBGridColumnEh).Footer.SumValue;
       Fper:=(dbgDetail.Columns[i-2] as TDBGridColumnEh).Footer.SumValue;
       if Fper<>0 then
       begin
         (dbgDetail.Columns[i+1] as TDBGridColumnEh).Footer.ValueType := fvtStaticText;
         (dbgDetail.Columns[i+1] as TDBGridColumnEh).Footer.Value :=formatfloat('0.00',100*Ffact/Fper)+'%';
       end;
     end;
  end;