É comum perceber a dificuldade de muitos usuários quando se deparam com a linguagem DAX pela primeira vez. Pela sua similaridade sintática com fórmulas e funções do Microsoft Excel, estes acabam por cometer erros simples de lógica durante a elaboração de uma medida no Power BI ou Power Pivot.

Isto ocorre devido a um conceito muito importante que existe na linguagem DAX, que são os contextos de filtro e contextos de linha. Entender a diferença entre contexto de linha e contexto de filtro é muito importante para utilizar o DAX corretamente.

Neste artigo irei apresentá-los a esses dois conceitos.

CONTEXTO DE LINHA

Contexto de linha é quando utilizamos valores de uma determinada linha de uma tabela para realizar um cálculo. Porém, ao construir cálculos utilizando o DAX não informamos uma linha específica de determinada coluna, e sim somente coluna. A linha que será utilizada no cálculo será definida pelo contexto em que ela está inserida.

Esse contexto pode ser determinado de duas maneiras diferentes. A aplicação mais comum do contexto de linha é quando criamos uma coluna calculada em uma tabela. Para criarmos uma nova coluna em uma tabela, realizamos um cálculo linha a linha dessa tabela para obter o resultado da nova coluna.

Para entendermos melhor, vamos criar uma coluna calculada no modelo de dados abaixo:

O resultado da coluna calculada é criado a partir do contexto de cada linha, onde as colunas Vendas[Qtde] e Vendas[Valor Unitário] são multiplicadas criando assim um resultado para cada linha da nova coluna calculada.

Existe uma segunda forma de definir esse contexto de linha através de funções iterantes no DAX. Essas funções são utilizadas em medidas que iteram sobre uma determinada tabela, atuando linha a linha, e calculando o resultado da expressão informada na função.

Mas para falarmos dessa segunda maneira de trabalhar com o contexto de linha, vamos primeiro entender como funciona o contexto de filtro.

CONTEXTO DE FILTRO

Contexto de filtro é o contexto que se modifica ao aplicarmos um filtro em uma ou mais tabelas. Medidas utilizam normalmente esse tipo de contexto. As medidas são cálculos agregadores que são aplicados sobre uma determinada coluna. Ao filtrar uma tabela, o contexto muda, modificando também o resultado da medida. Isso significa que o resultado de um cálculo de uma medida é influenciado quando aplicamos filtros em uma ou mais tabelas.

Para entendermos melhor como o contexto de filtro atua sobre uma coluna, vamos continuar utilizando o exemplo anterior. Vamos criar uma medida chamada Total Geral que será a somatória da coluna Total.

Num primeiro cenário vemos o resultado da medida Total Geral com o contexto de filtro sem nenhum filtro aplicado. Porém, se aplicarmos um filtro, o resultado irá mudar, mesmo continuando atuando sobre a mesma coluna. No resultado abaixo vemos a somatória da coluna Total para o contexto onde foi aplicado o filtro [Vendedor = Sandra]

De forma simplificada podemos entender um contexto de filtro como os dados que serão mantidos em uma tabela após a aplicação de filtros. Depois de definido o contexto as medidas terão a função de agregar o valor de uma determinada coluna sobre esse contexto, seja somando, calculando a média, encontrando o valor máximo, mínimo, etc.

FUNÇÕES ITERANTES

Agora que já entendemos basicamente o que é um contexto de filtro e contexto de linha e de forma genérica vimos que as colunas calculadas atuam em um contexto de linha e que as medidas atuam em um contexto de filtro, podemos falar sobre funções iterantes.

As funções iterantes são funções agregadoras que são capazes de antes de atuar sobre o contexto de filtro fazer uma iteração em uma tabela dentro do seu contexto de linha, para somente depois fazer a agregação.

No exemplo anterior, primeiro criamos uma coluna calculada (contexto de linha) chamada Total, que era responsável por atuar sobre o contexto de linha da tabela, multiplicando duas colunas. Depois criamos uma medida utilizando a função SUM para agregar o valor dessa coluna calculada.

Com uma única função iterante, podemos fazer essa iteração no contexto de linha para depois fazer a agregação. Neste exemplo vamos utilizar a função SUMX. Vejamos a sintaxe desta função.

=SUMX(Tabela;Expressão)

Perceba que o primeiro parâmetro desta função é uma tabela, que deverá ser a tabela na qual a função irá fazer a sua iteração. E depois é pedido a expressão que deverá ser avaliada.

Sendo assim, sem a necessidade de criar uma coluna calculada para intermediar o cálculo, podemos obter o mesmo resultado para a medida Total Geral utilizando o cálculo a seguir.

A função SUMX irá interagir sobre a tabela Vendas, calculando a expressão dada, atuando sobre o contexto de linha. Depois fará a agregação somando, pois estamos utilizando uma função iterante SUMX, aplicando o contexto de filtro.

PROPAGAÇÃO DE RELACIONAMENTOS

É importante lembrar que o contexto de linha não se propaga através dos relacionamentos entre tabelas. Se você tiver um contexto de linha em uma tabela, poderá iterar nas linhas de uma tabela relacionada usando a função RELATEDTABLE e poderá acessar a linha de uma tabela pai usando a função RELATED.

Um filtro aplicado em uma coluna da tabela afeta todas as linhas dessa tabela, filtrando as linhas que atendem a esse filtro. Se dois ou mais filtros forem aplicadas na mesma tabela, somente as linhas que atenderem a todos os filtros serão processadas por uma expressão DAX nesse contexto de filtro.

Já o contexto de filtro se propaga automaticamente por relacionamentos, de acordo com a direção do filtro cruzado do relacionamento.

CONCLUSÃO

Vimos neste artigo o que é um contexto de filtro e um contexto de linha e como eles se aplicam dentro das funções DAX. Entender esses conceitos é muito importante para o seu aprofundamento nesta linguagem. Existe ainda a possibilidade de fazermos a transição de contextos, mas esse será assunto para um próximo artigo.

Aproveite e deixe nos comentários a sua percepção sobre esses conceitos, e como os contextos de linhas e filtros mudaram o seu mindset na construção de cálculos utilizando DAX.