Tempo de leitura:
Neste artigo vou mostrar-te como podes usar a função CROSSFILTER em DAX! Quando precisas de calcular uma expressão e necessitas de mudar a direção do Filtro de Propagação dos dados esta é a função a usar.
Em DAX, usando o Power BI – Desktop ou o Microsoft Excel, quando definimos o modelo de dados e a relação entre tabelas, por norma a propagação do Filtro é unidirecional (apenas num sentido) e definido entre a tabela de Dimensão e a tabela de Factos. Isto significa que qualquer cálculo aplicado sobre uma coluna da Tabela de Factos, exemplo Vendas, é afetado por qualquer filtro aplicado nas tabelas de Dimensão, como por exemplo o Cliente ou o Produto ou a Marca.

No cenário vamos verificar um exemplo de aplicação.
A medida definida calcula o valor da coluna Preço de Venda multiplicado sobre a Coluna Quantidade, iterando a Tabela de Vendas. Para o exemplo estamos a usar a Função SUMX.
Quando aplicada a medida num visual, que tem o Contexto de Filtro definido, existe para cada um dos visuais um filtro aplicado em cada uma das Tabelas, que ao propagar-se para a Tabela das Vendas, altera o valor da Medida – Este é o comportamento normal de uma medida quando aplicada no relatório.
Vendas Totais =
SUMX (
Vendas;
Vendas[Preço Venda] * Vendas[Quantidade]
)

Como podemos verificar na imagem, por exemplo as Vendas Totais para o cliente CONFECÇÕES LANÇA, LDA é de 1.677.874 € e a mesma medida aplicada por exemplo para a marca PARAQUA é de 10.882.145 €. No cartão, conseguimos ver o valor total da medida 100.762.264 € uma vez que no “cartão” não existe nenhum filtro de contexto aplicado.
Mudar o contexto de FILTRO
Vamos ter um cálculo onde iremos ter a necessidade de alterar este comportamento!
O nosso objetivo é mudar o contexto de Filtro. Para tal necessitamos de usar a Função CALCULATE, com uma das funções modificadoras do filtro – A função CROSSFILTER!
Vamos começar com um cálculo que indica, o número de clientes que compram uma determinada marca, ou por exemplo numa determinada loja ou produto!
# Clientes =
COUNTROWS(Cliente)
Nesta medida, o cálculo está a ser realizado sobre a Tabela Cliente, que é uma Tabela de Dimensão! As Tabelas de Dimensão normalmente não recebem o filtro, elas aplicam o filtro!

O que está a acontecer no relatório é que o Filtro aplicado aos visuais, respetivamente Produto, Marca e Loja, afetam um cálculo realizado sobre a tabela Vendas não afetam um cálculo realizado na tabela Clientes!
A razão está no modo de preparação do modelo de dados, onde podemos verificar que o filtro está aplicado apenas numa direção. Um filtro aplicado por exemplo sobre a tabela produto, chega à tabela Vendas, mas não passa para a tabela Cliente, dado que os filtros de ambas as dimensões, convergem todos na tabela Vendas.

Se modificarmos a direção do Filtro, rapidamente conseguimos verificar os resultados a surgirem conforme pretendido. Editando a relação entre a tabela de Vendas e a tabela Clientes, podemos colocar o filtro Bidirecional!


Apesar desta solução parecer uma solução eficiente e simples de aplicar, não é recomendada! Podemos ver no relatório a medida a funcionar para cada uma das tabelas do relatório.

Apesar de funcionar, como referido, não é recomendado, uma vez que ativando o filtro bidirecional de forma permanente no modelo de dados, todos os cálculos realizados sobre a tabela de Vendas, vão afetar a tabela do cliente.
Assim, em vez de aplicar o filtro bidirecional, vamos definir o mesmo apenas para efeito de cálculo na medida, afetando apenas a direção quando a medida é colocada no relatório.
Esta solução permite a afetar apenas 1 cálculo, em vez de afetar todos os possíveis cálculos no relatório!
Para podermos realizar a operação vamos restabelecer a relação entre a tabela Cliente e Vendas, para ficar com o filtro Unidirecional!
É expectável voltar a ver sempre o mesmo valor em todos os visuais.

Vamos então definir a função CROSSFILTER que deve ser usada em conjunto com a função CALCULATE.
A função CROSSFILTER especifica a direção a ser usada pelo filtro no momento de avaliação da expressão DAX.
Para a função devemos indicar as 2 colunas que definem a relação, independentemente da ordem da relação.
- Esta questão da ordem das colunas é importante apenas no 3º argumento da função.
O 3º argumento da função define a direção do filtro.
- 0 para None
- 1 para OneWay,
- 2 para Both,
- 3 para OneWay_RightFiltersLeft,
- 4 para OneWay_LeftFiltersRight.
Podemos ser específicos e usar o nome da opção literal – None, OneWay, Both, OneWay_RightFiltersLeft, OneWay_LeftFiltersRight.
Nas 2 últimas opções é que devemos ter em conta a ordem das colunas indicadas no 1º e 2º argumentos, pois estamos a definir que uma das colunas filtra a outra.
A expressão pretendida no exemplo será então a seguinte:
# Clientes =
CALCULATE(
COUNTROWS(Cliente);
CROSSFILTER(Cliente[id_cliente]; Vendas[ID Cliente]; Both)
)

Desta forma usando a função CALCULATE com modificadores de filtro, neste caso a função CROSSFILTER obtemos mais controlo sobre o nosso modelo de dados e realizamos os cálculos à medida da necessidade.
Próximo artigo:
Artigo Anterior:
Artigos por Categoria
Artigos por Categoria
- Microsoft Excel (44)
- Power Apps (16)
- Power Automate (3)
- Power BI (11)
- Power Query (14)
- Python (3)
- VBA (7)

Leave a Reply