|
16.04.2013, 11:39 | #1 |
Участник
|
Проблема с аргументами формы в АХ2009
Доброго времени суток, уважаемые коллеги
Использую AX2009, Kernel version: 5.0.1000.52, Application version: 5.0.1500.2116, Solution version: RU HRP 5.0.1500.2116.1 Столкнулся с проблемой потери параметров Args формы. Описание ситуации: 1. Есть некоторая форма в методе init которой извне (из вызывающего объекта) в данную форму передается экземпляр класса wfDocApproveEngine: X++: public void init() { Object callerForm; if (!element.args().caller() || !element.args().record()) { throw error("@SYS22539"); } super(); callerForm = element.args().caller(); wfDocApproveEngine = callerForm.getWFDocApproveEngine(); callerArgs = wfDocApproveEngine.parmParentObjectRun().args(); X++: void initDocApproveEngine() { EventContextInformation eci; FormRun formRunDoc; FormDataSource docFormDataSource; Object formObjDoc; int i; ; eci = EventContextInformation::construct(); if (eventInbox.ParentTableId) { eci.parmAlertBuffer(common); if (common.RecId && eci.unpack(eventInbox.contextData())) { formRunDoc = eci.createFormRun(); if (formRunDoc) { for (i=1; i<= formRunDoc.dataSourceCount(); i++) { if (formRunDoc.dataSource(i).cursor().TableId == common.TableId) { docFormDataSource = formRunDoc.dataSource(i); break; } } wfDocApproveEngine.parmParentObjectRun(formRunDoc); wfDocApproveEngine.parmParentDataSource(docFormDataSource); formRunDoc.close(); } } } } Результаты трассировки кода: в методе init переменная callerArgs не пустая и содержит корректный набор аргументов: Args(Name: RHRMOrderTable, Parm: , DesignName: , Enum: RHRMJournalType::Перевод, MenuItemName: RHRMOrderTableTransfer) Аналогично проверил аргументы в методе Run формы, вызвав callerArgs = wfDocApproveEngine.parmParentObjectRun().args(); тоже полный порядок. Но в методе closeOk проверка показала, что аргументы перестали существовать - переменная callerArgs приняла значение null. Хотя ни экземпляр класса, ни его параметр parentObjectRun не изменялись. Попробовал сохранять параметр parentObjectRun в переменную формы: X++: saveobj = wfDocApproveEngine.parmParentObjectRun(); callerArgs = saveobj.args(); Если кто сталкивался с подобной ситуацией, подскажите пожалуйста в чем может быть причина проблемы? PS Удаление пользовательских данных, компиляция формы и класса не помогли((( Заранее спасибо за ответы. Последний раз редактировалось A.Nekrasov; 16.04.2013 в 12:00. Причина: Добавление дополнительной информации по проблеме |
|
16.04.2013, 11:58 | #2 |
Участник
|
|
|
16.04.2013, 12:25 | #3 |
Участник
|
Цитата:
Баг SysInfoAction_MenuItemRun_RU
Возможно корни те же. |
|
16.04.2013, 12:23 | #4 |
Участник
|
Позвольте, в методе initDocApproveEngine вы же делаете formRunDoc.close();
После этого хотите, чтобы во внешнем классе сохраненные в переменную callerArgs свойства данной формы не приняли значение null? Я вас правильно понял? |
|
16.04.2013, 12:56 | #5 |
Участник
|
Цитата:
Позвольте, в методе initDocApproveEngine вы же делаете formRunDoc.close();
После этого хотите, чтобы во внешнем классе сохраненные в переменную callerArgs свойства данной формы не приняли значение null? Я вас правильно понял? А значение null переменная callerArgs принимает только в методе CloseOK, тогда как в методах init и run все в порядке. При этом сам formRunDoc не принимает значение null ни в одном из методов. |
|
16.04.2013, 15:35 | #6 |
Участник
|
В итоге вышел из ситуации изменив подход.
Если в вкратце и глобально, то теряемые аргументы в дальнейшем нужны были для формирования контекстных данных уведомления (EventInBoxData). Суть такова: в контекстных данных сохраняются параметры запуска формы явившейся источником события для которого генерируется оповещение (уведомление). Но стандартно предполагалось, что эта самая форма еще активна на момент генерации уведомления и формирования контекстных данных. Мне же понадобилось генерировать оповещение для уже закрытой формы. А для этого пришлось динамически в коде открыть форму и сохранить параметры запуска, а затем закрыть форму. Но параметры запуска сохранялись неявно как аргументы formrun. Изменение подхода - это явное сохранение аргументов в переменную с типом Args. Я добавил строку: X++: wfDocApproveEngine.parmParentObjectRunArgs(formRunDoc.args()); X++: // _EventContextInformation.parmPackedArgs(callerObjectRun.args()); if(callerObjectRun.args()) { _EventContextInformation.parmPackedArgs(callerObjectRun.args()); } else { _EventContextInformation.parmPackedArgs(wfDocApproveEngine.parmParentObjectRunArgs()); } Все равно всем спасибо |
|
Теги |
args, проблема |
|
|