Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
pericles_silva
New Contributor III

Solução para uma Tabela Hierárquica

Boa tarde. Estou com uma séria dificuldade em fazer isso.

Só para relembrar que, uma tabela hierarquica, é uma tabela cujo os registros são pais ou filhos de certos registros da mesma tabela.

Vou aplicar um exemplo simples: Uma tabela que armazena dados de computadores.

Id
IdPaiDescricao
1
Desktop
2
Servidores
3
Equipamentos de Rede
183Roteador
193Switch
112Placa-mãe
122Placa de rede
132Processador para servidores
142Memória
1513Processador núcleo simples
1613Processador núcleo duplo
1713Processador de quatro núcleos
41Placa-mãe
51Placa de rede
61Processador para desktops
71Placa de vídeo
81Memória
96Processador de núcleo simples

Até ai tranquilo. O problema é o seguinte: Eu quero criar uma tabela (chamada SERVIDORESSmiley Happy para pegar apenas os dados A PARTIR do registro "Processadores para servidores" no QlikView.

A tabela resultante seria:

Id
IdPaiDescricao
132Processador para servidores
1513Processador núcleo simples
1613Processador núcleo duplo
1713Processador de quatro núcleos

Segue comando Inline dos dados da tabela origem:

LISTA:

LOAD * INLINE [

    Id, IdPai, Descricao

    1, , Desktop

    2, , Servidores

    3, , Equipamentos de Rede

    18, 3, Roteador

    19, 3, Switch

    11, 2, Placa-mãe

    12, 2, Placa de rede

    13, 2, Processador para servidores

    14, 2, Memória

    15, 13, Processador núcleo simples

    16, 13, Processador núcleo duplo

    17, 13, Processador de quatro núcleos

    4, 1, Placa-mãe

    5, 1, Placa de rede

    6, 1, Processador para desktops

    7, 1, Placa de vídeo

    8, 1, Memória

    9, 6, Processador de núcleo simples

];

1 Solution

Accepted Solutions
cesaraccardi
Valued Contributor

Re: Solução para uma Tabela Hierárquica

Olá Péricles, segue sugestão:

TMP_LISTA:

Hierarchy(Id,IdPai,Descricao,Pai,Descricao,'Caminho','\','Nível')

LOAD * INLINE [

    Id, IdPai, Descricao

    1, , Desktop

    2, , Servidores

    3, , Equipamentos de Rede

    18, 3, Roteador

    19, 3, Switch

    11, 2, Placa-mãe

    12, 2, Placa de rede

    13, 2, Processador para servidores

    14, 2, Memória

    15, 13, Processador núcleo simples

    16, 13, Processador núcleo duplo

    17, 13, Processador de quatro núcleos

    4, 1, Placa-mãe

    5, 1, Placa de rede

    6, 1, Processador para desktops

    7, 1, Placa de vídeo

    8, 1, Memória

    9, 6, Processador de núcleo simples

]
;



LISTA:

NoConcatenate

LOAD

*

Resident

TMP_LISTA

WHERE Descricao2 = 'Processador para servidores';



DROP TABLE TMP_LISTA;

6 Replies
aderlanrm
Valued Contributor

Re: Solução para uma Tabela Hierárquica

Olá Pericles,

Se você ja sabe quais os código basta fazer:

LOAD Id,

    'Servidor' as IdPai,

    Descricao

Resident LISTA

Where Id = 13 or Id = 15 or Id = 16 or Id = 17;

E colocar isso na tabela dinâmica com os campos na ordem Pai, Descrição.

Mas se você quer que isso fique flexivel para sempre que carregar todos os dados sejam devidamente agrupados

o código fica:

Left Join (LISTA)

LOAD Id as IdPai,

    Descricao as DescricaoPai

Resident LISTA

Where Exists(Id,IdPai) or IsNull(IdPai) or IdPai = '';

Coloquei alguns tratamentos no WHERE que talvez seja desnecessário, avalie.

Abraço.

cesaraccardi
Valued Contributor

Re: Solução para uma Tabela Hierárquica

Olá Péricles, segue sugestão:

TMP_LISTA:

Hierarchy(Id,IdPai,Descricao,Pai,Descricao,'Caminho','\','Nível')

LOAD * INLINE [

    Id, IdPai, Descricao

    1, , Desktop

    2, , Servidores

    3, , Equipamentos de Rede

    18, 3, Roteador

    19, 3, Switch

    11, 2, Placa-mãe

    12, 2, Placa de rede

    13, 2, Processador para servidores

    14, 2, Memória

    15, 13, Processador núcleo simples

    16, 13, Processador núcleo duplo

    17, 13, Processador de quatro núcleos

    4, 1, Placa-mãe

    5, 1, Placa de rede

    6, 1, Processador para desktops

    7, 1, Placa de vídeo

    8, 1, Memória

    9, 6, Processador de núcleo simples

]
;



LISTA:

NoConcatenate

LOAD

*

Resident

TMP_LISTA

WHERE Descricao2 = 'Processador para servidores';



DROP TABLE TMP_LISTA;

rvsilvestre
Contributor III

Re: Solução para uma Tabela Hierárquica

Estou com uma dúvida muito parecida , estou tentando fazer com o Hierarchy , mas não esta dando certo..

tenho

cod1  cod2

1          8

1          7

1          2

2          4

2          9

e quero transformar para

cod1 cod2

1          8

1          7

1          4

1          9

Alguém para dar um help?

aderlanrm
Valued Contributor

Re: Solução para uma Tabela Hierárquica

Olá Rodrigo,

Acredito que a melhor opção neste caso é o uso do Mapping, segue:

Grupo:

Mapping

LOAD cod2,

    cod1

From...;

Resultado:

LOAD MapSubString('Grupo',cod1) as cod1,

    cod2,

    Descricao

From...

Where not Exists(cod1,cod2);

O Where é apenas para remover os "gurpos" da tabela cerregada.

Abraço.

pericles_silva
New Contributor III

Re: Solução para uma Tabela Hierárquica

Cesar Accardi é isso mesmo. Agora mais uma dúvida:

Gostaria de armazenar em uma variável (valores separados por vírgula) cada ID das peças de computador a partir de "Processador para servidores". Tem como?

$idsCpuServer = 13, 15, 16, 17, (...)

cesaraccardi
Valued Contributor

Re: Solução para uma Tabela Hierárquica

Olá Pericles,

Tem sim.... use a função Concat(Descrição,',')