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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.10.2021, 13:10   #1  
oleggy is offline
oleggy
Участник
 
270 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
вопрос про RunBaseBatch::queryBuild при showQueryValues = true
Привет всем.
Подскажите имеется такой класс:

X++:
class MyClassRunBaseBatch extends RunBaseBatch
{
	...
	QueryRun        queryRun;
	...
}

...

public boolean init()
{
    return true;
}

public void initParmDefault()
{
    super();

    this.queryBuild(true);
}

public Object dialog()
{
    DialogRunbase       dialog = super();
    ;

    return dialog;
}

protected void queryBuild(boolean _reWrite)
{
    Query                   query = new Query();
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;
    ;

    if (!queryRun || _reWrite)
    {
        qbds = query.addDataSource(tablenum(MyTable));

        qbr = qbds.addRange(fieldnum(Table1, Field1)); 
        qbr.value(sysQuery::value('Value1'));

        qbr = qbds.addRange(fieldnum(Table1, Field1)); 
        qbr.value(sysQuery::valueNot('Value2'));

        qbr = qbds.addRange(fieldnum(Table1, Field2));
        qbr.value(sysQuery::valueNotEmptyString());

        qbr = qbds.addRange(fieldnum(Table1, Field3));
        qbr.value(queryValue(NoYes::No));

        qbr = qbds.addRange(fieldnum(Table1, Field4));
        qbr.value(queryValue(MyEnum::Enum1));

        queryRun = new SysQueryRun(query);
    }
}	

public QueryRun queryRun()
{
    return queryRun;
}

public boolean showQueryValues()
{
    return true;
}

void new()
{
    super();
}

static void main(Args args)
{
    MyClassRunBaseBatch myClassRunBaseBatch;
    ;

    myClassRunBaseBatch = MyClassRunBaseBatch ::construct();

    if (myClassRunBaseBatch.prompt())
        myClassRunBaseBatch.run();
}
...

// ну и остальные методы ...
public void run()
public boolean validate()
server static MyClassRunBaseBatch construct()
static ClassDescription description()
static void main(Args args)


Вопрос:
1. Почему при вызове диалогового окна отображаются фильтры только полей Field1 и Field4 ?
Хотя по логике должны отображается все поля для которых я задаю фильтры в методе queryBuild. Т.е. должно быть отображено 4 фильтра: Field1 / Field2 / Field3 / Field4

2. Как сделать так что бы в окне диалогового окна (когда showQueryValues возвращает true) были заданы значение установленные как раз в методе queryBuild ? У меня почему то там выводит последнее сохраненное значение но для полей Field1 и Field4 (см. вопрос 1)

3. Почему initParmDefault не вызывается? Например в стоковом классе APMUpdateObjectLocation вот такой стек вызовов:
Цитата:
[s] \Classes\APMUpdateObjectLocation\queryBuild 6
[s] \Classes\APMUpdateObjectLocation\initParmDefault 5
[s] \Classes\xSysLastValue\getLast 23
[s] \Classes\RunBase\getLast 9
[s] \Classes\RunBaseBatch\getLast 12
[s] \Classes\RunBase\promptPrim 9
[s] \Classes\RunBase\prompt 12
[s] \Classes\RunBaseBatch\prompt 32
[s] \Classes\APMUpdateObjectLocation\main 8

Похоже я что то упустил раз у меня не происходит этого вызова.

Последний раз редактировалось oleggy; 18.10.2021 в 13:27.
Старый 18.10.2021, 13:33   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Посмотрите по перекрестным ссылкам при каких условиях вызывается initParmDefault
И все поймете сами.

Этот метод дергается только если для класса нет записи в SysLastValue. Т.е. один раз всего. Вам надо метод по инициализации в другом месте разместить.
Старый 18.10.2021, 13:36   #3  
oleggy is offline
oleggy
Участник
 
270 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
В каком месте рекомендуете?
Старый 18.10.2021, 14:09   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
initParmDefault() вызывается только в том случае, если это первый запуск. Точнее, если по данному классу нет записи в кеше. В таблице SysLastValue. В противном случае, наполнение полей ввода выполняется в unpack().

Если необходимо, то именно в unpack() надо организовать либо запуск queryBuild(), либо организовать прямую упаковку/распаковку query
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 18.10.2021, 14:26   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Простейший вариант выглядит примерно так (макросы CurrentVersion и CurrentList в ClassDeclaration указываются)


X++:
public container pack()
{
    return [#CurrentVersion, #CurrentList, queryRun.query().pack()];
}

public boolean unpack(container packedClass)
{
    boolean     ret;
    int         ver = RunBase::getVersion(packedClass);
    container   packedQR;
    ;

    switch (ver)
    {
        case #CurrentVersion:
            [ver, #CurrentList, packedQR] = packedClass;

            if (SysQuery::isPackedOk(packedQR))
            {
                queryRun = new QueryRun(packedQR);
                ret = true;
            }

            break;
    }

    return ret;
}
При этом вызов в initParmDefault() должен также остаться для первичного заполнения Query при первом запуске или после очистки кеша.

Ну, или так

X++:
public container pack()
{
    return [#CurrentVersion, #CurrentList];
}

public boolean unpack(container packedClass)
{
    boolean     ret;
    int         ver = RunBase::getVersion(packedClass);
    ;

    switch (ver)
    {
        case #CurrentVersion:
            [ver, #CurrentList] = packedClass;

            this.queryBuild(true);
            ret = true;

            break;
    }

    return ret;
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 18.10.2021 в 14:28.
Старый 18.10.2021, 19:47   #6  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Посмотрите, как сделано в классах Tutorial_RunbaseForm или RunBaseQuery_RU. От последнего можно и отнаследоваться в принципе, правда стоит отметить, что в обоих есть небольшой баг в методе unpack() при работе в пакете. Подробности тут
__________________
Кононов Пётр
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не создается экземпляр SysMailer в RunBaseBatch pvito DAX: Программирование 3 21.10.2011 15:30
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 04.04.2009 22:05
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 31.03.2009 06:06
Вопрос по Проектам PSA DAX: Функционал 35 19.01.2007 22:26
PatrickChua: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 28.10.2006 18:14

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

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

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