Continuando a série sobre a função calculate e seu uso em expressões DAX, hoje quero mostrar como a função keepfilter interage quando utilizamos em conjunto.

Este será um post base e introdutório pois ainda estou fazendo pesquisas e estudando a respeito, então, será bem curto e rápido.

RECAPITULANDO 

Vimos que  a função calculate  age no filter context sobrepondo um existente de acordo com o valor passado no filtro da função. Indiretamente é como se estivéssemos utilizando ALL e removendo o contexto para por um novo.

Implicitamente, é como se a engine do PBI entendesse que estamos criando uma expressão como a que foi destacada em vermelho.

Aplicado ao filter context, temos o mesmo valor para as três medidas.

Visto o conceito básico da calculate podemos imaginar a seguinte situação: 

Imagine que na medida criada para uma determinada localidade, como foi o caso acima, não é desejável que o valor de uma determinada região, sobreponha a outra; Ou seja, não queremos que o valor das vendas na Europa seja repetido para as outras regiões.

Como sabemos que a calculate sobrescreve o filtro existente impondo o dela, precisamos de uma função que mantenha o filtro, mas ao mesmo tempo, exiba o resultado desejado e para isso, precisamos da função KEEPFILTER.

KEEP FILTER E CALCULATE – MODIFICANDO FILTRO DENTRO DA FUNÇÃO

Vimos no tópico anterior o funcionamento da função calculate e sua sobrescrita no filter context e como isso pode se tornar um problema quando não queremos aplicar em todas as linhas de um dashboard, por exemplo.

Para essa situação a solução que temos é a utilização da função KEEPFILTER que mantém o filtro da calculate, mas ao invés de aplicar para todas as outras, retorna apenas o que está sendo filtrado. 

Veja este exemplo abaixo:

Criei a seguinte medida com a “nova” função keepfilter dentro da calculate mantendo apenas as vendas da marca “Contoso”. E antes de mostrar o gráfico, gostaria de chamar atenção para a segunda coluna da tabela.

Com a medida criada e aplicada num gráfico de matriz poderemos entender seu funcionamento. Veja.

Uma vez que a segunda coluna (quadrado preto), não possui a função keepfilter, a sobrescrição ocorreu em todas as linhas, diferente da medida criada com ela.

Se por acaso quiser substituir os valores blank por 0, por exemplo, basta adicionar dentro de um IF. 

Para clarificar de vez o funcionamento do keepfilters o que ele faz é o seguinte:

  • Analisa o contexto de filtro;
  • Se estiver alterando uma calculate, analisa qual filtro ela está aplicando;
  • Analisa seu próprio filtro e adiciona ao filtro da calculate;
  • Retorna apenas o valor que ela está filtrando dentro do contexto e blank para os que foram “excluídos”.

É possível utilizar mais de um filtro dentro da keepfilter, desde que este esteja dentro de um IN, fora isso, a função não permite outro operador lógico. O que faz sentido, já que ela precisa selecionar os filtros corretos para análise.

Outro fator interessante é manter dois filtros simultâneos com colunas diferentes, como foi o caso abaixo. Apliquei um contexto para categoria, filtrei as marcas Contoso e Litware e por fim, produtos do segmento Deluxe.

Aplicando a medida no gráfico.

Veja que o total geral continua sendo exibido.

O interessante é que conseguimos utilizar tanto uma tabela, quanto um predicado quando estamos tratando de keepfilter. Por exemplo, sabendo que a função Filter e ALL são tabulares, veja a combinação na medida abaixo.

Destaco que o contexto é basicamente o mesmo, o que mudou foi que apliquei a remoção de filtro com ALL, mas como está em uma keepfilter, não temos aquela aplicação em todas as linhas.

mrKPFAudioComP = 
    VAR SALESAM = [mrStoreSalesAmt]
    VAR CALCKPF = CALCULATE([mrStoreSalesAmt],
                 KEEPFILTERS(
                            FILTER(
                                    ALL('Product Category'),
                                    'Product Category'[Category] IN {"AUDIO", "COMPUTERS"})))
    RETURN
        CALCKPF

Nas categorias Camcoders e Cell Phones, não houve exibição de valor como esperado quando utilizamos ALL.

Veja quando removemos do contexto, o filtro por Brand.

Como já era esperado, aplicou-se o valor para todas as linhas do contexto independente da categoria. Funcionamento padrão do uso de Filter + ALL.

CONCLUSÃO

Este foi um post bem básico e introdutório sobre keepfilter. Fiz com o intuito de apresentá-la e como ela funciona quando utilizamos junto com a Calculate.

Como foi possível perceber, esta é outra função que manipula o filtro entregando um resultado que mostra apenas aquele valor utilizado como parâmetro para a expressão.

Como é uma função que possui uma extensa capacidade de uso, reduzi este post apenas para uma introdução e para próximo, pretendo retornar com mais aplicações e usos.

Espero que gostem, saúde!

Deus os abençoe!