Miklix

Dynamics AX 2012 中 data() 和 buf2Buf() 之间的区别

已出版: 2025年2月15日 UTC 22:54:08
最后更新 2026年1月12日 UTC 08:41:13

本文解释了 Dynamics AX 2012 中的 buf2Buf() 和 data() 方法之间的区别,包括何时适合使用每种方法以及 X++ 代码示例。


为了使尽可能多的人能够访问本页面,本页面由英文机译而成。遗憾的是,机器翻译技术尚不完善,因此可能会出现错误。如果您愿意,可以在此处查看原始英文版本:

The Difference Between data() and buf2Buf() in Dynamics AX 2012

本文中的信息基于 Dynamics AX 2012 R3 版本,可能不适用于其他版本。

在 Dynamics AX 中,当需要将一个表缓冲区中所有字段的值复制到另一个表缓冲区时,传统做法是:

toTable.data(fromTable);

这种方法效果很好,在大多数情况下都是最佳选择。

不过,您也可以选择使用 buf2Buf 函数:

buf2Buf(fromTable, toTable);

这种方法也行得通。那么区别在哪呢?

区别在于 buf2Buf 不会复制系统字段。系统字段包括 RecId、TableId 等字段,以及在此上下文中可能最为重要的 DataAreaId。之所以后者最为重要,是因为使用 buf2Buf() 而不是 data() 的最典型情况是在公司账户之间复制记录时,通常是通过 changeCompany 关键字来实现的。

例如,如果您在名为“dat”的公司,并且您希望将另一家名为“com”的公司中的所有 CustTable 记录复制到该公司:

while select crossCompany : ['com'] custTableFrom
{
    buf2Buf(custTableFrom, custTableTo);
    custTableTo.insert();
}

在这种情况下,之所以能成功,是因为 buf2Buf 会将除系统字段外的所有字段值复制到新的缓冲区。如果您使用的是 data() 函数,则新记录将被插入到“com”公司帐户中,因为该值也会被复制到新的缓冲区。

(实际上,这会导致密钥重复错误,但这也不是你想要的结果)。

进一步阅读

如果您喜欢这篇文章,您可能还会喜欢这些建议:


分享至 Bluesky在 Facebook 上分享在 LinkedIn 上分享在 Tumblr 上分享分享至 X在 LinkedIn 上分享在Pinterest上固定

Mikkel Christensen

关于作者

Mikkel Christensen
迈克尔 是 miklix.com 的创建者和所有者。他拥有 20 多年的专业计算机程序员/软件开发人员经验,目前全职受雇于一家大型欧洲 IT 公司。不写博客时,他把业余时间花在各种兴趣、爱好和活动上,这在一定程度上反映在本网站涵盖的各种主题上。