none
Recalcular KPI quando aplicado filtro - MDX Analysis Service RRS feed

  • Pergunta

  • Boa noite!

    Gente, to com um problemão:

    Tenho uma medida calculada (KPI) com base numa medida de count de produtos. A intenção é que esse KPI mostre qual o percentual de produtos por loja, por exemplo.

    Da forma que foi escrita, como segue abaixo, funciona corretamente. O problema é que, quando o usuário cria um filtro, o resultado esperado é que o percentual seja recalculado de acordo com o total atual da medida, filtrado, e não de acordo com o total sem filtro. Como posso fazer isso?

     

    format(

    IIF

     

     

    (

    ([Measures].[Qtd Produtos] = 0), 0,

    [Measures].[Qtd Produtos] /

    Sum(Root().CURRENTMEMBER, [Measures].[Qtd Produtos])

    ),

    'percent')

     

    Obrigada!

    Camila Neiva

    quarta-feira, 24 de novembro de 2010 00:37

Todas as Respostas

  • Olá Camila, não seria o caso de vc atribuir o que será filtrado no seu MDX? Pois, como vc mesmo explicou está correto mas se vc precisar fazer um filtro por algum periodo (no caso com a dimensão de tempo) isso não vai ocorrer, ou seja, seu MDX tem que contemplar também os atributos que serão usados para filtro. Espero ter ajudado, boa sorte!
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quarta-feira, 24 de novembro de 2010 10:41
  • Wyllian, bom dia!

    Obrigada pela resposta!

    Então, na verdade eu não sei como fazer isso que você sugeriu (atribuir o que será filtrado no meu MDX). Você poderia me dar algum exemplo?

    Estava pensando que, talvez, se eu conseguisse pegar o grand total da medida, poderia dividir por ela ao invés de dividir pela soma do root.

    Não manjo de MDX... =/

    Abraços!

    quinta-feira, 25 de novembro de 2010 08:36
  • Camila,

    Sou raciocínio esta certo, mas este total que você esta querendo utilizar esta armazenado também em um membro?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quinta-feira, 25 de novembro de 2010 12:16
  • Tente algo assim, format( IIF ( ([Measures].[Qtd Produtos] = 0), 0, ([DimExemploTempo].[DiaExemplo],[Measures].[Qtd Produtos]) / Sum(Root().CURRENTMEMBER, [Measures].[Qtd Produtos]) ), 'percent') .... O conceito é este, veja se consegue algum resultado vou ver se consigo algum exemplo mais claro se vc não conseguir. Boa sorte !
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quinta-feira, 25 de novembro de 2010 17:06
  • Wyllian,

    Sem resultado. Na verdade, agora está dando erro (troquei a [DimExemploTempo].[DiaExemplo] por uma dimensão válida).

    Não sei se consegui explicar claramente o que eu preciso, mas caso não tenha ficado claro, é o seguinte:

    Tenho uma medida, quantidade de produtos. Quando não tenho filtro, eu coloco qualquer dimensão relacionada e funciona corretamente. Digamos que a medida colocada seja Produto, e que eu tenha duas opções: A e B. Sem filtro, o resultado fica:

    PRODUTO   QTD DE PRODUTO      % PRODUTO

    A                      200                           20%

    B                      800                           80%

    Total               1000                          100%

     

    Quando eu filtro por cidade, por exemplo, São Paulo, o resultado fica:

    PRODUTO   QTD DE PRODUTO      % PRODUTO

    A                       30                            3%

    B                       50                            5%

    Total                  80                            8%

     

    Quando o correto e esperado pelo cliente seria A = 37.5%, B = 62.5% e Total = 100%.

    Aguardo uma ajuda, ainda não consegui resolver meu problema...

    Obrigada!

    domingo, 28 de novembro de 2010 23:08
  • Camila,

    O valor não esta sendo agrupado da forma correta!!!

    No caso quando você aplica um filtro, o que eu entendo é que esta filtro esta trazendo um valor parcial dentro da condições impostas com base no valor informado dentro do filtro e não com base em uma porcentagem completa.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    terça-feira, 30 de novembro de 2010 18:42
  • Desculpe, mas não entendi... Como assim, o valor não está sendo agrupado da forma correta? Qual é a forma correta do agrupamento? O único lugar onde eu sei que podemos definir a forma de agrupamento de um campo é nas propriedades da medida... e, no caso da medida que estou utilizando, é um count. Não defini nenhuma forma de agrupamento do KPI criado, nem sei onde eu poderia definir isso. O valor da medida utilizada está correto, independente de filtro ou nível de detalhe... o problema é que, quando filtrado, o valor total para o cálculo do percentual no KPI deve mudar, para ser igual ao novo grand total do cubo. Não faz sentido para mim que isso não seja possível... tem que haver alguma forma... Alguém poderia me enviar um exemplo de como deveria ficar a fórmula do KPI, ou qualquer configuração que eu precise alterar para obter o resultado esperado? Obrigada! Camila Neiva
    Camila Neiva
    terça-feira, 30 de novembro de 2010 18:53
  • Camila,

    Desculpe-me talvez eu não me expressei bem!!! Na verdade o que eu estava querendo dizer é a forma que o SQL Server esta processando o seu resultado.

    Como você esta filtrando, acredito que o resultado é uma porcentagem parcial com base nos valroes filtrados.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    terça-feira, 30 de novembro de 2010 18:56
  • Ah, entendi!

    Sim, provavelmente é isso mesmo que está acontecendo...  Sabe se tem alguma forma de contornar isso?

    Obrigada!

    Camila Neiva


    Camila Neiva
    quarta-feira, 1 de dezembro de 2010 08:25
  • Boa tarde Camila, 

    estive lendo um pouco sobre a função MDX Root() e fiquei com um pouco de dúvida sobre o uso dela. No conceito que eu li fala que a função retorna uma tupla com todos os membros de cada atributo dentro do escopo corrente do cubo. Juntando essa informação com o caso que você está relatando fiquei pensando se não seria o caso de você especificar dentro dessa função uma tupla que represente os tributos correntes da dimensão produto. Algo como Root([DimProduto].[Produto].CurrentMember). Acho que era o caso até de descartar a função Root e usar só a Tupla mesmo.

    Penso que dessa forma o escopo corrente seja o que já está delimitado na função e não os filtros que você aplicar na sua visão, como por exemplo fazer um filtro na dimensão cidade.

    Não fiz teste algum, isso seria apenas uma tentativa.

     

     


    Nayron Araújo - Desenvolvedor BI - Setor de TI - Universidade Potiguar - UnP
    quarta-feira, 1 de dezembro de 2010 17:16
  • Nayron,

    Obrigada pela resposta e pela ajuda.

    Antes de testar essa função (Root()), eu estava realmente usando as tuplas. Como eu tinha que colocar todas as que faziam relacionamento com a medida, de forma que o percentual atendesse corretamente às mudanças de valores da medida. Mesmo utilizando as tuplas, estava com o mesmo problema.

    Troquei pela função apenas para economizar código, mas posso te garantir que a simples troca da função pela tupla, ou lista de tuplas, não resolve o problema.

    Acho inacreditável que seja complicado assim fazer um cálculo tão bobo... srsrsrsr

    Vou continuar pesquisando, tem que ter uma solução!...

    Aguardo mais sugestões. Obrigada!

    Camila Neiva


    Camila Neiva
    quinta-feira, 2 de dezembro de 2010 13:47
  • Bom dia Camila, 

    mais uma tentativa. Não sei se você já tentou isso, ao invés de dividirmos pelo escopo corrente 

    format(IIF(([Measures].[Qtd Produtos] = 0), 0,[Measures].[Qtd Produtos] /Sum(Root().CURRENTMEMBER, [Measures].[Qtd Produtos])),'percent')

    para o resultado que você está esperando, acho que o correto seria dividirmos por todos os membros. Então ficaria algo como:

    format(IIF(([Measures].[Qtd Produtos] = 0), 0,[Measures].[Qtd Produtos] /Sum(Root().ALLMEMBERS, [Measures].[Qtd Produtos])),'percent')

    espero que não seja mais uma perda tempo como meu último post. hehehhe.



    Nayron Araújo - Desenvolvedor BI - Setor de TI - Universidade Potiguar - UnP
    sexta-feira, 3 de dezembro de 2010 11:43
  • Camila,

    Acho que o problema não é fazer o cálculo, mas sim fazer com que o Analysis Services ou o próprio SQL Server entendam a hierarquia dos dados e monte esta estrutura para geração do cálculo.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    sexta-feira, 3 de dezembro de 2010 18:46