Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] [Dúvida] Filtrar dentro ou fora do CALCULATE

Na aula "06 Tratamento de retornos indesejados" é passada a seguinte fórmula DAX:

Teste 1 = 
var DataAtual = MAX(Tb_Calendario[Date])
RETURN
IF(
    COUNTROWS(Tb_ItensNotas) > 0,
    CALCULATE(
        [Total Vendas],
        DATESBETWEEN(
            Tb_Calendario[Date],
            DataAtual - 30,
            DataAtual)))

Quando coloco esse IF no formato de filtro, interno ao CALCULATE, o resultado final é diferente:

Teste 2 = 
var DataAtual = MAX(Tb_Calendario[Date])
RETURN
    CALCULATE(
        [Total Vendas],
        DATESBETWEEN(
            Tb_Calendario[Date],
            DataAtual - 30,
            DataAtual),
        FILTER(Tb_ItensNotas, COUNTROWS(Tb_ItensNotas) > 0)            
            )

Qual o motivo dessa diferença? Quando usar um e quando usar outro?

1 resposta
solução!

Olá Eduardo, tudo bem?

A diferença entre as duas abordagensestá relacionada ao contexto de filtro no qual o CALCULATE opera e como o IF afeta a lógica da sua medida.

No primeiro código, o IF é usado para verificar se a tabela Tb_ItensNotas tem linhas antes de aplicar qualquer cálculo. Se COUNTROWS(Tb_ItensNotas) > 0 não for verdadeiro, o CALCULATE não é executado, e a função retorna BLANK() (ou nada). Com isso, o cálculo só ocorre se a condição for atendida, protegendo sua medida de executar cálculos desnecessários quando não há dados relevantes.

Já o segundo código, o FILTER é usado como parte dos argumentos do CALCULATE. Isso significa que o CALCULATE sempre será executado, mas o resultado será filtrado para incluir apenas as linhas onde COUNTROWS(Tb_ItensNotas) > 0. Como o CALCULATE é executado independentemente, ele pode retornar resultados mesmo quando não há dados, dependendo do contexto de filtro existente.

Quando usar um ou outro:

  • Use a abordagem do Teste 1 quando quiser evitar completamente a execução do cálculo se a condição não for atendida.
  • Use a abordagem do Teste 2 quando você deseja que o cálculo sempre seja executado, mas apenas os resultados relevantes sejam considerados no final.

Espero ter esclarecido.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado