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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2019, 16:31   #1  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Angry QueryRange ошибка
Приветствую!

Необходимо создать элементарный запрос с помощью динамического Query, но при задании Range выводится ошибка "Ошибка расширенного диапазона запроса: Задано недопустимое имя функции в 11." И запрос отрабатывается не корректно, он просто выводит все строки из таблицы, будто ограничений нет.
Range задаю таким образом
qbr.value(strFmt('((%1 >= %2) && (%1 <= %2))',
fieldStr(FISalesPlanLine_ICL, Year),
queryValue(int2str(2018))));

Пример брал с http://www.axaptapedia.com/Expressions_in_query_ranges.

С Query не часто работал, но по идее все должно отрабатывать нормально, но не работает.

Немного понятно как отрабатывает range при задании таким образом:
qbr = qbds.addRange(fieldNum(FISalesPlanLine_ICL, Year));
qbr.value(" < 2019");
И ошибки нет, и отрабатывает запрос как надо. Но если задать по этому же полю второе ограничение, то внутри класса между двумя range ставится OR, а мне нужно AND. Если кто то подскажет как при задании двух addRange по одному полю сделать чтобы между ними было AND - буду очень благодарен.
Ещё момент, если написать qbr.value(" <= 2019"); вместо qbr.value(" < 2019");, то снова вылезает ошибка о неверном условии.
Старый 24.01.2019, 16:53   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,415 / 913 (33) +++++++
Регистрация: 13.01.2004
Имя поля (Year) совпало с именем функции year(), что и вызывает проблемы

Advanced query range value expressions: поле таблицы - имя вcтроенной функции year().

Если надо только 2 условия, то можно для первого использовать fieldNum(), а для второго global::filedIdExt().

Т.е. для второго условия как для первого элемента поля-массива. Идентификаторы получатся разные и это интерпретируется построителем как разные поля. Соответственно, объединение через AND

PS: По приведенной тобой ссылке есть пример с алиасами полей в условии (%1.%2 < %3) попробуй этот вариант решения
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 24.01.2019 в 16:59.
Старый 24.01.2019, 16:57   #3  
Weez is offline
Weez
Участник
Axapta Retail User
 
203 / 75 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
(%1 >= %2) && (%1 <= %2) - условие странное
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 24.01.2019, 18:04   #4  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от Weez Посмотреть сообщение
(%1 >= %2) && (%1 <= %2) - условие странное
Мне нужна выборка по диапазону дат. Можно как то по другому?
Старый 24.01.2019, 18:09   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,415 / 913 (33) +++++++
Регистрация: 13.01.2004
Вот так не пробовали?

X++:
qbr = qbds.addRange(fieldNum(FISalesPlanLine_ICL, Year));
qbr.value(sysQuery::range(2018,2019));
Если вместо одного из параметров в sysQuery::range() указать пустое значение соответствующего типа, то вместо диапазона условие "выродится" в соответственно, "<=" или ">="
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: vizir (1).
Старый 24.01.2019, 18:11   #6  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Имя поля (Year) совпало с именем функции year(), что и вызывает проблемы

Advanced query range value expressions: поле таблицы - имя вcтроенной функции year().

Если надо только 2 условия, то можно для первого использовать fieldNum(), а для второго global::filedIdExt().

Т.е. для второго условия как для первого элемента поля-массива. Идентификаторы получатся разные и это интерпретируется построителем как разные поля. Соответственно, объединение через AND

PS: По приведенной тобой ссылке есть пример с алиасами полей в условии (%1.%2 < %3) попробуй этот вариант решения
Спасибо! Попробую через global. Условий будет много, но уже по другим полям.

Алиасы пробовал, но ошибка та же самая была.

А вот этот построитель всегда разные поля через AND соединяет, а одни и те же через OR? Нельзя как то это задать самому?
Старый 24.01.2019, 18:13   #7  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вот так не пробовали?

X++:
qbr = qbds.addRange(fieldNum(FISalesPlanLine_ICL, Year));
qbr.value(sysQuery::range(2018,2019));
Если вместо одного из параметров в sysQuery::range() указать пустое значение соответствующего типа, то вместо диапазона условие "выродится" в соответственно, "<=" или ">="
Ещё раз спасибо, похоже, что это то что нужно! Завтра буду пробовать
Старый 31.01.2019, 08:59   #8  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Возник ещё один более интересный вопрос. Есть ли возможность в агрегатную функцию SUM() в Query вставить формулу? Например у меня идет SUM(Field1), а мне надо SUM(Field1 + 2). Появилась необходимость пересчета значений поля по ходу запроса. Хотелось бы сделать все сразу, а не плодить промежуточные таблицы.
Старый 31.01.2019, 11:11   #9  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
284 / 276 (10) ++++++
Регистрация: 27.02.2006
Адрес: Дания
Делаете View с Computed Column, суммируете в этом новом View. Смотрите InventValue* views в АОТ.
https://docs.microsoft.com/en-us/dyn...lumn-to-a-view
Старый 31.01.2019, 11:32   #10  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Делаете View с Computed Column, суммируете в этом новом View. Смотрите InventValue* views в АОТ.
https://docs.microsoft.com/en-us/dyn...lumn-to-a-view
Вряд ли это мне подойдет. Я не упоминал, но Query строится динамически по заданию параметров на форме. И отчет выводится в excel. View ведь нельзя из кода строить динамически никак?
Старый 31.01.2019, 11:40   #11  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,869 / 3782 (184) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от vizir Посмотреть сообщение
qbr.value(strFmt('((%1 >= %2) && (%1 <= %2))',
fieldStr(FISalesPlanLine_ICL, Year),
queryValue(int2str(2018))));

