31.01.2020, 15:57 | #1 |
Участник
|
Ошибка расширенного диапазона запроса
Доброго дня. В AX2009 понадобилось наложить расширенный фильтр на датасорс.
Накладываю на подчинённый ds через команду childQBDS.addRange(fieldId).value('AS_ComVehicleLink.Node like ("val1")) ||(RWPreliminaryRepair.AutoParkId like ("val2")) ') Вот полный текст запроса: SELECT FIRSTFAST * FROM RWPreliminaryRepair JOIN FIRSTFAST * FROM AS_ComVehicleLink WHERE RWPreliminaryRepair.VehicleId = AS_ComVehicleLink.VehicleId AND (((AS_ComVehicleLink.Node like ("val1")) || (RWPreliminaryRepair.AutoParkId like ("val2")))) При запуске формы вылетает ошибка : "Ошибка расширенного диапазона запроса: AS_ComVehicleLink.Node не является корректной парой datasource.field рядом с 30." На форуме нашёл совет вручную указать имя подчинённого ds: childQBDS = qbds.addDataSource(tableNum(AS_ComVehicleLink) , "AS_ComVehicleLink"); Если делаю так, то текст запроса остаётся прежним, но ошибка меняется на "Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 85." Последний раз редактировалось Vlad_; 31.01.2020 в 16:35. |
|
31.01.2020, 16:11 | #2 |
Участник
|
Первое что бросилось в глаза
X++: value('AS_ComVehicleLink.Node like ("val1")) || |
|
31.01.2020, 16:13 | #3 |
Участник
|
попробуйте так
X++: .value('( (AS_ComVehicleLink.Node like ("val1")) ||(RWPreliminaryRepair.AutoParkId like ("val2")) )'); |
|
31.01.2020, 16:20 | #4 |
Участник
|
а лучше вот так
X++: .value(strfmt('((%1.%2 like "%3") || (%1.%4 like "%5"))', qbdsMyTable.name(), fieldStr(MyTable, Node), 'val1', fieldStr(MyTable, AutoParkId), 'val2')); |
|
31.01.2020, 16:32 | #5 |
Участник
|
Добавил скобки, команда вышла такая:
qbr.value('( (AS_ComVehicleLink.Node like ("var1")) || (RWPreliminaryRepair.AutoParkId like ("var2")) )'); Общий запрос: SELECT FIRSTFAST * FROM RWPreliminaryRepair JOIN FIRSTFAST * FROM AS_ComVehicleLink WHERE RWPreliminaryRepair.VehicleId = AS_ComVehicleLink.VehicleId AND ((( (AS_ComVehicleLink.Node like ("var1")) || (RWPreliminaryRepair.AutoParkId like ("var2")) ))) Результат тот же. |
|
31.01.2020, 16:34 | #6 |
Участник
|
|
|
31.01.2020, 16:50 | #7 |
Участник
|
Джойним датасорс:
X++: childQBDS = qbds.addDataSource(tableNum(AS_ComVehicleLink), "AS_ComVehicleLink"); // здесь разные ошибки в зависимости от того, указываем или нет имя childQBDS.addLink(fieldNum(RWPreliminaryRepair, VehicleId), fieldNum(AS_ComVehicleLink, VehicleId)); X++: str makerFilterStr(Set _filterSet = filterSet) { SetEnumerator se; str filterStr; ; fldStr = fieldStr(AS_ComVehicleLink, Node); se = _filterSet.getEnumerator(); while (se.moveNext()) { if (!se.current()) { continue; } if (filterStr) { filterStr += "||"; } filterStr += (strFmt(' (%1.%2 like ("%3")) ', childQBDS.name(), fldStr, se.current())); // фильтр по ноде вешаем на подчинённый датасорс } fldStr = fieldStr(RWPreliminaryRepair, AutoParkId); se = autoParkFilterSet.getEnumerator(); while (se.moveNext()) { if (!se.current()) { continue; } if (filterStr) { filterStr += "||"; } filterStr += (strFmt(' (%1.%2 like ("%3")) ', qbds.name(), fldStr, se.current())); // фильтр по площадке на главный } this.parmQBDS(childQBDS); //return filterStr; return strFmt("(%1)",filterStr); } X++: "( (AS_ComVehicleLink.Node like ('val')) || (RWPreliminaryRepair.AutoParkId like ('val2')) )" X++: qbr = childQBDS.addRange(fieldId); qbr.value(filterStr) X++: "SELECT FIRSTFAST * FROM RWPreliminaryRepair JOIN FIRSTFAST * FROM AS_ComVehicleLink WHERE RWPreliminaryRepair.VehicleId = AS_ComVehicleLink.VehicleId AND ((( (AS_ComVehicleLink.Node like ('val1')) || (RWPreliminaryRepair.AutoParkId like ('val2')) )))" Последний раз редактировалось Vlad_; 31.01.2020 в 16:57. |
|
31.01.2020, 17:00 | #8 |
Участник
|
Какая версия Ах?
Вот есть одна статейка там в самом низу как раз про LIKE http://www.axaptapedia.com/Expressions_in_query_ranges |
|
|
За это сообщение автора поблагодарили: Logger (3). |
31.01.2020, 17:12 | #9 |
Участник
|
Цитата:
Сообщение от smailik
Какая версия Ах?
Вот есть одна статейка там в самом низу как раз про LIKE http://www.axaptapedia.com/Expressions_in_query_ranges |
|
31.01.2020, 17:21 | #10 |
Участник
|
X++: CustTable custTable; SalesTable salesTable; Query query; QueryBuildDataSource qbdsCustTable; QueryBuildDataSource qbdsSalesTable; QueryBuildRange qbr; QueryBuildRange qbr2; QueryRun queryRun; int idx; ; query = new Query(); qbdsCustTable = query.addDataSource(tableNum(CustTable)); qbdsSalesTable = qbdsCustTable.addDataSource(tableNum(SalesTable)); qbdsSalesTable.relations(true); qbr = qbdsSalesTable.addRange(fieldNum(SalesTable, TableId)); qbr.value(strfmt('((%1.%2 like "%3") || (%4.%5 like "%6"))', qbdsCustTable.name(), fieldStr(CustTable, AccountNum), '*000018', qbdsSalesTable.name(), fieldStr(SalesTable, CustAccount), '*000018')); queryRun = new QueryRun(query); while (queryRun.next()) { custTable = queryRun.get(tableNum(CustTable)); salesTable = queryRun.get(tableNum(SalesTable)); idx++; if (idx == 5) { break; } info(strFmt("%1 %2", salesTable.SalesId, custTable.AccountNum)); } info(strFmt("%1", idx)); |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
31.01.2020, 17:22 | #11 |
Участник
|
Вот что выдало
Сообщение (17:22:07) ВЗ01000001 КК00000018 ВЗ01000002 КК00000018 ВЗ01000003 КК00000018 ВЗ01000004 КК00000018 5 |
|
31.01.2020, 17:26 | #12 |
Участник
|
Это в 12? А в 4?
|
|
31.01.2020, 17:26 | #13 |
Участник
|
|
|
31.01.2020, 17:28 | #14 |
Участник
|
|
|
31.01.2020, 17:32 | #15 |
Участник
|
|
|
31.01.2020, 17:34 | #16 |
Участник
|
Цитата:
Сообщение от smailik
X++: CustTable custTable; SalesTable salesTable; Query query; QueryBuildDataSource qbdsCustTable; QueryBuildDataSource qbdsSalesTable; QueryBuildRange qbr; QueryBuildRange qbr2; QueryRun queryRun; int idx; ; query = new Query(); qbdsCustTable = query.addDataSource(tableNum(CustTable)); qbdsSalesTable = qbdsCustTable.addDataSource(tableNum(SalesTable)); qbdsSalesTable.relations(true); qbr = qbdsSalesTable.addRange(fieldNum(SalesTable, TableId)); qbr.value(strfmt('((%1.%2 like "%3") || (%4.%5 like "%6"))', qbdsCustTable.name(), fieldStr(CustTable, AccountNum), '*000018', qbdsSalesTable.name(), fieldStr(SalesTable, CustAccount), '*000018')); queryRun = new QueryRun(query); while (queryRun.next()) { custTable = queryRun.get(tableNum(CustTable)); salesTable = queryRun.get(tableNum(SalesTable)); idx++; if (idx == 5) { break; } info(strFmt("%1 %2", salesTable.SalesId, custTable.AccountNum)); } info(strFmt("%1", idx)); |
|
31.01.2020, 17:37 | #17 |
Участник
|
Надо тщательно проверить запрос в рабочем примере и в том что у вас не работает
X++: filterStr += (strFmt(' (%1.%2 like ("%3")) ', |
|
|
За это сообщение автора поблагодарили: Vlad_ (1). |
31.01.2020, 18:22 | #18 |
Участник
|
Разобрался. Ошибка была в значении, поля, в котором имелся символ обратного слэша. Я его экранировал другим слэшем, но в запросе это не сработало, сработало поместить '@' перед значением
|
|
Теги |
ax2009, qbds |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|