Показать сообщение отдельно
Старый 31.03.2009, 11:13   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Открытие форм с сервера с использованием MenuFunction
Не так давно потребовалось из класса, отрабатывающего на сервере, запускать форму, отображающую некоторые результаты его работы. Для формы есть пункт меню, запускающий ее на клиенте. Оказалось, что решение "в лоб" вовсе не обязательно приведет к желаемому эффекту:
X++:
MenuFunction menuFunc = new MenuFunction( menuitemdisplaystr(SomeForm), MenuItemType::Display );
Args         args     = new Args();
// ...
menuFunc.run( args );
Несмотря на то, что, опять же, в пункте меню явно прописано запускать форму на клиенте, никакого видимого эффекта в результате выполнения этого кода не наблюдалось. Опытным путем было выяснено, что для 3-ки и MenuFunction, и Args должны создаваться на клиенте, иначе форма не откроется. Для 4-ки вроде бы MenuFunction отрабатывает и с сервера, но в любом случае объект Args должен создаваться на клиенте - иначе клиент вообще сваливается. Для 3-ки дополнительные неудобства еще создает то, что конструктор MenuFunction требует передачи параметров, так что через какой-нить classFactory соотв. объект на нужном уровне не создашь; пришлось создавать через infolog:
X++:
MenuFunction menuFunc = infolog.getNode( UtilElementType::DisplayTool, menuitemdisplaystr(SomeForm) );
Args         args     = classFactory::makeObjectOnClient( classnum(Args) );
// ...
menuFunc.run( args );
Во вложении - небольшой проект для 4-ки с job'ом и пунктом меню для запуска его на сервере, демонстрирующий указанный эффект; в принципе, его можно и на 3-ке загрузить, только надо пункт меню для запуска job'а проверить и при необходимости подправить, чтобы запускался именно job, а не одноименная форма. В job'е в качестве тестовой формы открывается AddressTrans_RU через одноименный пункт меню, поскольку он - один из немногих, где для формы штатно прописано RunOn Client; обычно для форм в пунктах меню стандартного приложения прописано RunOn Called from.

На форуме уже встречалась похожая тема Проблема с программным открытием форм, но в моем случае вариант "запускать класс на клиенте" был неприемлем.

PS. Axapta 3.0.1951.7669, также проверялось на AX 4.0.2501.116.
Вложения
Тип файла: xpo TestServerMenuFunction.xpo (3.6 Кб, 290 просмотров)
За это сообщение автора поблагодарили: samolalex (3).