Pular para o conteúdo

10 diferenças que mordem

Aula 3 de 58 minOperarAtualizada em 2026-10-04

Vídeo em produção

A gravação desta aula está no lote de produção. O objetivo, o exercício e a documentação já valem. Duração-alvo: 8 min.

Objetivo: Reescrever 5 medidas

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ítuloMinutagem-alvoRota
1Abertura — não é DAX traduzido, é DAX-like honesto00:00–00:50/connect
2Diferenças 1 a 4: sintaxe, Tabela[Coluna], TUDO(), FILTRAR00:50–03:00/dashboards (editor de medida)
3Diferenças 5 a 7: sem tabela virtual, escopo do visual, branco honesto03:00–05:00/dashboards (editor de medida)
4Diferenças 8 a 10: lógico 1/0, "DIFERE do DAX", o que mora no modelo05:00–06:30/dashboards (editor de medida)
5Cinco medidas reescritas lado a lado06:30–07:30/dashboards (importador de DAX)
6Encerramento — releia a doc da função antes de confiar no nome07: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.biO que morde
1SUM(x, y) · decimal 0.33SOMA(x; y) · decimal 0,33Argumentos por ; e vírgula decimal. Colar DAX com vírgula quebra na primeira linha
2Vendas[valor], [Receita]valor, MEDIDA('Receita')Coluna pelo nome simples; colchete não existe no editor e dá Caractere inesperado: "["
3ALL(Vendas) / ALL(Vendas[uf])TUDO() / REMOVER_FILTROS(uf)TUDO() tem aridade zero — significa "o visual inteiro". TUDO(Vendas) não compila
4FILTER(Vendas, Vendas[valor] > 150)FILTRAR(valor > 150)FILTRAR recebe só a condição: a tabela some, porque o contexto é o visual
5SUMMARIZE, ADDCOLUMNS, VALUES, CALCULATETABLE— (sem equivalente)Não há tabela virtual no motor. Por isso CALCULAR tem um repertório fechado de modificadores
6Agrega sobre o modelo tabular, com tabela de datas marcadaAgrega sobre as linhas do visualACUM_ANO e companhia não exigem tabela de datas marcada — e reiniciam no ano do calendário do modelo (abril, num fiscal abr–mar)
7BLANK() que vira 0 em muitas contasBranco honestoResultado 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, 0Não há operador lógico infixo, e lógico é representado como 1/0
9COUNT, DISTINCTCOUNT, VAR, SEARCHCONT, CONTD, VAR, LOCALIZARMesmo 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
10RELATED, 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.

  1. Condição composta — diferenças 1, 2 e 8:
    dax
    IF(AND(Vendas[valor] > 150, Vendas[quantidade] > 1), "sim", "não")
    formula
    SE(E(valor > 150; quantidade > 1); "sim"; "não")
  2. Ignorar o filtro de uma coluna — diferença 3 (ALL(coluna) não é TUDO()):
    dax
    CALCULATE([Receita], ALL(Produtos[categoria]))
    formula
    CALCULAR(MEDIDA('Receita'); REMOVER_FILTROS(categoria))
  3. Iterador com tabela filtrada em SOMAX — diferença 4 (a tabela some):
    dax
    SUMX(FILTER(Vendas, Vendas[quantidade] > 1), Vendas[valor] * Vendas[quantidade])
    formula
    SOMAX(FILTRAR(quantidade > 1); valor * quantidade)
  4. Contagem distinta sem tabela virtual — diferença 5 (VALUES não tem par):
    dax
    COUNTROWS(VALUES(Vendas[pedido_id]))
    formula
    CONTD(pedido_id)
  5. Janela móvel de 3 meses — diferenças 1, 2 e 6:
    dax
    CALCULATE([Receita], DATESINPERIOD(Calendario[data], MAX(Calendario[data]), -3, MONTH))
    formula
    CALCULAR(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:

formula
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):

  1. Crie as quatro medidas centrais da Aurora: Receita, Custo, Pedidos e Lucro, exatamente como nesta aula.
  2. Reescreva as cinco medidas da seção anterior no editor e salve cada uma só depois de compilar sem erro.
  3. 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)).
  4. Abra as páginas de CONTD e SEERRO e anote, com suas palavras, a linha DIFERE do DAX de cada uma.
  5. Cole no importador de DAX uma medida sua que use RELATED ou USERELATIONSHIP e leia o que aparece em naoSuportados.
  6. 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".

Carregando seu progresso…