AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.01.2020, 15:57   #1  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Ошибка расширенного диапазона запроса
Доброго дня. В 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  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Первое что бросилось в глаза
X++:
value('AS_ComVehicleLink.Node like ("val1")) ||
Перед || у вас две закрывающихся скобки, а перед только одна открывающаяся
Старый 31.01.2020, 16:13   #3  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
попробуйте так
X++:
.value('( (AS_ComVehicleLink.Node like ("val1")) ||(RWPreliminaryRepair.AutoParkId like ("val2")) )');
Старый 31.01.2020, 16:32   #4  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Добавил скобки, команда вышла такая:
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:20   #5  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
а лучше вот так
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:34   #6  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Цитата:
Сообщение от smailik Посмотреть сообщение
а лучше вот так
X++:
.value(strfmt('((%1.%2 like "%3") || (%1.%4 like "%5"))',
    qbdsMyTable.name(),
    fieldStr(MyTable, Node),
    'val1',
    fieldStr(MyTable, AutoParkId),
    'val2'));
Да, ровно так эта строка и генерится, только поля на разных таблицах и на разных ds расположены
Старый 31.01.2020, 16:50   #7  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Джойним датасорс:
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);
}
filterStr в этом месте равно
X++:
 "( (AS_ComVehicleLink.Node like ('val')) || (RWPreliminaryRepair.AutoParkId like ('val2')) )"
Накладываем фильтр:
X++:
qbr = childQBDS.addRange(fieldId);
qbr.value(filterStr)
Текст qbds в этом месте:
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:26   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Vlad_ Посмотреть сообщение
X++:
    this.parmQBDS(childQBDS);
Что у вас делает этот метод? Вы случайно не переопределяете основной источник данных на вложенный?
Старый 31.01.2020, 17:28   #9  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Что у вас делает этот метод? Вы случайно не переопределяете основной источник данных на вложенный?
Нет, не на форме. Подставляю его в класс, чтобы фильтр накладывался именно на подчинённый ds. На форме остаётся родительский.
Старый 31.01.2020, 17:00   #10  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Какая версия Ах?
Вот есть одна статейка там в самом низу как раз про LIKE
http://www.axaptapedia.com/Expressions_in_query_ranges
За это сообщение автора поблагодарили: Logger (3).
Старый 31.01.2020, 17:12   #11  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Цитата:
Сообщение от smailik Посмотреть сообщение
Какая версия Ах?
Вот есть одна статейка там в самом низу как раз про LIKE
http://www.axaptapedia.com/Expressions_in_query_ranges
Версия 5.0. LIKE должен в ней работать, согласно этой статье. Синтаксис кажется тоже совпадает. На всякий случай попробовал заменить like на ==, ничего не изменилось
Старый 31.01.2020, 17:21   #12  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
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));
Вот это у меня в Ах4 не работает, в Ах12 работает
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 31.01.2020, 17:34   #13  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Цитата:
Сообщение от 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));
Вот это у меня в Ах4 не работает, в Ах12 работает
Хм, в пятёрке отработало нормально. Значит проблема не в like и не в наличие двух датасорсов
Старый 31.01.2020, 17:22   #14  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Вот что выдало
Сообщение (17:22:07)
ВЗ01000001 КК00000018
ВЗ01000002 КК00000018
ВЗ01000003 КК00000018
ВЗ01000004 КК00000018
5
Старый 31.01.2020, 17:26   #15  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Это в 12? А в 4?
Старый 31.01.2020, 17:32   #16  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
Сообщение от Vlad_ Посмотреть сообщение
Это в 12? А в 4?
В Ах4 вот что
Сообщение (17:31:45)
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 31.
Старый 31.01.2020, 17:37   #17  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Надо тщательно проверить запрос в рабочем примере и в том что у вас не работает
X++:
filterStr += (strFmt(' (%1.%2 like ("%3")) ',
У вас параметр для LIKE в скобках, быть может это не единственное различие. Хотя конечно не знаю влияют ли эти скобки
За это сообщение автора поблагодарили: Vlad_ (1).
Старый 31.01.2020, 18:22   #18  
Vlad_ is offline
Vlad_
Участник
 
11 / 10 (1) +
Регистрация: 24.09.2019
Адрес: Санкт-Петербург
Разобрался. Ошибка была в значении, поля, в котором имелся символ обратного слэша. Я его экранировал другим слэшем, но в запросе это не сработало, сработало поместить '@' перед значением
Теги
ax2009, qbds

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка расширенного диапазона запроса samolalex DAX: Программирование 2 18.04.2014 00:59
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 0. uskutus DAX: Программирование 5 11.04.2012 13:48
Ошибка расширенного диапазона запроса: stTable2.ItemId не является корректной парой datasource.field рядом с 24. uchenik DAX: Программирование 14 05.05.2011 08:47
Ошибка расширенного диапазона Yugene DAX: Программирование 1 21.04.2006 10:36
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:09.