Определение SysOperationController в диалоге
Класс SysSetupForm в AX2012 по какой-то причине не подвергся доработке после внедрения SysOperationFramework, и стало невозможно определить, что за класс вызвал диалог. Хотя доработка-то всего в пять строк:
X++:
public ClassName determineCallerName() { #aot Object caller = editFormRun.args().caller(); if (caller) { switch (true) { // fix --> case caller is SysOperationDialog: caller = caller.controller(); callerName = classId2Name(classidget(caller)); callerPath = #classesPath; break; // fix <-- ...
Всего комментариев 1
Комментарии
-
Допил, по определению пункта меню в случае, если вызов был из controller(в основном актуально для отчётов, в некоторых случаях для отчётов показывается общий controller - SrsReportRunController - пример такого отчёта в стандарте Физические запасы по складским аналитикам)
Метод init подвергся модификации :
X++:#aot //+ fix s-nefedo MenuItemType menuItemType; SysOperationController controller; //- fix s-nefedo ... this.DetermineCallerName(); //fix s-nefedo /*menuItemName = editFormRun.args().menuItemName(); if (menuItemName) { menuItemPath = #MenuItemsPath + #FilePathDelimiter + enum2str(editFormRun.args().menuItemType()) + #AOTDelimiter + menuItemName; }*/ menuItemName = editFormRun.args().menuItemName(); if (menuItemName) { menuItemType = editFormRun.args().menuItemType(); } if (! menuItemName && caller) { switch(true) { case SysDictClass::isEqualOrSuperclass(classidget(caller), classnum(SysOperationDialog)): controller = caller.controller(); if (controller.parmArgs()) { menuItemName = controller.parmArgs().menuItemName(); menuItemType = controller.parmArgs().menuItemType(); } break; default : break; } } if (menuItemName) { menuItemPath = #MenuItemsPath + #FilePathDelimiter + enum2str(menuItemType) + #AOTDelimiter + menuItemName; } //fix s-nefedo ....
Запись от SRF размещена 19.06.2020 в 13:21
Обновил(-а) SRF 25.06.2020 в 11:43