![]() |
#1 |
Участник
|
Группировка в лукапе
День добрый всем, не знаю проскакивала ли подобная тема, по поиску не нашел.
У контрола формы, основанного на EDT, перекрыт метод lookup. Примерный код выглядит так: X++: public void lookup() { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; SysTableLookup sysTableLookup; tableId tableId; fieldId fieldId; ; tableId = tableNum(Table1); sysTableLookup = SysTableLookup::newParameters(tableId, this,false); fieldId = fieldnum(Table1, Field1); sysTableLookup.addLookupfield(fieldId); queryBuildDataSource = query.addDataSource(tableId); queryBuildDataSource.addRange(fieldnum(Table1, Field2)).value(SysQuery::value(RangeValue)); queryBuildDataSource.addGroupByField(fieldnum(Table1,Field1)); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); } Как с этим бороться, может кто подскажет? |
|
![]() |
#2 |
Участник
|
Насколько я знаю, в Axapta возможна либо группировка, либо сортировка (во всяком случае в 3-ей версии).
Если же вы хотите задать сортировку по группировочному полю, то, скорее всего, следует сделать так: X++: public void lookup() { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; SysTableLookup sysTableLookup; tableId tableId; fieldId fieldId; ; tableId = tableNum(Table1); sysTableLookup = SysTableLookup::newParameters(tableId, this,false); fieldId = fieldnum(Table1, Field1); sysTableLookup.addLookupfield(fieldId); queryBuildDataSource = query.addDataSource(tableId); queryBuildDataSource.addRange(fieldnum(Table1, Field2)).value(SysQuery::value(RangeValue)); queryBuildDataSource.orderMode(orderMode::GroupBy); queryBuildDataSource.addSortField(fieldnum(Table1, Field1), sortOrder::Ascending); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 28.01.2011 в 17:02. |
|
|
За это сообщение автора поблагодарили: greench (1). |
![]() |
#3 |
Участник
|
Точно, спасибо.
|
|
![]() |
#4 |
Administrator
|
Небольшое замечание. Если вдруг в лукапе потом захочется вывести поля, к которым нужно применить агрегатную функцию (Sum, Count и т.д.), то можно столкнуться с неприятным моментом, когда пропадает группировка.
Связано это с тем, что в рамках оптимизации исполнения запроса выбираются не все поля, а только те, что определены в лукапе (для которых был вызван метод addLookupField). Соответственно, выполняется следующий код (\Classes\SysTableLookup\buildSelectionList): X++: for (i = 1; i <= conlen(lookupItems); i++)
{
[fieldId, returnItem, method] = conpeek(lookupItems, i);
queryBuildDataSource.addSelectionField(fieldId);
} Лечится это простым условием: X++: if (queryBuildDataSource.orderMode() == OrderMode::OrderBy) // Ограничение числа полей актуально только для выборки без группировок { for (i = 1; i <= conlen(lookupItems); i++) { [fieldId, returnItem, method] = conpeek(lookupItems, i); queryBuildDataSource.addSelectionField(fieldId); } } Справедливо для всех версий (3.0 - 2009 RU5)
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 29.01.2011 в 12:37. |
|
|
За это сообщение автора поблагодарили: konopello (1), jonny (3), IKA (1), player (1). |
![]() |
#5 |
Developer
|
Добавлю, что в этом методе (\Classes\SysTableLookup\buildSelectionList) не корректно определяется наличие методов (проявляется как пустые значения дисплэй методов в лукапе):
X++: // Test that all are fields (no methods) for (i = 1; i <= conlen(lookupItems); i++) { [fieldId, returnItem, method] = conpeek(lookupItems, i); if (method) { return; } } X++: [fieldId, returnItem, method] = conpeek(lookupItems, i); Для исправления достаточно изменить тип локальной переменной method с boolean на str. Последний раз редактировалось vallys; 15.03.2011 в 16:12. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от vallys
![]() Добавлю, что в этом методе (\Classes\SysTableLookup\buildSelectionList) не корректно определяется наличие методов (проявляется как пустые значения дисплэй методов в лукапе):
X++: // Test that all are fields (no methods) for (i = 1; i <= conlen(lookupItems); i++) { [fieldId, returnItem, method] = conpeek(lookupItems, i); if (method) { return; } } В Ax2009 были проблемы с лукапами, основанными на запросах с применением Union. Как раз метод \Classes\SysTableLookup\buildSelectionList портил всё. В Ax2012 вроде попытались исправить и учесть Union, но опять же не до конца. Если union состоит из двух одинаковых таблиц, то проблем нет. Но если к одной из таблиц в union приджойнена ещё какая-нибудь таблица (ExistsJoin например), то лукап перестаёт работать.
__________________
Дмитрий |
|
![]() |
#7 |
Участник
|
А не проще ли для такого лукапа сделать View?
|
|
![]() |
#8 |
Участник
|
В sysTableLookup просится метод для явного добавления полей в выборку через queryBuildDataSource.addSelectionField(), но не отображающий их. Наверное не сложно такой костыль реализовать.
|
|
![]() |
#9 |
Участник
|
Цитата:
X++: // Test that all are fields (no methods) for (i = 1; i <= conlen(lookupItems); i++) { [fieldId, returnItem, method] = conpeek(lookupItems, i); if (method) { return; } } И для использования union в лукапах тоже класс SysTableLookup подкорректировал в нужных местах.
__________________
Дмитрий |
|
Теги |
group by, lookup, order by, query |
|
![]() |
||||
Тема | Ответов | |||
Группировка по полю GUID | 6 | |||
Группировка сводной таблицы Excel | 4 | |||
Группировка в Lookup | 6 | |||
Группировка временной таблицы | 3 | |||
Группировка в отчетах | 14 |
|