AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.04.2013, 11:39   #1  
A.Nekrasov is offline
A.Nekrasov
Участник
 
4 / 10 (1) +
Регистрация: 13.11.2012
Проблема с аргументами формы в АХ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();
в данном классе один из параметров - это переменная parentObjectRun типа object, в которой хранится другая форма. Переменная callerArgs введена для отслеживания параметров Args при трассировке в связи с проблемой. Вот метод в котором инициируется переменная parentObjectRun:

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();
с последующей проверкой наличия аргументов. Результат тот же - переменная callerArgs приняла значение null.

Если кто сталкивался с подобной ситуацией, подскажите пожалуйста в чем может быть причина проблемы?

PS Удаление пользовательских данных, компиляция формы и класса не помогли(((

Заранее спасибо за ответы.

Последний раз редактировалось A.Nekrasov; 16.04.2013 в 12:00. Причина: Добавление дополнительной информации по проблеме
Старый 16.04.2013, 11:58   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Баг SysInfoAction_MenuItemRun_RU

Возможно корни те же.
Старый 16.04.2013, 12:23   #3  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
Позвольте, в методе initDocApproveEngine вы же делаете formRunDoc.close();
После этого хотите, чтобы во внешнем классе сохраненные в переменную callerArgs свойства данной формы не приняли значение null? Я вас правильно понял?
Старый 16.04.2013, 12:25   #4  
A.Nekrasov is offline
A.Nekrasov
Участник
 
4 / 10 (1) +
Регистрация: 13.11.2012
Цитата:
Баг SysInfoAction_MenuItemRun_RU

Возможно корни те же.
Да нет, не похоже что дело в упаковке данных, более того форма-то не закрывалась.
Старый 16.04.2013, 12:56   #5  
A.Nekrasov is offline
A.Nekrasov
Участник
 
4 / 10 (1) +
Регистрация: 13.11.2012
Цитата:
Позвольте, в методе initDocApproveEngine вы же делаете formRunDoc.close();
После этого хотите, чтобы во внешнем классе сохраненные в переменную callerArgs свойства данной формы не приняли значение null? Я вас правильно понял?
Да, правильно. Собственно вызов метода initDocApproveEngine выполняется во внешнем контексте (форме) по отношению к форме в которой наблюдается ситуация. Форма formRunDoc сохраняется как object в классе до того как закрывается.

А значение null переменная callerArgs принимает только в методе CloseOK, тогда как в методах init и run все в порядке. При этом сам formRunDoc не принимает значение null ни в одном из методов.
Старый 16.04.2013, 15:35   #6  
A.Nekrasov is offline
A.Nekrasov
Участник
 
4 / 10 (1) +
Регистрация: 13.11.2012
В итоге вышел из ситуации изменив подход.

Если в вкратце и глобально, то теряемые аргументы в дальнейшем нужны были для формирования контекстных данных уведомления (EventInBoxData). Суть такова: в контекстных данных сохраняются параметры запуска формы явившейся источником события для которого генерируется оповещение (уведомление). Но стандартно предполагалось, что эта самая форма еще активна на момент генерации уведомления и формирования контекстных данных.

Мне же понадобилось генерировать оповещение для уже закрытой формы. А для этого пришлось динамически в коде открыть форму и сохранить параметры запуска, а затем закрыть форму. Но параметры запуска сохранялись неявно как аргументы formrun.

Изменение подхода - это явное сохранение аргументов в переменную с типом Args. Я добавил строку:
X++:
wfDocApproveEngine.parmParentObjectRunArgs(formRunDoc.args());
в метод где сохранял саму форму. И соответственно parm-метод и его вызов на чтение тоже добавил как альтернативу:
X++:
// _EventContextInformation.parmPackedArgs(callerObjectRun.args());
        if(callerObjectRun.args())
        {
            _EventContextInformation.parmPackedArgs(callerObjectRun.args());
        }
        else 
        {
            _EventContextInformation.parmPackedArgs(wfDocApproveEngine.parmParentObjectRunArgs());
        }
to Xardas: спасибо за подсказку, немного поразмыслив я пришел к выводу что истиная причина ситуации скорее всего именно указанная Вами. Т.е. formRunDoc.close() все-таки влияет, вот только как бы с некоторой задержкой, как будто не сразу закрылась форма.

Все равно всем спасибо
Теги
args, проблема

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
В АХ2009 проблема с General Ledger->Chart of accounts AndrianG DAX: Администрирование 3 12.02.2009 13:15
Проблема с передачей контролов из формы в класс matew DAX: Программирование 0 28.04.2008 17:37
Проблема с активно-пассивными счетамидля формы 1 в генераторе финансовых отчетов Truba DAX: Функционал 8 14.08.2006 12:07
Проблема с доступом к настройкам формы ViV DAX: Администрирование 6 14.11.2005 15:59
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:24.