|
18.10.2021, 13:10 | #1 |
Участник
|
вопрос про 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 |
Участник
|
Посмотрите по перекрестным ссылкам при каких условиях вызывается initParmDefault
И все поймете сами. Этот метод дергается только если для класса нет записи в SysLastValue. Т.е. один раз всего. Вам надо метод по инициализации в другом месте разместить. |
|
18.10.2021, 13:36 | #3 |
Участник
|
В каком месте рекомендуете?
|
|
18.10.2021, 14:09 | #4 |
Участник
|
initParmDefault() вызывается только в том случае, если это первый запуск. Точнее, если по данному классу нет записи в кеше. В таблице SysLastValue. В противном случае, наполнение полей ввода выполняется в unpack().
Если необходимо, то именно в unpack() надо организовать либо запуск queryBuild(), либо организовать прямую упаковку/распаковку query
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
18.10.2021, 14:26 | #5 |
Участник
|
Простейший вариант выглядит примерно так (макросы 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; } Ну, или так 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 |
Молодой, подающий надежды
|
Посмотрите, как сделано в классах Tutorial_RunbaseForm или RunBaseQuery_RU. От последнего можно и отнаследоваться в принципе, правда стоит отметить, что в обоих есть небольшой баг в методе unpack() при работе в пакете. Подробности тут
__________________
Кононов Пётр |
|