| 
			
			 | 
		#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(); Заранее спасибо!!  | 
| 
	
 | 
| 
			
			 | 
		#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();  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 SAP 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Как вариант на стороне вызова создать экземпляр класса, при открытии Вашей формы получить его, записать в него данные закрыть форму, примеров таких масса смотрите как работает журнал и строки, обработка заказа на закупку продажу. А да и по мойму так вызывать не рекомендуют, создайте свой меню айтем и делайте вызов через него, с правами доступа так могут быть проблемы.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#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);  | 
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#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 такие ограничения сняты. Для таких переменных компилятор использует механизм позднего связывания и в момент выполнения ищет необходимый метод в уже созданном реальном объекте, находящемся в этой переменной. Спасибо.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Передайте в форму через аргумент класс, из которого проиходит вызов.  
		
		
		
		
		
		
		
	args.parmObject(класс вызова формы). На классе сделайте метод для передачи RecId. Получите класс в форме из args и вызовите метод.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Нужно сделать практически тоже самое, но не возвращать в класс, а открыть конкретную запись в гриде. Есть класс - наследник от runbase, который вставляет информацию в таблицу из другой таблицы. Необходимо, чтобы после вставки информации и открытия дочерней формы она открывалась только с теми записями, которые соответствуют условию mytable.RContractAccount == PurchTable.RContractAccount).  
		
		
		
		
		
		
		
	Я пробовал доинициализировать квери в init формы, но тогда RContractAccount пустой и открываются все записи. С args-ами мучаюсь 2 день, до сих пор не могу полноценно понять их применение  
		 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Читайте про Dynalink. Если между вашей таблицей mytable и таблицей PurchTable будет настроена связь по RContractAccount, то тогда достаточно будет при вызове дочерней формы передать в неё args.record() содержащий курсор с нужным значением RContractAccount
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
То есть мне нужно в методе открытия формы в классе записать в args-record что-то, а потом в ините формы передать этот args.record() ?  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Каким кодом вы открываете дочернюю форму? Вы передаёте в форму args?  | 
| 
	
 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			вы уже поздно делаете  
		
		
		
		
		
		
		
	X++: args.record(mytable); И ещё. В args.record нужно помещать не ту таблицу, которая должна отображаться на форме, а ту от которой осуществляется связь с этой подчинённой(дочерней) таблицей. И findRecord в этом случае не нужен. Если связь между таблицами (переданной и отображаемой) есть, то фильтрация произойдёт сама.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: user_ax (1). | |
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сделал так, как вы сказали - работает, на форме отображаются только те строки, которые соответствуют связи в таблице! Спасибо! + в карму  
		
		
		
		
		
		
		
	![]() Если можно - небольшая просьба: можно какое нибудь задание для работы с args, чтобы понять до конца принцип работы этого класса и чтобы в дальнейшем не задавались такие вопросы?   был бы благодарен.
		 | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В системе есть много мест, где используется args. Запустите поиск по AOT\Forms и посмотрите примеры. Обратите внимание, что входящий args на форме есть всегда, даже если открытие этой формы происходит не программно. Система сама заполняет свойства args в соответствии с контекстом вызова формы. Посмотрите какие ещё свойства/методы есть у класса Args найдите поиском по элементам AOT пример использования каждого. 
		
		
		
		
		
		
		
	Почему может не передаваться args().record() ? С Формы в Класс  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от S.Kuskov
			 
 
			В системе есть много мест, где используется args. Запустите поиск по AOT\Forms и посмотрите примеры. Обратите внимание, что входящий args на форме есть всегда, даже если открытие этой формы происходит не программно. Система сама заполняет свойства args в соответствии с контекстом вызова формы. Посмотрите какие ещё свойства/методы есть у класса Args найдите поиском по элементам AOT пример использования каждого. 
		
	Почему может не передаваться args().record() ? С Формы в Класс  
		 | 
| 
	
 | 
| 
			
			 | 
		#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, возврат, значение, форма | 
| 
	
	 | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |