Ir para conteúdo
  • 0

PREVIOUSYEAR - MODO Raiz


Joao Felipe
Ir para solução Solucionado por Fred - DAX ,

Pergunta

  • Alunos

Boa noite a todos, 

*** Se for algo muito complexo, e tiver algum consultor, que tiver uma hora disponível para auxiliar, deixe o contato que entro em contato,  gostaria muito de entender a lógica por trás da solicitação abaixo ***

Seguindo as aulas do Leo no novo módulo de Dax, gostaria de entender COMO A CALCULATETABLE faz para esconder as datas futuras, ou seja, datas ondem não deveriam ter valores. 

Abaixo seguem as imagens para facilitar.

1. Primeiro:
Reduzi a tabela Fato para 49 linhas  onde tem dados de 01/01/2017 até 16/03/2019. 
Tenho uma tabela calendário que vai de 01/01//2017 até 31/12/2019

2. Criei uma medida de Total Vendas, bem simples, somando a coluna Valor da tabela Fato.

3. Depois Criei uma Medida de Total Vendido Previous Year, que retorna o valor do Ano Anterior em todos os contextos (foto Abaixo)

image.thumb.png.b0e4010de7164737dc339df2da14df69.png

 

4. Para exercitar eu quis Criar a Media no modo Raiz, sem utilizar a função de inteligência de tempo e Fiz da Seguinte maneira 

image.png.4d1923d2eef5be56969f15ffd2b0b401.png

 

o Resultado ficou da Seguinte Maneira:  (ficou da maneira que eu gostaria, deixando blank as datas futuras a partir de abril de 2019) 
 

image.thumb.png.4e468b8b71357f685a50df9b0914e6db.png

 

A pergunta é a seguinte, vamos imaginar que estamos no contexto de abril de 2019 (grifado de amarelo acima)

Alguém consegue me explicar passo a passo como que o segundo argumento da CalculateTable "dCalendario[Datas com Venda] = TRUE()" consegue realizar esse filtro na função de tabela da Filter no primeiro argumento ?  ou seja, gostaria de entender o que o Power Bi faz por trás dos panos

 

Obs.: Segue o Pbix para testes se necessário, lembrando que reduzi a tabela fato para apenas 49 linhas para facilitar a vida de quem puder contribuir com a ajuda. 

 

 

Exemplo.pbix

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos

Oi João, tudo bem?

Então:

