Miklix

Разница между data() и buf2Buf() в Dynamics AX 2012

Опубликовано: 15 февраля 2025 г. в 22:54:00 UTC
Последнее обновление: 12 января 2026 г. в 08:41:09 UTC

В этой статье объясняются различия между методами buf2Buf() и data() в Dynamics AX 2012, включая случаи, когда целесообразно использовать каждый из них, а также приводится пример кода на 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

Миккель Кристенсен

Об авторе

Миккель Кристенсен
Миккель - создатель и владелец сайта miklix.com. Он имеет более чем 20-летний опыт работы в качестве профессионального программиста/разработчика программного обеспечения и в настоящее время работает на полную ставку в крупной европейской IT-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.