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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.12.2013, 21:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,459 / 846 (79) +++++++
Регистрация: 28.10.2006
sashanazarov: Table inheritance and collection objects
Источник: http://sashanazarov.blogspot.com/201...n-objects.html
==============


Be aware that there is an issue with storing child table records in collection objects like List.

If you have a table hierarchy and add a child table record to a List and then try to get it back, information from parent tables is lost, along with InstanceRelationType field value.

The following job reproes the issue:

static void tableInheritanceAndListBug(Args _args)
{
CompanyInfo companyInfo;
List companyInfoList;
ListEnumerator companyInfoEnumerator;

companyInfoList = new List(Types::Record);

select firstOnly companyInfo;

info(strFmt(
"Orig: RecId: %1, Name: %2, InstanceRelationType: %3",
companyInfo.RecId,
companyInfo.Name,
companyInfo.InstanceRelationType));

companyInfoList.addEnd(companyInfo);

companyInfoEnumerator = companyInfoList.getEnumerator();
if (companyInfoEnumerator.moveNext())
{
companyInfo = companyInfoEnumerator.current();
info(strFmt(
"List: RecId: %1, Name: %2, InstanceRelationType: %3",
companyInfo.RecId,
companyInfo.Name,
companyInfo.InstanceRelationType));
}
}
Output:
Orig: RecId: 5637151316, Name: Contoso Entertainment Systems - E&G Division, InstanceRelationType: 41
List: RecId: 5637151316, Name: , InstanceRelationType: 0

The workaround is to use buf2con function to convert the table buffer to a container, save the container in the list and finally use con2buf when fetching the value with enumerator.

static void tableInheritanceAndListBugWorkaround(Args _args)
{
CompanyInfo companyInfo;
List companyInfoList;
ListEnumerator companyInfoEnumerator;

companyInfoList = new List(Types::Container);

select firstOnly companyInfo;

info(strFmt(
"Orig: RecId: %1, Name: %2, InstanceRelationType: %3",
companyInfo.RecId,
companyInfo.Name,
companyInfo.InstanceRelationType));

companyInfoList.addEnd(buf2Con(companyInfo));

companyInfoEnumerator = companyInfoList.getEnumerator();
if (companyInfoEnumerator.moveNext())
{
companyInfo = con2Buf(companyInfoEnumerator.current());
info(strFmt(
"List: RecId: %1, Name: %2, InstanceRelationType: %3",
companyInfo.RecId,
companyInfo.Name,
companyInfo.InstanceRelationType));
}
}
Output:
Orig: RecId: 5637151316, Name: Contoso Entertainment Systems - E&G Division, InstanceRelationType: 41
List: RecId: 5637151316, Name: Contoso Entertainment Systems - E&G Division, InstanceRelationType: 41


Источник: http://sashanazarov.blogspot.com/201...n-objects.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
За это сообщение автора поблагодарили: gl00mie (5).
Старый 19.12.2013, 12:02   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
зарепортил куда-то?
Старый 19.12.2013, 14:08   #3  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
а куда можно репортить, кроме как через New Support Request на PartnerSource? (для которого предоплата нужна)
Старый 19.12.2013, 14:24   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от lvan Посмотреть сообщение
а куда можно репортить, кроме как через New Support Request на PartnerSource? (для которого предоплата нужна)
Ну, если у вас нет возможности зарепортить через официальный канал, то можно хоть сюда - тут когда-то была тема для багов, а добрый дядя Ваня создаст в системе (правда это будет касаться только след. релизов)

Но лучше конечно, когда через официальные каналы - хот фикс можете получить, да и вообще.

А Саша как раз имеет возможность зарепортить, вот я и спрашиваю
Старый 19.12.2013, 16:18   #5  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
ну баг такой не особо критичный, но интересен тем, что в дебаггере виден код, который не виден в AOT
короче я щас проверю на демо-машине последней, чтобы вам проще было воспроизвести
Старый 19.12.2013, 16:22   #6  
Slava Chernenko is offline
Slava Chernenko
Участник
Самостоятельные клиенты AX
Соотечественники
 
34 / 15 (0) ++
Регистрация: 30.04.2008
Адрес: Copenhagen, Denmark
Ты уверен, что Саша это сообщение увидит? Это же блог-бот скопировал с его блога.
Старый 19.12.2013, 17:26   #7  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Только что увидел .

Нет, еще никуда не репортил.

Вообще баг странный. Такое впечатление, что на моем теперешнем клиенте это работало весь последний год (CU3), и только сейчас вылезло (CU5). В моем собственном коде, так что его пришлось срочно править.

В RTM, кстати, тоже воспроизводится.

Последний раз редактировалось Stitch_MS; 19.12.2013 в 17:57.
За это сообщение автора поблагодарили: kashperuk (5).
Старый 03.01.2014, 12:45   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Создал баг, посмотрим, что скажут.
За это сообщение автора поблагодарили: Stitch_MS (3).
Старый 03.01.2014, 14:00   #9  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Создал баг, посмотрим, что скажут.
Пардон, забыл отписаться, что тоже создал баг, и добрые индусы уже работают .
Старый 18.01.2014, 01:50   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вот тебе ответ на мой баг (Won't Fix):

Цитата:
This is a well-know limitation due to the existing kernel implementation where only data buffer of the current table can be put in the collection list.



There are two possible work-arounds.



1. use xRecord.buf2con() and con2buf() to pack/unpack all the data buffers in the inheritance chain as container put it in the container.



2. use a class that holds the reference to the table variable, and put the class instance in the collection list.
За это сообщение автора поблагодарили: Stitch_MS (5).
Старый 21.01.2014, 18:58   #11  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
а как мне зарепортить про драгндроп?
__________________
Felix nihil admirari
Старый 15.02.2017, 16:53   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Кстати, упаковка таким способом
X++:
con = [buffer];
buffer = conPeek(con, 1);
[buffer] = con;
Также имеет упомянутые проблемы. Поэтому кучу старого кода при переводе на 12-ю надо перепроверять.

Касательно использования листов и мапов мой коллега еще одну интересную особенность нашел:

Если у нас есть буфер в котором есть куча длинных строковых полей (например, текстовые поля по 250-1000 символов), в которых значение пустое или записана короткая строка, то буфер в памяти занимает все запланированное место. Т.е. поле имеет длину 1000 символов, там хранится строка из 10 символов, то памяти под хранение все равно отведено 1000 символов. И это же верно при сохранении буфера в map. Поэтому если в мапах кешируем много записей у которых куча строковых полей, то они могут сожрать неожиданно много памяти.

Чтобы такого не происходило, можно в мапе хранить контейнеры в которых упакованы буферы. Память существенно экономится. (Все это проверено на 2009-й аксапте. В 2012-й не перепроверяли)

Последний раз редактировалось Logger; 15.02.2017 в 16:58.
Теги
buf2con, con2buf

 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:26.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.