AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.02.2009, 00:27   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
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));
    }
}
Ax 3.0 KR3
Старый 02.02.2009, 01:06   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Поскольку контейнер - это суть строковый тип (и относится к простым скалярным типам, т.е. не содержащим объект) - то помещение записи в контейнер - суть есть копирование значений всех полей в этот контейнер.

Распаковка происходит аналогично. А какие поля нельзя поменять из кода? Системные. Но тут видимо отрабатывает overwritesystemfields(true) (поле createdBy сохраняется).
RecId тоже можно поменять, но при вставке записи система все равно свой запишет.
А вот dataareaid - фиг. Это, пожалуй единственное поле, которое "незыблемо".

Поэтому сию особенность имеет смысл помнить - но она вполне на мой взгляд объяснима.

Повторял на AX4 SP2
__________________
Возможно сделать все. Вопрос времени
Старый 02.02.2009, 01:15   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Это понятно.
Но как-то неожиданно.

Кстати, вызов common.data() не в исходной компании тоже изменил dataareaId.
Т.е. дубликата не получается.
Старый 02.02.2009, 10:13   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
У метода data есть некоторые особенности - я о них писал
__________________
Возможно сделать все. Вопрос времени
Старый 02.02.2009, 11:21   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
Цитата:
Сообщение от Logger Посмотреть сообщение
Кстати, вызов common.data() не в исходной компании тоже изменил dataareaId.
Т.е. дубликата не получается.
Вы неверно трактуете точку изменения поля dataareaid.

Оно происходит не при распаковке (извлечения) данных из контейнера, а при смене компании!
X++:
changeCompany(CompanyIdTo)
Проверьте в дебагере, при выполненни этого кода (т.е. при входе в блок с другой компанией) поле dataareaid именно в контейнере(!) меняется на новое, и возвращается на на старое, при выходе из этого блока.

Так что data() тут уже не при чём... Всё дело в контейнере...
Видимо фича такая... для удобства
__________________
Zhirenkov Vitaly
Старый 02.02.2009, 12:11   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от ZVV Посмотреть сообщение
Вы неверно трактуете точку изменения поля dataareaid.

Оно происходит не при распаковке (извлечения) данных из контейнера, а при смене компании!
Не. Сомнительно что при смене компании ядро перебивает во всех контейнерах поля dataareaId - там же данные в бинарном виде лежат - их распаковывать надо.

Скорее всего это багофича работы конструктора объекта common - при создании экземпляра в dataareaId класть текущую компанию. Соответственно это проявляется при conpeek, присваиваниях вида [common] = con, и при работе отладчика тоже, так как чтобы представить нам содержимое контейнера, ядро вынуждено где-то внутри себя сделать операцию аналогичную conpeek - создать экземпляр объекта common.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DataAreaId в виртуальной компании. vasiliy DAX: Программирование 1 17.04.2008 15:30
Строки временной таблицы с разными DataAreaId PavelSR DAX: Программирование 16 26.03.2008 10:32
Dave: Creating 'Permanent' Indexes on DataAreaId in Dynamics AX Blog bot DAX Blogs 0 29.02.2008 05:37
Самопроизвольная смена компании (DataAreaId) у табличной переменной gl00mie DAX: Программирование 14 10.04.2006 12:18
changecompany(conpeek(container)) Vadik DAX: Программирование 3 03.06.2003 16:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:03.