No artigo anterior sobre função CALCULATE abordamos todos os conceitos básicos e exploramos como ela manipula e interage com o contexto de filtro criado pelos gráficos dentro do Power BI.

Entendemos que o poder da função está no seu argumento de filtro e na forma como ele pode entregar medidas e análises úteis para os donos de negócio.

Sabendo da importância da função dentro da ferramenta vamos destrinchar e aprender como podemos manipular o filtro da CALCULATE, melhorando nossos resultados e análise de dados.

FILTROS AVANÇADOS  E MODIFICADORES DA CALCULATE

Vimos que quando construímos uma medida com a função CALCULATE utilizando a mesma coluna que está no gráfico, por exemplo, sobrescrevemos o filter context pelo parâmetro que está na função. Entenda:

Exemplo de sobrescrita do contexto de filtro com a função CALCULATE.
Exemplo de sobrescrita do contexto de filtro com a função CALCULATE.

Como pode ver no gráfico, todos os valores das vendas da categoria áudio foram aplicados nas outras categorias. O que acontece nesta situação é uma sobrescrita de filtro, como já vimos anteriormente (leia mais aqui)

Porém, existe uma forma de alterar os valores exibidos dentro do gráfico utilizando uma função que irá manter apenas a coluna e os valores desta coluna, que se chama KEEPFILTER.

A função recebe um parâmetro com um ou mais valores e quando a medida construída com ela é aplicada no gráfico, exibe apenas os itens envolvidos. Observe:

Uso da função KEEPFILTERS na CALCULATE
Uso da função KEEPFILTERS na CALCULATE

Mas perceba que não posso utilizar duas KEEPFILTERS na mesma expressão:

Erro ao utilizar duas KEEPFILTERS
Erro ao utilizar duas KEEPFILTERS

Para mais de um parâmetro na função KEEPFILTERS, utilizar da seguinte forma:

Forma correta de múltiplos parâmetros  na função KEEPFILTERS.
Forma correta de múltiplos parâmetros na função KEEPFILTERS.

Ela pode ser considerada um modificador do parâmetro de filtro da CALCULATE, assim como a ALL. O que ocorre aqui é a substituição do filtro existente, pelo filtro que está dentro da KEEPFILTER.

Se quiser entender melhor a diferença que ocorre quando utilizamos KEEPFILTERS, veja as duas medidas abaixo.

Múltiplos parâmetros com KEEPFILTERS 
e o filtro da CALCULATE.
Múltiplos parâmetros com KEEPFILTERS
e o filtro da CALCULATE.

Agora perceba como o resultado é exibido para cada uma das medidas.

Resultado das duas medidas anteriores.

Quando utilizamos o operador IN na KEEPFILTERS exibimos os dois parâmetros separados, porém, na CALCULATE não ocorre desta forma e sim, a sobrescrita do contexto de filtro – como era esperado.

É possível utilizar ALL dentro da KEEPFILTERS sem alterar o resultado. O único ponto é que não podemos adicionar itens ao parâmetro de filtro como foi feito nos outros exemplos.

Uso da função ALL com a função KEEPFILTERS. Não altera o resultado
Uso da função ALL com a função KEEPFILTERS. Não altera o resultado

Para utilizar múltiplos parâmetros com ALL, precisaríamos da seguinte solução de contorno:

Solução de contorno para múltiplos parâmetros de filtro com a função ALL.
Solução de contorno para múltiplos parâmetros de filtro com a função ALL.

Esse exemplo é para fins didáticos. Filtros de funções, preferencialmente, devem ser mantidos o mais simples possível.

A cláusula IN funciona como OR, quando estamos construindo medidas.

Demonstrando como IN e OR funcionam iguais em medidas.
Demonstrando como IN e OR funcionam iguais em medidas.

É importante destacar que assim como a função CALCULATE é uma table function, seu filtro também o é. Logo, quando aplicamos filtro na função, estamos filtrando valores que estão em uma espécie de tabela virtual.

Não se esqueça que múltiplos filtros dentro da CALCULATE são entendidos logicamente pelo engine do Power BI como “and”. Veja abaixo:  

Como a função CALCULATE entende múltiplos filtros nas medidas.
Como a função CALCULATE entende múltiplos filtros nas medidas.

Então, como não existe um produto que é azul e ao mesmo tempo vermelho, para retornar “true” na avaliação lógica, nosso resultado é blank.

FILTRO COM CONDIÇÕES COMPLEXAS

Até o momento vimos como trabalhar da melhor maneira quando o assunto é filtro em colunas únicas utilizando a linguagem DAX dentro do Power BI.

Porém, quando nos deparamos com cenários que múltiplas colunas são necessárias, precisamos utilizar outros recursos para a medida retornar o valor desejado.

O Power BI não é capaz de filtrar duas colunas diferentes na mesma expressão. Veja esse exemplo abaixo. 

