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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2009, 10:37   #1  
s.alex is offline
s.alex
Участник
 
28 / 10 (1) +
Регистрация: 07.06.2007
Как из формы передать значение?
Добрый день.

Из класса открываю форму, в которой в Гриде нужно выбрать запись и вернуть обратно в класс. Это не Lookup выбор, это полноправная форма! Вопросы:
1) как из формы передать значение (можно RecId)?
2) как в классе организовать прием этого значения?

Открываю форму вот так:
X++:
        // Более одного ШК
        args = new Args();
        args.name(formStr(FRM_BarCodePlusInvent));
        args.parm(_itemBarCode);
        formrun = ClassFactory.formRunClass(args);
        formrun.init();
        formrun.run();
        formRun.wait();
Задача в том, чтобы выбрать правильный штрих-код, когда в таблице несколько таких штрих-кодов.

Заранее спасибо!!
Старый 28.09.2009, 10:42   #2  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от s.alex Посмотреть сообщение
Добрый день.

Из класса открываю форму, в которой в Гриде нужно выбрать запись и вернуть обратно в класс. Это не Lookup выбор, это полноправная форма! Вопросы:
1) как из формы передать значение (можно RecId)?
2) как в классе организовать прием этого значения?

Открываю форму вот так:
X++:
        // Более одного ШК
        args = new Args();
        args.name(formStr(FRM_BarCodePlusInvent));
        args.parm(_itemBarCode);
        formrun = ClassFactory.formRunClass(args);
        formrun.init();
        formrun.run();
        formRun.wait();
Задача в том, чтобы выбрать правильный штрих-код, когда в таблице несколько таких штрих-кодов.

Заранее спасибо!!
1. Добавьте строчку:
X++:
formrun.args().record(RecID)
2. Прием значения
X++:
RecID = element.args().record();
У меня так работает.
Старый 28.09.2009, 10:43   #3  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
Как вариант на стороне вызова создать экземпляр класса, при открытии Вашей формы получить его, записать в него данные закрыть форму, примеров таких масса смотрите как работает журнал и строки, обработка заказа на закупку продажу. А да и по мойму так вызывать не рекомендуют, создайте свой меню айтем и делайте вызов через него, с правами доступа так могут быть проблемы.
Старый 28.09.2009, 10:44   #4  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
1. В своем классе объявите метод, напр:

X++:
public SalesTable parmSalesTable(SalesTable _salesTable = salesTable)
{
    ;
    salesTable = _salesTable;

    return salesTable;
}
2. При вызове формы, передайте в нее объект класса, добавив строку
X++:
args.caller(this);
3. При закрытии формы, напр. в методе closeOK():

X++:
MyClass myClass = element.args.caller();
;

myClass.salesTable(salesTable);
Старый 28.09.2009, 10:46   #5  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
1) На форме создать public метод. Например barCode()
2) В классе для приема выбранного значения использовать переменную типа object

X++:
    object obj;
    ;
        // Более одного ШК
        args = new Args();
        args.name(formStr(FRM_BarCodePlusInvent));
        args.parm(_itemBarCode);
        formrun = ClassFactory.formRunClass(args);
        formrun.init();
        formrun.run();
        formRun.wait();
        obj = formRun;
        barCode = obj.barCode();
Дело в том, что если переменную formRun типизировать типом FormRun, то компилятор не даст вызвать метод, не объявленный в интерфейсе класса FormRun.
Для переменной типа object такие ограничения сняты. Для таких переменных компилятор использует механизм позднего связывания и в момент выполнения ищет необходимый метод в уже созданном реальном объекте, находящемся в этой переменной.
За это сообщение автора поблагодарили: alex55 (1), Alexx7 (1), mikki_messer (1).
Старый 28.09.2009, 10:47   #6  
s.alex is offline
s.alex
Участник
 
28 / 10 (1) +
Регистрация: 07.06.2007
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
1. Добавьте строчку:
X++:
formrun.args().record(RecID)
2. Прием значения
X++:
RecID = element.args().record();
У меня так работает.
Похоже вы показали как в форму передать запись, а мне нужно из формы вернуть.
Старый 28.09.2009, 10:56   #7  
s.alex is offline
s.alex
Участник
 
28 / 10 (1) +
Регистрация: 07.06.2007
Цитата:
Сообщение от ta_and Посмотреть сообщение
1) На форме создать public метод. Например barCode()
2) В классе для приема выбранного значения использовать переменную типа object

