如何强制客户端数据集重新计算计算和内部计算字段?

时间:2013-07-28 10:55:15

标签: delphi delphi-xe2 tclientdataset

我有ClientDatSetfkInternalCalc个字段。 CDS与任何提供商均无关联;而是它在飞行中填充。如何强制CDS重新计算所有“可计算”字段?我无法调用Refresh(),因为没有提供程序可以刷新数据。到目前为止,我唯一的方法是浏览所有记录,这不是最佳方式。

PS:我已阅读this questionthis post,但我希望能有更优雅的方式。

2 个答案:

答案 0 :(得分:8)

我用帮助(在这里剥离必要的)来实现这一点,这允许在没有任何黑客攻击的情况下调用受保护的方法。确保在OnCalcFields中为fkInternalCalc字段检查DataSet.State = dsInternalCalc

type
  TClientDataSetHelper = class helper for TClientDataSet
  public
    function AssureEditing: Boolean;
    procedure InternalCalc;
  end;

function TClientDataSetHelper.AssureEditing: Boolean;
begin
  result := not (State in [dsEdit, dsInsert]);
  if result then
    Edit;
end;

procedure TClientDataSetHelper.InternalCalc;
var
  needsPost: Boolean;
  saveState: TDataSetState;
begin
  needsPost := AssureEditing;
  saveState := setTempState(dsInternalCalc);
  try
    RefreshInternalCalcFields(ActiveBuffer);
  finally
    RestoreState(saveState);
  end;
  if needsPost then
    Post;
end;

使用CalculateFields可以轻松扩展常规计算字段。虽然这不是必需的,因为只要任何其他数据字段发生变化,就会重新计算计算字段。

答案 1 :(得分:-1)

这有点像黑客,但它有效!

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)