|
|
#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. |
|
|
|
|
#2 |
|
Участник
|
Первое что бросилось в глаза
X++: value('AS_ComVehicleLink.Node like ("val1")) || |
|
|
|
|
#3 |
|
Участник
|
попробуйте так
X++: .value('( (AS_ComVehicleLink.Node like ("val1")) ||(RWPreliminaryRepair.AutoParkId like ("val2")) )'); |
|
|
|
|
#4 |
|
Участник
|
а лучше вот так
X++: .value(strfmt('((%1.%2 like "%3") || (%1.%4 like "%5"))', qbdsMyTable.name(), fieldStr(MyTable, Node), 'val1', fieldStr(MyTable, AutoParkId), 'val2')); |
|
|
|
|
#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")) ))) Результат тот же. |
|
|
|
|
#6 |
|
Участник
|
|
|
|
|
|
#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. |
|
|
|
|
#8 |
|
Участник
|
Какая версия Ах?
Вот есть одна статейка там в самом низу как раз про LIKE http://www.axaptapedia.com/Expressions_in_query_ranges |
|
|
|
| За это сообщение автора поблагодарили: Logger (3). | |
|
|
#9 |
|
Участник
|
Цитата:
Сообщение от smailik
Какая версия Ах?
Вот есть одна статейка там в самом низу как раз про LIKE http://www.axaptapedia.com/Expressions_in_query_ranges |
|
|
|
|
#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). | |
|
|
#11 |
|
Участник
|
Вот что выдало
Сообщение (17:22:07) ВЗ01000001 КК00000018 ВЗ01000002 КК00000018 ВЗ01000003 КК00000018 ВЗ01000004 КК00000018 5 |
|
|
|
|
#12 |
|
Участник
|
Это в 12? А в 4?
|
|
|
|
|
#13 |
|
Участник
|
|
|
|
|
|
#14 |
|
Участник
|
|
|
|
|
|
#15 |
|
Участник
|
|
|
|
|
|
#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)); |
|
|
|
|
#17 |
|
Участник
|
Надо тщательно проверить запрос в рабочем примере и в том что у вас не работает
X++: filterStr += (strFmt(' (%1.%2 like ("%3")) ', |
|
|
|
| За это сообщение автора поблагодарили: Vlad_ (1). | |
|
|
#18 |
|
Участник
|
Разобрался. Ошибка была в значении, поля, в котором имелся символ обратного слэша. Я его экранировал другим слэшем, но в запросе это не сработало, сработало поместить '@' перед значением
|
|
|
| Теги |
| ax2009, qbds |
|
|
|