Erro do Power BI ao tentar filtrar duas colunas na expressão.
Erro do Power BI ao tentar filtrar duas colunas na expressão.

Perceba que o resultado não é processado, mesmo que a medida seja compilada e criada.

Sempre que uma medida necessitar de múltiplas colunas com parâmetro de filtro em uma CALCULATE, uma table expression deverá ser criada para satisfazer essa necessidade

Existe uma diferença que pode alterar o resultado da sua expressão em DAX quando estamos filtrando na CALCULATE.

Demonstração de um erro com filtros na CALCULATE.
Demonstração de um erro com filtros na CALCULATE.

Agora, veja 

Erro devido o uso de variáveis na construção do filtro da medida.
Erro devido o uso de variáveis na construção do filtro na CALCULATE.

Na primeira expressão, como eu coloquei o filtro dentro de uma variável  e ela é processada antes, por estar declarada primeiro, quando adiciono no parâmetro de filtro da CALCULATE, o que ocorre é um reprocessamento da medida puxando apenas os produto que atendem ao filtro e recalculando o total.

E mesmo utilizando KEEPFILTER, o resultado não se altera. É próprio do processamento de variáveis do Power BI tal comportamento.

Demonstrando que o uso de KEEPFILTERS não soluciona o resultado acima.
Uso de KEEPFILTERS não soluciona o resultado acima.

Uma dica interessante para o Power BI é utilizar  a função KEEPFILTERS sempre que se deparar com a situação do exemplo acima. A função FILTER é iteradora e irá percorrer linha por linha dentro da tabela em busca das condições passadas o filtro – o que pode gerar custo de performance.

Quando utilizamos KEEPFILTERS, estamos limitando a ação para as condicionais do parâmetro de filtro dentro da função – o que nos traz ganho de desempenho

Utilizando KEEPFILTERS para melhorar o desempenho da função FILTER.
Utilizando KEEPFILTERS para melhorar o desempenho da função FILTER.

Existe uma situação que exige atenção do usuário quanto ao filtro utilizado dentro de uma medida e sua interação com um SLICER. Dependendo de como é utilizado, o valor exibido será alterado, mostrando apenas casos em que haja correspondência.

Porém, quando construímos com a ALL, sobrescrevemos o contexto inclusive o SLICER. Veja que o resultado não se altera, diferente da medida ao lado.

ALL e seu uso em conjunto com SLICERS para seleção de dados.

O exemplo do SLICER foi utilizado no primeiro conjunto de resultados. Perceba que a medida mrRedContoso está com seu resultado inalterado. Como foi construída com a função ALL, acabamos nos deparando com esse resultado.

Então, pense quando for elaborar medidas que irão interagir com SLICE. Saiba que o seu resultado, dependendo da construção, será computado de acordo com o filtro externo.

MODIFICADORES DA CALCULATE

Vimos que a função CALCULATE é extremamente versátil e permite a criação de diversas medidas e expressões que auxiliam na análise de dados. 

Entendemos a importância de construir bons filtros para que o resultado não seja diferente do desejado, e isso requer atenção de quem está construindo a expressão. 

Ao lidar com filtros em sua construção, utilizamos algumas funções de apoio como ALL e KEEPFILTERS. Essas funções, quando utilizadas com esse objetivo, são tratadas como modificadoras da calculate e é sobre elas que falarei a partir de agora.

Vamos ver algumas funções que estão no grupo das modificadoras de filtro da CALCULATE.

FUNÇÃO RELATIONSHIP

Em modelos de dados dentro do Power BI, existem diversos relacionamentos entre as tabelas. Em alguns casos, temos de construir uma medida ou coluna com uma tabela que não existe um relacionamento padrão, criado quando o modelo foi concebido.

Quando nos deparamos com esse cenário, precisamos estabelecer entre estas entidades do modelo de dados um relacionamento secundário. Como a CALCULATE com a função USERELATIONSHIP consegue ativar um relacionamento durante seu plano de execução, este recurso é perfeito para solução do problema.

É importante ressaltar que o relacionamento secundário passado na função USERELATIONSHIP  só permanece ativo durante o tempo de execução e retorno do resultado. Com o resultado processado, o relacionamento padrão volta a ser ativo.

Criação de um relacionamento secundário dentro do modelo de dados.
Criação de um relacionamento secundário dentro do modelo de dados.

NOTA: quando for trabalhar com filtros na CALCULATE e RELATIONSHIP, construa sua expressão, declare seu filtro e ao final, utilize RELATIONSHIP.

Uso da função USERELATIONSHIP.
Uso da função USERELATIONSHIP.

Tenha em mente que essa função não é um filtro, mas sim, modificadora. O que ela faz é modificar a forma como o argumento de filtro é processado pelo engine  do Power BI.

Ainda que ela modifique o argumento de filtro, perceba que o comportamento no geral é o mesmo, reescreveu todo o contexto de filtro.

