Selo de estado:
Preview(teto atual do produto) · Curso ACD-350 — Rota rápida: do Power BI/Excel ao ingestia.bi · Aula 3 de 5 · Atualizado em 2026-10-04.
Objetivo#
Ao final desta aula você vai reescrever 5 medidas DAX na linguagem pt-BR e reconhecer, de cabeça, as dez diferenças que fazem uma medida "traduzida ao pé da letra" dar número errado ou nem compilar.
Vídeo#
Identificador no manifesto: acd-350-03-dax-vs-formulas · duração-alvo 8 min · tela do produto: /connect.
Roteiro:
| # | Capítulo | Minutagem-alvo | Rota |
|---|---|---|---|
| 1 | Abertura — não é DAX traduzido, é DAX-like honesto | 00:00–00:50 | /connect |
| 2 | Diferenças 1 a 4: sintaxe, Tabela[Coluna], TUDO(), FILTRAR | 00:50–03:00 | /dashboards (editor de medida) |
| 3 | Diferenças 5 a 7: sem tabela virtual, escopo do visual, branco honesto | 03:00–05:00 | /dashboards (editor de medida) |
| 4 | Diferenças 8 a 10: lógico 1/0, "DIFERE do DAX", o que mora no modelo | 05:00–06:30 | /dashboards (editor de medida) |
| 5 | Cinco medidas reescritas lado a lado | 06:30–07:30 | /dashboards (importador de DAX) |
| 6 | Encerramento — releia a doc da função antes de confiar no nome | 07:30–08:00 | /connect |
Conteúdo#
A linguagem daqui se inspira no DAX e mantém os nomes em inglês como aliases, mas não é DAX: "onde a semântica difere, a página da função marca explicitamente com DIFERE do DAX". A aula 13 de ACD-320 ensina a converter medidas com o importador assistido. Esta aula é a outra metade: as dez diferenças que mordem — aquelas que passam pelo compilador e só aparecem depois, no número errado.
Tabela das 10 diferenças
| # | No Power BI (DAX) | No ingestia.bi | O que morde |
|---|---|---|---|
| 1 | SUM(x, y) · decimal 0.33 | SOMA(x; y) · decimal 0,33 | Argumentos por ; e vírgula decimal. Colar DAX com vírgula quebra na primeira linha |
| 2 | Vendas[valor], [Receita] | valor, MEDIDA('Receita') | Coluna pelo nome simples; colchete não existe no editor e dá Caractere inesperado: "[" |
| 3 | ALL(Vendas) / ALL(Vendas[uf]) | TUDO() / REMOVER_FILTROS(uf) | TUDO() tem aridade zero — significa "o visual inteiro". TUDO(Vendas) não compila |
| 4 | FILTER(Vendas, Vendas[valor] > 150) | FILTRAR(valor > 150) | FILTRAR recebe só a condição: a tabela some, porque o contexto é o visual |
| 5 | SUMMARIZE, ADDCOLUMNS, VALUES, CALCULATETABLE | — (sem equivalente) | Não há tabela virtual no motor. Por isso CALCULAR tem um repertório fechado de modificadores |
| 6 | Agrega sobre o modelo tabular, com tabela de datas marcada | Agrega sobre as linhas do visual | ACUM_ANO e companhia não exigem tabela de datas marcada — e reiniciam no ano do calendário do modelo (abril, num fiscal abr–mar) |
| 7 | BLANK() que vira 0 em muitas contas | Branco honesto | Resultado vazio é vazio, nunca um zero inventado. SE sem "senão" devolve vazio; SEERRO cobre erro e vazio (o IFERROR só cobre erro) |
| 8 | &&, ||, TRUE(), FALSE() | E(…), OU(…), 1, 0 | Não há operador lógico infixo, e lógico é representado como 1/0 |
| 9 | COUNT, DISTINCTCOUNT, VAR, SEARCH | CONT, CONTD, VAR, LOCALIZAR | Mesmo nome, semântica diferente: CONT() sem argumento conta linhas; CONTD não conta o vazio; VAR(x) é variância (e VAR x = … é variável); LOCALIZAR devolve 0 quando não acha e ignora maiúsculas |
| 10 | RELATED, USERELATIONSHIP, EARLIER, USERPRINCIPALNAME | — (mora fora da fórmula) | A relação mora no modelo; a relação alternativa é escolhida na consulta/visual; o contexto externo vira VAR; a identidade do usuário não chega ao motor de fórmulas (é RLS por atributo) |
A diferença 9 é a mais perigosa
As de 1 a 4 o compilador pega na hora. A 9 passa limpa e muda o número: DISTINCTCOUNT do DAX conta o BLANK como um valor a mais; CONTD não conta. Antes de confiar num nome familiar, abra a página da função e procure a linha DIFERE do DAX.
Cinco medidas reescritas
Todas as fórmulas abaixo compilam no motor. À esquerda, o DAX original; à direita, a versão daqui.
- Condição composta — diferenças 1, 2 e 8:
dax
IF(AND(Vendas[valor] > 150, Vendas[quantidade] > 1), "sim", "não")formulaSE(E(valor > 150; quantidade > 1); "sim"; "não") - Ignorar o filtro de uma coluna — diferença 3 (
ALL(coluna)não éTUDO()):daxCALCULATE([Receita], ALL(Produtos[categoria]))formulaCALCULAR(MEDIDA('Receita'); REMOVER_FILTROS(categoria)) - Iterador com tabela filtrada em
SOMAX— diferença 4 (a tabela some):daxSUMX(FILTER(Vendas, Vendas[quantidade] > 1), Vendas[valor] * Vendas[quantidade])formulaSOMAX(FILTRAR(quantidade > 1); valor * quantidade) - Contagem distinta sem tabela virtual — diferença 5 (
VALUESnão tem par):daxCOUNTROWS(VALUES(Vendas[pedido_id]))formulaCONTD(pedido_id) - Janela móvel de 3 meses — diferenças 1, 2 e 6:
dax
CALCULATE([Receita], DATESINPERIOD(Calendario[data], MAX(Calendario[data]), -3, MONTH))formulaCALCULAR(MEDIDA('Receita'); DATAS_NO_PERIODO(data; ULTIMA_DATA(data); -3; "m"))
Repare no padrão: o que viaja é a intenção, não a forma. VALUES + COUNTROWS queria "quantos pedidos distintos" — e isso é uma função só aqui. FILTER(tabela, cond) queria "só estas linhas" — e a tabela era redundante, porque o contexto já é o visual.
Como isso aparece no produto
As medidas vivem na biblioteca de medidas centrais do editor do painel, e você as referencia por MEDIDA('Receita') — nunca por [Receita]. Para trazer DAX existente há o importador assistido (C06.6): ele preserva a fórmula original byte a byte, traduz o que tem equivalente e lista o que não tem em naoSuportados, com motivo em português. A tradução sai com confiança alta, média ou baixa; trate média e baixa como "revise antes de salvar".
Exemplo Aurora
Na Aurora Varejo, a biblioteca mínima é Receita = SOMA(valor), Custo = SOMA(custo), Pedidos = CONTD(pedido_id), Lucro = MEDIDA('Receita') - MEDIDA('Custo'). A participação de uma categoria no total do visual, que no DAX seria DIVIDE([Receita], CALCULATE([Receita], ALL(Vendas))), fica:
DIVIDIR(MEDIDA('Receita'); CALCULAR(MEDIDA('Receita'); TUDO()))O que NÃO existe
Não há paridade de DAX e o produto não finge que há: sem tabelas virtuais arbitrárias, sem funções de janela (RANK, ROWNUMBER, OFFSET, WINDOW), sem RELATED/RELATEDTABLE, sem USERELATIONSHIP dentro da fórmula, sem USERNAME/USERPRINCIPALNAME. Quando a medida original depende disso, o importador sinaliza e o caminho mais rápido é entender a intenção e escrever direto na linguagem daqui.
Estado da capacidade
O importador de DAX assistido e a matriz de conformidade são C06.6, claim GA-candidato — motor provado por testes determinísticos. O teto do produto segue Preview, e o selo desta aula é o mais conservador.
Faça você mesmo#
No workspace de treino Aurora Varejo (abra o editor de um painel, aba do modelo):
- Crie as quatro medidas centrais da Aurora:
Receita,Custo,PedidoseLucro, exatamente como nesta aula. - Reescreva as cinco medidas da seção anterior no editor e salve cada uma só depois de compilar sem erro.
- Force cada mordida de propósito, uma por vez, e leia a mensagem:
SOMA(Vendas[valor]),CALCULAR(SOMA(valor); TUDO(vendas)),FILTRAR(vendas; valor > 150),DIVIDIR(SOMA(valor), SOMA(custo)). - Abra as páginas de
CONTDeSEERROe anote, com suas palavras, a linha DIFERE do DAX de cada uma. - Cole no importador de DAX uma medida sua que use
RELATEDouUSERELATIONSHIPe leia o que aparece emnaoSuportados. - Escolha uma medida do seu Power BI que ninguém sabe explicar e reescreva-a aqui partindo da intenção, não do texto.
Você terminou quando as cinco medidas estiverem salvas e compilando, você tiver visto as quatro mensagens de erro do passo 3 e conseguir dizer de cabeça por que TUDO() não aceita argumento.
Checagem rápida#
Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.
Documentação relacionada#
Capacidades ensinadas#
C06.6 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".