Delphi 如何将一个TClientDataset更改为另一个TClientDataset?

Delphi 如何将一个TClientDataset更改为另一个TClientDataset?,delphi,delphi-xe6,tclientdataset,Delphi,Delphi Xe6,Tclientdataset,如何从TClientDataset获取更改 我有一个名为GetDataset的TClientDataset和一个网格。我希望在名为ChangeDataset的新TClientDataset中进行更改 我该怎么做 如果您有一个源ClientDataSet CDS1,您应该能够通过执行以下操作将更改的记录复制到第二个ClientDataSet CDS2 if CDS1.ChangeCount > 0 then CDS2.Data := CDS1.Delta; 正如您将看到的,如果您尝试

如何从
TClientDataset
获取更改

我有一个名为
GetDataset
TClientDataset
和一个网格。我希望在名为
ChangeDataset
的新
TClientDataset
中进行更改


我该怎么做

如果您有一个源ClientDataSet CDS1,您应该能够通过执行以下操作将更改的记录复制到第二个ClientDataSet CDS2

if CDS1.ChangeCount > 0 then 
  CDS2.Data := CDS1.Delta;
正如您将看到的,如果您尝试这样做,它会给您一个“before”记录和一个带有更改的记录。这可能不一定是你想要的——坦白地说,你最好读一读Whipple在评论和OLH中发表的文章,以获得你可能想要达到的确切结果。关键是,您需要的所有信息都在源CD中,直到您将其清除为止(通过调用ApplyUpdate()——之后,如果成功,更改日志将为空)

如果您查看CDS2中的行,就不清楚如何判断特定字段是否包含已更改的值,以及如何区分已更改的值和仅为空的值。Istr很久以前,在Borland NTTP的一个新闻组中有一篇很好的帖子,作者是MarkEdington,我想,他解释了如何做到这一点。基本上,这是一个根据字段的NewValue属性评估变量的问题:

if VarIsClear(CDS2.Fields[i].NewValue) then 
// means Fields[i] does not have a changed value

顺便说一句,由于可以将CD的状态保存为XML,因此可以使用XML操作,例如使用DOM解析器,例如Windows内置的解析器(请参见MSXML.Pas)使用TDataSet范型可以轻松完成许多麻烦的事情。

您希望ChangeDataset仅包含第一个ClientDataSet中已更改的记录,还是全部?Eric Whipple@SirRufo的文章:非常感谢您的参考,非常有用。