Решил поделиться своими наблюдениями:
В 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 отчета в форму.
Ну а нам внедренцам остается только вздыхать...