X++:
    object obj;
    ;
        // Более одного ШК
        args = new Args();
        args.name(formStr(FRM_BarCodePlusInvent));
        args.parm(_itemBarCode);
        formrun = ClassFactory.formRunClass(args);
        formrun.init();
        formrun.run();
        formRun.wait();
        obj = formRun;
        barCode = obj.barCode();
Дело в том, что если переменную formRun типизировать типом FormRun, то компилятор не даст вызвать метод, не объявленный в интерфейсе класса FormRun.
Для переменной типа object такие ограничения сняты. Для таких переменных компилятор использует механизм позднего связывания и в момент выполнения ищет необходимый метод в уже созданном реальном объекте, находящемся в этой переменной.
ЗАРАБОТАЛО!!!!
Спасибо.
Старый 28.09.2009, 10:59   #8  
corner77 is offline
corner77
Участник
 
18 / 25 (1) +++
Регистрация: 28.04.2009
Передайте в форму через аргумент класс, из которого проиходит вызов.
args.parmObject(класс вызова формы). На классе сделайте метод для передачи RecId. Получите класс в форме из args и вызовите метод.
Старый 26.04.2013, 10:22   #9  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Нужно сделать практически тоже самое, но не возвращать в класс, а открыть конкретную запись в гриде. Есть класс - наследник от runbase, который вставляет информацию в таблицу из другой таблицы. Необходимо, чтобы после вставки информации и открытия дочерней формы она открывалась только с теми записями, которые соответствуют условию mytable.RContractAccount == PurchTable.RContractAccount).
Я пробовал доинициализировать квери в init формы, но тогда RContractAccount пустой и открываются все записи.
С args-ами мучаюсь 2 день, до сих пор не могу полноценно понять их применение
Старый 26.04.2013, 10:39   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Читайте про Dynalink. Если между вашей таблицей mytable и таблицей PurchTable будет настроена связь по RContractAccount, то тогда достаточно будет при вызове дочерней формы передать в неё args.record() содержащий курсор с нужным значением RContractAccount
Старый 26.04.2013, 10:50   #11  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Читайте про Dynalink. Если между вашей таблицей mytable и таблицей PurchTable будет настроена связь по RContractAccount, то тогда достаточно будет при вызове дочерней формы передать в неё args.record() содержащий курсор с нужным значением RContractAccount
Да, на моей таблице mytable создана связь c PurchTable по rcontractaccount.

То есть мне нужно в методе открытия формы в классе записать в args-record что-то, а потом в ините формы передать этот args.record() ?
Старый 26.04.2013, 10:56   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
То есть мне нужно в методе открытия формы в классе записать в args-record что-то, а потом в ините формы передать этот args.record() ?
В момент открытия дочерней формы, её args.record() уже должен быть заполнен.

Каким кодом вы открываете дочернюю форму?
Вы передаёте в форму args?
Старый 26.04.2013, 11:02   #13  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В момент открытия дочерней формы, её args.record() уже должен быть заполнен.

Каким кодом вы открываете дочернюю форму?
Вы передаёте в форму args?
Да, передаю.
В методе run такой код открытия формы

X++:
 Mytable mytable;
    Args args = new Args();
    FormRun formRun;
    FormDataSource formDataSource;
    ;
    args.name(formstr(Specifications_po_dogovoru));
    args.caller(this);

    formRun = new MenuFunction(menuitemdisplaystr(Specifications_po_dogovoru_watch), MenuItemType::Display).create(args);
    vendSpListJour = this.insert_data_in_VendSp(purchTable);
   
    formRun.init();
    formRun.run();

   formDataSource =  formRun.dataSource(tablestr(mytable_ZTR));
    formDataSource.findRecord(mytable);
    
    args.record(mytable);
  
   
    super();
Только вот в отладчике ничего, кроме Args name не вижу, когда заходит в init формы...

Метод insert_data_in_VendSp вставляет данные в мою таблицу из purchtable.


Переменная formDataSource ищет в дочерней форме запись, которая была добавлена и ставит на неё курсор, это не совсем то, что мне нужно.

Последний раз редактировалось user_ax; 26.04.2013 в 11:18.
Старый 26.04.2013, 11:19   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
вы уже поздно делаете
X++:
args.record(mytable);
это нужно делать до вызова формы, а не после.

