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

时间:2016-01-29 09:27:10

标签: delphi zeos

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

我试过

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

我把代码放在

  • BeforePost,OnUpdateRecord,AfterPost

但是在Debugger中,OldValue始终是NewValue。如何查看哪个字段已更改?

3 个答案:

答案 0 :(得分:2)

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

  1. 将ZTable.CachedUpdates设置为true;
  2. 创建名为“Status”的新计算字段。
  3. 要显示字段“FNAME”的旧值,请创建名为“FNameOldValue”的新计算字段
  4. 在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;
    
  5. 结果:

    enter image description here

    编辑:

    您可以检测字段级别更改,如:

    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; 
    

答案 1 :(得分:1)

根据documentation

  

NewValue属性仅在使用时访问数据时可用   启用了TClientDataSet组件或缓存更新。

答案 2 :(得分:1)

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