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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.02.2008, 17:41   #1  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
SYS_ExpressionQueryBuilder
Вопрос к belugin

А не пополнить ли класс SYS_ExpressionQueryBuilder методом formula(), позволяющим вставлять арифметические выражения в запрос

X++:
SYS_ExpressionDataSourceBuilder formula(str _formula)
{
;
    dataSource.addRange( fieldname2id(dataSource.table(), "RecId") ).value('('+_formula+'))');

    return this;
}
а к нему ещё и макрос SYS_ExpressionQueryBuilder

X++:
// Created by GRR on 07.02.2008 for SYS_ExpressionQueryBuilder

    #localMacro.const
        strFmt('%1 * RecId/RecId')
    #endmacro
Данный макрос, кроме всего, будет ещё и полезен любителям сравнений на ноль и на прочие константы арифметические операции в условие Where

Например
X++:
    #macrolib.SYS_ExpressionQueryBuilder
    ;

   new DEV_QueryBrowser().run(
       SYS_ExpressionQueryBuilder::construct()
         .dataSource(tableNum(Table1))
             .formula(
                strfmt("%1 + %2*10 - %3 - %4 == %5", //f2 + 10*f4 - f5 - 3 == 0

                    fieldStr(Table1, Field2),
                    fieldStr(Table1, Field4),
                    fieldStr(Table1, Field5),
                    #const(3),
                    #const(0))
             )
   .run()
   .query());
Миниатюры
Нажмите на изображение для увеличения
Название: Запрос.JPG
Просмотров: 371
Размер:	27.2 Кб
ID:	3205  
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
За это сообщение автора поблагодарили: belugin (5).
Старый 08.02.2008, 17:54   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Можно чуть покороче
X++:
return this.matches(fieldname2id(dataSource.table(), "RecId") ), '('+_formula+'))');
А почему две закрывающих скобки?
Старый 08.02.2008, 17:55   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Поправьте кто-нибудь аксаптапедию на эту тему.
Старый 08.02.2008, 18:02   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Очепятка
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 08.02.2008, 18:10   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
еще я бы вынес код из макроса в статический метод, а макрос сделал бы алиасом.

еще можно сделать алиас для конструктора (кстати там есть еще фабричный метод для создания сразу датасурса)
Старый 08.02.2008, 18:25   #6  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Можно было и статическим методом сделать. Просто подумалось, что макросом компактнее код получится. (длинное название у класса) да и для общественности он полезен

про алиас можно поподробнее?
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 08.02.2008, 18:47   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
макрос, единственный смысл которого делегировать вызовы статическому методу
X++:
#localmacro.const
SYS_ExpressionQueryBuilder::const(%1)
#endmacro

#localmacro.newQuery
SYS_ExpressionQueryBuilder::datasource(%1)
#endmacro
Тогда получится имитация неймспейсов
X++:
#macrolib.SYS_ExpressionQueryBuilder // типа подключаем неймспейс
    ;

   new DEV_QueryBrowser().run(
       #newQuery(tableNum(Table1)) // юзаем штуки из неймспейса по короткому имени (без полной кваличикации типа)
             .formula(
                strfmt("%1 + %2*10 - %3 - %4 == %5", //f2 + 10*f4 - f5 - 3 == 0

                    fieldStr(Table1, Field2),
                    fieldStr(Table1, Field4),
                    fieldStr(Table1, Field5),
                    #const(3),
                    #const(0))
             )
   .run()
   .query());
Старый 08.02.2008, 18:48   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
И при этом, если мы заъхотим что-то поменять в реализации const не надо будет перекомпилировать все, где оно исользуется
Старый 12.02.2008, 18:06   #9  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
c #newQuery лихо как-то
Компилятору
__________________

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


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

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

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