AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 24.01.2019, 16:31   #1  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 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");, то снова вылезает ошибка о неверном условии.
Alt 24.01.2019, 16:53   #2  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.720 / 1207 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Имя поля (Year) совпало с именем функции year(), что и вызывает проблемы

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

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

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

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

Geändert von Владимир Максимов (24.01.2019 um 16:59 Uhr)
Alt 24.01.2019, 16:57   #3  
Weez ist offline
Weez
Участник
Axapta Retail User
 
250 / 89 (3) ++++
Registriert seit: 18.01.2006
Ort: Moscow city
(%1 >= %2) && (%1 <= %2) - условие странное
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Alt 24.01.2019, 18:04   #4  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von Weez Beitrag anzeigen
(%1 >= %2) && (%1 <= %2) - условие странное
Мне нужна выборка по диапазону дат. Можно как то по другому?
Alt 24.01.2019, 18:09   #5  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.720 / 1207 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Вот так не пробовали?

X++:
qbr = qbds.addRange(fieldNum(FISalesPlanLine_ICL, Year));
qbr.value(sysQuery::range(2018,2019));
Если вместо одного из параметров в sysQuery::range() указать пустое значение соответствующего типа, то вместо диапазона условие "выродится" в соответственно, "<=" или ">="
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
This post has been rated by: vizir (1).
Alt 24.01.2019, 18:11   #6  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von Владимир Максимов Beitrag anzeigen
Имя поля (Year) совпало с именем функции year(), что и вызывает проблемы

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

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

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

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

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

А вот этот построитель всегда разные поля через AND соединяет, а одни и те же через OR? Нельзя как то это задать самому?
Alt 24.01.2019, 18:13   #7  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von Владимир Максимов Beitrag anzeigen
Вот так не пробовали?

X++:
qbr = qbds.addRange(fieldNum(FISalesPlanLine_ICL, Year));
qbr.value(sysQuery::range(2018,2019));
Если вместо одного из параметров в sysQuery::range() указать пустое значение соответствующего типа, то вместо диапазона условие "выродится" в соответственно, "<=" или ">="
Ещё раз спасибо, похоже, что это то что нужно! Завтра буду пробовать
Alt 31.01.2019, 08:59   #8  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Возник ещё один более интересный вопрос. Есть ли возможность в агрегатную функцию SUM() в Query вставить формулу? Например у меня идет SUM(Field1), а мне надо SUM(Field1 + 2). Появилась необходимость пересчета значений поля по ходу запроса. Хотелось бы сделать все сразу, а не плодить промежуточные таблицы.
Alt 31.01.2019, 11:11   #9  
Stitch_MS ist offline
Stitch_MS
Участник
Benutzerbild von Stitch_MS
Соотечественники
 
397 / 483 (17) +++++++
Registriert seit: 27.02.2006
Ort: Дания
Делаете View с Computed Column, суммируете в этом новом View. Смотрите InventValue* views в АОТ.
https://docs.microsoft.com/en-us/dyn...lumn-to-a-view
Alt 31.01.2019, 11:32   #10  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von Stitch_MS Beitrag anzeigen
Делаете View с Computed Column, суммируете в этом новом View. Смотрите InventValue* views в АОТ.
https://docs.microsoft.com/en-us/dyn...lumn-to-a-view
Вряд ли это мне подойдет. Я не упоминал, но Query строится динамически по заданию параметров на форме. И отчет выводится в excel. View ведь нельзя из кода строить динамически никак?
Alt 31.01.2019, 11:40   #11  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von vizir Beitrag anzeigen
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)));
особенно в запросах с несколькими датасорсами.
__________________
полезное на axForum, github, vk, coub.
Alt 31.01.2019, 11:55   #12  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von mazzy Beitrag anzeigen
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
Alt 31.01.2019, 12:07   #13  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von vizir Beitrag anzeigen
Возник ещё один более интересный вопрос. Есть ли возможность в агрегатную функцию SUM() в Query вставить формулу? Например у меня идет SUM(Field1), а мне надо SUM(Field1 + 2). Появилась необходимость пересчета значений поля по ходу запроса. Хотелось бы сделать все сразу, а не плодить промежуточные таблицы.
1. как вставляются агрегатные функции в обычный запрос смотрите в SysQuery::countTotal()

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

Если будете использовать ResultSet, то посмотрите на мой SysResultSet
и вот этот пример с формулой
__________________
полезное на axForum, github, vk, coub.

Geändert von mazzy (31.01.2019 um 12:20 Uhr)
Alt 31.01.2019, 12:20   #14  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von mazzy Beitrag anzeigen
1. как вставляются агрегатные функции в обычный запрос смотрите в SysQuery::countTotal()

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

Если будете использовать ResultSet, то посмотрите на мой SysResultSet
Я нашел как делать прямой запрос, но вот перевод из динамически созданного Query в обычный sql запрос для resultSet это величайший гемор. Мб есть какие то штатные переводчики чтобы убрать все эти алиасы аксапты в скобочках и очередность операторов правильную поставить?
Alt 31.01.2019, 12:25   #15  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
Zitat:
Zitat von vizir Beitrag anzeigen
Я нашел как делать прямой запрос, но вот перевод из динамически созданного Query в обычный sql запрос для resultSet это величайший гемор.
угу. это + много еще чего = вытекающие последствия

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

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

Geändert von mazzy (31.01.2019 um 12:28 Uhr)
Alt 31.01.2019, 17:28   #16  
VORP ist offline
VORP
Участник
Benutzerbild von VORP
 
147 / 95 (4) ++++
Registriert seit: 26.05.2006
Zitat:
SUM(Field1 + 2)
Вам надо именно сумму сумм сделать? Почему не сделать Sum(Field1) + Sum(Field2)? С произведениями так не получится конечно.
Alt 01.02.2019, 09:29   #17  
vizir ist offline
vizir
Участник
 
43 / 10 (1) +
Registriert seit: 08.09.2017
Zitat:
Zitat von VORP Beitrag anzeigen
Вам надо именно сумму сумм сделать? Почему не сделать Sum(Field1) + Sum(Field2)? С произведениями так не получится конечно.
Там надо коэффициент подставлять, я сумму как пример привел просто.

Geändert von vizir (01.02.2019 um 09:59 Uhr)
Stichworte
query, queryrange

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Однократная ошибка времени выполнения 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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 04:10 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.