Come usare
- Copia il comando e controlla il pacchetto prima di installarlo nel tuo ambiente agente.
- Controlla strumenti, credenziali e ambienti richiesti nel documento originale.
- Descrivi input e risultato desiderato; confronta l’output con le fonti.
npx skills add https://github.com/officetuning/skill-library --skill dax-udfPrima di iniziare
- L’installazione non include abbonamenti, quote API o accesso ai file.
- Stelle e installazioni indicano attività, non un test indipendente di qualità o sicurezza.
Contenuto dal repository con titoli, esempi, codice, tabelle, link e immagini preservati.
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.



