如何通过 ZeosLib 找出 delphi 6 TZTable 中更改了哪个字段

How to find out which field was changed in a delphi 6 TZTable via ZeosLib

我有一个绑定到 DBGrid 的 TZTable (ZEOSlib),现在我需要知道用户更改了哪个特定的 TField。

我试过

if NOT (taPositionenArtNrGH.NewValue = taPositionenArtNrGH.OldValue) then
    ShowMessage('ArticleNumber changed');

我把代码放在了

但在调试器中,旧值始终是新值。如何检查更改了哪个字段?

根据documentation

The NewValue property is only usable when the data is accessed using a TClientDataSet component or cached updates is enabled.

您可以为此使用 UpdateStatus : TUpdateStatus。例如:

  1. 将 ZTable.CachedUpdates 设为真;
  2. 创建名为 "Status" 的新计算字段。
  3. 要显示字段 "FNAME" 示例的旧值,请创建名为 "FNameOldValue"
  4. 的新计算字段
  5. 在 OnCalcFields 事件中使用:

    procedure TDM1.ZTable1CalcFields(DataSet: TDataSet);
    begin
      if ZTable1.UpdateStatus in [usModified] then
        begin
          ZTable1Status.value := 'Modified';
          ZTable1FNameOldValue.value := ZTable1FNAME.OldValue;
        end
      else
        ZTable1Status.value := 'UnModified'
    end;
    

结果:

编辑:

您可以检测字段级别的变化,例如:

if ZTable1.UpdateStatus in [usModified] then
  begin
    for I := 0 to ZTable1.Fields.Count - 1 do
      begin
        if ZTable1.Fields[i].OldValue <> ZTable1.Fields[i].NewValue  then
          -- do something with this field
      end;
   end; 

如果你只是想知道哪些字段被更改了,为什么不使用 TField.OnChange 事件呢?您可以在此事件中填写字段名称列表,并在 OnAfterPost 中将其清除。但是 Modified 属性 确实非常有用;奇怪的是还没有实现。