Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Ноябрь 21, 2017, 03:41:37 am

Автор Тема: Иерархический список в Qlikview  (Прочитано 3398 раз)

Оффлайн Aleksey

  • Новичок
  • *
  • Сообщений: 15
  • Рейтинг: +2/-0
    • Просмотр профиля
Иерархический список в Qlikview
« : Апрель 03, 2013, 09:08:21 pm »
На форму выведен иерархический список для создания использовалась стандартная функция Hierarchy().
Как можно настроить список, чтобы при выборе пользователем родительского элемента в выборки автоматически попадали все подчиненные элементы?

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 981
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Иерархический список
« Ответ #1 : Апрель 04, 2013, 11:52:45 am »
Добрый день.
 :)
Я пока не представляю, как работает эта функция. Сам только вчера начал разбираться с этой темой.
Что касается выдачи списка деревом - это понятно, все работает.
А вот как сделать так, чтобы в одном поле формы можно было работать с деревом, пока не разбирался.
Давайте вместе, для примера могу предложить следующую структурку:
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

  • Новичок
  • *
  • Сообщений: 15
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Иерархический список
« Ответ #2 : Апрель 04, 2013, 03:50:56 pm »
Для построения иерархии нам потребуется еще 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 ТаблицаПодразделений;

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

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

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

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

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

Re: Иерархический список
« Ответ #2 : Апрель 04, 2013, 03:50:56 pm »

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 981
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Иерархический список
« Ответ #3 : Апрель 04, 2013, 08:27:08 pm »
Спасибо, теперь немного добавлю, для новичков.
Источник - иерархическая таблица со смежными узлами:
(Извините, но вы не имеете доступа к галерее)
В результате работы функция сформирует полезную таблицу модели данных QlikView:
(Извините, но вы не имеете доступа к галерее)
По таблицам нетрудно понять что делает функция и как она работает:
(Извините, но вы не имеете доступа к галерее)
Можно ли прийти к такому же результату без использования функции 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 ТаблицаПодразделений;

(Извините, но вы не имеете доступа к галерее)