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. Мне кажется, более ясным его подход. Спасибо. |
|