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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2008, 12:12   #1  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
? Расширенные возможности Query - арифметические операции в условие Where.
Добрый день, уважаемые коллеги!

Существует ли возможность с помощью Query создать запрос, который в SQL выглядит так:

X++:
select * from ExtendedTestData where Amount + Amount1 - Amount2 <> 0;
Следующее выражение

X++:
exQueryString = strfmt("(( %1 + %2 - %3 <> 0 ))",
                           fieldId2name(TableNum(ExtendedTestData), fieldNum(ExtendedTestData, Amount)),
                           fieldId2name(TableNum(ExtendedTestData), fieldNum(ExtendedTestData, Amount1)),
                           fieldId2name(TableNum(ExtendedTestData), fieldNum(ExtendedTestData, Amount2)));
приводит к ошибке: Ошибка расширенного диапазона запроса: Синтаксическая ошибка рядом с 34.


А, например, вот такое выражение
X++:
exQueryString = strfmt("(( %1 + %2 - %3 > 0 ))", ...
Генерирует следующий SQL код

X++:
SELECT A.KEY_,A.AMOUNT,A.AMOUNT1,A.AMOUNT2,A.RECID
FROM EXTENDEDTESTDATA A
WHERE ((DATAAREAID=?)
AND (((AMOUNT+AMOUNT1)-AMOUNT2)>1=?))
ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 1)
с ошибкой : [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near '='.


Со ссылкой http://www.axaptapedia.com/Expressions_in_query_ranges знаком.

Собственно, сам вопрос: умеет ли парсер кверей разбирать текст запроса, содержащий арифметические выражения?
Старый 07.02.2008, 12:25   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А попробуй так:

strfmt("(( %1 + %2 > %3 ))", ...

А в первом варианте - <> не для АХ. В АХ это !=. Но такое тоже врядли работает.
Старый 07.02.2008, 12:34   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Lemming Посмотреть сообщение
Существует ли возможность с помощью Query создать запрос, который в SQL выглядит так:
Нет. Насколько я знаю ни арифметические операции, ни функции не допустимы в range.
__________________
полезное на axForum, github, vk, coub.
Старый 07.02.2008, 12:48   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Lemming, Так попробуйте:

X++:
    Query           query;
    ;

    query = new Query();
    query.addDataSource(tablenum(Table1));

    query.dataSourceTable(tablenum(Table1)).addRange(fieldNum(Table1, RecId)).value(

        //strfmt("(( (%1 + %2 - %3) <> 0 ))",
        strfmt("( (%1+%2*10) != (%3) ) )",
            fieldStr(Table1, Field2),
            fieldStr(Table1, Field4),
            fieldStr(Table1, Field5))
    );

    new DEV_QueryBrowser().run( query );
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню

Последний раз редактировалось Russland; 07.02.2008 в 13:10.
Старый 07.02.2008, 14:04   #5  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Cool
Видимо не судьба...уже массу вариантов перепробовал, не хочет DAX хавать запросы такого плана. Ну ладно, буим знать.
Старый 07.02.2008, 14:11   #6  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Ну как не судьба?
Я же вам уже подсказал
Только перепишите под себя

Table1 заменяем на ExtendedTestData
Field2 - Amount
Field4 - Amount1
Field5 - Amount2

strfmt("( (%1+%2) != (%3) ) )", // умножение на 10 было для демонстрации того, что можно вставлять арифметические операции

Обратите внимание на то что открывающих скобок 3, а закрывающих 4!
Одну скобку кушает RecId
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню

Последний раз редактировалось Russland; 07.02.2008 в 14:17.
Старый 07.02.2008, 14:12   #7  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
В Query вы не засунете больше, чем можно засунуть в Аксаптовский select. Я так думаю.
__________________
С уважением,
glibs®
Старый 07.02.2008, 14:25   #8  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от Lemming Посмотреть сообщение
Видимо не судьба...уже массу вариантов перепробовал, не хочет DAX хавать запросы такого плана. Ну ладно, буим знать.
strfmt("(( %1 + %2 != %3 ))" - так в трешке точно работает (проверил на kr1)
strfmt("(( %1 + %2 - %3 != 0))" - а так ругается
Старый 07.02.2008, 14:27   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Lemming, должно работать. Просто надо чтобы с обоих сторон были поля, насколько я знаю.

Толкьо что проверил - работает.
Так что показывайте весь код - будем ошибку искать

X++:
static void Job1(Args _args)
{
    Query q = new Query();
    QueryBuildDataSource qbds = q.addDataSource(tableNum(Table1));
    QueryBuildRange qbr = qbds.addRange(fieldNum(Table1, RecId));
    
    QueryRun    qr;
    Table1 table1;
    ;
    qbr.value(strFmt('((%1+%2) > (%3))', fieldStr(Table1, Field1), fieldStr(Table1, Field2), fieldStr(Table1, Field3)));
    
    qr = new QueryRun(q);
    while (qr.next())
    {
        table1 = qr.get(tableNum(Table1));
        info(strFmt("Field1 = %1, Field2 = %2, Field3 = %3, Field4 = %4", table1.Field1, table1.Field2, table1.Field3, table1.Field4));
    }
}
Вот данные из Table1:

Field1 Field2 Field3 Field4 dataAreaId recVersion RecId
100.00 100.00 100.00 100 tst 1 5637144576
50.00 100.00 30.00 120 tst 1 5637144577
20.00 20.00 80.00 -40 tst 458154613 5637144578

Данные из Infolog:
Info Message (12:27:00 pm) Field1 = 100.00, Field2 = 100.00, Field3 = 100.00, Field4 = 100
Info Message (12:27:00 pm) Field1 = 50.00, Field2 = 100.00, Field3 = 30.00, Field4 = 120
За это сообщение автора поблагодарили: Lemming (3), oip (1).
Старый 07.02.2008, 14:32   #10  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
strfmt("(( %1 + %2 - %3 != 0))" - а так ругается
Цитата:
Просто надо чтобы с обоих сторон были поля
Правильно!
Но и ноль можно получть вычтя поле само из себя

X++:
        strfmt("( %1+%2*10-%3 != %3-%3 ) )",
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
За это сообщение автора поблагодарили: Lemming (3).
Старый 07.02.2008, 14:38   #11  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Thumbs up
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Lemming, должно работать. Просто надо чтобы с обоих сторон были поля, насколько я знаю.
...
Супер, спасибо!

Цитата:
Сообщение от Russland Посмотреть сообщение
Правильно!
Но и ноль можно получть вычтя поле само из себя

...
Браво!!! Вот оно! Всем спасибо! Заработало.
Теги
query, where, запрос (query), математика, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
условие where по полям одной и той же таблицы Starling DAX: Программирование 23 05.03.2008 15:48
Как прикрутить в query условие vale15 DAX: Программирование 1 11.09.2007 11:00
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Условие where в синтаксисе Query sev DAX: Программирование 25 04.08.2005 08:48
условие WHERE SomeField == NULL Alexey DAX: Программирование 7 23.01.2002 16:42

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

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

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