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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.07.2015, 11:50   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Получение значения из поля диалога AX2009
Доброго времени суток!

есть такой код в диалоге (При выборе значения лукап поля должны проверяться значения некоторых полей и выполняться некоторые действия, метод вызывается но все поля судя по дебаггеру пустые) как получить значение полей в диалоге:
X++:
protected boolean fld2_1_modified()
{
    ;
    if ((dlgFactuDocId.value() == 'ПНЕ') || (dlgFactuDocId.value() == 'РКЕ'))
    {
        dlgRegInERNN.value(true);
    }
    else
    {
        dlgRegInERNN.value(false);
    }
    return true;
}
Старый 14.07.2015, 12:09   #2  
Craz is offline
Craz
Участник
 
56 / 19 (1) ++
Регистрация: 17.09.2009
Напишите лучше что-то вроде этого:

X++:
public boolean fld2_1_modified()
{
    Object      control = dialog.formRun().controlCallingMethod();
    boolean     ret = control.modified();
    ;

    if (ret)
    {
         if ((dlgFactuDocId.value() == 'ПНЕ') || (dlgFactuDocId.value() == 'РКЕ'))
         {
             dlgRegInERNN.value(true);
         }
         else
         {
             dlgRegInERNN.value(false);
         }
    }

    return ret;
}
и в методе dialog() должны поля быть объявлены так
X++:
    dialog.customFieldName_RU("dlgRegInERNN");
    dlgRegInERNN= dialog.addFieldValue(typeid(...), ...);
    dialog.customFieldName_RU("dlgFactuDocId");
    dlgFactuDocId= dialog.addFieldValue(typeid(...), ...);
ну и еще по идее неплохо там же иметь такую строку : dialog.allowControlMethodOverload_RU(true);

Последний раз редактировалось Craz; 14.07.2015 в 12:12. Причина: вспомнил важный момент
Старый 14.07.2015, 12:35   #3  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Все равно не работает.

Привожу код диалога:
X++:
class DialogHH extends RunBase
{
    DialogField             dlgFactureDate;
    DialogField             dlgFactuDocId;
    DialogField             dlgRegInERNN;

    DialogButton            dialogButton;

    FactureDate_RU           factureDate;
    FactuDocId          factureDocId;
    RegInERNN           regInERNN;

    #define.CurrentVersion(1)
    #localmacro.CurrentList
        factureDate,
        factureDocId,
        regInERNN
    #endmacro
}

public Object dialog()
{
    DialogRunbase      dlg;
    ;
    dlg = super(dlg)
    dlgFactureDate = dlg.addFieldValue(typeid(FactureDate_RU), factureDate);
    
    dlg.customFieldName_RU("dlgFactuDocId");
    dlgFactuDocId = dlg.addFieldValue(typeid(FactuDocId), factureDocId);

    dlgRegInERNN = dlg.addFieldValue(typeid(RegInERNN),regInERNN);
    dlgRegInERNN.allowEdit(false);
    return dlg;
}

public void dialogPostRun(DialogRunbase dialog)
{
    ;
    Super(dialog);
    dialog.formRun().controlMethodOverload(true);
    dialog.formRun().controlMethodOverloadObject(this);
}

protected boolean dlgFactuDocId_modified()
{
    ;
    info(dlgFactuDocId.value());
    if ((dlgFactuDocId.value() == 'ПНЕ') || (dlgFactuDocId.value() == 'РКЕ'))
    {
        dlgRegInERNN.value(true);
    }
    else
    {
        dlgRegInERNN.value(false);
    }
    return true;
}

public boolean getFromDialog()
{
;
    factureDate = dlgFactureDate.value();
    factureDocId = dlgFactuDocId.value();
    regInERNN = dlgRegInERNN.value();

    return true;
}

//Ну и само собой pack unpack ....
Работать с полем dlgRegInERNN получается нормально, не выходит только получить значения поля dlgFactuDocId, хотя метод modified отрабатывает, значение постоянно пустое...

Последний раз редактировалось syl; 14.07.2015 в 12:39.
Старый 14.07.2015, 12:50   #4  
Craz is offline
Craz
Участник
 
56 / 19 (1) ++
Регистрация: 17.09.2009
Очень странно, потому что я создал у себя ваш класс и у меня все отработало.
Старый 14.07.2015, 13:01   #5  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Если я в коде пишу dlgFactuDocId.value('ПНЕ'); то все работает, если методом простого выбора то по дебаггеру поле помечено как new, infolog выдает пустое значение....

P.S. Что то я ничего не понимаю, все поля кроме lookup полей работают корректно. В чем подвох?

Последний раз редактировалось syl; 14.07.2015 в 13:29.
Старый 14.07.2015, 16:17   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,699 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от syl Посмотреть сообщение
Если я в коде пишу dlgFactuDocId.value('ПНЕ'); то все работает, если методом простого выбора то по дебаггеру поле помечено как new, infolog выдает пустое значение....

P.S. Что то я ничего не понимаю, все поля кроме lookup полей работают корректно. В чем подвох?
Вы ВНИМАТЕЛЬНО посмотрите на то, что написал Вам Craz в самом первом ответе. И сравните со своим кодом. Не замечаете отличий Намекаю Обратите внимание на первые строчи метода

