如何将TClientDataset的更改内容传递到另一个TClientDataset?

3

我该如何从 TClientDataset 中获取更改内容?

我有一个名为 GetDatasetTClientDataset,并且我有一个网格。我想将更改内容放入一个新的名为 ChangeDatasetTClientDataset 中。

我应该如何实现这个功能?


您想让ChangeDataset仅包含第一个ClientDataSet中已更改的记录,还是所有记录都包含进去? - MartynA
1个回答

11

如果您有一个源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范例难以实现的事情。


2
来自Eric Whipple的文章http://conferences.embarcadero.com/article/32227#AuditTrail - Sir Rufo
@SirRufo:非常感谢您的引用,非常有用。 - MartynA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接