segunda-feira, 23 de novembro de 2015

Implementando Hierarquias Recursivas no Microstrategy (Recursive Hierarchies)

Chegou a vez de abordar a ferramenta Microstrategy. Nos próximos artigos pretendo abordar algumas técnicas que julgo interessante nesta plataforma.

Começaremos com Hierarquias Recursivas. Vale lembrar que esta técnica serve para outras ferramentas. Recentemente implementei também em um projeto Tableau.

Vou utilizar para exemplo, parte de um plano de contas fictício. Imagine a seguinte estrutura:



Esta estrutura está implementada no seguinte datamart de exemplo:



Repare que existe uma tabela de Plano de Contas, onde toda estrutura é armazenada. Ela é uma tabela recursiva. Possui um campo ID_CONTA, seja ela conta sintética ou analítica. Também possui um campo ID_CONTA_PAI, que referencia a própria tabela, quem é sua conta pai. Por fim, possui um campo ID_NIVEL_CONTA, que não são todas tabelas recursivas em um datawarehouse que tem. Explicarei das duas formas de implementar.

Observe como a tabela é preenchida:




Veja que todos os níveis estão na mesma tabela. Para fazer o mapeamento no Microstrategy ou em outra ferramenta, você precisará inicialmente saber o número de níveis existentes no modelo, no caso, são 3 níveis.  Cada um dos níveis será isolado em uma view, seja uma Logical View no Microstrategy ou uma Database View, formando a seguinte estrutura:



O código de cada view segue abaixo. Eu particularmente prefiro as database views pois, quando você visualizar o código SQL de seus relatórios microstrategy fica mais enxuto. 

Nível 1:

SELECT  ID_CONTA    AS ID_NIVEL_1,
               DS_CONTA  AS DS_NIVEL_1
FROM    dim_Plano_Conta
WHERE ID_NIVEL_CONTA=1;

Sem o campo ID_NIVEL_CONTA :

SELECT  ID_CONTA    AS ID_NIVEL_1,
               DS_CONTA  AS DS_NIVEL_1
FROM    dim_Plano_Conta
WHERE ID_CONTA_PAI IS NULL


Nível 2:

SELECT  ID_CONTA AS ID_NIVEL_2, 
               DS_CONTA AS DS_NIVEL_2, 
               ID_CONTA_PAI AS ID_NIVEL_1
FROM     dim_Plano_Conta
WHERE  ID_NIVEL_CONTA=2;

Sem o campo ID_NIVEL_CONTA :

SELECT  ID_CONTA AS ID_NIVEL_2, 
               DS_CONTA AS DS_NIVEL_2, 
               ID_CONTA_PAI AS ID_NIVEL_1
FROM     dim_Plano_Conta N2,
               inner join dim_Plano_Conta N1
               on N2.ID_CONTA_PAI = N1.ID_CONTA
WHERE  N1.ID_CONTA_PAI IS NULL;

Nível 3:

SELECT  ID_CONTA AS ID_NIVEL_3, 
               DS_CONTA AS DS_NIVEL_3, 
               ID_CONTA_PAI AS ID_NIVEL_2
FROM     dim_Plano_Conta
WHERE  ID_NIVEL_CONTA=3;

Sem o campo ID_NIVEL_CONTA :

SELECT   ID_CONTA AS ID_NIVEL_3, 
                DS_CONTA AS DS_NIVEL_3, 
                ID_CONTA_PAI AS ID_NIVEL_2
FROM     dim_Plano_Conta N3,
               inner join dim_Plano_Conta N2
               on N3.ID_CONTA_PAI = N2.ID_CONTA
              inner join dim_Plano_Conta N1
              on N2.ID_CONTA_PAI = N1.ID_CONTA
WHERE  N1.ID_CONTA_PAI IS NULL;

Depois faça o mapeamento de cada view no Microstrategy como um atributo.




Defina o Nível 2 como filho do Nível 1, e o Nível 3 como filho do Nível 2. Também defina o relacionamento do Nível 3 com a fato. Depois é só inserir os atributos e montar o relatório:



E assim finalizamos o artigo. Existe também uma maneira de implementar quando o número de níveis não é conhecido. Porém exige um capítulo aparte e eu não vejo muito sua eficácia como este método.

Obrigado

Fabio Idalgo

Nenhum comentário:

Postar um comentário