How to use
- Copy the installation command and review the source package before installing it in your own agent environment.
- Check the source document for required tools, credentials and supported hosts.
- Describe your input and desired deliverable; review the output against the source material.
npx skills add https://github.com/officetuning/skill-library --skill dax-udfBefore you start
- Installation does not include a model subscription, API allowance or permission to access your files.
- Repository stars and installation counts describe activity, not an independent quality or security test.
Rendered from the source repository. Headings, examples, code, tables, links, and referenced images are preserved.
UDF DAX
Uma UDF empacota lógica DAX com nome e parâmetros para reutilizar em medidas, colunas calculadas, cálculos visuais, formatos dinâmicos e outras UDFs. GA no Desktop e no Service desde junho/2026; exige nível de compatibilidade 1702 ou superior.
Antes de escrever uma função do zero, procure na Code Library UDF DAX (functionlibrary.officetuning.com.br/dax/udf/biblioteca): calendário, comparativo AV/AA/Δ (Delta.*), datas fiscais, feriados, texto, estatística.
Fluxo de trabalho
- Escreva e teste na DAX Query View com
DEFINE FUNCTION … EVALUATE.
Nada vai para o modelo até você aprovar.
- Grave no modelo: CodeLens Update model: Add new function (uma) ou
Update model with changes (todas). Na TMDL view, botão Apply.
- Use na medida e confira o resultado num visual.
- Em
.pbip, a função fica emdefinition/functions.tmdle entra no Git
como qualquer medida (ver tmdl-pbir).
Anatomia (padrão da casa)
DEFINE
/// Aplica imposto sobre um valor.
/// @param {NUMERIC} valor - Valor antes do imposto
/// @param {NUMERIC} [aliquota] - Alíquota opcional; padrão 0,1 (10%)
/// @returns O valor com imposto
FUNCTION Fiscal.ComImposto =
( valor : NUMERIC, aliquota : NUMERIC = 0.1 ) =>
valor * ( 1 + aliquota )
EVALUATE
ROW (
"Padrão", Fiscal.ComImposto ( 100 ),
"Alíquota 20%", Fiscal.ComImposto ( 100, 0.2 )
)
-- 110 e 120| Regra | Padrão OfficeTuning |
|---|---|
| Nome da função | Grupo.Acao com ponto para agrupar: Vendas.Margem, Delta.AA, Formato.Escala. Sem espaço, sem ponto no início/fim, sem nome de função nativa ou palavra reservada |
| Nome do parâmetro | camelCase, sem ponto. Parâmetro EXPR termina em Expr (valorExpr) para quem chama saber que será calculado dentro da função |
| Documentação | /// acima da função com @param {TIPO} nome - descrição, [nome] para opcional e @returns. Comentário // não aparece no IntelliSense |
| Tipo | O mais específico que resolve: o IntelliSense e a validação recusam o argumento errado já na chamada |
| Teste | Todo exemplo traz um EVALUATE com o resultado esperado em comentário |
Tipos de parâmetro
Forma: nome : [tipo] [subtipo] [modo] [= padrão]. Sem nada, vale ANYVAL VAL.
| Família | Tipo | Aceita | Modo |
|---|---|---|---|
| Valor | ANYVAL | Escalar ou tabela | VAL (padrão) ou EXPR |
| Valor | SCALAR + subtipo | Escalar | VAL (padrão) ou EXPR |
| Valor | TABLE | Tabela | VAL (padrão) ou EXPR |
| Expressão | ANYREF | Qualquer referência | sempre EXPR |
| Expressão | MEASUREREF / COLUMNREF / TABLEREF / CALENDARREF | Referência daquele tipo | sempre EXPR |
Subtipos de SCALAR (declarar o subtipo já implica SCALAR): INT64, DECIMAL, DOUBLE, NUMERIC (qualquer dos três), STRING, DATETIME, BOOLEAN, VARIANT. Tipos de valor convertem implicitamente ("5" vira 5 num INT64); tipos de expressão não.
VAL × EXPR — a decisão que mais erra
| Modo | Quando calcula | Herda do chamador |
|---|---|---|
VAL | Uma vez, antes de entrar na função | Contexto de linha e de filtro |
EXPR | Dentro da função, onde aparece (pode ser várias vezes, em outro contexto) | Só o contexto de filtro |
- Use
VALpara número, texto, data, tabela pronta. - Use
EXPRquando a função precisa mudar o contexto da expressão
(CALCULATE, ALL, iterar e recalcular por linha).
- Dentro de iterador,
MEASUREREFfaz transição de contexto sozinha;
SCALAR EXPR com SUM(...) não — envolva em CALCULATE ( valorExpr ).
Exemplos completos (TABLE VAL × EXPR, TOP N com MEASUREREF, checagem de tipo): references/padroes-udf.md.
UDF em formato dinâmico de medida
O caso que mais economiza: a mesma lógica de formato em várias medidas. Na medida: Formato → Dinâmico e, na expressão de formato:
Formato.Escala ( SELECTEDMEASURE () )A medida continua numérica (gráficos funcionam), ao contrário de FORMAT() dentro da medida, que devolve texto. No visual, deixe Unidades de exibição = Nenhum, senão o visual reescala por cima. Código da Formato.Escala e variações: references/padroes-udf.md.
Onde usar e cuidados
| Onde | Cuidado |
|---|---|
| Medida | — |
| Coluna calculada | A função deve devolver sempre o mesmo tipo; fixe com CONVERT |
| Cálculo visual | Só enxerga campos do visual; sem IntelliSense para UDF |
| Outra UDF | Sem recursão |
| Formato dinâmico | Unidades de exibição = Nenhum no visual |
Limitações (confira a data no Microsoft Learn)
- Sem recursão (nem mútua), sem sobrecarga, sem tipo de retorno declarado.
- Não dá para ocultar, colocar em pasta de exibição nem traduzir a função.
- Não funciona em modelo sem tabelas.
- Conexão dinâmica: medidas de relatório chamam a UDF, sem IntelliSense.
Modelo composto: medidas do modelo local não chamam UDF do modelo de origem.
- ⚠️ OLS não passa para a função. Não exponha objeto protegido em nome ou
descrição de função.
- Nome sem tabela (
[Valor]) é lido como medida: dentro de UDF, sempre
qualifique colunas (Vendas[Valor]).
- Parâmetro
EXPRnão usado no corpo nunca é calculado.
Listar e auditar
EVALUATE INFO.USERDEFINEDFUNCTIONS () -- nome, expressão, estado, erroMetadados completos podem exigir permissão de escrita ou de administrador do modelo, conforme o host. State = Error + ErrorMessage mostram função quebrada depois de renomear tabela ou coluna.



