Cognos MDX Parte 1
Autor: Thiago Bueno | Publicado: 2013-10-03T21:57:00-03:00

Eis que vos falo novamente... enquanto aguardo meu GTA Online funcionar.

Recentemente passei por um aperto e tanto e&nbsp; resolvi fazer minha contribuição semestral a comunidade que mexe com esse trem chamado Cognos.

Hoje vamos falar um pouco de MDX, básico.
Muitos já devem ter se deparado com o desenvolvimento de relatórios sobre cubos, no meu caso o infame Dynamic Cube, e como já era de se esperar, nunca é fácil, sempre difícil.

Então a linguagem que o tal cubo utiliza é o MDX, e se você tentar fazer um relatório sobre cubo com o conceito de desenvolvimento relacional você está perdido.

Isso acontece porque MDX é uma linguagem que faz um de hierarquias e buscas em profundidade, diferente do SQL que faz buscas lineares de profundidade 0.

Isso posto, vamos a dicas!

Para fazer um filtro de informação, procure sempre utilizar um slicer, veja exemplo abaixo:

Filtro simples obrigatório:
[Cubo];[Dimensão].[Hierarquia]-&gt;?p_parametro?

Filtro múltiplo obrigatório:
set([Cubo];[Dimensão].[Hierarquia]-&gt;?p_parametro?)

Filtro simples opcional:
#prompt('p_parametro';'memberuniquename';'rootMember([Cubo];[Dimensão].[Hierarquia])')#

Filtro múltiplo opcional:
#prompt('p_parametro';'memberuniquename';'rootMember([Cubo];[Dimensão].[Hierarquia])';'set(';'';')')#

Isso vai resolver a maior parte dos problemas de filtragem que você possa ter, mas se você precisar fazer a passagem de um parâmetro para um relatório que utiliza 2 cubos você encontrará um problema. Descobri como resolve-lo na sorte, depois explico, é um pouco mais complicado mas funciona.

Agora fazer dizer que você precisa fazer um relatório acumulado no período:
o seu slicer ficaria +/- assim:
head(children([Meu Cubo];[Tempo].[Ano]-&gt;?p_ano?);?p_mes?)
Nesse caso ele traz os ?p_mes? primeiros membros filhos de ?p_ano?.


Caso queira utilizar a mesma lógica para mês é só muda de head para item:
item(children([Cubo];[Tempo].[Ano]-&gt;?p_ano?);?p_mes?)

Bom isso é o começo, agora vamos ver como fazer um case, coisa muito simples no modo relacional, mas em cubo é um caos.
Se você fizer um simples case vai ter graves problemas de performance, então minha sugestão é a seguinte:
vamos agrupar SP, MG, RJ e ES como Sudeste e os demais e outros:
set(
member( total(currentMeasure within set filter([Cubo].[Estados].[Estados].[Estados]; caption([Cubo].[Estados].[Estados].[Estados]) in ('SP';'MG';'RJ';'ES'))); 'membro1'; 'Sudeste'; [Cubo].[Estados].[Estados]);
member( total(currentMeasure within set filter([Cubo].[Estados].[Estados].[Estados]; caption([Cubo].[Estados].[Estados].[Estados]) not in ('SP';'MG';'RJ';'ES'))); 'membro2'; 'Outros'; [Cubo].[Estados].[Estados]);
)

Fácil né?
Agora um sugestão muito útil, image que você quer trazer o TOP 10, moleza:
topCount([Cubo].[Dimensão].[Hierarquia].[Nível]; 10; [Cubo].[Medidas].[Medida])

Mole mesmo, mas agora você que ranquear esses caras, então faça assim:

Primeiro escolha pelo que vai ranquear, digamos que é pelo ano, e vamos imaginar que você já faz os Data itens.
Rank(tuple([Medida];[Ano]) within set([Top 10]))

Acho que isso já está bem complicado por hoje, mas logo volto com mais algumas dicas!!

Qualquer dúvida já sabem.

[[]]'s