Наводящий вопрос: Как Вы думаете, где происходит отработка штатного метода modify на объекте формы? Ну, грубо говоря, где выполняется super() метода модификации?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 14.07.2015, 16:38   #7  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вы ВНИМАТЕЛЬНО посмотрите на то, что написал Вам Craz в самом первом ответе. И сравните со своим кодом. Не замечаете отличий Намекаю Обратите внимание на первые строчи метода

Наводящий вопрос: Как Вы думаете, где происходит отработка штатного метода modify на объекте формы? Ну, грубо говоря, где выполняется super() метода модификации?
X++:
Object      control = dialog.formRun().controlCallingMethod();
boolean     ret = control.modified();
dialog не определен в методе, посему данный код подсвечивается ошибкой
Старый 14.07.2015, 17:00   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В коде предполагается, что переменная dialog объявлена в classDeclaration и инициализирована предположительно в методе dialog().
Старый 14.07.2015, 17:20   #9  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от gl00mie Посмотреть сообщение
В коде предполагается, что переменная dialog объявлена в classDeclaration и инициализирована предположительно в методе dialog().
А есть другие варианты, я так понял CustPrepaymentFactureCreate_RU работает немного не так...
Старый 14.07.2015, 17:24   #10  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
В общем данный способ работает если диалог выполняется на стороне клиента (если перевести RunOn = Client). А есть способ заставить его работать в RunOn = CalledFrom?
Старый 14.07.2015, 17:33   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если вы добавили свой метод dialogPostRun(DialogRunbase dialog), то сохраняйте в classDeclaration ссылку на диалог, которую получаете в нем, только надо учесть, что это ссылка на серверный диалог, где нет ссылки на FormRun, поэтому приведенный код надо модифицировать вот так:
X++:
Object      control = dialog.dialogOnClinet_RU().formRun().controlCallingMethod();
boolean     ret = control.modified();
За это сообщение автора поблагодарили: syl (1).
Старый 14.07.2015, 18:14   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,699 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от syl Посмотреть сообщение
X++:
Object      control = dialog.formRun().controlCallingMethod();
boolean     ret = control.modified();
dialog не определен в методе, посему данный код подсвечивается ошибкой
X++:
class DialogHH extends RunBase
{
    DialogField             dlgFactureDate;
    DialogField             dlgFactuDocId;
    DialogField             dlgRegInERNN;

    DialogButton            dialogButton;

    FactureDate_RU           factureDate;
    FactuDocId          factureDocId;
    RegInERNN           regInERNN;

    // Ссылка на класс диалога должна быть определена в ClassDeclaration
    // для перекрытия методов modified объектов диалога
    DialogRunbase   dialog;

    #define.CurrentVersion(1)
    #localmacro.CurrentList
        factureDate,
        factureDocId,
        regInERNN
    #endmacro
}

public Object dialog(DialogRunbase _dialog, boolean _forceOnClient)
{
//    DialogRunbase      dialog;	// определен в ClassDeclaration
    ;
    dialog = super(_dialog)
    dlgFactureDate = dialog.addFieldValue(typeid(FactureDate_RU), factureDate);
    
    dialog.customFieldName_RU("dlgFactuDocId");
    dlgFactuDocId = dialog.addFieldValue(typeid(FactuDocId), factureDocId);

    dlgRegInERNN = dialog.addFieldValue(typeid(RegInERNN),regInERNN);
    dlgRegInERNN.allowEdit(false);
    return dialog;
}

public void dialogPostRun(DialogRunbase _dialog)
{
    ;
    Super(_dialog);
    _dialog.formRun().controlMethodOverload(true);
    _dialog.formRun().controlMethodOverloadObject(this);
}

protected boolean dlgFactuDocId_modified()
{
    FormControl control = dialog.formRun().controlCallingMethod();
    boolean     ret = control.modified();
    ;

    if (ret)
    {
         if ((dlgFactuDocId.value() == 'ПНЕ') || (dlgFactuDocId.value() == 'РКЕ'))
         {
             dlgRegInERNN.value(true);
         }
         else
         {
             dlgRegInERNN.value(false);
         }
    }

    return true;
}

public boolean getFromDialog()
{
;
    factureDate = dlgFactureDate.value();
    factureDocId = dlgFactuDocId.value();
    regInERNN = dlgRegInERNN.value();

    return true;
}

public container pack()
{
    return [#CurrentVersion,#CurrentList];
}

public boolean unpack(container packedClass)
{
    Version version     = runbase::getVersion(packedClass);

    switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
            break;
        default:
            return false;
    }

    return true;
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Два поля-lookup. Автоматическая установка значения Vasiliusis DAX: Программирование 20 12.02.2013 08:40
Имитация выбора значения поля на DS формы. bodeaux DAX: Программирование 8 04.12.2012 10:41
Получение значений из диалога Antant DAX: Программирование 10 05.06.2006 15:17
метод leave у поля диалога? braathe DAX: Программирование 5 26.01.2006 09:23
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16

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

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

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