|
Избитая тема Получить родителя в запросе (2 уровня) | ☑ | ||
---|---|---|---|---|
0
GStiv
03.11.15
✎
14:45
|
Есть сводный документ со сводными отгрузками, необходимо в печатную форму вывести Итоги (группировки)
НоменклатураРодитель (Группа 2 уровень) --Склад ---Контрагент ----Документ -----Номенклатура (Без иерархии) Вот теперь остановился не могу в запросе получить Родителя второго уровня. Там где без группировок делал сортировку по иерархии и потом функцией в рекурсии получал родителя Функция ПолучитьВерхнийУровеньГруппы (ЭлементСправочника) УровеньЭлемента = ЭлементСправочника.Уровень(); Если УровеньЭлемента = 2 Тогда Возврат ЭлементСправочника.Родитель; ИначеЕсли УровеньЭлемента = 0 Тогда Возврат Справочники.ТвойСправочник.ПустаяСсылка(); Иначе РодительЭлемента = ПолучитьВерхнийУровеньГруппы(ЭлементСправочника.Родитель); Возврат РодительЭлемента; КонецЕсли; КонецФункции А как теперь в запросе не могу сообразить |
|||
1
PR третий
03.11.15
✎
14:47
|
ВЫБОР для фиксированной глубины вложенности
|
|||
2
GStiv
03.11.15
✎
14:54
|
Глубина может быть разная от 2 (искомый уровень) до 10, может есть смысл ВТ сначала запросом получить весь справочник потом через функцию добавить поле Родитель 2 уровня, а потом соединять но производительность просядет.
|
|||
3
H A D G E H O G s
03.11.15
✎
14:54
|
Запрос в цикле.
|
|||
4
sapphire
03.11.15
✎
14:57
|
(3) Тогда уж динамический запрос, да и для неограниченного уровня иерархии не прокатит
|
|||
5
GStiv
03.11.15
✎
14:59
|
(3)
Получить группы 2 уровня и циклом по ним ставить параметр в мой запрос и выводить, в принципе попробую но выполнять 15-30 запросов вместо 1 как то не очень |
|||
6
alex-pro
03.11.15
✎
15:01
|
(4) Неограниченного уровня иерархии не бывает на практике.
Когда я решал подобную задачу, просто взял задел на 10 подуровней и сделал запросом через выбрать. Таким образом находится второй уровень. |
|||
7
GStiv
03.11.15
✎
15:02
|
А может есть смысл
|ИТОГИ | СУММА(Количество), | СУММА(Сумма), | СУММА(Упаковки) |ПО | НоменклатураРодитель ТОЛЬКО ИЕРАРХИЯ, | Склад, | Контрагент, | Номенклатура"; а затем при выводе проверять НоменклатураРодитель на Уровень()=2 |
|||
8
GStiv
03.11.15
✎
15:09
|
Нет к сожалению ошибся, теряются итоги нижнего уровня
|
|||
9
strh
03.11.15
✎
15:13
|
ВЫБРАТЬ
ВЫБОР КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ТОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ТОГДА Номенклатура.Родитель.Родитель.Родитель КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ТОГДА Номенклатура.Родитель.Родитель КОГДА Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ТОГДА Номенклатура.Родитель КОГДА Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ТОГДА Номенклатура.Ссылка ИНАЧЕ "Нет второго уровня" КОНЕЦ КАК Родитель ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка = &Ссылка Размнож на сколько тебе надо уровней |
|||
10
Ildarovich
03.11.15
✎
15:18
|
Есть статья, которая называется Уровни, глубина, прародители, циклы и аналоги запросом. Вот ссылка http://catalog.mista.ru/public/160707/ . Там это задача 3 Определение прародителя (родителя верхнего уровня) в пакетном запросе . В запросе предлагается функция, которая строит запрос и выполняет его. Но на деле можно взять текст запроса, сформированный функцией и использовать его как статический, если зафиксировать предельную глубину иерархии Хоть 10, хоть 100 - от этого будет зависеть число блоков в запросе. Для 10 хватит 4-х блоков, а для 100 нужно будет 7.
Даже если в данной задаче не пригодится, будете иметь ввиду на будущее. |
|||
11
Ildarovich
03.11.15
✎
15:39
|
+(10) Вот запрос для справочника не более 16-ти уровней:
ВЫБРАТЬ Номенклатура.Родитель КАК НачалоДуги, Номенклатура.Ссылка КАК КонецДуги ПОМЕСТИТЬ ЗамыканияДлины1 ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ОБЪЕДИНИТЬ ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины2 ИЗ ЗамыканияДлины1 КАК ПерваяДуга ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины4 ИЗ ЗамыканияДлины2 КАК ПерваяДуга ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги, ВтораяДуга.КонецДуги ПОМЕСТИТЬ ЗамыканияДлины8 ИЗ ЗамыканияДлины4 КАК ПерваяДуга ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПерваяДуга.НачалоДуги КАК Прародитель, ВтораяДуга.КонецДуги КАК Ссылка ИЗ ЗамыканияДлины8 КАК ПерваяДуга ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги ГДЕ ПерваяДуга.НачалоДуги <> ВтораяДуга.КонецДуги И ПерваяДуга.НачалоДуги.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) Решение кажется громоздким, но сложность подхода из (9) при росте числа уровней в итоге будет больше |
|||
12
GStiv
03.11.15
✎
16:56
|
Спасибо всем Все получилось :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |