25.12.2020, 06:33 | #1 |
Участник
|
Проблема с Query в классе RunBaseBatch в AX 2012
Доброго времени суток!!! Столкнулся с такой проблемой в динамическом запросе класса RunBaseBatch при добавления метода InitQuery() в класс и выборкой критериев не работает запрос ( приведен ниже). т.е. не находит запись хотя тот же запрос в джобе работает на ура. Сначала думал что проблема в запаковке, наткнулся на то что влияет на неработоспособность запроса кол-во выбранных критериев по одному полю из таблицы. если добавить на форме диалога еще критерий то при этом на диалоговом окне класса запрос обрезает критерии. Но если смотреть строку запроса то она не обрезанная.
Запрос protected void initQuery() { Query query = new Query(); QueryBuildDataSource qbdsCustEtranInvoices, qbdsEtranInvoicesStateTable; QueryBuildRange qbrCustEtranInvoices, qbrEtranInvoicesStateTable; ; qbdsCustEtranInvoices = query.addDataSource(tableNum(CustEtranInvoices)); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldNum(CustEtranInvoices, GU27Num)); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldNum(CustEtranInvoices, GU27NumForClaim));//ЭУ091220 qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldNum(CustEtranInvoices, TypeRelationship)); qbrCustEtranInvoices.value(queryValue(EtranTypeRelationship::Cust)); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, SendPost)); qbrCustEtranInvoices.value(queryValue(NoYes::No)); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, TicketPost)); qbrCustEtranInvoices.value(queryValue(NoYes::No)); qbrCustEtranInvoices.status(RangeStatus::Locked); /*qbdsEtranInvoicesStateTable = qbdsCustEtranInvoices.addDataSource(tableNum(EtranInvoicesStateTable)); qbdsEtranInvoicesStateTable.joinMode(JoinMode::InnerJoin); qbdsEtranInvoicesStateTable.relations(true);*/ // Джоин таблицы названий енумов пока не в приоритете qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::vputi))); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::rabotasdokumentomokonchena))); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::gruzpribyl))); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState:oluchateluvedomlen))); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::raskreditovan))); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::gotovkomplektdokumentov))); qbrCustEtranInvoices.status(RangeStatus::Locked); qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState)); qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::gruzprinjatkperevozke))); qbrCustEtranInvoices.status(RangeStatus::Locked); //TODO:MNI какой то баг нашел разбираться нужно. //info(strFmt("%1", query.dataSourceNo(1).toString())); queryRun = new SysQueryRun(query); } Последний раз редактировалось Nick42; 25.12.2020 в 06:39. Причина: уменьшение кол-ва пробелов в запросе |
|
25.12.2020, 06:48 | #2 |
Участник
|
Прилагаю скриншоты.
https://yadi.sk/i/RlsyMAYsM_za5Q во втором видно что на диалоге запрос обрезан https://yadi.sk/i/R8dGJrg_1biPmA Последний раз редактировалось Nick42; 25.12.2020 в 06:50. Причина: не загрузились картинки |
|
25.12.2020, 08:04 | #3 |
Участник
|
Похоже где то идет усечение до 20 символов, как раз до длины номера накладной. Проверяйте, возможно где то в цепочке вызовов идет присвоение переменной или параметру функции с типом invoiceid или еще каким наследником edt Num.
|
|
25.12.2020, 08:44 | #4 |
Участник
|
Цитата:
Может поможет SQL запрос. SELECT * FROM CustEtranInvoices(CustEtranInvoices_1) WHERE ((TypeRelationship = 0)) AND ((SendPost = 0)) AND ((TicketPost = 0)) AND ((EtranInvoiceState = 35) OR (EtranInvoiceState = 44) OR (EtranInvoiceState = 36) OR (EtranInvoiceState = 38) OR (EtranInvoiceState = 42) OR (EtranInvoiceState = 32) OR (EtranInvoiceState = 4)) |
|
25.12.2020, 12:02 | #5 |
Участник
|
Цитата:
То что на диалоге отображение усекается проблемы не должно вызывать. Там используется EDT RunBaseRange, у которого длина отображения 20. Если подсчитать что перечислено на скриншоте это 18 символов, остальные просто не показываются в диалоговом окне. Главное, что есть по кнопке "Выбрать", ну и что в запросе. Судя по последнему приведенному запросу с условием все в порядке, ничего не обрезается. |
|
25.12.2020, 12:06 | #6 |
Участник
|
Так что в своем InitQuery смотрите что в переменной qbdsCustEtranInvoices , а еще лучше перед пробегом по QueryRun получите этот qbdsCustEtranInvoices из Query (типа qbdsCustEtranInvoices.query().dataSourceTable(tableNum(CustEtranInvoices))) и смотрите что там.
|
|
25.12.2020, 13:03 | #7 |
Участник
|
Цитата:
З.Ы. EtranInvoiceState метка на енум там есть таблица со значениями. |
|
25.12.2020, 14:19 | #8 |
Участник
|
Вот несколько вариантов, которые надо попробовать
1) Выведите текст запроса, который генерирует ваш QueryRun не в методе initQuery(), а в том методе, который уже реально выбирает данные. Вот такой командой Цитата:
throw error(queryRun.query().dataSourceNo(1).toString());
2) После модификации метода initQuery вы забыли увеличить #currentVersion в декларации класса, и поэтому у вас распаковывается старая версия запроса. 3) В методе initQuery() добавьте строку X++: queryRun.saveUserSetup(false); UPD: 4) Проверьте, что метод initQuery() вызывается. И вызывается только при первом запуске после увеличения #currentVersion. Начиная со второго запуска он уже не должен вызываться. UPD2: 5) Проверьте, что ваш QueryRun запаковывается в методе pack() и распаковывается в методе unpack()
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ Последний раз редактировалось Ace of Database; 25.12.2020 в 14:27. |
|
27.12.2020, 08:13 | #9 |
Участник
|
1. Уже пробовал но еще раз сделал чтобы показать запрос до цикла.
total = SysQuery::countTotal(queryRun); info(strFmt(queryRun.query().dataSourceNo(1).toString())); if(total) { this.progressInit(this.caption(), total, "104.avi"); this.parmProgress().setText("Обработка данных"); while (queryRun.next()) { Запрос SELECT * FROM CustEtranInvoices(CustEtranInvoices_1) WHERE ((TypeRelationship = 0)) AND ((SendPost = 0)) AND ((TicketPost = 0)) AND ((EtranInvoiceState = 35) OR (EtranInvoiceState = 44) OR (EtranInvoiceState = 36) OR (EtranInvoiceState = 38) OR (EtranInvoiceState = 42) OR (EtranInvoiceState = 32) OR (EtranInvoiceState = 4)) Параметры https://yadi.sk/i/aTvrYaxRSn4FNg |
|
27.12.2020, 08:15 | #10 |
Участник
|
2. Не забыл, версию изменяю при любом изменение Query.
Последний раз редактировалось Nick42; 27.12.2020 в 08:21. |
|
27.12.2020, 08:34 | #11 |
Участник
|
3. Тоже пробовал только иначе перекрытием метода allowSaveLast.
|
|
27.12.2020, 08:36 | #12 |
Участник
|
4 Все верно 1 раз при смене версии заходит.
5 Все методы pack() и unpack() работают исправно. Мне интересно почему после вызова расширенного фильтра и введение в него номера в 3 рисунке его обрезает на форме? 1 до https://yadi.sk/i/aTvrYaxRSn4FNg 2 во время https://yadi.sk/i/B9xhvHPelOzKeg 3 после нажатия ОК https://yadi.sk/i/Qm8h0XBDy5FdHQ Последний раз редактировалось Nick42; 27.12.2020 в 08:41. |
|
27.12.2020, 22:27 | #13 |
Участник
|
Глубоко не копал, но, "на вскидку" сразу же наткнулся на ограничение количества отображаемых Range на форме диалога в классе \Classes\RunBaseDialogModify
X++: // \Classes\RunBaseDialogModify\addQueryDatasource - здесь инициализация при открытии диалога // Add ranges defined in datasource while (curRangeFields <= #MAXRANGES && currentRange <= rangeCount) (...) // Add the specific element of the array field // that has been specified by the query. // Тут все правильно. Если поле то же самое, то счетчик curRangeFields не увеличивается curRangeFields += this.addField( sysDictField, fieldNameSet, sysDictField.label(), queryBuildRange.value()); (...) Теперь жмем кнопку расширенного фильтра и после сохранения попадаем вот сюда X++: // \Classes\RunBaseDialogModify\updateQuery - это обновление после кнопки расширенного фильтра // Loop through the ranges for the data source. while (curRangeFields <= #MAXRANGES && currentRange <= rangeCount) (...) fieldNameEnabledSet = this.addRangeAndFilterToDialog( sysDictField, queryBuildRange.value(), fieldNameEnabledSet, dialogGroupTable, curRangeFields); // И вот здесь безусловное увеличение счетчика curRangeFields++; (...) Т.е. отображать-то отображает, но не более указанного количества. По умолчанию, не более 8 Range. Причем в данном синтаксисе каждое значение пойдет как отдельный Range. Вот их и обрезали. Просто достигли предела цикла Видимо, тут надо добавить проверку на количество элементов в возвращенном fieldNameEnabledSet. Т.е. цикл ограничить не переменной curRangeFields, а как-то так X++: // Loop through the ranges for the data source. while (fieldNameEnabledSet.elements() <= #MAXRANGES && currentRange <= rangeCount)
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
28.12.2020, 12:02 | #14 |
Участник
|
Попробуйте в методе initQuery в команде qbrCustEtranInvoices.value() передать сразу все значения через запятую. И опять увеличьте currentVersion. Т.е. передавайте значения перечисления сразу все через запятую, а не через новый range.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
28.12.2020, 12:10 | #15 |
Участник
|
Спасибо! Это я уже раньше сделал так работает если сделать его открытым и перечислить все элементы через запятую то работает на ура! Вопрос то почему так не работает а после урезания меняется Query. Хотя по строке запрос не урезан но строк не находит т.е. QueryRun пуст)
|
|
|
|