Ir para conteúdo
  • 0

Transição de contexto (FILTER)


Joao Felipe
Ir para solução Solucionado por Barony ,

Pergunta

  • Alunos

Criei um modelo bem simples com 2 tabelas (Vendas e Clientes ) print abaixo: 

Tabela Vendas: 
image.png.8eff4c559e625f9a1231c238ba5de8c7.png

 

Tabela Clientes:

image.png.e5b601e4666d48d76f856c72c11e479d.png
 

Criei 2 medidas: 

Soma Vendas =  SUM( fVendas[Valor] )
 
Ranking =
   RANKX(
       ALL( dCliente[Nome]),
       [Soma Vendas]
   )

 

A Dúvida é a seguinte:
O que acontece por trás dos cálculos quando utiliza-se VÁRIAVEL e MEDIDA dentro de uma função iterante. 

Exemplo abaixo: 

Criei uma medida  com nome TESTE, para que fosse retornado em todos os contextos apenas o valor de venda dos vendedores que tiveram RANK acima de 2. 

Eu cheguei no resultado que eu queria, conforme abaixo: 

image.png.48a2aaad5c7d66d72d32fdd47dd012fb.png

 

para chegar neste resultado utilizei a seguinte medida 

CALCULATE(
    [Soma Vendas],
    FILTER(
        ALL( dCliente[Nome]),
        [Ranking] > 2
    )
)
 
Note que foi utilizado uma medida dentro da filter

 

Porém, se eu tentar fazer este mesmo cálculo armazenando a medida de Ranking em uma variável, o resultado é diferente, e eu gostaria de entender EXATAMENTE o que é feito no momento das iterações quando se tem uma variável dentro da FILTER. 

Var Variavel_rank =
    RANKX(
       ALL( dCliente[Nome]),
       CALCULATE( SUM( fVendas[Valor] ) )
   )
 
Return
 
CALCULATE(
    [Soma Vendas],
    FILTER(
        ALL( dCliente[Nome]),
        Variavel_rank  > 2
    )
)
 

o resultado  abaixo É 55 nos contextos de Patricia e João .  Pq não deu  15 ?

image.png.b56f998efc904e475f4aa23dfc06059a.png

 

Grato desde já pela ajuda 
 

 
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
  • Solução

 

@Joao Felipe

Que duvida legal.. A resposta é o seguinte uma variavel é uma constante ou seja quando armazena um valor em uma variavel ela guarda um valor sendo um munero fixo tipo 3  a  com isso a filter nao ira realizar transição de contexto pois se trata de um numero fixo. Ja na outra medida esta utilizando uma medida entao para cada linha na tabela base do visual ira realziar transição de contexto . Em ambos os casos a filter ira retonar uma tabela com os dois nomes patricia e joao porem no primeiro caso o filtro sera aplicado na medida e no segundo caso é como se tisse somente um calculate([somavenda] all(dcliente), Filter(dcliente, [ranking].2))

 

 

image.png.1ca35be355c235c9b9f7415f5d2be8a6.png

image.png.e5e7abf5252578a1dbc5d1fc26dc7292.png

 

  • Like 3
  • Thanks 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
2 horas atrás, Nelson Kobayashi disse:

Olá @Joao Felipe!

Veja a explicação do jovem Leonardo Karspinki neste vídeo antigo, aos 11 minutos do vídeo :

 

 

 

 

Obrigado Nelson, mas infelizmente não ajudou.

Por exemplo. 

Imagine que estamos no Contexto da Patrícia, no qual o Valor da Medida TESTE é = 55. 

image.png.2b2150bfd0e92fa10740c39718d1041e.png

 

Como que o DAX chegou nesse valor de 55 ? 

 

A medida utilizada foi: 
 

Teste =
 
Var Variavel_rank =
    RANKX(
       ALL( dCliente[Nome]),
       CALCULATE( SUM( fVendas[Valor] ) )
   )
 
Return
 
CALCULATE(
    [Soma Vendas],
    FILTER(
        ALL( dCliente[Nome]),
        Variavel_rank > 2
    )
)

 

Eu quero entender exatamente o seguinte: (relembrando que estamos no contexto da Patrícia)

1.  Eu criei a variável "variavel_rank" e inicialmente é gravado o valor das variáveis , no caso da Patrícia o Rank dela foi 3. 

2.  Próximo passo, a CALCULATE primeiro faz a avaliação dos filtros. 

Entao na Filter, como tenho ALL, removeu o contexto da Patrícia, e devolveu todos os vendedores. 

3. agora temos a expressão da FILTER ***** Variavel_rank > 2 **** 

A partir deste ponto eu não sei o que esta sendo realizado. 

Era essa iteração da Filter que eu gostaria de entender o passo a passo. 

 

 



 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Olá @Joao Felipe!

 

Basicamente o que a sua MEDIDA diz é :

1. ) Calcule a soma de ALL dCLIENTE[Nome]

Ou seja: calcule a soma de vendas de TODOS (ALL) clientes que é igual a 55

image.png.8406979f27c218100ee32fca93f9cb80.png

 

2.) Filtre somente os nomes dos clientes com RANK maior que 2 (Patrícia e Joao).

3.) Retorne somente para esses nomes filtrados o valor de todas as vendas (ALL DCLIENTES) que é 55. E para os que não cumprem a regra de RANK>2 retorne BLANK.

 

Se você esperava o seguinte resultado:

image.png.10138b612900bee383074f381b0c9fec.png

Deveria substituir

FILTER(ALL( dCliente[Nome])

Por:
FILTER(ALLSELECTED( dCliente[Nome])

 

Espero ter ajudado.

Abç.

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Barony e Nelson , agradeço pelo tempo de vocês. 

Mas não compreendi ainda o que acontece dentro da Filter no cenário que expus acima. 

Exemplo: vamos pegar o contexto da Patrícia. 

FILTER(
        ALL( dCliente[Nome]),
        Variavel_rank > 2
    )

1. passo:     a Variavel_rank = 3 

2. passo:     A função ALL remove todos os vendedores. 

3. passo    faz a iteração em todas as linhas resultante da função ALL, verificando se a  Variavel_rank > 2 , 

4. passo:

começa a iteração: 
Maria tem o rank 1 , fica de fora 

Pedro tem o rank2, fica de fora

Patrícia  tem o rank 3, OK

Joao tem o rank 4, OK 

5. passo:    sobrou uma tabela apenas com Patricia e Joao.

6. passo:   Patricia tem venda de 10 .... Joao tem venda de 5 , somando ambos da 15.

7. Porém o resultado foi 55 em ambos os contextos.

8. Pq deu 55 e não 15  ? 

 

 


 

 

 

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...