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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.07.2009, 19:41   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
conPeek() и common.dataareaID
Коллеги, кто-нибудь знает способ, как можно извлечь буфер из контейнера и сохранить оригинальное значение dataareaID.

Суть проблемы в том, что при извленчении буфера из контейнера, ядро заново констрактит экземпляр common, соответственно в common.datareaID кладется текущая компания, а исходное значение этого поля теряется. Таким образом если мы имеем контейнер содержащий буфер, то непонятно как определить его компанию. Есть какой нибудь нормальный способ ?
За это сообщение автора поблагодарили: glibs (1).
Старый 24.07.2009, 20:22   #2  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
static void glibs(Args _args)
{
CustTable custTable;
List list;
ListEnumerator listEnumerator;
;

list = new List(Types::Record);
select firstonly custTable;
list.addEnd(custTable);

changecompany ("DAT")
{
listEnumerator = list.getEnumerator();
while (listEnumerator.moveNext())
{
custTable.data(listEnumerator.current());
info (strfmt("%1", custTable.dataAreaId));
}
}

}
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: Logger (2).
Старый 24.07.2009, 20:34   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Спасибо. Пример хороший.

Но вопрос был про контейнеры.
Для них все плохо.

Немного переделал джоб для иллюстрации. (Запускать надо не в компании dat)
X++:
static void glibs(Args _args)
{
container   con;
CustTable custTable;
CustTable custTable2;
CustTable custTable3;
CustTable custTableCon;
CustTable custTableCon2;
CustTable custTableCon3;

List list;
ListEnumerator listEnumerator;
;

    list = new List(Types::Record);
    select firstonly custTable;
    list.addEnd(custTable);
    con = [custTable];

    changecompany ("DAT")
    {
        listEnumerator = list.getEnumerator();
        while (listEnumerator.moveNext())
        {
            custTable.data(listEnumerator.current());
            custTable2.data(listEnumerator.current());
            custTable3 = listEnumerator.current();
            info (strfmt("%1", custTable.dataAreaId));
            info (strfmt("2 : %1", custTable2.dataAreaId));
            info (strfmt("3 : %1", custTable3.dataAreaId));

            [custTableCon] = con;
            custTableCon2 = conPeek(con,1);
            //custTableCon3 = listEnumerator.current();
            info (strfmt("Con %1", custTableCon.dataAreaId));
            info (strfmt("Con2 : %1", custTableCon2.dataAreaId));
            //info (strfmt("Con3 : %1", custTableCon3.dataAreaId));

        }
    }

}
Старый 24.07.2009, 20:47   #4  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Вставляйте в контейнер List с единственной записью.

А если серьезно, то почему для вас так принципиален контейнер?
__________________
С уважением,
glibs®
Старый 24.07.2009, 20:53   #5  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Джоб у меня такоо плана был .
Цитата:
Сообщение от glibs
...Вставляйте в контейнер List с единственной записью...
Наверное, я имел в виду list.pack(). В смысле, тоже контейнер.

Кстати, в List можно вставить объект, в контейнер нет. Если я не ошибаюсь. А вообще мне казалось, что буфер в контейнер не вставляется. Так что спасибо, вспомнил теорию.
__________________
С уважением,
glibs®
Старый 24.07.2009, 20:55   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от glibs Посмотреть сообщение
Вставляйте в контейнер List с единственной записью.

А если серьезно, то почему для вас так принципиален контейнер?
Для меня - нисколько не принципиален.

Заметил что многие разработчики любят использовать контейнеры и класть туда все скопом. У нас из-за описанного бага в некоторых местах ошибки лезли.
Старый 24.07.2009, 21:00   #7  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от Logger
...многие разработчики любят использовать контейнеры...
IMHO им просто лень изучать как следует и потом использовать API Аксапты.

Не бросайте в меня камнями, пож. Я знаю, что вас тут много.
__________________
С уважением,
glibs®
Старый 24.07.2009, 21:30   #8  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Вообще, создание классов-контейнеров (Map, List, Set) с типом Record у меня находится в списке приемов, благодаря которым можно получить проблему на ровном месте.

Уже несколько раз натыкался на случаи, когда память, выделенная на AOS под хранение Record не возвращается операционной системе даже после переиниициализации класса контейнера. Как правило, данная проблема ловится на самописных отчетах, обрабатывающих большой объем данных.

