![]() |
#1 |
Участник
|
Некорректная работа Extended query в 2012-й с Array полями
Привет.
Пишем модификацию под 12-ку R3 задействовали array поля (аналог Dimension) И вдруг выясняется что для измерений начиная с 2-ки extended query в 12-ке не работает. Хотя это было вылечено еще в 2009-й. Обычный Query работает. Пример - джобик отрабатывает в 2009-й для SysDimension::Center в бд уходит запрос с фильтром такого вида X++: (DIMENSION2_=N'1929') X++: (DIMENSION=N'1929') Но если поставить обычный Query то в 12-ке тоже работает. Может можно как-то это исправить ? В синтаксисе extendedQuery что-то поменять. X++: static void Job503_TestDim(Args _args) { Query query; QueryBuildDataSource qbds; SysQueryRun queryRun; SalesTable salesTable; void test(SysDimension _finSysDimension, SysDim _num) { ; setPrefix(strFmt("%1 - %2", _finSysDimension, _num)); query = new query(); query.literals(1); qbds = query.addDataSource(tableNum(SalesTable)); qbds.addSelectionField(fieldNum(SalesTable, SalesId)); // extended query для измерений начиная с 2 не работает в 12-ке qbds.addRange(fieldNum(SalesTable, RecId)).value( strFmt('((%1.%2=="%3"))', qbds.name(), fieldid2name(tablenum(SalesTable), fieldid2ext(fieldnum(SalesTable, Dimension), Dimensions::code2ArrayIdx(_finSysDimension))), SysQuery::value(_num) ) ); /* // а обычный query - работает qbds.addRange(fieldid2ext(fieldnum(SalesTable, Dimension), Dimensions::code2ArrayIdx(_finSysDimension))).value( SysQuery::value(_num) ); */ queryRun = new SysQueryRun(query); // info(queryRun.toString()); info(queryRun.query().dataSourceNo(1).toString()); // поправил для 2009-й if (queryRun.next()) { salesTable = queryRun.get(tableNum(SalesTable)); info(strFmt("%1", salesTable.SalesId)); } else { warning(strFmt("Нет записей")); } } ; setPrefix(strFmt("Test")); // test(SysDimension::Department, '001'); // для SysDimension::Department - все работает в Extended Query // test(SysDimension::Department, '002'); test(SysDimension::Center, '1929'); // а для SysDimension::Center - уже нет // test(SysDimension::Center, '222'); } Последний раз редактировалось Logger; 18.09.2025 в 14:13. Причина: Исправил строку info(queryRun.toString()); |
|
![]() |
#2 |
Участник
|
Дополню в несколько другой формулировке (а то уточняют - видимо не совсем понятно описал)
в общем в 12-ке есть array поле самописное и для столбцов Filed[2] Filed[3] и.т.п. extendedQuery не отрабатывает. Считает что это Filed[1] Я помню что-то подобное было в 2009-й, но начиная с какого-то сервис пака (кажется SP5) это было исправлено. - Проверил в 2009-й все хорошо на последних билдах |
|
![]() |
#3 |
Участник
|
То есть в Ax если текст запроса посмотреть - он нормальный, а в SQL уходит другой?
Это очень странно. Или он уже в Ax кривой? если да - то где именно ломается внутри этого? X++: strFmt('((%1.%2=="%3"))', qbds.name(), fieldid2name(tablenum(SalesTable), fieldid2ext(fieldnum(SalesTable, Dimension), Dimensions::code2ArrayIdx(_finSysDimension))), SysQuery::value(_num) |
|
![]() |
#4 |
Участник
|
X++: Dimensions::code2ArrayIdx() ну и в SalesTable нет Dimension, там DefaultDimension в 12ке - джоб не компилится |
|
![]() |
#5 |
Участник
|
Цитата:
Скрины не могу выкладывать - превысил лимит по картинкам. Выглядит так X++: info(queryRun.query().dataSourceNo(1).toString()); Цитата:
SELECT WITH FORCE_LITERALS OrderId FROM TreasPayReqTable(TreasPayReqTable_1) WHERE ((((TreasPayReqTable_1.FinDimension[2]=="1929"))))
Цитата:
SELECT T1.ORDERID,T1.RECID FROM TREASPAYREQTABLE T1 WHERE (((PARTITION=5637144576) AND (DATAAREAID=N'mrc')) AND (FINDIMENSION=N'1929')) ORDER BY T1.ORDERID
Последний раз редактировалось Logger; 18.09.2025 в 14:25. |
|
![]() |
#6 |
Участник
|
Цитата:
В 12-ку наверно легко портировать - просто константы поставить например. У нас свои самописные таблички, я мог бы выложить джобик для них, но но у вас их нет. Не сможете повторить. Попробуйте на SalesTable.DEL_Dimension вместо FinDimensions::code2ArrayIdx(_finSysDimension) можно просто поставить (_finSysDimension+ 1) это же джоб |
|
![]() |
#7 |
Участник
|
Кажется придумал как обойти.
Делаем вьюху по табличке. В ней делаем поля View.Dimension1 - мапируется на Table.Dimension[1] View.Dimension2 - мапируется на Table.Dimension[2] View.Dimension3 - мапируется на Table.Dimension[3] в запросе джоиним эту вьюху по первичному ключу (или по RecId) к таблице и накладываем фильтры уже на поля вьюхи. Все работает. Немного геморно, но рабочий вариант. Но может можно без вьюхи ? |
|
Теги |
bug, extended query, extended query syntax |
|
|