28.09.2009, 10:37 | #1 |
Участник
|
Как из формы передать значение?
Добрый день.
Из класса открываю форму, в которой в Гриде нужно выбрать запись и вернуть обратно в класс. Это не 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 |
Сам.AX
|
Цитата:
Сообщение от 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(); Заранее спасибо!! X++: formrun.args().record(RecID) X++: RecID = element.args().record(); |
|
28.09.2009, 10:43 | #3 |
SAP
|
Как вариант на стороне вызова создать экземпляр класса, при открытии Вашей формы получить его, записать в него данные закрыть форму, примеров таких масса смотрите как работает журнал и строки, обработка заказа на закупку продажу. А да и по мойму так вызывать не рекомендуют, создайте свой меню айтем и делайте вызов через него, с правами доступа так могут быть проблемы.
|
|
28.09.2009, 10:44 | #4 |
Боец
|
1. В своем классе объявите метод, напр:
X++: public SalesTable parmSalesTable(SalesTable _salesTable = salesTable) { ; salesTable = _salesTable; return salesTable; } X++: args.caller(this); X++: MyClass myClass = element.args.caller(); ; myClass.salesTable(salesTable); |
|
28.09.2009, 10:46 | #5 |
Участник
|
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(); Для переменной типа object такие ограничения сняты. Для таких переменных компилятор использует механизм позднего связывания и в момент выполнения ищет необходимый метод в уже созданном реальном объекте, находящемся в этой переменной. |
|
|
За это сообщение автора поблагодарили: alex55 (1), Alexx7 (1), mikki_messer (1). |
28.09.2009, 10:47 | #6 |
Участник
|
|
|
28.09.2009, 10:56 | #7 |
Участник
|
Цитата:
Сообщение от 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(); Для переменной типа object такие ограничения сняты. Для таких переменных компилятор использует механизм позднего связывания и в момент выполнения ищет необходимый метод в уже созданном реальном объекте, находящемся в этой переменной. Спасибо. |
|
28.09.2009, 10:59 | #8 |
Участник
|
Передайте в форму через аргумент класс, из которого проиходит вызов.
args.parmObject(класс вызова формы). На классе сделайте метод для передачи RecId. Получите класс в форме из args и вызовите метод. |
|
26.04.2013, 10:22 | #9 |
Участник
|
Нужно сделать практически тоже самое, но не возвращать в класс, а открыть конкретную запись в гриде. Есть класс - наследник от runbase, который вставляет информацию в таблицу из другой таблицы. Необходимо, чтобы после вставки информации и открытия дочерней формы она открывалась только с теми записями, которые соответствуют условию mytable.RContractAccount == PurchTable.RContractAccount).
Я пробовал доинициализировать квери в init формы, но тогда RContractAccount пустой и открываются все записи. С args-ами мучаюсь 2 день, до сих пор не могу полноценно понять их применение |
|
26.04.2013, 10:39 | #10 |
Участник
|
Читайте про Dynalink. Если между вашей таблицей mytable и таблицей PurchTable будет настроена связь по RContractAccount, то тогда достаточно будет при вызове дочерней формы передать в неё args.record() содержащий курсор с нужным значением RContractAccount
|
|
26.04.2013, 10:50 | #11 |
Участник
|
Цитата:
То есть мне нужно в методе открытия формы в классе записать в args-record что-то, а потом в ините формы передать этот args.record() ? |
|
26.04.2013, 10:56 | #12 |
Участник
|
Цитата:
Каким кодом вы открываете дочернюю форму? Вы передаёте в форму args? |
|
26.04.2013, 11:02 | #13 |
Участник
|
Цитата:
В методе 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(); Метод insert_data_in_VendSp вставляет данные в мою таблицу из purchtable. Переменная formDataSource ищет в дочерней форме запись, которая была добавлена и ставит на неё курсор, это не совсем то, что мне нужно. Последний раз редактировалось user_ax; 26.04.2013 в 11:18. |
|
26.04.2013, 11:19 | #14 |
Участник
|
вы уже поздно делаете
X++: args.record(mytable); И ещё. В args.record нужно помещать не ту таблицу, которая должна отображаться на форме, а ту от которой осуществляется связь с этой подчинённой(дочерней) таблицей. И findRecord в этом случае не нужен. Если связь между таблицами (переданной и отображаемой) есть, то фильтрация произойдёт сама. |
|
|
За это сообщение автора поблагодарили: user_ax (1). |
26.04.2013, 11:21 | #15 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Сделал так, как вы сказали - работает, на форме отображаются только те строки, которые соответствуют связи в таблице! Спасибо! + в карму
Если можно - небольшая просьба: можно какое нибудь задание для работы с args, чтобы понять до конца принцип работы этого класса и чтобы в дальнейшем не задавались такие вопросы? был бы благодарен. |
|
26.04.2013, 12:14 | #17 |
Участник
|
В системе есть много мест, где используется args. Запустите поиск по AOT\Forms и посмотрите примеры. Обратите внимание, что входящий args на форме есть всегда, даже если открытие этой формы происходит не программно. Система сама заполняет свойства args в соответствии с контекстом вызова формы. Посмотрите какие ещё свойства/методы есть у класса Args найдите поиском по элементам AOT пример использования каждого.
Почему может не передаваться args().record() ? С Формы в Класс |
|
26.04.2013, 12:20 | #18 |
Участник
|
Цитата:
Сообщение от S.Kuskov
В системе есть много мест, где используется args. Запустите поиск по AOT\Forms и посмотрите примеры. Обратите внимание, что входящий args на форме есть всегда, даже если открытие этой формы происходит не программно. Система сама заполняет свойства args в соответствии с контекстом вызова формы. Посмотрите какие ещё свойства/методы есть у класса Args найдите поиском по элементам AOT пример использования каждого.
Почему может не передаваться args().record() ? С Формы в Класс |
|
16.05.2013, 00:56 | #19 |
Талантливый разгвоздяй
|
Дополню тему
Статья на Аксаптапедии про передачу параметров наглядно иллюстрирует как передавать и принимать параметры используя 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 } 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, возврат, значение, форма |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|