25 Novembro 2025
Descomplicar Modelos Complexos: O poder das UDFs em DAX
Com a introdução das User-Defined Functions (UDFs) em DAX, lançadas em setembro de 2025, a Microsoft transformou a forma como os modelos semânticos são construídos e otimizados no Power BI e no ecossistema Microsoft Fabric.
As UDFs permitem modularizar lógica repetida, reduzir redundância de medidas e melhorar a consistência e a manutenção dos modelos empresariais.
Este artigo técnico apresenta o conceito de UDFs em DAX, evidencia os seus principais benefícios e analisa o seu impacto prático na modelação semântica.
Os exemplos em TMDL aqui incluídos ilustram a sua aplicação em diferentes contextos empresariais, com destaque para o setor financeiro, utilizado como base nos use cases apresentados.
As User-Defined Functions (UDFs) introduzem no DAX um nível de modularidade até agora inexistente, permitindo que os developers definam expressões parametrizadas que podem ser reutilizadas em múltiplas medidas e modelos. Na prática, uma UDF funciona como uma função nativa do DAX como CALCULATE, FILTER ou SUMX, mas é criada pelo próprio utilizador, com total controlo sobre os parâmetros, a lógica interna e o contexto de avaliação.
A sintaxe base segue o formato:
O símbolo => separa a definição dos parâmetros do corpo da função, que contém a lógica DAX a executar. Depois de criada, a função pode ser invocada em qualquer medida, coluna calculada ou outra função, bastando passar os argumentos necessários entre parênteses, tal como se tratasse de uma função nativa.
As UDFs podem aceitar parâmetros tipados, especificando não apenas o tipo de valor esperado (por exemplo, SCALAR, TABLE ou STRING), mas também o modo de passagem de parâmetro, que é um dos aspetos mais importantes do novo modelo funcional do DAX.
Existem dois modos principais:
VAL (Value): avaliado antecipadamente, no mesmo contexto de avaliação em que a função é chamada. O resultado é calculado uma única vez e passado para a função como um valor fixo.
É ideal para parâmetros que representam resultados estáveis ou agregações pré-calculadas.
EXPR (Expression): avaliado dinamicamente dentro da função, cada vez que é utilizado no corpo da expressão.
Pode gerar resultados diferentes consoante o contexto de filtro ou linha ativo.
Este modo é fundamental quando a função precisa de se adaptar ao contexto de execução, por exemplo, em iterações com FILTER, SUMX ou AVERAGEX.
O uso de VAL e EXPR altera profundamente o comportamento da função, especialmente em cenários com contextos complexos de filtro.
Um parâmetro VAL comporta-se como uma variável estática; um EXPR, como uma fórmula viva, que reage ao contexto onde é avaliada.
Esta distinção é o que permite às UDFs criar padrões de cálculo reutilizáveis sem comprometer o dinamismo e a flexibilidade do DAX.
Por exemplo, enquanto VAL é ideal para funções que recebem métricas já resolvidas (como totais ou médias consolidadas), EXPR é preferível em funções que precisam reavaliar medidas sob filtros distintos ou contextos específicos, como calcular uma métrica apenas para um país, segmento ou período.
As User-Defined Functions (UDFs) foram concebidas para se integrarem nativamente na arquitetura do Power BI e do Microsoft Fabric, funcionando como elementos dentro do modelo semântico.
Podem ser criadas e geridas diretamente no Power BI Desktop, no Power BI Service, ou em ferramentas especializadas como o Tabular Editor, e são armazenadas no ficheiro TMDL do modelo, tornando-se parte da sua definição estrutural.
Esta abordagem garante portabilidade entre ambientes e consistência de comportamento, independentemente da origem do dataset.
As UDFs podem ser armazenadas diretamente no modelo semântico, tornando-se componentes reutilizáveis que podem ser chamadas por múltiplas medidas, colunas calculadas ou até outras funções, tal como as funções nativas do DAX.
Esta integração promove consistência lógica, reduz a duplicação de expressões e simplifica a manutenção em projetos de larga escala, onde a coerência entre modelos é crítica.
Em termos de arquitetura, as UDFs são totalmente integradas na camada semântica e processadas pelo Formula Engine, tal como qualquer outra expressão DAX.
Podem referenciar medidas, colunas, tabelas e variáveis, sendo avaliadas dinamicamente de acordo com o contexto de filtro e linha ativo no momento da execução.
As UDFs coexistem de forma complementar com os Calculation Groups e os Field Parameters, oferecendo uma camada adicional de modularidade e abstração lógica.
Enquanto os Calculation Groups lidam com padrões de cálculo aplicados sobre medidas existentes, como variações temporais (YTD, MTD, LY) as UDFs operam a um nível mais fundamental, encapsulando a lógica interna das medidas e permitindo a sua reutilização em diferentes contextos analíticos.
Este novo paradigma aproxima o DAX de linguagens funcionais mais maduras, onde a lógica de negócio é modular, testável e versionável, promovendo modelos semânticos mais limpos, consistentes e sustentáveis a longo prazo.
Na prática, esta abordagem reduz o número de medidas necessárias, melhora a legibilidade e cria uma base sólida para governança de modelos empresariais complexos.
A performance de um modelo semântico em Power BI depende diretamente da forma como a lógica DAX é escrita e organizada.
Em muitos projetos empresariais, é comum encontrar dezenas, ou mesmo centenas de medidas que repetem o mesmo padrão de cálculo, alterando apenas um filtro, uma moeda, um período ou uma hierarquia de produto.
Esta abordagem tradicional conduz a modelos mais pesados, com maior complexidade de manutenção e maior risco de inconsistência entre medidas semelhantes.
Do ponto de vista técnico, as UDFs são processadas pelo mesmo Formula Engine que avalia qualquer expressão DAX.
Contudo, a sua estrutura modular reduz a redundância de parsing e de avaliação, o que pode ter impacto positivo em modelos complexos, especialmente quando múltiplas medidas dependem da mesma lógica base.
Além disso, as UDFs favorecem a reutilização de subexpressões pelo Formula Engine, isto é, a partilha de partes comuns do plano de execução entre medidas que usam a mesma lógica, reduzindo o esforço global de cálculo. Mais do que ganhos diretos de desempenho, as UDFs trazem eficiência estrutural.
Ao centralizar a lógica em funções reutilizáveis, o modelo torna-se mais previsível e mais fácil de otimizar.
As alterações podem ser feitas de forma isolada, sem necessidade de rever dezenas de medidas dependentes, o que reduz significativamente o custo de manutenção e os riscos de regressão lógica.
Um exemplo simples dessa eficiência pode ser observado numa função genérica que aplica um contexto dinâmico a uma métrica:
Neste caso, em vez de repetir CALCULATE() com filtros diferentes em várias medidas, o modelador define uma única função e invoca-a em diferentes contextos.
A sintaxe fica mais concisa, a semântica mais clara e o esforço cognitivo de leitura reduz substancialmente.
Na prática, o impacto das UDFs não se limita à performance computacional: melhora também a performance humana a capacidade de compreender, auditar e evoluir um modelo ao longo do tempo.
Ao eliminar a duplicação de lógica, o analista ganha controlo sobre a coerência das métricas e o processo de otimização torna-se mais previsível.
Os testes e observações conduzidos por Marco Russo e Alberto Ferrari (SQLBI, 2025) confirmam esta visão qualitativa: a utilização de funções reutilizáveis conduz a modelos semanticamente mais sólidos, com ganhos tangíveis em clareza, consistência e governança.
Ainda que o impacto direto na execução dependa da estrutura e do volume de dados de cada modelo, os benefícios em termos de facilidade de manutenção e sustentabilidade são transversais a todos os cenários.
Em suma, o verdadeiro valor das UDFs está na sua capacidade de reduzir a complexidade e aumentar a previsibilidade do comportamento do modelo, mantendo a performance e a lógica de negócio sob um controlo centralizado, uma evolução natural do DAX em direção a uma modelação mais modular, escalável e orientada à reutilização.
Os seguintes exemplos demonstram a aplicação prática de VAL e EXPR em contextos empresariais.
Embora alguns se baseiem em métricas financeiras, as mesmas abordagens aplicam-se a qualquer domínio de negócio.
ApplyContext
Exemplo genérico que demonstra como aplicar um filtro dinâmico a uma métrica.
TotalWithDiscount
Exemplo de utilização de parâmetros VAL, ambos os valores são avaliados antes da execução da função.
SalesForPortugal
Exemplo de utilização de parâmetros EXPR, avaliados dentro do contexto de filtro.
ECL_Total
Exemplo mais técnico, cálculo do Expected Credit Loss (ECL) num cenário bancário.
ConvertToCurrency
Função para conversão cambial parametrizada.
Análise — Diferenças entre VAL e EXPR
(ex. CALCULATE, FILTER, AVERAGEX).
Modelo A — Abordagem Tradicional (sem UDFs)
Cada medida contém a sua própria lógica, resultando em duplicação de código e maior dificuldade de manutenção.
Limitações:
Modelo B — Abordagem Modular com UDFs
As UDFs permitem encapsular a lógica base e reutilizá-la em diferentes medidas, reduzindo a duplicação e aumentando a consistência.
Vantagens observadas:
|
Critério |
Modelo A (sem UDFs) | Modelo B (com UDFs) |
|
Estrutura de código |
Duplicada | Centralizada |
|
Facilidade de manutenção |
Baixa | Elevada |
| Reutilização de lógica | Limitada |
Total |
| Consistência entre medidas | Média |
Elevada |
|
Adaptabilidade a novos contextos |
Difícil | Imediata |
| Risco de erro humano | Alto |
Reduzido |
| Complexidade geral do modelo | Elevada |
Simplificada |
Estes exemplos evidenciam claramente a vantagem estrutural das UDFs: a lógica de negócio deixa de estar dispersa entre dezenas de medidas e passa a estar concentrada em funções reutilizáveis, promovendo transparência, performance e sustentabilidade do modelo semântico.
SQLBI (Russo & Ferrari, 2025) — Introducing User-Defined Functions in DAX
https://www.sqlbi.com/articles/introducing-user-defined-functions-in-dax/
SQLBI YouTube — User-Defined Functions in DAX Explained (2025)
https://www.youtube.com/@SQLBI
Microsoft Learn — DAX Function Reference
https://learn.microsoft.com/power-bi/transform-model/dax/dax-function-reference
Microsoft Learn — Tabular Model Definition Language (TMDL)
https://learn.microsoft.com/power-bi/transform-model/semantic-model-tmdl
DAX Studio — Query Performance Analysis Guide