# Manipulando dados hierárquicos

Hierarquias são uma parte importante de todas as soluções de business intelligence, utilizadas para descrever dimensões que obviamente contêm diferentes níveis de granularidade. Algumas são simples e intuitivas, enquanto outras são complexas e exigem bastante planejamento para serem corretamente modeladas.

Da parte superior de uma hierarquia até a parte inferior, os membros são progressivamente mais detalhados. Por exemplo, em uma dimensão que tenha os níveis Mercado, País, Estado e Cidade, o membro Américas aparece no nível mais alto da hierarquia, o membro EUA aparece no segundo nível, o membro Califórnia aparece no terceiro nível e São Francisco no nível inferior. Califórnia é mais específico do que EUA e São Francisco é mais específico do que Califórnia.

Armazenar hierarquias em um modelo relacional é um desafio comum com várias soluções. Há várias abordagens:

* A hierarquia Horizontal
* O modelo de lista de Adjacência
* O método de enumeração do Caminho
* O modelo de conjuntos Aninhados
* A lista de Ancestrais

Para os fins deste tutorial, criaremos uma lista de Ancestrais, já que ela apresenta a hierarquia de uma forma que pode ser utilizada diretamente em uma consulta. Mais informações sobre as outras abordagens podem ser encontradas no Qlik Community.

## Prefixo Hierarchy

O prefixo Hierarchy é um comando de script que é colocado na frente de um comandoLOAD ou SELECT que carrega uma tabela de nós adjacentes. O comando LOAD precisa ter pelo menos três campos: um ID que seja uma chave exclusiva do nó, uma referência ao pai e um nome.

O prefixo transformará uma tabela carregada em uma tabela de nós expandidos; uma tabela que tenha um número de colunas adicionais; uma para cada nível da hierarquia.

Faça o seguinte:

1. Crie um novo aplicativo e nomeie-o.

2. Adicione uma nova seção de script no Editor de carregamento de dados.

3. Nomeie a seção como Wine.

4. Em DataFiles no menu direito, clique em Selecionar dados.

5. Carregue e, em seguida, selecione Winedistricts.txt.

6. Na janela Selecionar dados de, desmarque os campos Lbound e RBound para que não sejam carregados.

7. Clique em Adicionar.

8. Digite o seguinte acima do comando LOAD:

   ```
   Hierarchy (NodeID, ParentID, NodeName)
   ```

   Seu script deve ter a seguinte aparência:

   ```
   Hierarchy (NodeID, ParentID, NodeName)
   LOAD
       NodeID,
       ParentID,
       NodeName
   FROM [lib://DataFiles/Winedistricts.txt] 
   (txt, utf8, embedded labels, delimiter is '\t', msq);			
   ```

9. Clique em Carregar dados.

