|  03.09.2014, 22:25 | #1 | 
| Участник | Как класс->запрос->форма. Как такое создать? 
			
			Задание: 1) Пользователь жмет на пункт меню, появляется форма запроса по таблице заказов 2) Пользователь забивает критерии , и открываетя форма с выбранными заказами (и их строками) + на форме несколько текстовых полей (для комметариев). 3) Пользователь жмет кнопку "ок" и по выбранным заказам производится определенная операция. Создала класс, в котором в в методе prompt вызываю свою форму стандартно через X++: boolean prompt()
{
    Args formArgs;
    FormRun formRun;
    formArgs = new Args();
    formArgs.name(formStr(myForm));
    formArgs.caller(this);
    formRun = ClassFactory::formRunClassOnClient(formArgs);
    formRun.init();
    formRun.run();
    formRun.wait();
    return formRun.closedOk();
}X++: public void init() { ..... super(); ..... xSysLastValue::getLast(this); if (!queryRun.prompt()) { element.close(); } salesTable_ds.query(queryRun.query()); } Что верно, тк в методе init по сути форма закрыватеся и formRun.wait не имеет уже formRun . Я могу, конечно, проверять formRun на существование после вызова formRun.init()в методе promt(). Но, мне кажется. я что-то идеологически неправильно делаю.  Может, лучше создавать запрос в классе и там же делать queryRun.prompt , а потом передавать его в форму и подставлять в ds? Это тоже коряво, тк зачем отдельно в классе создавать запрос , если форма уже на нем основана и по сути надо дать пользователю именно его изменить... Подскажите, где в системе есть примеры подобного интерфейса? Как правильно его реализовать? | 
|  | 
|  04.09.2014, 09:06 | #2 | 
| Участник | 
			
			Изучите \Classes\Tutorial_RunbaseForm Ну и остальные Tutorial* будут Вам небесполезны   
				__________________ любитель портвейна и снов с прокисшей капустой в усах | 
|  | |
| За это сообщение автора поблагодарили: RVS (1). | |
|  04.09.2014, 11:07 | #3 | 
| Участник | 
			
			Как поможет Tutorial_RunbaseForm, поясните, раз уж решили посоветовать? Мне не нужна кнопка запроса на форме, мне нужно до открытия формы показать пользователю запрос, на основе которого уже отобразятся данные на форме. | 
|  | 
|  04.09.2014, 11:26 | #4 | 
| Участник | 
			
			Как уже писала выше, если создавать запрос в классе и подставлять его потом в запрос формы ,имхо, это неверно, тк если завтра кто-то изменит DSs формы, но не внесет соответствующие изменения в класс, то вся функциональность слетит.  В идеале prompt должен быть по запросу формы Последний раз редактировалось kitty; 04.09.2014 в 11:30. | 
|  | 
|  04.09.2014, 11:26 | #5 | 
| Участник | 
			
			Я бы вынес вызов запроса из метода формы в класс, который запускает форму. Во первых снимается ваша проблема с закрытием формы (в случае отмены - её можно просто не открывать), а во вторых форма получается более универсальной, в том плане что её можно будет использовать и в других сценариях, например, когда фильтр не нужно запрашивать у пользователя.
		 | 
|  | |
| За это сообщение автора поблагодарили: kitty (1). | |
|  04.09.2014, 11:31 | #6 | 
| Участник | 
			
			Я делал FormDataSource.prompt() в методе run формы (кажется после super)
		 | 
|  | 
|  04.09.2014, 12:22 | #7 | 
| Участник | |
|  | |
| За это сообщение автора поблагодарили: kitty (1). | |
|  04.09.2014, 12:47 | #8 | 
| Участник | |
|  | 
|  04.09.2014, 15:34 | #9 | 
| Участник | 
			
			Я делал, проблем не было. Попробуйте, может заработает как надо!
		 | 