CALCULATETABLE(
FILTER(
ALL(dCalendario),
dCalendario[Ano] = MAX(dCalendario[Ano]) - 1
),
dCalendario[Datas com Venda] = TRUE()

Essa tua última linha do DAX acima está filtrando a "Tabela" FILTER que criaste logo acima, trazendo apenas as Datas com Venda = TRUE.

Sem o CALCULATETABLE, tu não consegues filtrar diretamente a Medida que criaste.

Desculpa se não entendi tua pergunta.

Abraço!

 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
1 hora atrás, Carlos Beck disse:

Oi João, tudo bem?

Então:

CALCULATETABLE(
FILTER(
ALL(dCalendario),
dCalendario[Ano] = MAX(dCalendario[Ano]) - 1
),
dCalendario[Datas com Venda] = TRUE()

Essa tua última linha do DAX acima está filtrando a "Tabela" FILTER que criaste logo acima, trazendo apenas as Datas com Venda = TRUE.

Sem o CALCULATETABLE, tu não consegues filtrar diretamente a Medida que criaste.

Desculpa se não entendi tua pergunta.

Abraço!

 

Ola Carlos, boa noite tudo bem e contigo ? 

Agradeço pela resposta, mas que essa ultima linha filtra eu já compreendi. 

O que eu não entendo é a lógica por trás para realizar o filtro.

Por exemplo:
Essa última linha, é o mesmo que: 
Filter(
  ALL(dCalendario[Datas com Venda]),
  dCalendario[Datas com Venda] = TRUE()
)


Como que essa tabela, consegue filtrar a tabela  passada no primeiro argumento da calculateTable  "All(dcalendario) dentro da função filter " ? 


image.png.216ef788d15983905dbb9bbb91ecacad.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
12 horas atrás, Joao Felipe disse:

Ola Carlos, boa noite tudo bem e contigo ? 

Agradeço pela resposta, mas que essa ultima linha filtra eu já compreendi. 

O que eu não entendo é a lógica por trás para realizar o filtro.

Por exemplo:
Essa última linha, é o mesmo que: 
Filter(
  ALL(dCalendario[Datas com Venda]),
  dCalendario[Datas com Venda] = TRUE()
)


Como que essa tabela, consegue filtrar a tabela  passada no primeiro argumento da calculateTable  "All(dcalendario) dentro da função filter " ? 


image.png.216ef788d15983905dbb9bbb91ecacad.png

Bom dia! Tudo bem com vocês?

Para entender a lógica podemos olhar a documentação, que está em anexo.

Mas de todo modo eu entendo que seria o seguinte: A Calculatetable pede uma expressão(que retorna uma tabela, é bom frisar isso) e depois um ou mais filtros. Logo:

CALCULATETABLE(
                             <EXPRESSÃO>,
                             <FILTRO>
)

Na sua fórmula, a expressão retorna uma tabela com todas as datas da sua dCalendario (ALL(dCalendario)) onde o ano seja igual ao ano -1. Com esses dados retornados, o próximo argumento serve de filtro para essa expressão. Então dentre essas datas ele filtra as que tem venda (dCalendario[Data Venda] = TRUE()).

Espero que tenha ficado mais claro.

Qualquer coisa me add no linkedin para trocarmos uma ideia melhor! (1) Fernando Lozer | LinkedIn

Abraço!

image.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
22 horas atrás, Fernando Lozer disse:

Bom dia! Tudo bem com vocês?

Para entender a lógica podemos olhar a documentação, que está em anexo.

Mas de todo modo eu entendo que seria o seguinte: A Calculatetable pede uma expressão(que retorna uma tabela, é bom frisar isso) e depois um ou mais filtros. Logo:

CALCULATETABLE(
                             <EXPRESSÃO>,
                             <FILTRO>
)

Na sua fórmula, a expressão retorna uma tabela com todas as datas da sua dCalendario (ALL(dCalendario)) onde o ano seja igual ao ano -1. Com esses dados retornados, o próximo argumento serve de filtro para essa expressão. Então dentre essas datas ele filtra as que tem venda (dCalendario[Data Venda] = TRUE()).

Espero que tenha ficado mais claro.

Qualquer coisa me add no linkedin para trocarmos uma ideia melhor! (1) Fernando Lozer | LinkedIn

Abraço!

image.png

Olá Fernando, agradeço a resposta, 

Porém, a CaculateTable funciona igual a Calculate, ela primeiro avalia os filtros e depois a expressão. 

Vamos imaginar que nós estamos no contexto do ano de 2019 no mês de Abril , e tentar entender o motivo do valor ter dado Blank.

image.png.16511466ee4705c8d340ff607e76aa69.png

a medida Criada foi a seguinte: 

PY raiz = 

//Localizando o Ano do Contexto 
Var vAnoContexto = MAX(dCalendario[Ano])
   

Var vResultado = 
    CALCULATE(
        [Total Vendas],
        //CalculateTable para esconder as Datas onde não hove vendas, ou seja, a partir de 16/03/2019
        CALCULATETABLE(
           FILTER(
                ALL(dCalendario),
                dCalendario[Ano] = MAX(dCalendario[Ano]) - 1 
            )
,
            dCalendario[Datas com Venda] = TRUE()
        )
    )

Return
    vResultado


Então se a CalculateTable começa a avaliação pelos FILTROS (grifado de verde) , logo vai retornar todas as datas de abril/2019 no qual a coluna de "Datas com Venda" seja "true" (neste caso nenhuma data será retornada, uma vez que a ultima data de venda é 16/03/2019).


Feito isso, agora é avaliado a Expressão (grifado de amarelo), onde temos dentro da Filter a função ALL removendo qualquer filtro da dCalendário, e fazendo a expressão "ano do contexto tem que ser igual o próprio ano menos 1), isso faz com que retorne as 30 linhas de abril de 2018. Logo, ao meu ver deveria retornar o valor de abril de 2018 e não retornar blank.
 

Nota.: A medida está fazendo realmente o que eu quero, eu só não entendi como que ela funcionou corretamente. 
 

 

 

Editado por Joao Felipe
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
1 hora atrás, Fernando Lozer disse:

Entendi João.

Dá uma olhada nesse vídeo do papai do dax: 

É bem provável que fique mais claro com a explicação dele do que com a minha. 🤣

Espero ter contribuído de alguma forma!

Abraço!



Fernando, obrigado pela ajuda, contribuiu bastante.

Mas ainda continuo sem entender kkkkkkkkkk (rindo pra não chorar). 

Por hora mesmo com toda a ajuda, não consigo compreender a ordem de execução da medida que criei, e o motivo dela ter funcionado.

Enfim, a medida funcionou, e quem sabe daqui a alguns longos meses eu consiga compreender o que aconteceu. 

Infelizmente o Power Bi é muito engessado quando a gente tenta debugar alguma medida, mas vida que segue kkkk. 

De qualquer forma muitíssimo obrigado brother.

 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 17/02/2022 em 11:35, Fred - DAX disse:

@Joao Felipe,  eu consigo te explicar. Se quiser me chamar no privado, terei maior prazer em explicar. Existe um pequeno detalhe que passou despercebido por você...

Fred muitíssimo obrigado pela ajuda. Sua explicação foi excelente, realmente abriu a mente para o entendimento dos contextos no Power Bi. Gratidão total pela ajuda. 

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...