![]() |
#1 |
Участник
|
QueryRun.next игнорит группировку в query
Ситуация такая: есть простая кверя, в ней на единственном источнике данных два сортировочных поля и OrderNode::GroupBy. При этом же queryRun для данной квери при прохождении выгребает ВСЕ записи, нагло игнорируя группировку.
В общем, ощущение дежавю, будто такая ситуация уже была и я где-то читал в чем причина и как обойти, но уже не помню ![]()
__________________
Axapta has seduced me deadly! ![]() Последний раз редактировалось HorrR; 21.04.2011 в 17:44. |
|
![]() |
#2 |
северный Будда
|
Может, вы просто не указали в SelectionField, какие именно данные группировать?
__________________
С уважением, Вячеслав |
|
![]() |
#3 |
Участник
|
Цитата:
Всегда думал, что для группировки достаточно задать SortField. По крайней мере на кверях для лукапа этого точно достаточно. Тем не менее, добавил и в SelectionFields - один фиг.
__________________
Axapta has seduced me deadly! ![]() |
|
![]() |
#4 |
----------------
|
чудес не бывает - давайте код, а критики найдутся.
|
|
![]() |
#5 |
Участник
|
Этот метод генерит набор элементов по заданным критериям.
items - курсор источника данных (временная таблица). X++: void genItemSelection() { int recordTypeAbsoluteVal; UtilIdElements idElements; Query query = new Query(); QueryBuildDatasource qbds = query.addDataSource(tablenum(UtilIdElements)); QueryRun queryRun; ; delete_from items; qbds.addRange(fieldnum(UtilIdElements, Name)).value(ObjectNameSelection.text()); qbds.addRange(fieldnum(UtilIdElements, ParentId)).value(queryValue(0)); if (ObjTypeSelection.selection()) { qbds.addRange(fieldnum(UtilIdElements, RecordType)).value (ObjTypeSelection.valueStr()); } qbds.addSortField(fieldnum(UtilIdElements, Name)); qbds.addSortField(fieldnum(UtilIdElements, RecordType)); //qbds.addSelectionField(fieldnum(UtilIdElements, Name)); //qbds.addSelectionField(fieldnum(UtilIdElements, RecordType)); qbds.orderMode(OrderMode::GroupBy); queryRun = new QueryRun(query); while(queryRun.next()) { idElements = queryRun.get(tablenum(UtilIdElements)); recordTypeAbsoluteVal = idElements.recordType; Items.ElementName = idelements.name; items.RecordType = recordTypeAbsoluteVal; items.insert(); } }
__________________
Axapta has seduced me deadly! ![]() |
|
![]() |
#6 |
северный Будда
|
А попробуйте перед созданием QueryRun написать info(qbds.toString()) и посмотрите в инфологе, какой запрос уходит на сервер
__________________
С уважением, Вячеслав |
|
![]() |
#7 |
Участник
|
Какое значение имеют ObjectNameSelection.text(), ObjTypeSelection.selection() и ObjTypeSelection.valueStr())? Там нигде пустых строк или не ограниченных диапазонов нет?
Если я вместо этих значений подставляю константы, то Ваш код четко находит конкретные элементы. Никаких ошибок. |
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
![]() Какое значение имеют ObjectNameSelection.text(), ObjTypeSelection.selection() и ObjTypeSelection.valueStr())? Там нигде пустых строк или не ограниченных диапазонов нет?
Если я вместо этих значений подставляю константы, то Ваш код четко находит конкретные элементы. Никаких ошибок. Ну и не думаю, что информация релевантна, но у меня 4ка.
__________________
Axapta has seduced me deadly! ![]() |
|
![]() |
#9 |
Участник
|
Цитата:
SELECT * FROM UtilIdElements GROUP BY UtilIdElements.name ASC, UtilIdElements.recordType ASC WHERE ((name LIKE N'Sys*')) AND ((parentId = 0)) AND ((recordType = 11)) Все верно. А записи дублируются...
__________________
Axapta has seduced me deadly! ![]() |
|
![]() |
#10 |
Участник
|
Ну это ж ISAM, а не "настоящая" СУБД, там, поди, запрос по каждому слою отдельно гоняется... попробуйте тогда добавить
X++: qbds.addSelectionField(fieldnum(UtilIdElements, utilLevel), SelectionField::Max); |
|
|
За это сообщение автора поблагодарили: HorrR (1). |
![]() |
#11 |
Участник
|
Цитата:
В любом случае спасибо!
__________________
Axapta has seduced me deadly! ![]() |
|
![]() |
#12 |
Участник
|
|
|
![]() |
#13 |
Участник
|
Немного(совсем) не та проблема:
а.) запрос формируется не к временной таблице б.) собственно запрос отрабатывает корректно, проблема возникает только тогда, когда я эту же задачу пытаюсь решить с помощью query фреймворка. Но все-равно спасибо, интересно было почитать.
__________________
Axapta has seduced me deadly! ![]() |
|
![]() |
#14 |
Axapta
|
Цитата:
X++: static void groupUtilIdElements(Args _args) { UtilIdElements utilIdElements ; while select utilIdElements group by Name, RecordType where utilIdElements.Name == 'zipCodeReference' { info (strFmt('%1 %2', utilIdElements.Name, utilIdElements.RecordType)); } } |
|
![]() |
#15 |
Участник
|
Цитата:
Сообщение от oip
![]() Ну как же... А с while select что, все "правильно" покажет?
X++: static void groupUtilIdElements(Args _args) { UtilIdElements utilIdElements ; while select utilIdElements group by Name, RecordType where utilIdElements.Name == 'zipCodeReference' { info (strFmt('%1 %2', utilIdElements.Name, utilIdElements.RecordType)); } } Да! но парадокс в том, что в случае с неточным соответствием, а соответствием паттерну, проще говоря like, группировка срабатывает правильно!!! Попробуйте выполнить X++: while select utilIdElements group by Name, RecordType where utilIdElements.Name like "zipCodeReferenc*" { info (strFmt('%1 %2', utilIdElements.Name, utilIdElements.RecordType)); }
__________________
Axapta has seduced me deadly! ![]() |
|
Теги |
group by, query, группировка, дублирование, запрос (query), слои |
|
|