| name | pbi-dax-create |
| description | Cria medida DAX a partir de descrição em PT, respeitando o modelo Power BI existente (colunas reais, naming convention, padrões DAX). Use quando o usuário pedir "cria medida pra X", "preciso de DAX que faça Y", "quero calcular Z", "uma fórmula pra...", ou qualquer pedido pra gerar nova medida em projeto PBIP aberto. |
/pbi-dax-create — Criação de medida DAX
📦 Distribuída publicamente: github.com/xperiun/claude-code-powerbi-skills — pasta claude-code/pbi-dax-create/ (skill nativa) + claude-web/pbi-dax-create.zip (upload no Claude.ai). Mudança aqui exige sincronizar lá: atualizar pasta + regenerar ZIP (Python zipfile, ver CLAUDE.md) + commit + bump CHANGELOG. Repo é open-source, leiame público — evitar referências internas (Xperiun-only) na SKILL.md.
Gera medidas DAX a partir de descrição em linguagem natural, respeitando o modelo existente:
- Usa as colunas e tabelas que realmente existem (sem inventar)
- Detecta o padrão de nomenclatura do projeto (Title Case, camelCase, com prefixos, etc.) e segue
- Aplica boas práticas DAX automaticamente (DIVIDE em vez de /, SUMX vs SUM correto, time intelligence apropriado)
- Avisa se a medida pedida já existe ou tem similar parecida
- Faz pergunta clarificadora quando o pedido é ambíguo
Output principal: medida DAX no chat com nome, fórmula completa, explicação linha-a-linha e onde colar. Opcional: aplica direto no .tmdl (com aprovação explícita).
Quando usar
- Analista que sabe o que quer mas quer pular o "digitar DAX no editor"
- Líder de dados criando medidas em batch sem abrir Power BI Desktop
- Refatorando uma medida pra padrão DAX recomendado
- Onboarding: aprendiz descreve em PT e a skill mostra a forma correta
Não usar quando:
- Quer documentar medidas existentes → use
/pbi-doc
- Quer auditar qualidade de modelo → use
/pbi-modelo-review
- Quer refatorar medidas existentes em batch (skill futura
/pbi-dax-refactor)
- Quer apenas explicar um DAX que já existe (use
/pbi-doc que tem isso)
Pré-requisitos
- Projeto em formato PBIP (Power BI Project) — pasta com
.SemanticModel/. Se faltar, instruir conversão e encerrar.
- Acesso aos arquivos
.tmdl (via filesystem ou upload — ver "Modos de execução" abaixo)
Se faltar PBIP, mensagem curta:
Esse projeto ainda está em .pbix (binário). Pra eu criar medidas com base no modelo real, salva como Power BI Project: File → Save as → Power BI Project (.pbip). Sem isso eu não consigo ler colunas/medidas existentes pra te dar uma medida que funciona.
Modos de execução
A skill detecta automaticamente o ambiente e adapta input/output:
Modo Code (Claude Code · Desktop · file-based)
- Detecção: tenho acesso a filesystem e a pasta atual contém
.SemanticModel/
- Input: leio automaticamente os
.tmdl da pasta
- Output: medida no chat. Se aprovado, edito direto o
.tmdl da tabela host
Modo Web (Claude.ai · upload-based)
- Detecção: não tenho acesso a filesystem (claude.ai web)
- Input: peço ao usuário pra anexar os arquivos:
Pra eu criar uma medida que funciona com o seu modelo real, anexe nesse chat:
model.tmdl (lista geral de tabelas)
- O
.tmdl da tabela onde a medida vai ficar (ex: Medidas.tmdl)
- Se a medida vai usar colunas/medidas de outras tabelas, anexa também esses
.tmdl
Pode arrastar individualmente ou zipar tudo num arquivo só.
- Output: medida no chat (3 nomes + DAX + explicação + onde colar). Como não posso editar arquivo direto no web, devolvo o bloco TMDL pronto pra usuário copiar e colar manualmente no arquivo (ou no Power BI Desktop).
Detecção automática
Verificar se a pasta .SemanticModel/ é acessível via filesystem:
- ✅ Sim → Modo Code (file-based, edição direta possível)
- ❌ Não → Modo Web (peço uploads, devolvo bloco pra copiar)
Se ambíguo, perguntar uma vez:
Você tá rodando isso no Claude Code (CLI/IDE com acesso à pasta) ou no claude.ai (web)? Pra Code eu posso editar o .tmdl direto; pra web você precisa colar o bloco que eu te mando.
Inputs
- Descrição em PT (obrigatório) — o que a medida deve calcular
- (Opcional) Tabela host — onde colocar. Default: tabela
Medidas se existir, senão pergunta
Se descrição for vaga ou ambígua (ex: "vendas totais" — bruto ou líquido?), fazer 1 pergunta clarificadora antes de gerar.
Processo
1. Detectar e mapear o modelo
- Confirmar
.SemanticModel/
- Ler
model.tmdl (config), relationships.tmdl, tables/*.tmdl
- Ignorar
LocalDateTable_* e DateTableTemplate_* (auto-date hidden)
- Inventariar:
- Tabelas (e qual delas é "Medidas" container, se existir)
- Todas as colunas tipadas (qual tabela, tipo, papel inferido)
- Todas as medidas existentes (nome, DAX, displayFolder)
- Padrão de naming detectado nas medidas (ver
references/padroes.md)
2. Interpretar a solicitação
Da descrição em PT, identificar:
- Tipo de cálculo: agregação simples (soma/média/contagem), divisão (%, ratio), comparação temporal (YoY, MTD, YTD), ranking, filtro condicional, lógica IF/SWITCH
- Colunas/medidas necessárias: tem que existir no modelo. Se a descrição menciona algo que não existe → sugerir alternativas reais
- Granularidade implícita: se "total" provavelmente quer SUM/SUMX, se "média" AVERAGE, se "único/distintos" DISTINCTCOUNT, etc.
Se ambíguo, parar e perguntar (1 pergunta única, objetiva). Exemplos:
- "vendas totais" → "Total de qual coisa? (a) Receita bruta com SUMX(Vendas, Qtd × Preço), (b) Receita líquida com algum desconto/devolução, (c) Quantidade total de itens vendidos"
- "% de margem" → "Sobre o quê? (a) Margem Bruta / Faturamento, (b) Margem Líquida / Receita Líquida"
3. Aplicar padrões DAX
Ler references/padroes.md e seguir as regras:
DIVIDE(num, den) em vez de num / den (evita ∞ e erros silenciosos)
SUMX(tabela, expressão) quando expressão envolve mais de 1 coluna por linha
SUM(tabela[col]) quando é soma simples de 1 coluna
DISTINCTCOUNT() em coluna inteira (key) quando possível
- Time intelligence (
SAMEPERIODLASTYEAR, DATEADD, DATESYTD) sempre referenciando coluna de tabela calendário
CALCULATE com filter modifier explícito quando precisa modificar contexto
VAR ... RETURN pra medidas com 3+ passos lógicos (legibilidade)
4. Aplicar padrão de nomenclatura
Detectar o padrão usado nas medidas existentes do projeto (ver references/padroes.md seção naming):
- Title Case PT (
Total Vendas, % Margem Bruta)
- Prefixo de tipo (
% Faturamento YoY, # Pedidos, Δ MoM)
- camelCase (
totalVendas)
- Mistura (sinalizar que tá inconsistente, sugerir o mais comum)
Sempre gerar 3 sugestões de nome seguindo o padrão dominante.
5. Gerar a medida
Verificar antes de retornar:
- ✅ Todas as colunas/medidas referenciadas existem no modelo
- ✅ DAX segue boas práticas
- ✅ Nome segue padrão do projeto
- ⚠️ Existe medida similar no modelo? (busca por nome parecido OU mesma fórmula) → avisar antes de duplicar
6. Retornar no chat
Usar o formato definido em templates/output-medida.md. Resposta:
- 3 sugestões de nome (1ª recomendada, com justificativa)
- DAX completo formatado
- Explicação linha-a-linha em PT
- Onde colar (qual
.tmdl, em qual seção/displayFolder)
- displayFolder sugerido (se aplicável)
7. Aplicação opcional
Ao final, perguntar:
Quer que eu aplique direto no Medidas.tmdl (vou editar o arquivo) ou prefere só copiar e colar no Power BI manualmente?
Default seguro: só mostra. Aplica direto somente se o usuário disser sim explicitamente.
Se aplicar:
- Localizar a tabela host no
.tmdl
- Inserir a medida na seção correta (alfabética dentro do displayFolder)
- Adicionar
description: opcional se útil
- Salvar
- Não commita (regra inviolável git do CLAUDE.md raiz)
Outputs
Modo padrão (só sugere):
- Resposta no chat com nome + DAX + explicação + instruções de colar
- Nenhum arquivo modificado
Modo aplicar (com aprovação explícita):
.tmdl da tabela host modificado (medida inserida)
- Resumo curto no chat: "Medida X adicionada em Medidas.tmdl, linha Y"
Edge cases
| Cenário | O que fazer |
|---|
| Descrição muito vaga | 1 pergunta clarificadora antes de gerar |
| Coluna pedida não existe | Sugerir as 2-3 colunas reais mais próximas + perguntar qual |
| Medida pedida já existe (mesmo nome) | Avisar e perguntar: substituir ou criar com nome diferente? |
| Medida com fórmula similar já existe | Avisar e mostrar a existente — perguntar se é o que ele quer ou se realmente quer criar nova |
| Sem tabela "Medidas" no modelo | Listar tabelas e perguntar onde colocar (ou sugerir criar tabela vazia "Medidas") |
| Time intelligence sem dim Calendario marcada | Avisar limitação + criar a medida mas sinalizar que pode dar resultado errado |
| Modelo enorme (>500 medidas) | Carregar só nomes+DAX-essência das existentes (não DAX completo) pra evitar contexto explodir |
Tom
Estilo Xperiun:
- Direto: vai pra fórmula sem rodeio teórico
- Didático mas não condescendente: explica linha-a-linha em PT, mas no nível de quem já sabe DAX
- Provocativo quando útil: se o pedido tem antipattern óbvio, sinaliza ("você quer SUMX direto em fato de 5M linhas? Pode dar trabalho — alternativa: ...")
- PT-BR com todos os acentos (regra inviolável CLAUDE.md)
Exemplos:
❌ Ruim: "Para calcular o faturamento, podemos utilizar a função SUMX que iterará..."
✅ Bom: "Faturamento — SUMX em fVendas multiplicando QtdItens × PrecoUnitario. Mais limpo que coluna calculada (que infla a fato)."
Segurança / Blast radius
- Lê arquivos
.tmdl (texto puro)
- Modo padrão: zero modificação no projeto
- Modo aplicar: edita só o
.tmdl da tabela host, nunca toca outros
- NÃO commita (segue regra inviolável git)
- NÃO faz rede — operação 100% local
Tom dos avisos sobre risco
Quando aplicar direto:
- Antes: "Vou editar
Medidas.tmdl e adicionar a medida na seção 0. Medidas Padrão. Pode?"
- Após: "Adicionada. Abre o Power BI Desktop e ele vai recarregar o modelo automaticamente. Se quiser desfazer, só rodar
git diff e descartar."
Tempo típico
- Medida simples (agregação ou divisão): 15–30s
- Medida com time intelligence ou múltiplos VAR: 30–60s
- Medida que requer pergunta clarificadora: + tempo de ida-e-volta com você
Versão
v0.1 — protótipo interno Xperiun OS. Faz parte do trio do lead magnet (/pbi-modelo-review · /pbi-doc · /pbi-dax-create).