|
v8: Выборка с иерархией - как обойти иерархию ПоГруппировкамСИерархией | ☑ | ||
---|---|---|---|---|
0
FReIM
20.06.11
✎
14:56
|
Столкнулся с проблемой и занялся её решением собственно почему не работает выборка по иерархии:
Запрос =Новый Запрос; Запрос.Текст="ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ИТОГИ ПО | Ссылка ИЕРАРХИЯ"; Результат=Запрос.Выполнить(); Выборка=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ТабДок = Новый ТабличныйДокумент; ТабДок.НачатьАвтогруппировкуСтрок(); ТабДок.Очистить(); Макет=ПолучитьМакет("Макет"); Пока Выборка.Следующий() цикл ОбластьСсылка=Макет.ПолучитьОбласть("Строка"); ОбластьСсылка.Параметры.Ссылка=Выборка.Ссылка; ТабДок.Вывести(ОбластьСсылка, Выборка.Уровень()); Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Пока Выборка2.Следующий() цикл ОбластьСсылка=Макет.ПолучитьОбласть("Строка"); ОбластьСсылка.Параметры.Ссылка=Выборка2.Ссылка; ТабДок.Вывести(ОбластьСсылка, Выборка2.Уровень()); КонецЦикла КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); ТабДок.Показать(); Как выяснилось Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) - явно недостаточно, необходимо для вложенной выборки явно задавать группировку. Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Ссылка") Иначе метод Выборка.Следующий() для итогов по иерархии будет возвращать всегда "Ложь". Т.е. если мы захотим для группы справочника получить вложенные группы, то необходимо явное указание наименования группировки "Ссылка". Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Ссылка") |
|||
1
FReIM
20.06.11
✎
14:58
|
Так, небольшая опечатка:
НЕ "Иначе метод Выборка.Следующий() для итогов по иерархии будет возвращать всегда "Ложь".... " А Иначе метод Выборка2.Следующий() для итогов по иерархии будет возвращать всегда "Ложь". Т.е. если мы захотим для группы справочника получить вложенные группы, то необходимо явное указание наименования группировки "Ссылка". Выборка2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Ссылка") |
|||
2
vmv
20.06.11
✎
15:00
|
выгрузи запрос в дерево значений и обходи как хочь, надеюсь функционал по работе с деревьями в кармане
зачем парить репу с какими-то выборками |
|||
3
vmv
20.06.11
✎
15:02
|
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
|
|||
4
Ёпрст
20.06.11
✎
15:04
|
(0) а нахрена 2-ая выборка ? Когда у тебя их всего одна!
ТабДок.Очистить(); ТабДок.Вывести(ОбластьЗаголовок); ТабДок.Вывести(ОбластьШапкаТаблицы); ТабДок.НачатьАвтогруппировкуСтрок(); ВыборкаСсылка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСсылка.Следующий() Цикл Если ВыборкаСсылка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда Область = ОбластьСсылкаИерархия; Иначе Область = ОбластьСсылка; КонецЕсли; Область.Параметры.Заполнить(ВыборкаСсылка); ТабДок.Вывести(Область, ВыборкаСсылка.Уровень()); КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); ТабДок.Вывести(ОбластьПодвалТаблицы); ТабДок.Вывести(ОбластьПодвал); |
|||
5
Ёпрст
20.06.11
✎
15:04
|
+4 вот тупо код, слепленный конструктором.
|
|||
6
Defender aka LINN
20.06.11
✎
15:15
|
(4) Иерархия потому что.
|
|||
7
FReIM
20.06.11
✎
15:30
|
(3)
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Выборка более гибкая штука, там рассчитаны все возможные итоги в любом порядке, т.е. можно выборку вложенную в любом порядке следования итогов выбрать. Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Ссылка;Период") так и Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Период;Ссылка"). |
|||
8
FReIM
20.06.11
✎
15:34
|
И итоги разные будут и обход их может быть разный. Особенно актуально для сложных многоуровневых выборок.
|
|||
9
FReIM
20.06.11
✎
15:36
|
В любом случае я просто хотел поделиться опытом, чтобы потом никто на эти грабли не наступал.
|
|||
10
Guk
20.06.11
✎
15:36
|
нажми букву "Я"...
|
|||
11
FReIM
20.06.11
✎
15:38
|
Лол. Самое смешное, что там я так ничего и не нашел. Просто вопросы без ответов, мало названия в поисковике просмотреть, нужно еще и найденое прочитать.
|
|||
12
Guk
20.06.11
✎
15:41
|
(11) странно. прямо во второй ссылке приведен пример из Радченко...
|
|||
13
FReIM
20.06.11
✎
16:33
|
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=537568&threadtype=0
Работать не будет попробуйте запустить написанный выше код. Справочник Номенклатура есть во многих конфигурациях Примеры есть, но вот только они не рабочие, попробуйте обойти вложенность более 2 х уровней. пример из митичкина, при развертке рекурсии в цикл работать не будет, так как поле групировки по иерархии явно во второй выборке не задано. Пример из Митичкина: Процедура ВыдатьРекурсивно(Выборка) Далее; Процедура ВыполнитьЗапрос() Запрос = Новый Запрос(" ВЫБРАТЬ Товар, Количество ИЗ Документ.РасходнаяНакладная.Состав УПОРЯДОЧИТЬ ПО Товар |ИТОГИ СУММА(Количество) ПО Товар, Товар ИЕРАРХИЯ"); СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией; Выборка = Запрос.Выполнить().Выбрать(СпособВыборки); ВыдатьРекурсивно (Выборка) ; КонецПроцедуры Процедура ВыдатьРекурсивно(Выборка) Пока Выборка.Следующий() Цикл //выведем в окно сообщений поля из результата Товар = Выборка.Наименование; Количество = Выборка.Количество; Сообщить("Товар: " + СокрЛП(Товар) + "Количество: " + СокрЛП(Количество)); //продолжим выборку подчиненных записей СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией; ВыдатьРекурсивно(Выборка.Выбрать(СпособВыборки)); КонецЦикла; КонецПроцедуры тоже не совсем корректен, а для задачи с задынным уровнем вложений - нуждается в доработке. |
|||
14
FReIM
20.06.11
✎
16:34
|
Запрос =Новый Запрос;
Запрос.Текст="ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ИТОГИ ПО | Ссылка ИЕРАРХИЯ"; Результат=Запрос.Выполнить(); Выборка=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ТабДок = Новый ТабличныйДокумент; ТабДок.НачатьАвтогруппировкуСтрок(); ТабДок.Очистить(); Макет=ПолучитьМакет("Макет"); Пока Выборка.Следующий() цикл ОбластьСсылка=Макет.ПолучитьОбласть("Строка"); ОбластьСсылка.Параметры.Ссылка=Выборка.Ссылка; ТабДок.Вывести(ОбластьСсылка, Выборка.Уровень()); Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Пока Выборка2.Следующий() цикл ОбластьСсылка=Макет.ПолучитьОбласть("Строка"); ОбластьСсылка.Параметры.Ссылка=Выборка2.Ссылка; ТабДок.Вывести(ОбластьСсылка, Выборка2.Уровень()); КонецЦикла КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); ТабДок.Показать(); |
|||
15
FReIM
20.06.11
✎
16:35
|
код примитивный и из-за описанных выше не соблюденных условий работать не будет.
|
|||
16
FReIM
20.06.11
✎
16:42
|
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=537568&threadtype=0
Там тоже отписался))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |