如何手动执行“OnCalcFields”事件?

时间:2011-05-26 10:21:35

标签: delphi tclientdataset

假设我暂时想要在TClientDataSet上执行耗时的操作期间禁用OnCalcFields事件(例如,通过设置cdsCalcFields := nil)。当我重新附加OnCalcFields方法时,如何告诉TClientDataSet重新计算计算字段?

可能需要手动重新计算的另一种情况是某些计算字段取决于其他数据集的情况(例如,计算字段用于临时保存来自其他数据集的某些聚合值)。这在大多数情况下都可以正常工作,因为OnCalcFields事件的执行频率足以从其他数据集中获取正确的值。但在某些情况下,需要重新计算才能从其他数据集中获取正确的值。

AutoCalcFields属性设置为False也可能会让您进入需要手动重新计算的情况。

我已经看到了关于如何减少OnCalcFields事件执行的几个解释,但我找不到一种简单的方法来执行重新计算......

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

计算字段是在从数据库中检索记录时计算的,因此请在数据集上调用Refresh(或关闭 - >打开)以强制重新计算。

(关于该问题的评论),要强制仅对一条记录进行重新计算,您可以在数据集上调用RefreshRecord。如果特定数据集后代未实现该方法,则Edit后跟Cancel调用将实现相同的目标。

答案 1 :(得分:2)

调用刷新或关闭 - >可以导致整个表从数据库重新加载。如果这不是您想要的东西,您只需调用OnCalc方法就可以将自己传递给CDS。虽然您可能需要手动滑动光标。

with DisplayAcctListCDS do begin
  First;
  while not Eof do begin
    Edit;
    DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
    Next;
  end;
end;

假设DisplayAcctListCDS是带有计算字段的TClientDataSet,而DisplayAcctListCDSCalcFields是OnCalcFields生成的事件方法。

答案 2 :(得分:0)

这有点像黑客,但对我来说这个问题的回答是100%!

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