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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.03.2007, 17:37   #1  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Как такую конструкцию записать в Range?
Как такую конструкцию:

X++:
//...
      //  SPLJLH = qr.get(tablenum(SalesPickingListJournalLineHistory));
        while select sum(SalesQty) from SPLJLH
        group by ModifDate
        where SPLJLH.EmplId == it.value()
//...
записать в Range?
Старый 19.03.2007, 17:46   #2  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Так это стандартный Range:

X++:
range = sysquery::findorcreaterange(...);
range.value(it.value());
Старый 19.03.2007, 17:52   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
X++:
     Query q=new Query();   
     //while select sum(SalesQty) from SPLJLH
     QueryBuildDataSource ds = q.addDataSource(tableNum(SPLJLH));
;
        //group by ModifDate
     ds.OrderMode(OrderMode::GroupBy);
     ds.addSortField(fieldNum(SPLJLH, ModifDate));
     ds.addSelectionField(fieldNum(SPLJLH, SalesQty), SelectionField::Sum);
        //where SPLJLH.EmplId == it.value()
     ds.addRange(fieldNum(SPLJLH, EmplID)).value(queryValue(it.value()));
За это сообщение автора поблагодарили: moid (1).
Старый 19.03.2007, 17:58   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
X++:
     Query q=new Query();   
     //while select sum(SalesQty) from SPLJLH
     QueryBuildDataSource ds = q.addDataSource(tableNum(SPLJLH));
;
        //group by ModifDate
     ds.OrderMode(OrderMode::GroupBy);
     ds.addSortField(fieldNum(SPLJLH, ModifDate));
     ds.addSelectionField(fieldNum(SPLJLH, SalesQty), SelectionField::Sum);
        //where SPLJLH.EmplId == it.value()
     ds.addRange(fieldNum(SPLJLH, EmplID)).value(queryValue(it.value()));
Категорически против такого варианта - нахлебался в русской функциональности.
Он правилен, но чертовски трудномодифицируемый и трудноапгрейдируемый.

Создайте Query в AOT с датасорсом, группировками и прочими параметрами. Можно мышкой и drag'n'drop'ом
В коде напишите две строчки как написал Delfins.

X++:
Query q=new Query(querystr(mySuperEmplQuery));  

// 2 строчки от Delfins
range = sysquery::findorcreaterange(q,...);
range.value(it.value());
Можете написать в одну строчку, если отлаживать не надо
X++:
sysquery::findorcreaterange(new Query(querystr(mySuperEmplQuery)),...).value(it.value());
//
Но только не надо генерить кучу кода, пожалуйста.

Max, давай советовать минимальное программирование?

PS Кроме того, подход с созданием Query в AOT позволяет разделить задачу оптимизации производительности между кодером и администратором. Администратор может исправить Query не затрагивая кода.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: belugin (14).
Старый 19.03.2007, 18:29   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кроме того, подход с созданием Query в AOT позволяет разделить задачу оптимизации производительности между кодером и администратором. Администратор может исправить Query не затрагивая кода.
Интересно, пробовал ли кто-нибудь такой подход как основной - нет ли каких-нибудь подводных камней при массовом использованиии?
Старый 19.03.2007, 18:36   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
Интересно, пробовал ли кто-нибудь такой подход как основной - нет ли каких-нибудь подводных камней при массовом использованиии?
Да, есть один большой подводный камень - русская функциональность.
Запросы в русской функциональности кодируются таким хитровывернутым способом, что просто слов нет.
__________________
полезное на axForum, github, vk, coub.
Старый 19.03.2007, 18:36   #7  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
На то он и Query в AOT, что бы юзался многократно... а если надо специфический, то тогда создавайте подобный используя метод "Duplicate"

Конечно, если меняется логика Q, то тогда об этом должны знать все кодеры... Это уже другая тема.
Старый 19.03.2007, 18:50   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Delfins Посмотреть сообщение
На то он и Query в AOT, что бы юзался многократно... а если надо специфический, то тогда создавайте подобный используя метод "Duplicate"

Конечно, если меняется логика Q, то тогда об этом должны знать все кодеры... Это уже другая тема.
Query в AOT может использоваться и однократно.
Все равно выигрыш будет за счет более понятной логики, меньших затрат при оптимизации запроса и более легкого апгрейда.

Администратор не должен менять логику при оптимизации запроса.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Да, есть один большой подводный камень - русская функциональность.
Стереть, что ли этот оффтопик?
Чтобы вернуться к теме

Цитата:
Сообщение от belugin Посмотреть сообщение
Интересно, пробовал ли кто-нибудь такой подход как основной - нет ли каких-нибудь подводных камней при массовом использованиии?
Да, есть подводный камень.
Если в высоком слое был добавлен датасорс, то в низком слое его не удалишь даже если он больше не нужен. В основном это касается взаимодействия var/cus/usr, но и в системных такое тоже бывает. Например, запрос InventSumCount зачем-то содержит join к InventTable, хотя в коде эта таблица из запроса не используется. В результате для оптимизации приходится делать дубль и править класс inventCountCreate.initQueryRun()

Но даже в этом случае изменение имени запроса выполняется гораздо легче, нежели изменение кучи кода по программному созданию запроса.

Сравните:
BookDataCalc_Purch_Process_RU.initOnDelivery()
BookDataCalc_Purch_Process_RU.initParmDefault()
BookDataCalc_Purch_Process_RU.initTransitionPeriod()
BookDataCalc_Purch_Process_RU.inRangeIntoQueryRun()
BookDataCalc_Purch_Process_RU.qrSettlementDependent()
BookDataCalc_Purch_Process_RU.qrSettlementInDependent()
__________________
полезное на axForum, github, vk, coub.
Старый 20.03.2007, 10:56   #9  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Сделал как написал belugin все работает. Спасибо....
Старый 22.03.2007, 13:03   #10  
Tiruvileijadal' is offline
Tiruvileijadal'
Участник
Аватар для Tiruvileijadal'
 
92 / 10 (1) +
Регистрация: 15.03.2007
Адрес: Сургут
Цитата:
Сообщение от mazzy Посмотреть сообщение
Категорически против такого варианта - нахлебался в русской функциональности.
Он правилен, но чертовски трудномодифицируемый и трудноапгрейдируемый.

Создайте Query в AOT с датасорсом, группировками и прочими параметрами. Можно мышкой и drag'n'drop'ом
В коде напишите две строчки как написал Delfins.

X++:
Query q=new Query(querystr(mySuperEmplQuery));  
 
// 2 строчки от Delfins
range = sysquery::findorcreaterange(q,...);
range.value(it.value());
А в каком методе писать эти строчки, если класс - наследник от RunBaseBatch?
Старый 22.03.2007, 13:10   #11  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
если от RunBaseReport, то можно в initQuery(), к примеру

а вообще - см.метод queryRun() - он содержит выполнимый запрос. Его можете менять.
Поставьте бряк, посмотрите, откуда он вызывается, и вставьте добавление фильтров перед этим.
Теги
query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ComExcelDocument_RU по именнованной ячейки вывести номер ее строки. Poleax DAX: Программирование 37 15.10.2008 14:06
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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