Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: Aleksey от 03 апреля 2013, 09:08:21

Название: Иерархический список в Qlikview
Отправлено: Aleksey от 03 апреля 2013, 09:08:21
На форму выведен иерархический список для создания использовалась стандартная функция Hierarchy().
Как можно настроить список, чтобы при выборе пользователем родительского элемента в выборки автоматически попадали все подчиненные элементы?
Название: Re: Иерархический список
Отправлено: admin от 04 апреля 2013, 11:52:45
Добрый день.
:)
Я пока не представляю, как работает эта функция. Сам только вчера начал разбираться с этой темой.
Что касается выдачи списка деревом - это понятно, все работает.
А вот как сделать так, чтобы в одном поле формы можно было работать с деревом, пока не разбирался.
Давайте вместе, для примера могу предложить следующую структурку:

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
];

Название: Re: Иерархический список
Отправлено: Aleksey от 04 апреля 2013, 03:50:56
Для построения иерархии нам потребуется еще 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 ТаблицаПодразделений;


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

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

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

П.С. По поводу своего вопроса с выбором подчиненных элементов разобрался:
Если группа свернута, при нажатии в выборку попадают все вложенные элементы, если развернута, то выбирается текущий.
Название: Re: Иерархический список
Отправлено: admin от 04 апреля 2013, 08:27:08
Спасибо, теперь немного добавлю, для новичков.
Источник - иерархическая таблица со смежными узлами:
[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"]
Название: Re: Иерархический список в Qlikview
Отправлено: RinatG от 06 августа 2019, 07:56:13
Последние комментарии админа явно не для новичков. Вообще не понятно, что это и как работает  ???
Название: Re: Иерархический список в Qlikview
Отправлено: admin от 07 августа 2019, 08:27:59
С тех пор прошло уже 6 лет.
За это время Qlik создал прекрасный ресурс help.qlik.com
https://help.qlik.com/ru-RU/sense/June2019/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Hierarchy.htm
https://help.qlik.com/ru-RU/sense/June2019/Subsystems/Hub/Content/Sense_Hub/DataSource/hierarchies.htm
https://help.qlik.com/ru-RU/sense/June2019/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/HierarchyBelongsTo.htm