我该如何从 TClientDataset
中获取更改内容?
我有一个名为 GetDataset
的 TClientDataset
,并且我有一个网格。我想将更改内容放入一个新的名为 ChangeDataset
的 TClientDataset
中。
我应该如何实现这个功能?
我该如何从 TClientDataset
中获取更改内容?
我有一个名为 GetDataset
的 TClientDataset
,并且我有一个网格。我想将更改内容放入一个新的名为 ChangeDataset
的 TClientDataset
中。
我应该如何实现这个功能?
如果您有一个源ClientDataSet CDS1,您可以通过执行以下操作将更改的记录复制到第二个ClientDataSet CDS2:
if CDS1.ChangeCount > 0 then
CDS2.Data := CDS1.Delta;
如果您尝试这样做,您会发现它给出了一个“before”记录和一个更改(s)的记录。那可能不是您想要的-坦率地说,您最好阅读Whipple文章中发布的评论和OLH,以获得您可能想要实现的确切结果。重点是,除非您刷新它(通过调用ApplyUpdates() - 在此之后,如果成功,则更改日志为空),否则源CDS中包含您需要的所有信息。
如果您查看CDS2中的行,就不会立即清楚您如何告诉特定字段是否包含更改值以及您如何将其与仅为空的字段区分开来。我记得很久以前Borland NTTP新闻组中有一篇非常好的帖子,由他们的Mark Edington撰写,解释了如何做到这一点。基本上,这是评估字段的NewValue属性上的VarIsClear的问题:
if VarIsClear(CDS2.Fields[i].NewValue) then
// means Fields[i] does not have a changed value
顺带提一下,由于可以将CDS的状态保存为XML格式,因此可以使用XML操作,例如使用DOM解析器(如Windows内置的MSXML.Pas),轻松地完成许多使用TDataSet范例难以实现的事情。