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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2019, 16:31   #1  
vizir is offline
vizir
Участник
 
43 / 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,431 / 934 (34) +++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Имя поля (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
 
210 / 76 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
(%1 >= %2) && (%1 <= %2) - условие странное
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 24.01.2019, 18:04   #4  
vizir is offline
vizir
Участник
 
43 / 10 (1) +
Регистрация: 08.09.2017
Цитата:
Сообщение от Weez Посмотреть сообщение
(%1 >= %2) && (%1 <= %2) - условие странное
Мне нужна выборка по диапазону дат. Можно как то по другому?
Старый 24.01.2019, 18:09   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,431 / 934 (34) +++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вот так не пробовали?

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
Участник
 
43 / 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
Участник
 
43 / 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
Участник
 
43 / 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
Соотечественники
 
299 / 288 (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
Участник
 
43 / 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
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,974 / 3865 (186) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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
Участник
 
43 / 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
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,974 / 3865 (186) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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
Участник
 
43 / 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
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,974 / 3865 (186) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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
 
124 / 86 (3) ++++
Регистрация: 26.05.2006
Цитата:
SUM(Field1 + 2)
Вам надо именно сумму сумм сделать? Почему не сделать Sum(Field1) + Sum(Field2)? С произведениями так не получится конечно.
Старый 01.02.2019, 09:29   #17  
vizir is offline
vizir
Участник
 
43 / 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, время: 00:10.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.