Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦОО_ИСБУ_Лек3.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
684 Кб
Скачать
☆

Иерархический обход

Рассмотрим другой способ обхода результата запроса - иерархи­ческий. При данном варианте обходятся только записи, находя­щиеся на одном уровне. Для получения иерархической выборки из результата необходимо вызвать метод Выбрать объекта Резуль­татЗапроса с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией:

СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;

Выборка = РезультатЗапроса.Выбрать(СпособВыборки);

Выборка из результата запроса с иерархическим обходом в нашем примере обойдет только записи с номерами 1 и 11, так как только эти две записи находятся на самом верхнем уровне.

Проиллюстрируем это, представив наш результат в виде дерева, где узлами будут итоговые записи, а листьями дерева будут де­тальные записи. Вот что у нас получится:

1

Сантехника

104

2

Кран

84

3

Кран

10

4

Кран

8

5

Кран

44

6

Кран

22

7

Смеситель

20

8

Смеситель

5

9

Смеситель

1

10

Смеситель

14

11

Мебель

134

12

Стол

26

13

Кран

1

14

Кран

15

15

Кран

10

16

Стул

108

17

Стул

55

18

Стул

5

19

Стул

32

20

Стул

16

Из этого рисунка видно, что именно записи с номерами 1 и 11 находятся на первом уровне дерева, и поэтому только они попа­дают в первый проход иерархической выборки.

Возникает вопрос, как получить остальные записи результата за­проса. Для этого у объекта ВыборкаИзРезультатаЗапроса можно получить еще одну выборку, которая будет обходить подчиненные записи текущей записи выборки. В нашем примере в момент, когда объект Выборка будет позиционирован на запись с номе­ром 1, мы запросим у него иерархическую выборку. Таким обра­зом, мы получим выборку, которая вернет записи с номерами 2, 7. А когда Выборка будет спозиционирована на запись с номером 11, то полученная у нее иерархическая выборка вернет записи с номерами 12, 16. Так реализуется иерархический обход результа­тов запроса

Заметим, что у выборки можно получать вложенные выборки лю­бого типа. Так, если бы мы запросили у Выборки, спозициониро­ванной на записи 1, линейную выборку, то с ее помощью мы бы получили записи с номерами со 2-го по 10-й.

Проиллюстрируем описанную методику на примере:

Процедура ВыдатьРекурсивно(Выборка) Далее;

Процедура ВыполнитьЗапрос ()

Запрос = Новый Запрос ("

ВЫБРАТЬ Товар, Количество

ИЗ Документ.РасходнаяНакладная.Состав

УПОРЯДОЧИТЬ ПО Товар

ИТОГИ СУММА(Количество) ПО Товар, Товар ИЕРАРХИЯ");

СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;

Выборка = Запрос.Выполнить().Выбрать(СпособВыборки); ВыдатьРекурсивно(Выборка);

КонецПроцедуры

Процедура ВыдатьРекурсивно(Выборка)

Пока Выборка.Следующий() Цикл

//выведем в окно сообщений поля из результата

Товар = Выборка.Наименование;

Количество = Выборка.Количество;

Сообщить("Товар: " + СокрЛП(Товар) + "Количество: " + СокрЛП(Количество));

//продолжим выборку подчиненных записей

СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;

ВыдатьРекурсивно(Выборка.Выбрать(СпособВыборки));

КонецЦикла;

КонецПроцедуры

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]