И ещё. В args.record нужно помещать не ту таблицу, которая должна отображаться на форме, а ту от которой осуществляется связь с этой подчинённой(дочерней) таблицей. И findRecord в этом случае не нужен. Если связь между таблицами (переданной и отображаемой) есть, то фильтрация произойдёт сама.
За это сообщение автора поблагодарили: user_ax (1).
Старый 26.04.2013, 11:21   #15  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
вы уже поздно делаете
X++:
args.record(mytable);
это нужно делать до вызова формы, а не после.

И ещё. В args.record нужно помещать не ту таблицу, которая должна отображаться на форме, а ту от которой осуществляется связь с этой подчинённой(дочерней) таблицей. И findRecord в этом случае не нужен. Если связь между таблицами (переданной и отображаемой) есть, то фильтрация произойдёт сама.

Хм...парадок получается...У меня на форме должна отображаться mytable и связь с purchtable прописана в relation-ах таблицы mytable.

Получается, в Args.record нужно вставить purchtable и убрать findrecord, попробую.

Последний раз редактировалось user_ax; 26.04.2013 в 11:33.
Старый 26.04.2013, 11:35   #16  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Сделал так, как вы сказали - работает, на форме отображаются только те строки, которые соответствуют связи в таблице! Спасибо! + в карму

Если можно - небольшая просьба: можно какое нибудь задание для работы с args, чтобы понять до конца принцип работы этого класса и чтобы в дальнейшем не задавались такие вопросы? был бы благодарен.
Старый 26.04.2013, 12:14   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В системе есть много мест, где используется args. Запустите поиск по AOT\Forms и посмотрите примеры. Обратите внимание, что входящий args на форме есть всегда, даже если открытие этой формы происходит не программно. Система сама заполняет свойства args в соответствии с контекстом вызова формы. Посмотрите какие ещё свойства/методы есть у класса Args найдите поиском по элементам AOT пример использования каждого.

Почему может не передаваться args().record() ?
С Формы в Класс
Старый 26.04.2013, 12:20   #18  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В системе есть много мест, где используется args. Запустите поиск по AOT\Forms и посмотрите примеры. Обратите внимание, что входящий args на форме есть всегда, даже если открытие этой формы происходит не программно. Система сама заполняет свойства args в соответствии с контекстом вызова формы. Посмотрите какие ещё свойства/методы есть у класса Args найдите поиском по элементам AOT пример использования каждого.

Почему может не передаваться args().record() ?
С Формы в Класс
Спасибо вам большое! Буду искать, смотреть, изучать, чтобы подобных вопросов не возникало больше
Старый 16.05.2013, 00:56   #19  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Дополню тему
Статья на Аксаптапедии про передачу параметров наглядно иллюстрирует как передавать и принимать параметры используя Args.

В дополнение к статье. На формах для запуска форм и отчетов обычно используются пункты меню в виде контрола MenuItemButton. Как в таком случае передать параметры из вызывающей формы в вызываемую форму или отчет? Для этого на вызывающей форме на кнопке MenuItemButton необходимо перекрыть метод Clicked, в методе Clicked необходимо вернуть экземпляр объекта MenuFunction кнопки, а уже на объекте MenuFunction вызвать метод Run с предварительно инициализированными параметрами Args и удалить вызов super().

Образец:
X++:
void clicked()
{
    Args    args;
    ;

    args = new Args();
...
// передача параметров объекту Args
...
    this.menufunction().run(Args); //возвращается объект MenuFunction кнопки --> на объекте MenuFunction вызывается метод Run с параметрами Args
}
Пример из формы EmplSettlement_RU, метод Clicked кнопки SettledTransCredit (AX 2009 RU6):
X++:
void clicked()
{
    Args args = new Args();
    ;
    args.parmEnumType(enumnum(NoYes));
    args.parmEnum(NoYes::Yes);
    args.record(emplSettlementView);
    this.menufunction().run(args);
}
За это сообщение автора поблагодарили: S.Kuskov (3), Alucardkds (1), MerkurievV (0).
Теги
args, возврат, значение, форма

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно получить значение с компонента формы Daido DAX: Программирование 5 05.11.2007 17:37
Как передать значение переменной Аксапты COM-объекту AxaptaUser DAX: Программирование 2 11.07.2007 18:03
как передать значение из диалога в форму, вызываемую через menuItem? алька DAX: Программирование 9 25.06.2007 16:46
Как передать в отчет отфильтрованные данные из формы? ArturK DAX: Программирование 7 23.04.2004 13:59
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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