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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.09.2014, 22:25   #1  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Как класс->запрос->форма. Как такое создать?
Задание:
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();
}
Так как форма запроса, показываемая пользователю, по сути - запрос , используемый на форме, я вызываю в init формы queryRun.promt(), а потом подставляю его в запрос формы.
X++:
public void  init()
{   .....
    super();
    .....
    xSysLastValue::getLast(this);

    if (!queryRun.prompt())
    {
        element.close();
    }
    salesTable_ds.query(queryRun.query());
}
Все работает, но , если пользователь нажимает Отмена на форме запроса, то вываливается ошибка , что метод detach() или wait() вызван до run().
Что верно, тк в методе init по сути форма закрыватеся и formRun.wait не имеет уже formRun .
Я могу, конечно, проверять formRun на существование после вызова formRun.init()в методе promt(). Но, мне кажется. я что-то идеологически неправильно делаю. Может, лучше создавать запрос в классе и там же делать queryRun.prompt , а потом передавать его в форму и подставлять в ds? Это тоже коряво, тк зачем отдельно в классе создавать запрос , если форма уже на нем основана и по сути надо дать пользователю именно его изменить...

Подскажите, где в системе есть примеры подобного интерфейса? Как правильно его реализовать?
Старый 04.09.2014, 09:06   #2  
eugene egorov is offline
eugene egorov
Участник
Аватар для eugene egorov
 
273 / 97 (4) ++++
Регистрация: 05.06.2002
Адрес: Москва
Изучите \Classes\Tutorial_RunbaseForm
Ну и остальные Tutorial* будут Вам небесполезны
__________________
любитель портвейна и снов с прокисшей капустой в усах
За это сообщение автора поблагодарили: RVS (1).
Старый 04.09.2014, 11:07   #3  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Как поможет Tutorial_RunbaseForm, поясните, раз уж решили посоветовать?

Мне не нужна кнопка запроса на форме, мне нужно до открытия формы показать пользователю запрос, на основе которого уже отобразятся данные на форме.
Старый 04.09.2014, 11:26   #4  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Как уже писала выше, если создавать запрос в классе и подставлять его потом в запрос формы ,имхо, это неверно, тк если завтра кто-то изменит DSs формы, но не внесет соответствующие изменения в класс, то вся функциональность слетит.
В идеале prompt должен быть по запросу формы

Последний раз редактировалось kitty; 04.09.2014 в 11:30.
Старый 04.09.2014, 11:26   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я бы вынес вызов запроса из метода формы в класс, который запускает форму. Во первых снимается ваша проблема с закрытием формы (в случае отмены - её можно просто не открывать), а во вторых форма получается более универсальной, в том плане что её можно будет использовать и в других сценариях, например, когда фильтр не нужно запрашивать у пользователя.
За это сообщение автора поблагодарили: kitty (1).
Старый 04.09.2014, 11:31   #6  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Цитата:
Сообщение от kitty Посмотреть сообщение
Как поможет Tutorial_RunbaseForm, поясните, раз уж решили посоветовать?

Мне не нужна кнопка запроса на форме, мне нужно до открытия формы показать пользователю запрос, на основе которого уже отобразятся данные на форме.
Я делал FormDataSource.prompt() в методе run формы (кажется после super)
Старый 04.09.2014, 12:22   #7  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
Цитата:
Сообщение от kitty Посмотреть сообщение
Подскажите, где в системе есть примеры подобного интерфейса? Как правильно его реализовать?
какая то из форм "в наличии" так делает - сперва показывает форму параметров запроса потом уже отображает само наличие
За это сообщение автора поблагодарили: kitty (1).
Старый 04.09.2014, 12:47   #8  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Цитата:
Сообщение от Dreadlock Посмотреть сообщение
Я делал FormDataSource.prompt() в методе run формы (кажется после super)
На сколько я понимаю,после super форма уже открыта будет.
Если до super делать prompt по запросу формы, то проблема, будет та же, что и если в init его писать..
Старый 04.09.2014, 15:34   #9  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Я делал, проблем не было. Попробуйте, может заработает как надо!
За это сообщение автора поблагодарили: kitty (1).
Старый 04.09.2014, 17:20   #10  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Я поняла, как вы сделали и почему работает . Вы сделали как на форме В наличии. Там, вначала открывается Запрос, потом сама форма, как мне и надо. Но там, если пользователь жмет кнопку Отмена на форме запроса, то открывается форма "В наличии" без фильтров.
( +там действительно фильтры накладываются после super(), тк по сути форма - InventOnHandListPage уже открыта.)