10. Use a seção Pré-visualização do visualizador do modelo de dados para visualizar a tabela resultante.

    A tabela de nós expandidos resultante tem exatamente o mesmo número de registros que a sua tabela de origem: um por nó. A tabela de nós expandidos é muito prática, já que ela atende a alguns requisitos para a análise de uma hierarquia em um modelo relacional:

    * Todos os nomes de nós existem em uma e na mesma coluna; portanto, ela pode ser utilizada para pesquisas.
    * Além disso, os diferentes níveis de nós foram expandidos em um campo cada; campos que podem ser usados em grupos de hierarquia ou como dimensões em tabelas dinâmicas.
    * Além disso, os diferentes níveis de nós foram expandidos em um campo cada; campos que podem ser usados ​​em grupos detalhados.
    * Ela pode ser criada para conter um caminho exclusivo para o nó, listando todos os ancestrais na ordem correta.
    * Ela pode ser criada para conter a profundidade do nó, isto é, a distância da raiz.

    A tabela resultante tem a seguinte aparência:

    Tabela mostrando amostra de dados carregados usando o prefixo Hierarchy

    Tabela mostrando amostra de dados carregados usando o prefixo Hierarchy

    Tabela mostrando amostra de dados carregados usando o prefixo HierarchyHierarchy ![Tabela mostrando amostra de dados carregados usando o prefixo Hierarchy.](https://help.qlik.com/pt-BR/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-hierarchyprefix-table.png)

## Prefixo HierarchyBelongsTo

Assim como o prefixo Hierarchy, o prefixo HierarchyBelongsTo é um comando de script que é colocado na frente de um comando LOAD ou SELECT que carrega uma tabela de nós adjacentes.

Também aqui, o comando LOAD precisa ter pelo menos três campos: um ID que seja uma chave exclusiva do nó, uma referência ao pai e um nome. O prefixo transformará a tabela carregada em uma tabela de ancestrais, uma tabela que tenha cada combinação de um ancestral e um descendente listado como um registro separado. Por isso, é muito fácil localizar todos os ancestrais ou todos os descendentes de um determinado nó.

Faça o seguinte:

1. No Editor de carregamento de dados, modifique o comando Hierarchy para o seguinte:
   ```
   HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
   ```

1) Clique em Carregar dados.
2) Use a seção Pré-visualização do visualizador do modelo de dados para visualizar a tabela resultante.

   A tabela de ancestrais atende a vários requisitos para a análise de uma hierarquia em um modelo relacional:
   * Se o ID do nó representar os nós individuais, o ID do ancestral representará as árvores inteiras e sub-árvores da hierarquia.
   * Todos os nomes de nós existem na função como nós e na função como árvores e as duas podem ser utilizadas ​​para pesquisas.
   * Isso pode ser feito para conter a diferença de profundidade entre a profundidade do nó e a profundidade do ancestral, isto é, a distância entre a raiz da sub-árvore.

   A tabela resultante tem a seguinte aparência:

   Tabela mostrando dados carregados usando o prefixo HierarchyBelongsTo

   Tabela mostrando dados carregados usando o prefixo HierarchyBelongsTo

   Tabela mostrando dados carregados usando o prefixo HierarchyBelongsToHierarchyBelongsTo ![Tabela mostrando dados carregados usando o prefixo HierarchyBelongsTo.](https://help.qlik.com/pt-BR/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-hierarchybelongsto-table.png)

### Autorização

Não é raro que uma hierarquia seja usada para autorização. Um exemplo é uma hierarquia organizacional. Cada gerente deve ter o direito de visualizar tudo o que pertence ao seu próprio departamento, incluindo todos os seus sub-departamentos. Mas eles não devem, necessariamente, ter o direito de visualizar os outros departamentos.

Exemplo de hierarquia organizacional

Exemplo de hierarquia organizacional

Exemplo de hierarquia organizacional ![](https://help.qlik.com/pt-BR/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Authorization1.png)

Isso significa que diferentes pessoas poderão visualizar diferentes sub-árvores da organização. A tabela de autorização pode ter a seguinte aparência:

Tabela de autorização

| ACCESS | NTNAME | PERSON | POSITION | PERMISSIONS |
| --- | --- | --- | --- | --- |
| USER | ACME\JRL | John | CPO | HR |
| USER | ACME\CAH | Carol | CEO | CEO |
| USER | ACME\JER | James | Engenharia do Diretor | Engenharia |
| Usuário | ACME\DBK | Diana | CFO | Financeiro |
| Usuário | ACME\RNL | Bob | COO | Vendas |
| USER | ACME\LFD | Larry | CTO | Produto |

Neste caso, Carol pode visualizar tudo o que pertence ao CEO e outros; Larry pode visualizar a organização do Product; e James pode visualizar somente a organização Engineering.

Exemplo:

Muitas vezes, a hierarquia é armazenada em uma tabela de nós adjacentes. Neste exemplo, para resolver isso, você pode carregar a tabela de nós adjacentes usando um HierarchyBelongsTo e chamar o campo ancestralTree.

Se você quiser usar o Section Access, carregue uma cópia em maiúsculas de Tree e chame esse novo campo de PERMISSIONS. Por último, você precisa carregar a tabela de autorização. Essas duas últimas etapas podem ser realizadas usando as seguintes linhas de script. Observe que a tabela TempTrees é a tabela criada pelo comando HierarchyBelongsTo.

Observe que este é apenas um exemplo. Não há exercícios complementares a serem concluídos no Qlik Sense.

Trees: LOAD \*, Upper(Tree) as PERMISSIONS Resident TempTrees; Drop Table TempTrees; Section Access; Authorization: LOAD ACCESS, NTNAME, UPPER(Permissions) as PERMISSIONS From Organization; Section Application;

Este exemplo produziria o seguinte modelo de dados:

Modelo de dados: Tabelas Authorization, Trees, Fact e Nodes

Modelo de dados: Tabelas Authorization, Trees, Fact e Nodes

Modelo de dados: Tabelas AuthorizationAuthorization, TreesTrees, FactFact e NodesNodes ![Modelo de dados: tabelas Authorization, Trees, Fact e Nodes](https://help.qlik.com/pt-BR/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Authorization3.png)