Code Library — Biblioteca de UDFs DAX (DataHora, Delta, Estatistica)
Code Library — Biblioteca de UDFs DAX (DataHora, Delta, Estatistica)
Nota de integração
Este material é 100% DAX — nenhum dos três arquivos-fonte
(Biblioteca_de_Funções...html, Consulta_DAX.txt, Script_TMDL.txt)
contém função M ou código Power Query. Não há nada a incorporar na
seção M da Biblioteca a partir desta fonte.
O conteúdo abaixo se conecta diretamente a
07-dax-udf-tipos-parametro-conteudo.md (já auditado) — enquanto aquele
arquivo documenta o sistema de tipos de parâmetro de UDF em abstrato,
este documenta uma biblioteca real, testada e em produção usando
esses tipos. Recomenda-se publicar como subseção /dax/udf/biblioteca
ou como bloco de exemplos dentro da própria página de UDF.
MUST
- Publicar
Requisito mínimo = Setembro/2025 ou superior, não Março/2025 — ver correção na seção 1. - Manter a documentação do namespace
Estatistica— ele existe no código-fonte mas não estava no manual HTML v1.0.0 (que só documentavaDataHoraeDelta). Esta página corrige essa lacuna de versão. - Creditar a biblioteca como conteúdo autoral do projeto (OfficeTuning), não de terceiros — diferente das funções DAX nativas, aqui a Biblioteca é a única fonte de verdade.
AVOID
- Não republicar o aviso de direitos autorais completo do documento original (é redundante com os termos já definidos para o projeto) — uma nota de autoria simples basta.
1. Correção — requisito mínimo de plataforma
O manual original lista Março/2025 ou superior como requisito para o
recurso DEFINE FUNCTION (preview). Isso está incorreto. Múltiplas
fontes independentes confirmam que DAX UDFs entraram em preview em
setembro de 2025 (16/set/2025, conforme blog de Andrzej Leszkiewicz,
Power BI Developer/MVP, publicado no dia do lançamento; confirmado
também por artigo da mesma época na Medium). GA (disponibilidade geral)
veio em junho/2026 — já registrado em 01-dax-guia-conteudo.md.
| Manual original | Corrigido | |
|---|---|---|
| Requisito mínimo | Power BI Desktop, Março/2025 ou superior | Power BI Desktop, Setembro/2025 ou superior (preview) / Junho/2026 (GA) |
2. Visão geral da biblioteca (corrigida — 3 namespaces, 11 funções)
| Namespace | Categoria | Funções | Descrição |
|---|---|---|---|
DataHora | Calendário / Tempo | 2 | Geração de tabela calendário completa com dimensões gregoriana, fiscal e ISO 8601 |
Delta | Comparativos temporais | 6 | Variação absoluta, percentual, ícone e cor semântica vs. ano anterior |
Estatistica | Estatística descritiva | 3 | Coeficiente de Variação e classificação de confiabilidade da média |
3. Biblioteca DataHora
⚠️ Atualizado (2026-08-08): a fonte real do Code Library já renomeou este escopo para
DateTime(nãoDataHora) e a versão atual da função é significativamente mais rica (mais colunas: estação com cor/emoji, ano fiscal com convenção "rotulado pelo ano em que termina", etc.). Ver50-dax-code-library-business-datetime-novidades.mdpara a versão completa e atual — a assinatura abaixo (DataHora.Calendario) é a versão anterior, mantida aqui só como registro histórico.
DataHora.Calendario(StartDate, EndDate, Locale, FirstDay, FiscalYearStartMonth) — ⚠️ ver nota acima, use DateTime.Calendar
Gera uma tabela de datas com 28 colunas analíticas — gregoriano, semana, quinzena, ISO 8601 e calendário fiscal parametrizado.
FUNCTION DataHora.Calendario =
(
StartDate : SCALAR DATETIME VAL,
EndDate : SCALAR DATETIME VAL,
Locale : SCALAR STRING,
FirstDay : SCALAR INT64 VAL,
FiscalYearStartMonth : SCALAR INT64 VAL
) =>
VAR vCalendario =
SELECTCOLUMNS(
CALENDAR(StartDate, EndDate),
"Data Referência", [Date]
)
RETURN
ADDCOLUMNS(
vCalendario,
"Ano", YEAR([Data Referência]),
"Semestre #", IF(MONTH([Data Referência]) <= 6, 1, 2),
"Trimestre #", QUARTER([Data Referência]),
"Mês #", MONTH([Data Referência]),
"Mês", FORMAT([Data Referência], "MMMM", Locale),
"Semana #", WEEKNUM([Data Referência], FirstDay),
"Dia da Semana", FORMAT([Data Referência], "dddd", Locale),
"Semana ISO #", WEEKNUM([Data Referência], 21),
"Ano ISO", YEAR([Data Referência] - (WEEKDAY([Data Referência], 2) - 4)),
"Mês Fiscal #", MOD(MONTH([Data Referência]) - FiscalYearStartMonth + 12, 12) + 1,
"Ano Fiscal #", YEAR([Data Referência]) + IF(MONTH([Data Referência]) >= FiscalYearStartMonth, 1, 0)
-- + 18 colunas adicionais (ver código-fonte completo)
)
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
StartDate | SCALAR DATETIME VAL | Data de início (inclusive) |
EndDate | SCALAR DATETIME VAL | Data de fim (inclusive) |
Locale | SCALAR STRING | Código IETF BCP 47 ("pt-BR", "en-US") — controla nomes de mês/dia |
FirstDay | SCALAR INT64 VAL | Primeiro dia da semana para WEEKNUM/WEEKDAY — ver tabela §3.1 |
FiscalYearStartMonth | SCALAR INT64 VAL | Mês de início do ano fiscal (1-12) |
Retorno: TABLE — uma linha por dia, 28 colunas.
Validação técnica:
- Tabela de valores de
FirstDay/WEEKNUM— ✅ confirmada exatamente contradax.guide/weeknum:1=domingo,2=segunda,11=segunda (1ª convenção ISO-like),12=terça,21=ISO 8601 real (semana da primeira quinta-feira do ano). - Algoritmo de "Ano ISO" (
YEAR(data - (WEEKDAY(data,2)-4))) — ✅ confirmado como o método padrão e correto de cálculo de ano-semana ISO 8601 (método da quinta-feira).
3.1 — Valores de FirstDay
| Valor | Primeiro dia da semana |
|---|---|
| 1 | Domingo |
| 2 | Segunda-feira |
| 11 | Segunda-feira (1ª convenção ISO-like) |
| 12 | Terça-feira |
| 21 | Segunda-feira — ISO 8601 real (semana da 1ª quinta-feira do ano) |
DataHora.Sobre()
Retorna metadados da biblioteca (nome, autor, versão, funções, exemplo) como string multilinha — padrão de autodocumentação usado em todos os 3 namespaces desta Code Library.
4. Biblioteca Delta
Cinco funções encadeáveis para análise de variação temporal:
Delta.AA → Delta.Absoluto / Delta.Percentual → Delta.Info /
Delta.Cor.
FUNCTION Delta.AA =
(Valor: ANYREF) =>
CALCULATE(
Valor,
SAMEPERIODLASTYEAR('TabDimCalendario'[Data Referência])
)
FUNCTION Delta.Absoluto =
(Valor: ANYREF, ValorAA: ANYREF) =>
IF(
ISBLANK(Valor) || ISBLANK(ValorAA),
BLANK(),
Valor - ValorAA
)
FUNCTION Delta.Percentual =
(Valor: ANYREF, ValorAA: ANYREF) =>
IF(
ISBLANK(Valor) || ISBLANK(ValorAA),
BLANK(),
DIVIDE(Valor - ValorAA, ValorAA)
)
FUNCTION Delta.Info =
(ValorDeltaPercentual: ANYREF) =>
SWITCH(
TRUE(),
ISBLANK(ValorDeltaPercentual), BLANK(),
ValorDeltaPercentual > 0, "▲",
ValorDeltaPercentual = 0, "■",
"▼"
)
FUNCTION Delta.Cor =
(ValorDeltaPercentual: ANYREF) =>
SWITCH(
TRUE(),
ISBLANK(ValorDeltaPercentual), BLANK(),
ValorDeltaPercentual > 0, "#1AAB40",
ValorDeltaPercentual = 0, "#D9B300",
"#D64554"
)
Dependência: todas as funções Delta.* exigem uma tabela de datas
chamada TabDimCalendario (coluna [Data Referência]), marcada como
tabela de datas e relacionada às tabelas fato.
Exemplo de uso encadeado:
Δ Vendas AA = Delta.AA([Total Vendas])
Δ Vendas % = Delta.Percentual([Total Vendas], [Δ Vendas AA])
Δ Vendas Info = Delta.Info([Δ Vendas %])
Δ Vendas Cor = Delta.Cor([Δ Vendas %])
4.1 — Sugestão de evolução: ANYREF → MEASUREREF
Todos os 5 parâmetros Valor/ValorAA/ValorDeltaPercentual usam
ANYREF, mas na prática são sempre chamados com referência direta a
medida (Delta.AA([Total Vendas])). Pela regra prática já documentada
em 07-dax-udf-tipos-parametro-conteudo.md ("use o tipo mais
específico que a função realmente precisa"), esses parâmetros são
candidatos naturais para MEASUREREF:
// Versão atual (ANYREF — aceita qualquer expressão):
FUNCTION Delta.AA = (Valor: ANYREF) => ...
// Versão sugerida (MEASUREREF — só aceita medida existente):
FUNCTION Delta.AA = (Valor: MEASUREREF) => ...
Ganho: validação de tipo em tempo de design (erro claro se alguém
passar uma expressão em vez de medida) e garantia automática de
transição de contexto, sem depender de CALCULATE defensivo. Custo:
nenhum uso legítimo é perdido, já que todos os exemplos do manual já
chamam essas funções só com medidas. Não é uma correção — é uma
sugestão de reforço de tipo, opcional.
5. Biblioteca Estatistica
Não documentada no manual HTML v1.0.0 — presente apenas no
código-fonte (Consulta_DAX.txt, Script_TMDL.txt). Documentada aqui
pela primeira vez.
FUNCTION Estatistica.CV =
(DesvioPadrao: NUMERIC, Media: NUMERIC) =>
DIVIDE(DesvioPadrao, Media)
FUNCTION Estatistica.ClassificarCV =
(CV: NUMERIC) =>
SWITCH(
TRUE(),
ISBLANK(CV), BLANK(),
CV <= 0.15, "Dados concentrados, média confiável.",
CV <= 0.30, "Variação moderada, use com atenção.",
"A média não representa o grupo. Troque para a mediana."
)
Estatistica.CV(DesvioPadrao, Media) — Coeficiente de Variação
(σ/μ), validado como a definição estatística padrão. Retorna decimal
(0,15 = 15%).
Estatistica.ClassificarCV(CV) — interpreta o CV em 3 faixas:
≤15% (dados concentrados), ≤30% (variação moderada), >30% (média não
representativa, sugere usar mediana). Os limiares (15%/30%) são
convenção comum em estatística descritiva, não um padrão universal
único — vale nota na página de que são um critério prático, ajustável
por domínio.
Exemplo de uso:
VAR vCV = Estatistica.CV([Desvio Padrão], [Média])
RETURN Estatistica.ClassificarCV(vCV)
Aviso do autor preservado: evitar Estatistica.CV quando a média
for igual ou próxima de zero (DIVIDE retorna BLANK() nesse caso,
mas a métrica perde sentido interpretativo mesmo sem erro técnico).
6. Referências originais (preservadas do manual)
| # | Recurso | URL |
|---|---|---|
| 1 | DAX function reference | learn.microsoft.com/pt-br/dax/dax-function-reference |
| 2 | CALENDAR function | learn.microsoft.com/pt-br/dax/calendar-function-dax |
| 3 | SAMEPERIODLASTYEAR function | learn.microsoft.com/pt-br/dax/sameperiodlastyear-function-dax |
| 4 | WEEKNUM function | learn.microsoft.com/pt-br/dax/weeknum-function-dax |
| 5 | FORMAT function (DAX) | learn.microsoft.com/pt-br/dax/format-function-dax |
| 6 | DEFINE FUNCTION — DAX Query | learn.microsoft.com/pt-br/dax/define-function-statement |
| 7 | Marcar como tabela de datas | learn.microsoft.com/pt-br/power-bi/transform-model/desktop-date-tables |
| 8 | ISO 8601 — Week date | iso.org/iso-8601-date-and-time-format.html |
7. Resumo de correções aplicadas
| Item | Original | Corrigido |
|---|---|---|
| Requisito mínimo de plataforma | Março/2025 | Setembro/2025 (preview) / Junho/2026 (GA) |
Namespace Estatistica | Ausente do manual v1.0.0 | Documentado nesta versão (seção 5) |
Tipo dos parâmetros Delta.* | ANYREF (sem alteração de código) | Sugestão de evolução para MEASUREREF registrada (seção 4.1), não aplicada ao código-fonte |
8. Onde entra na navegação
Sugestão: /dax/udf/biblioteca — subseção da página de UDF
(/dax/udf) já existente, apresentando esta Code Library como exemplo
real de aplicação dos tipos de parâmetro documentados ali. Alternativa:
seção própria /dax/code-library se o projeto paralelo "Code Library"
crescer para incluir mais bibliotecas além de DataHora/Delta/
Estatistica.