如何将TClientDataset的更改转换为另一个TClientDataset?

时间:2014-09-05 14:00:11

标签: delphi delphi-xe6 tclientdataset

如何从TClientDataset变更中获取?

我有一个名为TClientDataset的{​​{1}}我有一个网格。我希望更改为名为GetDataset的新TClientDataset

我该怎么做?

1 个答案:

答案 0 :(得分:11)

如果您有源ClientDataSet CDS1,您应该能够通过执行

将更改的记录复制到第二个ClientDataSet CDS2
if CDS1.ChangeCount > 0 then 
  CDS2.Data := CDS1.Delta;

正如您所看到的那样,它会给您一个"之前"记录和一个有变化的记录。这可能不一定是你想要的 - 坦白说,你最好阅读评论和OLH中发布的Whipple文章,以获得你可能希望实现的确切结果。关键是,您需要的所有信息都在源CDS中,直到您将其清除(通过调用ApplyUpdates() - 之后,如果成功,则更改日志为空)。

如果你看一下CDS2中的行,你不知道如何判断一个特定字段是否包含一个已更改的值,以及如何区分一个只有空的一个。很久以前,Istr在他的Mark Terdington的一个Borland NTTP新闻组中有一篇非常好的帖子,我想,解释如何做到这一点。基本上,这是在字段的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范例很麻烦的事情。