02.02.2009, 00:27 | #1 |
Участник
|
dataareaid conpeek
Возможно уже было, но на форуме не нашел.
Наткнулся на странный глюк, если передавать common как элемент контейнера, то при "доставании" из контейнера может слететь dataareaid X++: static void JobCheckSerialize2(Args _args) { CompanyId CompanyIdFrom = "300"; CompanyId CompanyIdTo = "dat"; salesLine salesLineFrom; salesLine salesLineTo; salesLine salesLineTo2; container con; anyType a; ; changeCompany(CompanyIdFrom) { salesLineFrom = null; select salesLineFrom; info(strFMT("Сначала %1; %2", salesLineFrom.dataAreaId, salesLineFrom.RecId)); con = [salesLineFrom]; int2str(salesLineTo2.RecId); } changeCompany(CompanyIdTo) { salesLineTo = null; //a = conPeek(con,1); //salesLineTo2.data(conPeek(con,1)); salesLineTo = conPeek(con,1); if(salesLineTo.dataAreaId == salesLineFrom.dataAreaId) info(strFMT("Потом %1; %2; Все в порядке, значения dataareaId сопадают", salesLineTo.dataAreaId, salesLineTo.RecId)); else error(strFMT("Потом %1; %2; Ошибка, значения dataareaId не сопадают", salesLineTo.dataAreaId, salesLineTo.RecId)); } } |
|
02.02.2009, 01:06 | #2 |
Administrator
|
Поскольку контейнер - это суть строковый тип (и относится к простым скалярным типам, т.е. не содержащим объект) - то помещение записи в контейнер - суть есть копирование значений всех полей в этот контейнер.
Распаковка происходит аналогично. А какие поля нельзя поменять из кода? Системные. Но тут видимо отрабатывает overwritesystemfields(true) (поле createdBy сохраняется). RecId тоже можно поменять, но при вставке записи система все равно свой запишет. А вот dataareaid - фиг. Это, пожалуй единственное поле, которое "незыблемо". Поэтому сию особенность имеет смысл помнить - но она вполне на мой взгляд объяснима. Повторял на AX4 SP2
__________________
Возможно сделать все. Вопрос времени |
|
02.02.2009, 01:15 | #3 |
Участник
|
Это понятно.
Но как-то неожиданно. Кстати, вызов common.data() не в исходной компании тоже изменил dataareaId. Т.е. дубликата не получается. |
|
02.02.2009, 10:13 | #4 |
Administrator
|
У метода data есть некоторые особенности - я о них писал
__________________
Возможно сделать все. Вопрос времени |
|
02.02.2009, 11:21 | #5 |
MCITP
|
Цитата:
Оно происходит не при распаковке (извлечения) данных из контейнера, а при смене компании! X++: changeCompany(CompanyIdTo) Так что data() тут уже не при чём... Всё дело в контейнере... Видимо фича такая... для удобства
__________________
Zhirenkov Vitaly |
|
02.02.2009, 12:11 | #6 |
Участник
|
Цитата:
Скорее всего это багофича работы конструктора объекта common - при создании экземпляра в dataareaId класть текущую компанию. Соответственно это проявляется при conpeek, присваиваниях вида [common] = con, и при работе отладчика тоже, так как чтобы представить нам содержимое контейнера, ядро вынуждено где-то внутри себя сделать операцию аналогичную conpeek - создать экземпляр объекта common. |
|