...
qbr = qbds.addRange(fieldNum(FISalesPlanLine_ICL, Year));
qbr.value(" < 2019");
qbds.addRange добавляет имя датасорса перед полем

вам надо написать что-то вроде:
X++:
qbr.value(strFmt('((%3.%1 >= %2) && (%3.%1 <= %2))',
        fieldStr(FISalesPlanLine_ICL, Year),
        queryValue(int2str(2018)
        datasourceName)));
особенно в запросах с несколькими датасорсами.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 31.01.2019, 11:55   #12  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от mazzy Посмотреть сообщение
qbds.addRange добавляет имя датасорса перед полем

вам надо написать что-то вроде:
X++:
qbr.value(strFmt('((%3.%1 >= %2) && (%3.%1 <= %2))',
        fieldStr(FISalesPlanLine_ICL, Year),
        queryValue(int2str(2018)
        datasourceName)));
особенно в запросах с несколькими датасорсами.

Этот вопрос уже решен с помощью этого
X++:
qbr.value(sysQuery::range(2018,2019));
Если знаете, пригодился бы ответ на вопрос про добавление формулы в агрегатную функцию в Query
Старый 31.01.2019, 12:07   #13  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,869 / 3782 (184) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от vizir Посмотреть сообщение
Возник ещё один более интересный вопрос. Есть ли возможность в агрегатную функцию SUM() в Query вставить формулу? Например у меня идет SUM(Field1), а мне надо SUM(Field1 + 2). Появилась необходимость пересчета значений поля по ходу запроса. Хотелось бы сделать все сразу, а не плодить промежуточные таблицы.
1. как вставляются агрегатные функции в обычный запрос смотрите в SysQuery::countTotal()

2. напрямую задать формулу в запросе аксапта не умеет ни в какой версии (только через View с Computed Column). поэтому, если вам так уж необходмо формулу, то вам остается только прямой запрос и ResultSet. со всеми вытекающими последствиями

Если будете использовать ResultSet, то посмотрите на мой SysResultSet
и вот этот пример с формулой
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 31.01.2019 в 12:20.
Старый 31.01.2019, 12:20   #14  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от mazzy Посмотреть сообщение
1. как вставляются агрегатные функции в обычный запрос смотрите в SysQuery::countTotal()

2. напрямую задать формулу в запросе аксапта не умеет ни в какой версии (только через View с Computed Column). поэтому, если вам так уж необходмо формулу, то вам остается только прямой запрос и ResultSet. со всеми вытекающими последствиями

Если будете использовать ResultSet, то посмотрите на мой SysResultSet
Я нашел как делать прямой запрос, но вот перевод из динамически созданного Query в обычный sql запрос для resultSet это величайший гемор. Мб есть какие то штатные переводчики чтобы убрать все эти алиасы аксапты в скобочках и очередность операторов правильную поставить?
Старый 31.01.2019, 12:25   #15  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,869 / 3782 (184) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от vizir Посмотреть сообщение
Я нашел как делать прямой запрос, но вот перевод из динамически созданного Query в обычный sql запрос для resultSet это величайший гемор.
угу. это + много еще чего = вытекающие последствия

Цитата:
Сообщение от vizir Посмотреть сообщение
Мб есть какие то штатные переводчики чтобы убрать все эти алиасы аксапты в скобочках и очередность операторов правильную поставить?
нет. и не надо так делать, если вы не в майкрософте работаете
(майкрософт обязан был это сделать давным давно, сразу как объявил, что MS SQL - единственная поддерживаемая СУБД)

частично проблема решается методом sql.sqlLiteral
см. пример для SysResultSet: https://github.com/mazzy-ax/SysResul...sultSet_AX.xpp
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 31.01.2019 в 12:28.
Старый 31.01.2019, 17:28   #16  
VORP is offline
VORP
Участник
Аватар для VORP
 
121 / 86 (3) ++++
Регистрация: 26.05.2006
Цитата:
SUM(Field1 + 2)
Вам надо именно сумму сумм сделать? Почему не сделать Sum(Field1) + Sum(Field2)? С произведениями так не получится конечно.
Старый 01.02.2019, 09:29   #17  
vizir is offline
vizir
Участник
 
40 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от VORP Посмотреть сообщение
Вам надо именно сумму сумм сделать? Почему не сделать Sum(Field1) + Sum(Field2)? С произведениями так не получится конечно.
Там надо коэффициент подставлять, я сумму как пример привел просто.

Последний раз редактировалось vizir; 01.02.2019 в 09:59.
Теги
query, queryrange

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Однократная ошибка времени выполнения vizir DAX: Программирование 8 27.03.2018 21:57
QueryRange и QueryFilter [AX2012] iCloud DAX: Программирование 7 10.07.2014 00:12
Need help ошибка Неправильный тип индекса массива. Evgeniy2020 DAX: Администрирование 3 05.11.2013 03:13
Ошибка в логе при установке клиента AX 2009 sao DAX: Администрирование 9 04.02.2010 11:56
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:17.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.