FUNÇÃO CROSSFILTER

É similar à função anterior, USERELATIONSHIP. Isto é, trabalha com o relacionamento secundário entre as tabelas.

Aqui, nós manipulamos o relacionamento de duas formas:

  1. Alterando a direção do CROSSFILTER de um relacionamento
  2. Desabilitando um relacionamento.

Nela, podemos utilizar 3 parâmetros na sua construção, sendo os dois primeiros as tabelas e o último, a a direção do relacionamento entre as dimensões envolvidas.

Veja a construção da função abaixo e entenda como ela opera:

Exemplo de uso da função CROSSFILTER.
Exemplo de uso da função CROSSFILTER.

Quando aplicamos um filtro, mesmo cruzando o relacionamento, ele irá contar apenas o parâmetro.

ENTENDENDO  FUNÇÃO KEEPFILTERS

Em algumas construções acima, vimos que a função KEEPFILTER foi utilizada para manter o contexto de filtro externo à CALCULATE inalterado.

Esse tipo de comportamento acontece pois a função não é uma modificadora da CALCULATE como vimos nas situações anteriores, mas sim, do filtro. O que ela faz é reformular o filtro da função de modo que não altere o filtro externo.

Sabendo desta situação, na medida abaixo, veja que estamos exibindo apenas o resultado para a categoria “Computadores”

Filtro com a função CROSSFILTER.
Filtro com a função CROSSFILTER.

Existe uma construção que não é tão trivial e que está relacionada com a transição de contexto (irei atualizar este artigo em breve). Nesta situação, KEEPFILTERS age impedindo que a CALCULATE implícita dentro da SUMX sobrescreva o contexto de filtro ao processar a medida.

Ação implícita da função KEEPFILTERS como comportamento da SUMX.
Ação implícita da função KEEPFILTERS como comportamento da SUMX.

Não é tão comum o uso desse tipo de construção. Foi apenas um exemplo de como funciona a linguagem DAX.

ALL & ALLSELECTED COMO MODIFICADORAS DE FUNÇÃO

Sabendo que a função ALL é por natureza, uma table function – retorna tabela como resultado ao final da sua execução.

Porém, em algumas situações, ela muda de forma e adquire o poder de alterar o argumento de filtro, principalmente da CALCULATE.

Quando utilizada nesta situação, ao invés de criar um novo contexto de filtro, ela simplesmente remove todo o contexto, impondo o valor final da operação em todas as linhas do Power BI.

O que temos aqui então, não é mais uma função tabular, mas um modificador da CALCULATE e seu filtro.

ALL modificando o filtro da CALCULATE.
ALL modificando o filtro da CALCULATE.

Veja que indiferente do uso de ALL, todo o contexto visual é sobrescrito para a cor vermelha.

Isso é por conta da regra de correspodência entre a o filtro da CALCULATE e o contexto de filtro externo.

Mesmo utilizando a função KEEPFILTER, que supostamente deveria manter o filtro, isso não acontece. O contexto continua o mesmo e o resultado inalterado.

Tudo isso ocorre por causa da regra de modificadores da função DAX. Todas os modificadores de filtro da CALCULATE são aplicados ao final do contexto de filtro, antes até de argumentos de filtros explícitos.

Como a função ALL e suas variações são modificadoras da CALCULATE, acabam caindo nessa regra e sobrepondo qualquer outro argumento de filtro. Inclusive com KEEPFILTERS.

E mesmo alterando a ordem, o resultado não muda.

Indiferença da ordem ao utilizar a função ALL e KEEPFILTERS.
Indiferença da ordem ao utilizar a função ALL e KEEPFILTERS.

Como podemos observar nos resultados, a função ALL modificou o filtro de todas as medidas, independente da ordem e se tem KEEPFILTERS ou não.

CONCLUSÃO

Na continuação direta do artigo anterior sobre a função CALCULATE quis mostrar como podemos trabalhar com os argumentos de filtro da função e mais, como podemos modificá-lo.

Mostrei também as funções que podem alterar, ainda que temporariamente, a relação entre as tabelas utilizando CROSSFILTER E USEREALTIONSHIP.

Também entendemos como a função ALL age e como ela altera as medidas que se envolve na construção dentro das expressões.

Por fim, mas não menos importante, cuidado com o uso de variáveis, seu processamento e o uso do parâmetro de filtro. Como vimos em exemplos acima, o resultado é reprocessado e alterado quando utilizado em medidas.

OLÁ!

Se chegou até aqui, deixe seu like e compartilhe com seus amigos! Me ajude a alcançar mais pessoas!

Se gostou ou tem alguma dúvida ou sugestão, deixe seu comentário!

Não se esqueça de se inscrever para nossa newsletter!

Muito obrigado a todos! Volte sempre!

Baixe o arquivo aqui. Todas as medidas estão na tabela chamada aCalculateMeasure.

Se precisar, entre me contato: