19.03.2007, 17:37 | #1 |
Участник
|
Как такую конструкцию записать в Range?
Как такую конструкцию:
X++: //... // SPLJLH = qr.get(tablenum(SalesPickingListJournalLineHistory)); while select sum(SalesQty) from SPLJLH group by ModifDate where SPLJLH.EmplId == it.value() //... |
|
19.03.2007, 17:46 | #2 |
Участник
|
Так это стандартный Range:
X++: range = sysquery::findorcreaterange(...); range.value(it.value()); |
|
19.03.2007, 17:52 | #3 |
Участник
|
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 |
Участник
|
Цитата:
Сообщение от 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 не затрагивая кода. |
|
|
За это сообщение автора поблагодарили: belugin (14). |
19.03.2007, 18:29 | #5 |
Участник
|
Интересно, пробовал ли кто-нибудь такой подход как основной - нет ли каких-нибудь подводных камней при массовом использованиии?
|
|
19.03.2007, 18:36 | #6 |
Участник
|
Цитата:
Запросы в русской функциональности кодируются таким хитровывернутым способом, что просто слов нет. |
|
19.03.2007, 18:36 | #7 |
Участник
|
На то он и Query в AOT, что бы юзался многократно... а если надо специфический, то тогда создавайте подобный используя метод "Duplicate"
Конечно, если меняется логика Q, то тогда об этом должны знать все кодеры... Это уже другая тема. |
|
19.03.2007, 18:50 | #8 |
Участник
|
Цитата:
Все равно выигрыш будет за счет более понятной логики, меньших затрат при оптимизации запроса и более легкого апгрейда. Администратор не должен менять логику при оптимизации запроса. Стереть, что ли этот оффтопик? Чтобы вернуться к теме Цитата:
Если в высоком слое был добавлен датасорс, то в низком слое его не удалишь даже если он больше не нужен. В основном это касается взаимодействия 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() |
|
20.03.2007, 10:56 | #9 |
Участник
|
Сделал как написал belugin все работает. Спасибо....
|
|
22.03.2007, 13:03 | #10 |
Участник
|
Цитата:
Сообщение от mazzy
Категорически против такого варианта - нахлебался в русской функциональности.
Он правилен, но чертовски трудномодифицируемый и трудноапгрейдируемый. Создайте Query в AOT с датасорсом, группировками и прочими параметрами. Можно мышкой и drag'n'drop'ом В коде напишите две строчки как написал Delfins. X++: Query q=new Query(querystr(mySuperEmplQuery)); // 2 строчки от Delfins range = sysquery::findorcreaterange(q,...); range.value(it.value()); |
|
22.03.2007, 13:10 | #11 |
Участник
|
если от RunBaseReport, то можно в initQuery(), к примеру
а вообще - см.метод queryRun() - он содержит выполнимый запрос. Его можете менять. Поставьте бряк, посмотрите, откуда он вызывается, и вставьте добавление фильтров перед этим. |
|