Como Mudar a Direção do Filtro em Power BI

Tempo de leitura:

4–5 minutes

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.

A data model diagram illustrating relationships between entities such as Brand, Product, Store, Client, Seller, and Sales, with a highlighted filter direction.

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]

)

A spreadsheet displaying total sales data, including sales per client, brand, and store. The total sales amount is €100.762.264.

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!

Table displaying the count of clients for various products, brands, and stores, utilizing the COUNTRows function in a spreadsheet format.

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.

A flowchart representing a data model with entities such as Brand, Product, Store, Sales, Client, Vendor, and Date, showing relationships and filter directions.

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!

Database schema diagram showing three entities: Produto (Product), Vendas (Sales), and Cliente (Client) with attributes like ID Marca, ID Produto, Data de Entrega, Data de Venda, and ID Cliente. Includes a highlighted menu option for Properties.
Screenshot of a software interface displaying an 'Edit Relationship' window with options for data tables and cardinality settings, highlighting connections between clients, products, and brands in a database.

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.

Data table displaying customer counts by product, brand, and store. Includes products like resistance bands, bicycles, and running shoes, with corresponding client counts and totals.

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.

Table displaying product names, client count for each product, brands, and store locations, all indicating 54 clients.

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)

)

A screenshot displaying a data analysis table with metrics related to clients, including columns for product names, client counts, brand names, and store locations within a dashboard interface.

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:


Comments

Leave a Reply

Discover more from Exceldriven

Subscribe now to keep reading and get access to the full archive.

Continue reading