【问题标题】:How I can get the changes of a TClientDataset to another TClientDataset?如何将 TClientDataset 更改为另一个 TClientDataset?
【发布时间】:2014-10-30 12:18:19
【问题描述】:

我如何从TClientDataset 获得更改?

我有一个名为GetDatasetTClientDataset,并且我有一个网格。我想要一个名为ChangeDataset 的新TClientDataset 中的更改。

我该怎么做?

【问题讨论】:

  • 您希望 ChangeDataset只包含您的第一个 ClientDataSet 中已更改的记录,还是全部包含?

标签: delphi delphi-xe6 tclientdataset


【解决方案1】:

如果你有一个源 ClientDataSet CDS1,你应该能够通过这样做将更改的记录复制到第二个 ClientDataSet CDS2

if CDS1.ChangeCount > 0 then 
  CDS2.Data := CDS1.Delta;

如果您尝试这样做,您将会看到,它会为您提供一个“之前”记录和一个包含更改的记录。这可能不一定是您想要的 - 坦率地说,您最好阅读发表在评论和 OLH 中的 Whipple 文章,以获得您可能想要达到的确切结果。关键是,您需要的所有信息都在源 CDS 中,直到您将其清除(通过调用 ApplyUpdates() - 之后,如果成功,则更改日志为空)。

如果您查看 CDS2 中的行,您如何判断特定字段是否包含更改的值以及如何区分一个字段与一个空字段的区别并不明显。 Istr 很久以前,我认为他们的 Mark Edington 在 Borland NTTP 新闻组之一中发表了一篇非常好的帖子,解释了如何做到这一点。基本上,这是在字段的 NewValue 属性上评估 VarIsClear 的问题:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多