Тема: Dynalink в AX2012
Показать сообщение отдельно
Старый 05.09.2013, 13:05   #1  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Dynalink в AX2012
Решил поделиться своими наблюдениями:

В AX2012 рекомендуется перерабатывать модель данных в сторону сурогатных ключей и связей по RecId. Также привычные в предыдущих версиях Relation на EDT заменили свойством ReferenceTable и Relation на таблице.

Тема была уже упомянута Mazzy вот здесь:
Цитата:
Сообщение от mazzy Посмотреть сообщение
раньше: MDI + dynalink между формами = ПРЕКРАСНО.
в этой версии: начали отказываться от MDI в сторону SDI. Но при этом перевели не

Так вот, при построении таких связей между таблицами и последующем переходе в главную таблицу (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();
В случае с WMSLocation, InventDim передается в args.record()
В случае с 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).