Иерархический список в Qlikview

Автор Aleksey, апреля 03, 2013, 09:08:21 pm

« предыдущая - следующая »

Aleksey

апреля 03, 2013, 09:08:21 pm Последнее редактирование: июня 14, 2015, 03:29:57 pm от admin
На форму выведен иерархический список для создания использовалась стандартная функция Hierarchy().
Как можно настроить список, чтобы при выборе пользователем родительского элемента в выборки автоматически попадали все подчиненные элементы?

admin

Добрый день.
:)
Я пока не представляю, как работает эта функция. Сам только вчера начал разбираться с этой темой.
Что касается выдачи списка деревом - это понятно, все работает.
А вот как сделать так, чтобы в одном поле формы можно было работать с деревом, пока не разбирался.
Давайте вместе, для примера могу предложить следующую структурку:

LOAD * INLINE [
    A, B, C, D, E, F
    Управление финансами администрации, 909
    Общегосударственные вопросы, 909, 01, , ,
    Обеспечение деятельности финансовых налоговых и таможенных органов и органов финансового надзора, 909, 01, 06, ,
    Руководство и управление в сфере установленных функций органов государственной власти субъектов Российской Федерации и органов местного самоуправления, 909, 01, 06, 0020000,
    Выполнение функций органами местного самоуправления, 909, 01, 06, 0020000, 500
    Городская целевая программа повышения эффективности бюджетных расходов, 909, 01, 06, 7952700,
    Проведение мероприятий в рамках городских целевых программ, 909, 01, 06, 7952700, 009
    Резервные фонды, 909, 01, 11, ,
    Резервные фонды, 909, 01, 11, 0700000,
    Прочие расходы, 909, 01, 11, 0700000, 013
    Другие общегосударственные вопросы, 909, 01, 13
    'Городская целевая программа "Развитие муниципальной службы в городском округе"', 909, 01, 13, 7953100
    Проведение мероприятий в рамках городских целевых программ, 909, 01, 13, 7953100, 009
];


Aleksey

Для построения иерархии нам потребуется еще 2 поля:
Идентификатор элемента и идентификатор элемента-родителя. В качестве этого можно было конечно использовать наименование, но получится слишком громоздко.
Давай такой вариант иерархии:
Офис1
    Департамент1
        Отдел1
        Отдел2
Офис2
    Департамент2
    Департамент3

ТаблицаПодразделений:
LOAD * INLINE [
    Подразделение, ID, ID_Родителя
    Офис1, 1
    Департамент1, 2, 1
    Отдел1, 3, 2
    Отдел2, 4, 2
    Офис2, 5
    Департамент2, 6, 5
    Департамент3, 7, 5
];


Теперь воспользуемся волшебной функцией создания иерархии. Общий синтаксис:
ЦитироватьСинтаксис имеет следующий вид:

Hierarchy (NodeID, ParentID, NodeName, [ParentName], [PathSource], [PathName], [PathDelimiter], [Depth])(loadstatement | selectstatement)

где

NodeID -- имя поля, которое содержит идентификатор узла. Это поле должно существовать в таблице ввода.

ParentID -- имя поля, содержащего идентификатор родительского узла. Это поле должно существовать в таблице ввода.

NodeName -- имя поля, содержащего имя узла. Это поле должно существовать в таблице ввода.

ParentName - строка, которая используется для наименования нового поля ParentName. При его отсутствии это поле не создается.

PathSource -- имя поля, которое содержит имя узла, используемого для создания пути узла. Необязательный параметр. При его отсутствии используется NodeName.

PathName -- строка, которая используется для наименования нового поля Path, содержащего путь от корневого каталога к узлу. Необязательный параметр. При его отсутствии это поле не создается.

PathDelimiter -- строка, которая используется в качестве разделителя в новом поле ParentName. Необязательный параметр. При его отсутствии используется '/'.

Depth -- строка, которая используется для наименования нового поля Depth, содержащего глубину узла в иерархии. Необязательный параметр. При его отсутствии это поле не создается.


В нашем случае прописываем:
Hierarchy(ID, ID_Родителя, Подразделение,, Подразделение, 'Подразделения')
LOAD
ID,
ID_Родителя,
Подразделение
Resident ТаблицаПодразделений;

DROP Table ТаблицаПодразделений;


Ну вот и все. Перегружаем данные в модель.

На форму добавляем список в Поле выбираем Подразделения.
И обязательно ставим флажок "Показать как дерево".

Должна получиться как на скрине во вложении.

П.С. По поводу своего вопроса с выбором подчиненных элементов разобрался:
Если группа свернута, при нажатии в выборку попадают все вложенные элементы, если развернута, то выбирается текущий.

admin

апреля 04, 2013, 08:27:08 pm #3 Последнее редактирование: апреля 05, 2013, 08:28:20 am от admin
Спасибо, теперь немного добавлю, для новичков.
Источник - иерархическая таблица со смежными узлами:
[smg id=16 type=preview align=center width=200 caption="Источник. Иерархический справочник"]
В результате работы функция сформирует полезную таблицу модели данных QlikView:
[smg id=15 type=preview align=center width=600 caption="Результат. Иерархический справочник"]
По таблицам нетрудно понять что делает функция и как она работает:
[smg id=17 type=preview align=center width=600 caption="Пример работы. Иерархический справочник"]
Можно ли прийти к такому же результату без использования функции Hierarchy() ? Можно, если других дел больше нет и времени не жалко  :) .
Есть еще одна функция работы с иерархическими справочниками - HierarchyBelongsTo
ЦитироватьHierarchyBelongsTo (NodeID, ParentID, NodeName, AncestorID, AncestorName, [DepthDiff])(loadstatement | selectstatement)
где
NodeID -- имя поля, которое содержит идентификатор узла. Это поле должно существовать в таблице ввода.
ParentID -- имя поля, содержащего идентификатор родительского узла. Это поле должно существовать в таблице ввода.
NodeName -- имя поля, содержащего имя узла. Это поле должно существовать в таблице ввода.
AncestorID -- строка имени поля идентификатора нового родительского объекта, которая содержит идентификатор родительского узла.
AncestorName -- строка имени поля нового родительского объекта, содержащего имя родительского узла.
DepthDiff -- строка имени нового поля DepthDiff, содержащего глубину узла в иерархии по отношению к родительскому узлу. Необязательный параметр. При его отсутствии это поле не создается.

На упомянутом примере это будет выглядеть так:


HierarchyBelongsTo(ID, ID_Родителя, Подразделение,Уровень, ПодразделениеРодитель)
LOAD
ID,
ID_Родителя,
Подразделение
Resident ТаблицаПодразделений;


DROP Table ТаблицаПодразделений;


[smg id=18 type=preview align=center width=400 caption="Пример работы HierarchyBelongsTo"]

Рейтинг@Mail.ru Яндекс.Метрика