|  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 | 
|  | 
| 
 |