22.10.2012, 16:01 | #1 |
Участник
|
Ax2012 Изменение сегмента account dimension"а
Есть некая задача, если совсем упрощенно:
1. Добавляем новую финансовую аналитику(dimension) в структуру с связью на некоторый справочник. 2. Имеем форму, на которой при вводе значения в поле из этой справочной таблицы нужно автоматически проставить значение сегмента в LedgerDimension равное введенному значению (То есть, речь идет об автоматическом segmented value entry, а сам функционал можно рассматривать, как некоторый журнал). В чем у меня возникли трудности. Если работать напрямую через DimStorage, созданный для LedgerDimension поля(findById), после внесения нового сегмента, сохранения DimStorage и обновления записи( X++: X.LedgerDimension = dimStorage.save(); Конечно, изначально я смотрел в сторону класса-контролера дайменшена DimensionDynamicAccountController, но как с его помощью изменить значение сегмента - не ясно, в основном, в интерфейсе он содержит только обработчики событий на контроле. А мне же нужно инициировать событие. При этом, на классе LedgerDimensionController, есть protected метод setValue, который на ура устанавливает значение другого сегмента, будучи вызваным из segmentValueChanged для одного сегмента(по цепочке: произошло segmentValueChanged событие на контроле -> segmentValueChanged на DimensionDynamicAccountController -> segmentValueChanged на LedgerDimensionController и вызываем setValue для нашего сегмента, если теперь такой атрибут поддерживается активной структурой аккаунта). Но если мы попробуем вызвать setValue из вне этого события, а напрямую с modified нашего филда(создав до этого интерфейсный public wrapper) - сегмент не обновится. Опять же, догадываюсь, что это потому что не произошло событие в контроле аккаунта и ядро не скомандовало обновить сегменты. То есть, вопрос в первую очередь: есть ли какой-то стандартный способ без костылей это сделать, а если нет, то возможно ли вообще нормально решить эту задачу(то ли, работая напрямую с DimStorage и заставляя контрол сбросить и обновить сегменты, то ли работая с классами контроллерами и сигнализировать об изменении сегментов). Ну и последнее, по поводу сигнализации об изменении сегмента - думал явно вызывать segmentValueChanged метод на контроле, но для этого нужно сначала сгенерить SegmentValueChangedEventArgs, класс закрытый, системный, методы final, сетеров нет, то есть, он рассчитан исключительно на инстанциацию из ядра.
__________________
Axapta has seduced me deadly! |
|
22.10.2012, 16:13 | #2 |
Участник
|
UPD
Мда, забавно, проверил последний и самый простой способ: после вызова setValue на LedgerDimensionController просто вызвать modified контрола(который segmented value entry для LedgerDimension) и всё заработало.. Решил оставить пост с ответом - вдруг кому-то поможет.
__________________
Axapta has seduced me deadly! |
|
22.10.2012, 16:20 | #3 |
Участник
|
А вы не смотрели книгу "Microsoft Dynamics AX 2012 Development Cookbook" (недавно на форуме была ссылка на нее)? Там есть главка про работу с аналитиками и пример заполнения из кода.
__________________
Ivanhoe as is.. |
|
22.10.2012, 16:28 | #4 |
Участник
|
Нет, не смотрел ещё, но подозреваю, что там, как и интернетах автозаполнение из внешнего кода, вне контекста формы. В любом случае, хотя с вопросом и разобрался, спасибо за наводку! В целом, книга годная?
__________________
Axapta has seduced me deadly! |
|
22.10.2012, 17:14 | #5 |
Участник
|
Мне как не разработчику трудно судить. Спрошу у ребят.
Что мне ценно - там ставятся конкретные задачи и даются конкретные решения с объяснениями. Это, мне кажется, очень полезно.
__________________
Ivanhoe as is.. |
|
|
|