|
21.04.2011, 17:39 | #1 |
Участник
|
QueryRun.next игнорит группировку в query
Ситуация такая: есть простая кверя, в ней на единственном источнике данных два сортировочных поля и OrderNode::GroupBy. При этом же queryRun для данной квери при прохождении выгребает ВСЕ записи, нагло игнорируя группировку.
В общем, ощущение дежавю, будто такая ситуация уже была и я где-то читал в чем причина и как обойти, но уже не помню Так что простите, если что.
__________________
Axapta has seduced me deadly! Последний раз редактировалось HorrR; 21.04.2011 в 17:44. |
|
21.04.2011, 17:45 | #2 |
северный Будда
|
Может, вы просто не указали в SelectionField, какие именно данные группировать?
__________________
С уважением, Вячеслав |
|
21.04.2011, 18:00 | #3 |
Участник
|
Цитата:
Всегда думал, что для группировки достаточно задать SortField. По крайней мере на кверях для лукапа этого точно достаточно. Тем не менее, добавил и в SelectionFields - один фиг.
__________________
Axapta has seduced me deadly! |
|
21.04.2011, 18:01 | #4 |
----------------
|
чудес не бывает - давайте код, а критики найдутся.
|
|
21.04.2011, 18:07 | #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! |
|
21.04.2011, 18:29 | #6 |
северный Будда
|
А попробуйте перед созданием QueryRun написать info(qbds.toString()) и посмотрите в инфологе, какой запрос уходит на сервер
__________________
С уважением, Вячеслав |
|
21.04.2011, 18:48 | #7 |
Участник
|
Цитата:
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! |
|
21.04.2011, 18:31 | #8 |
Участник
|
Какое значение имеют ObjectNameSelection.text(), ObjTypeSelection.selection() и ObjTypeSelection.valueStr())? Там нигде пустых строк или не ограниченных диапазонов нет?
Если я вместо этих значений подставляю константы, то Ваш код четко находит конкретные элементы. Никаких ошибок. |
|
21.04.2011, 18:45 | #9 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Какое значение имеют ObjectNameSelection.text(), ObjTypeSelection.selection() и ObjTypeSelection.valueStr())? Там нигде пустых строк или не ограниченных диапазонов нет?
Если я вместо этих значений подставляю константы, то Ваш код четко находит конкретные элементы. Никаких ошибок. Ну и не думаю, что информация релевантна, но у меня 4ка.
__________________
Axapta has seduced me deadly! |
|
21.04.2011, 19:08 | #10 |
Участник
|
Ну это ж ISAM, а не "настоящая" СУБД, там, поди, запрос по каждому слою отдельно гоняется... попробуйте тогда добавить
X++: qbds.addSelectionField(fieldnum(UtilIdElements, utilLevel), SelectionField::Max); |
|
|
За это сообщение автора поблагодарили: HorrR (1). |
21.04.2011, 19:24 | #11 |
Участник
|
Цитата:
В любом случае спасибо!
__________________
Axapta has seduced me deadly! |
|
21.04.2011, 19:59 | #12 |
Участник
|
|
|
21.04.2011, 20:17 | #13 |
Участник
|
Немного(совсем) не та проблема:
а.) запрос формируется не к временной таблице б.) собственно запрос отрабатывает корректно, проблема возникает только тогда, когда я эту же задачу пытаюсь решить с помощью query фреймворка. Но все-равно спасибо, интересно было почитать.
__________________
Axapta has seduced me deadly! |
|
21.04.2011, 21:16 | #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)); } } |
|
22.04.2011, 00:09 | #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), слои |
|
|