05.09.2013, 13:05 | #1 |
Участник
|
Dynalink в AX2012
Решил поделиться своими наблюдениями:
В AX2012 рекомендуется перерабатывать модель данных в сторону сурогатных ключей и связей по RecId. Также привычные в предыдущих версиях Relation на EDT заменили свойством ReferenceTable и Relation на таблице. Тема была уже упомянута Mazzy вот здесь: Цитата:
Так вот, при построении таких связей между таблицами и последующем переходе в главную таблицу (Go to main table) args.record() или args.lookupRecord() не передаются. Вместо этого передается 3 значения: args.lookupTable(), args.lookupField() и args.lookupValue() Я проверил данный феномен на 2-х формах: WMSLocation и CustTable. Следующий код надо вставить в методе init форм: X++: Common callerRecord1 = element.args().record();
Common lookupRecord = element.args().lookupRecord();
anytype lookupValue = element.args().lookupValue();
TableId lookupTableId= element.args().lookupTable();
FieldId lookupFieldId= element.args().lookupField(); В случае с CustTable передается только тройка значений Связи между таблицами следующие: 1. SalesTable -> CustTable: \Data Dictionary\Tables\SalesTable\Relations\OrderCustomer Связь основана еще на старом Relation на EDT. AccountNum является PrimaryIndex 2. InventDim -> WMSLocation: \Data Dictionary\Tables\InventDim\Relations\WMSLocation Relation включает в себя 2 поля, составляющие PrimaryIndex в WMSLocation: InventLocationId + WMSLocationId. Соответственно на EDT WMSLocationId никаких связей нет. Свойство ReferenceTable тоже не выставлено Следующая статья описывает поведение связей на таблицах/типах. Однако на следующий вопрос я так и не могу ответить: Почему при переходе из InventDim в WMSLocation args.record() все же передается, хотя Relation основан на PrimaryKey? Неужели все дело в композитном индексе и отсутсвии ReferenceTable на EDT? При работе с сурогатными ключами ситуация такая же, как и с CustTable: args.record() пуст. При двойном нажатии на строку в ListPage args.record() все же передается... Складывается впечатление, что ссылки на объекты в вызывающих формах специально подавляются, передача параметров "по значению" более надежна с точки зрения утечек памяти. Этот механизм наверное также используется при переходе из SSRS отчета в форму. Ну а нам внедренцам остается только вздыхать...
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
|
За это сообщение автора поблагодарили: mazzy (10), Logger (5), MikeR (3). |
05.09.2013, 15:36 | #2 |
MCT
|
Не удержался, сорри
__________________
Axapta book for developer |
|
|
За это сообщение автора поблагодарили: plumbum (1), imir (2). |
15.09.2014, 10:45 | #3 |
Участник
|
Столкнулся с этим безобразием. Не знаю на сколько универсальным является найденное решение, но в моем случае у меня получилось достучаться до исходного курсора вот таким образом:
X++: FormRun _caller = _args.caller(); Common lookupRecord = _caller.selectedControl().dataSourceObject().cursor(); |
|
|
За это сообщение автора поблагодарили: trud (3), Logger (3), plumbum (2). |
Теги |
ax2012, dynalink, relation |
|
|