В моем случае я бы хотела просто отменить выполнение задачи т.е не открывать следующую Форму.
Попробовала сделать как порекомендовал S.Kuskov, нашла интересные примеры в стандарте,когда вызывается в RunBase форма запроса вместо диалога
(см, например, NumberSeqCleanUp, SalesJournalChangeType etc).
Делается так:
X++:
public Object dialog()
{
    FormRun formRun = classfactory.createQueryForm(this);
    formRun.init();
    return formRun;
}
при этом, нужно сам queryRun инициализировать уже в New()!

Далее, если диалог закрылся по Ок, то я вызываю свою форму( как указано выше) и передаю в нее сформированный запрос и заменяю им родительский ds формы. Имхо, хоть вариант тоже рабочий, но подмены запросов ds и двойные диалоги в runBase делают код менее яснным.
Старый 04.09.2014, 20:04   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я имел в виду нечто такое. Если не взлетит, не пинайте - писал на коленке.
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  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Спасибо, но queryRun не существует до run, поэтому совсем без бубнов не взлетит
Но я ваш ход мысли поняла, попробую поиграть и так

Последний раз редактировалось kitty; 05.09.2014 в 12:59.
Старый 08.09.2014, 04:24   #13  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Может не совсем понял суть задачи.. Форма Коды операций в ГК, в DAX4 во всяком случае, так же открывается? Сначала окно запроса, потом собственно сама форма.
Старый 08.09.2014, 19:25   #14  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Цитата:
Сообщение от Perc Посмотреть сообщение
Может не совсем понял суть задачи.. Форма Коды операций в ГК, в DAX4 во всяком случае, так же открывается? Сначала окно запроса, потом собственно сама форма.
Как уже описала выше, если в форме запроса пользователь нажал Cancel, то следующая форма открываться не должна. В этом и разница(в вашем примере форма откроется, но просто без доп фильтров, тк они как бы не заданы)
Старый 09.09.2014, 05:17   #15  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от kitty Посмотреть сообщение
Как уже описала выше, если в форме запроса пользователь нажал Cancel, то следующая форма открываться не должна. В этом и разница(в вашем примере форма откроется, но просто без доп фильтров, тк они как бы не заданы)
Чего то я значит все таки не понял в постановке задачи) У меня в аксапте при нажатии отмены в форме запроса ничего далее не открывается. (Для выше названной формы)
Старый 09.09.2014, 10:41   #16  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Не пробовали управлять видимостью? Костыль конечно.
Иницируете в фоне форму с параметром невидимый -> ОК -> производится фильтр и показали форму, иначе закройте ее - пользователь и не заметит.
По производительности и памяти много не возьмет - вопрос в фильтре по умолчанию.
Старый 09.09.2014, 12:52   #17  
kitty is offline
kitty
Участник
 
367 / 26 (1) +++
Регистрация: 24.05.2005
Цитата:
Сообщение от Perc Посмотреть сообщение
Чего то я значит все таки не понял в постановке задачи) У меня в аксапте при нажатии отмены в форме запроса ничего далее не открывается. (Для выше названной формы)
Если создавать форму в классе, то надо было бы делать приблизительно так:
X++:
formRun.init();
if(formRun)  
{  
    formRun.run();
    formRun.wait();
}
- т.е надо проверять formRun, тк если пользователь закрыл диалог фильтрации по Cancel, то мы закрываем саму форму еще в процессе init и run/wait уже не на ком вызывать.
Но написать так , хоть и можно, но так не пишут, коряво это, тк по идее форма не должна "исчезать" после инита...Поэтому я думала, что есть стандартный путь, которого я не улавливаю, тк задача ,имхо, совсем не сложна.

В любом случае, вопрос решен. Пока сделала приблизительно так , как написал Kuskov. Мне кажется, более ясным его подход. Спасибо.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Новый класс создается как копия существующего с другого слоя Владимир Максимов DAX: Программирование 9 15.06.2014 21:16
программно сохранить пользовательский запрос Varmen DAX: Программирование 13 28.04.2010 01:03
класс InventSumDateValueReportDim Физические запасы? Poleax DAX: Программирование 12 01.07.2008 15:27
как создать класс в Axapta? andreynikolai DAX: Программирование 4 12.04.2002 18:00
Класс xSysLastValue Maxim Gorbunov DAX: База знаний и проекты 0 27.11.2001 17:39

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

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

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