|  | |
| За это сообщение автора поблагодарили: kitty (1). | |
|  04.09.2014, 17:20 | #10 | 
| Участник | 
			
			Я поняла, как вы сделали и почему работает . Вы сделали как на форме В наличии. Там, вначала открывается Запрос, потом сама форма, как мне и надо. Но там, если пользователь жмет кнопку Отмена на форме запроса, то открывается форма  "В наличии" без фильтров.  ( +там действительно фильтры накладываются после super(), тк по сути форма - InventOnHandListPage уже открыта.) В моем случае я бы хотела просто отменить выполнение задачи т.е не открывать следующую Форму. Попробовала сделать как порекомендовал S.Kuskov, нашла интересные примеры в стандарте,когда вызывается в RunBase форма запроса вместо диалога (см, например, NumberSeqCleanUp, SalesJournalChangeType etc). Делается так: X++: public Object dialog() { FormRun formRun = classfactory.createQueryForm(this); formRun.init(); return formRun; } Далее, если диалог закрылся по Ок, то я вызываю свою форму( как указано выше) и передаю в нее сформированный запрос и заменяю им родительский ds формы. Имхо, хоть вариант тоже рабочий, но подмены запросов ds и двойные диалоги в runBase делают код менее яснным. | 
|  | 
|  04.09.2014, 20:04 | #11 | 
| Участник | 
			
			Я имел в виду нечто такое. Если не взлетит, не пинайте - писал на коленке. X++: boolean prompt()
{
    Args formArgs;
    FormRun formRun;
    FormDataSource formDataSource;
    boolean ret = false;
    formArgs = new Args();
    formArgs.name(formStr(myForm));
    formArgs.caller(this);
    formRun = ClassFactory::formRunClassOnClient(formArgs);
    formRun.init();
    formDataSource = formRun.dataSource();
    if (formDataSource.queryRun.prompt())    
    {
        formDataSource.query(formDataSource.queryRun.query());
        formRun.run();
        formRun.wait();
        ret = formRun.closedOk();
    }
    return ret;
} | 
|  | 
|  05.09.2014, 12:49 | #12 | 
| Участник | 
			
			Спасибо, но queryRun не существует до run, поэтому совсем без бубнов не взлетит Но я ваш ход мысли поняла, попробую поиграть и так Последний раз редактировалось kitty; 05.09.2014 в 12:59. | 
|  | 
|  08.09.2014, 04:24 | #13 | 
| Участник | 
			
			Может не совсем понял суть задачи.. Форма Коды операций в ГК, в DAX4 во всяком случае, так же открывается? Сначала окно запроса, потом собственно сама форма.
		 | 
|  | 
|  08.09.2014, 19:25 | #14 | 
| Участник | 
			
			Как уже описала выше, если в форме запроса пользователь нажал Cancel, то следующая форма открываться не должна. В этом и разница(в вашем примере форма откроется, но просто без  доп фильтров, тк они как бы не заданы)
		 | 
|  | 
|  09.09.2014, 05:17 | #15 | 
| Участник | 
			
			Чего то я значит все таки не понял в постановке задачи) У меня в аксапте при нажатии отмены в форме запроса ничего далее не открывается. (Для выше названной формы)
		 | 
|  | 
|  09.09.2014, 10:41 | #16 | 
| Участник | 
			
			Не пробовали управлять видимостью? Костыль конечно. Иницируете в фоне форму с параметром невидимый -> ОК -> производится фильтр и показали форму, иначе закройте ее - пользователь и не заметит. По производительности и памяти много не возьмет - вопрос в фильтре по умолчанию. | 
|  | 
|  09.09.2014, 12:52 | #17 | 
| Участник | Цитата: X++: formRun.init();
if(formRun)  
{  
    formRun.run();
    formRun.wait();
}Но написать так , хоть и можно, но так не пишут, коряво это, тк по идее форма не должна "исчезать" после инита...Поэтому я думала, что есть стандартный путь, которого я не улавливаю, тк задача ,имхо, совсем не сложна. В любом случае, вопрос решен. Пока сделала приблизительно так , как написал Kuskov. Мне кажется, более ясным его подход. Спасибо. | 
|  |