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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.04.2012, 09:53   #1  
yahenz is offline
yahenz
Участник
 
12 / 10 (1) +
Регистрация: 27.12.2011
Адрес: Челябинск
? Выражение в QueryBuildRange с сумой полей
Всем привет!

Пытаюсь написать что-то подобное в АХ 3.0:
X++:
    QueryRun qr;
    Query query = new Query();
    QueryBuildDataSource dsTable2 = query.addDataSource(tableNum(Table2));
    QueryBuildRange qbr;
    Table2 t2;
    ;

    qbr = dsTable2.addRange(fieldNum(Table2, DataAreaId));
    qbr.value(strfmt('((%1 + %2) > 0)', fieldStr(Table2, Field1), fieldStr(Table2, Field2)));

    qr = new QueryRun(query);

    while(qr.next())
    {
        t2 = qr.get(tablenum(Table2));
        info(int2str(t2.Field1) + "+" + int2str(t2.Field2));
    }
Выдает ошибку:

Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '='.
Оператор SQL: SELECT A.FIELD1,A.FIELD2,A.RECVERSION,A.RECID FROM TABLE2 A WHERE ((DATAAREAID=?) AND ((FIELD1+FIELD2)>1=?)) ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 45)

В АХ 5.0 все работает. Неужели в 3.0 ничего не получится?
Старый 13.04.2012, 10:19   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а арифметические выражения в сложных условиях не поддерживались, насколько я помню.
такие условия только на стороне аксапты.
__________________
полезное на axForum, github, vk, coub.
Старый 13.04.2012, 14:26   #3  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Более детально можно посмотреть здесь,не очень понятно зачем по компании суммировать.
__________________
Axapta book for developer
Старый 13.04.2012, 15:27   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от MikeR Посмотреть сообщение
не очень понятно зачем по компании суммировать.
Это вы о чём? Автор вопроса суммирует Field1 и Field2. Вместо DataAreaId ограничение можно было добавить на любое другое поле. В случае с расширенным синтаксисом это не имеет значения! Я например обычно для этих целей использую поле TableId, чтобы гарантированно исключить пересечения с поьлзовательскими фильтрами
Старый 13.04.2012, 16:45   #5  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Цитата:
Сообщение от yahenz Посмотреть сообщение
Всем привет!

Пытаюсь написать что-то подобное в АХ 3.0:
X++:
    QueryRun qr;
    Query query = new Query();
    QueryBuildDataSource dsTable2 = query.addDataSource(tableNum(Table2));
    QueryBuildRange qbr;
    Table2 t2;
    ;

    qbr = dsTable2.addRange(fieldNum(Table2, DataAreaId));
    qbr.value(strfmt('((%1 + %2) > 0)', fieldStr(Table2, Field1), fieldStr(Table2, Field2)));

    qr = new QueryRun(query);

    while(qr.next())
    {
        t2 = qr.get(tablenum(Table2));
        info(int2str(t2.Field1) + "+" + int2str(t2.Field2));
    }
Выдает ошибку:

Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '='.
Оператор SQL: SELECT A.FIELD1,A.FIELD2,A.RECVERSION,A.RECID FROM TABLE2 A WHERE ((DATAAREAID=?) AND ((FIELD1+FIELD2)>1=?)) ORDER BY A.DATAAREAID,A.RECID OPTION(FAST 45)

В АХ 5.0 все работает. Неужели в 3.0 ничего не получится?

В качестве workaround для Axapta 3.0 могу предложить на рассмотрение следующий подход - необходимо постараться избавиться от числовой константной составляющей в правой части неравенства заменив ее выражением (с использованием некоторого числового поля).

К примеру для этого можно воспользоваться нехитрым тождеством N = N * RecId / RecId. В частном случе '0' можно представить как 0*RecId или привести Ваше выражение вида (a+b)>0 к тождественному виду a > -1*b

X++:
qbr.value(strfmt('((%1 + %2) > 0*%3)', fieldStr(Table2, Field1), fieldStr(Table2, Field2), fieldStr(Table2, RecId)));

P.S. Тестировалось на версии ядра 1951.7609 (Axapta 3.0 SP3 KR3)
__________________
Dynamics AX 4.0 SP2
За это сообщение автора поблагодарили: yahenz (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
Изменение идентификаторов(id) полей Dron AKA andy DAX: База знаний и проекты 30 17.06.2009 10:11
Как перекрыть lookup для поля входящего в группу полей ATimTim DAX: Программирование 2 05.10.2005 11:26
Реализация функциональной зависимости полей в Query levsha DAX: Программирование 2 22.12.2003 09:40
очистка полей. простой вопрос Антон Солдатов DAX: Программирование 4 04.04.2003 10:28

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

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

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