Cálculos dinâmicos no Power Query

Uma das perguntas que me surgiu na comunidade do Fabric foi se era possível, ter cálculos que fossem realizados tendo em atenção uma fórmula definida numa outra coluna, conseguindo assim realizar os cálculos de forma diferenciada e dinâmica.

No exemplo em questão pretendia-se ler e avaliar uma expressão e obter o resultado correspondente tendo em atenção os valores nas outras colunas.

Vamos então considerar os seguintes dados:

O conceito por trás desta tabela é conseguirmos para cada uma das categorias calcularmos o seu resultado correspondente fazendo uma análise da expressão na coluna “Formula” obtendo assim os resultados diferenciados para cada uma das linhas.

Apesar de algumas tentativas para solucionar esta questão através de DAX a mesma não seria possível sem reescrever todas as fórmulas novamente na sintaxe de uma medida ou de uma coluna uma vez que através de DAX não conseguimos avaliar a expressão dinamicamente.

No entanto o Power Query fornece-nos algumas funções que permitem trabalhar com expressões:

FunctionDescription
Expression.ConstantRetorna a representação do código-fonte M de um valor constante.
Expression.EvaluateRetorna o resultado da avaliação de uma expressão, com os identificadores disponíveis que podem ser referenciados definidos por ambiente.
Expression.IdentifierRetorna a representação do código-fonte M de um identificador.

A segunda sintaxe devolve-nos então o resultado de uma expressão vamos então verificar com uma expressão simples (10+5) qual o resultado que obtemos:

Como podemos verificar na nova coluna conseguimos obter o resultado pretendido e não a fórmula que escrevemos. Vamos então proceder a alteração da expressão de modo a conseguirmos obter o nosso resultado.

A nossa primeira transformação será substituir as variáveis que temos na coluna de fórmula pelas diversas colunas correspondentes, vamos exemplificar utilizando uma cópia da nossa coluna e vamos adicionar um novo passo com a seguinte expressão:

 Table.ReplaceValue(#"Duplicated Column","A", each Text.From ([A]) ,Replacer.ReplaceText,{"Formula - Copy"})

Como se pode ver onde tínhamos a letra A temos agora o valor da coluna A, o valor tem de ser envolvido na expressão Text.From uma vez que a coluna de Formula é texto e a utilização da coluna A com o formato de número resulta na não aplicação da alteração:

Vamos então adicionar as restantes expressões a nossa coluna:

= Table.ReplaceValue(#"Replaced Value","B", each Text.From([B]) ,Replacer.ReplaceText,{"Formula - Copy"})

= Table.ReplaceValue(Custom1,"C", each Text.From([C]) ,Replacer.ReplaceText,{"Formula - Copy"})

Podemos agora utilizar a Expression.Evaluate para obter o resultado final:

Na nova coluna temos então o resultado pretendido para cada expressão.

Ao realizarmos estes novos passos apesar de obtermos o resultado temos um acréscimo do número de passos e de utilização de expressão podemos então simplificar o processo escrevendo uma nova coluna com a seguinte expressão:

Expression.Evaluate(
       Replacer.ReplaceText (
            Replacer.ReplaceText (
                 Replacer.ReplaceText ([Formula],"A", Text.From([A] )),
                 "B", Text.From([B])
                             ), 
                 "C", Text.From([C])
                            )
                 )

Nos links abaixo podem encontrar mais informação sobre esta função do Power Query:

https://powerquery.how/expression-evaluate/

Deixe um comentário