Может быть в пятерке исправили - не проверял. Кроме того, подозреваю, что существует некая критическая длинна записи, после которой начинает проявляться данная проблема, но я не экспериментировал, а просто перепаковал все необходимые поля в контейнер от греха подальше.
Старый 24.07.2009, 21:33   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Есть 2 отличные функции у класса Global:
container buf2Con(Common common)
static void con2Buf(container c, Common common)
И ещё полезные: con2List, con2Str, buf2Buf, bufCmp

X++:
static void dspic(Args _args)
{
    CustTable custTable;
    container conCustTable;
    ;

    select firstonly custTable;
    
    conCustTable = buf2con(custTable);

    changecompany ("DAT")
    {
        con2buf(conCustTable, custTable);
 
        info (strfmt("%1", custTable.dataAreaId));
    }
}
За это сообщение автора поблагодарили: ZVV (2), Logger (2).
Старый 27.07.2009, 08:41   #10  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Logger Посмотреть сообщение
... Есть какой нибудь нормальный способ ?
Наиболее логичным способом помещения record в контейнер, как мне кажется является вариант, предложенный DSPIC, использование функций
container buf2Con(Common common) и static void con2Buf(container c, Common common), по всей видимости они для этого и предназначены

Цитата:
Сообщение от DSPIC Посмотреть сообщение
Есть 2 отличные функции у класса Global:
container buf2Con(Common common)
static void con2Buf(container c, Common common)
...

X++:
static void dspic(Args _args)
{
    CustTable custTable;
    container conCustTable;
    ;
 
    select firstonly custTable;
 
    conCustTable = buf2con(custTable);
 
    changecompany ("DAT")
    {
        con2buf(conCustTable, custTable);
 
        info (strfmt("%1", custTable.dataAreaId));
    }
}
Однако стоить помнить, что функция Global \ container buf2Con(Common common) в версиях AX 3.0(возможно только в некоторых, проверял на AX 3.0 SP 2, AX 3.0 SP 3 CU 1) не работает(выпадает эксепшен), если у табличных переменных есть поля-массивы(т.е. выше описанный job работать не будет )

Также в случае использования одной табличной переменной и функции xRecord.company(...) можно получить реальную компанию(однако, если в changeCompany("dat") вместо CustTable, использовать CustTable2, то в обоих случаях будет выведено "dat")

X++:
static void srf_test(Args _args)
{
    CustTable   custTable;
    Container   conCustTable;
    ;
 
    select firstOnly custTable;
 
    conCustTable = [custTable];
 
    changecompany("dat")
    {
        custTable.clear();
        custTable.data(conpeek(conCustTable, 1));
 
        info(custTable.dataAreaId);
        info(custTable.company());
    }
}
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: Logger (2).
Старый 27.07.2009, 11:07   #11  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Однако стоить помнить, что функция Global \ container buf2Con(Common common) в версиях AX 3.0(возможно только в некоторых, проверял на AX 3.0 SP 2, AX 3.0 SP 3 CU 1) не работает(выпадает эксепшен), если у табличных переменных есть поля-массивы(т.е. выше описанный job работать не будет )
Справедливое замечание. Лечится-то просто - добавить дополнительный пробег по полям-массивам в ф-циях buf2Con\vice versa. Но помнить, конечно, следует.

Я вот только не совсем понял, зачем вообще трогать dataAreaId? Насколько это корректно?
Читать - да, менять - не знаю. По-моему, это бубен какой-то...
Старый 28.07.2009, 11:30   #12  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
По моему с записями лучше уже использовать RecordSortedList / RecordInsertList - они же для этого и созданы (journalTransList)

Чтоб пихать контейнер в List можно использовать ContainerClass, для уверенности, а вообще в 4.0 и выше уже можно пихать контейнер в список
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 04.03.2011, 00:19   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
В 2009-й исправлено.
Теперь сохраняется исходный dataareaID.
Теги
container, dataarea, компания

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dataareaid conpeek Logger DAX: Программирование 5 02.02.2009 12:11
Строки временной таблицы с разными 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
Inside Dynamics AX 4.0: Common Search Blog bot DAX Blogs 0 29.10.2007 10:50
Самопроизвольная смена компании (DataAreaId) у табличной переменной gl00mie DAX: Программирование 14 10.04.2006 12:18

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

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

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