Selo de estado:
Preview(teto atual do produto) · Curso ACD-320 — Fórmulas pt-BR: de SOMA a CALCULAR · Aula 6 de 13 · Atualizado em 2026-10-04.
Objetivo#
Ao final desta aula você vai compor participação no total e recorte fixo.
Vídeo#
Identificador no manifesto: acd-320-06-calcular-e-modificadores · duração-alvo 10 min · tela do produto: /dashboards.
Roteiro:
| # | Capítulo | Minutagem-alvo | Rota |
|---|---|---|---|
| 1 | Abertura — CALCULAR é a função que muda o contexto | 00:00–00:50 | /dashboards |
| 2 | FILTRAR — recortar por uma condição | 00:50–02:30 | /dashboards (editor de fórmulas) |
| 3 | TUDO(), TUDO_EXCETO e REMOVER_FILTROS — ignorar o grupo e os dois lados da mesma moeda | 02:30–06:40 | /dashboards (biblioteca de medidas) |
| 4 | MANTER_FILTROS — somar ao filtro em vez de substituir | 06:40–08:10 | /dashboards (editor de fórmulas) |
| 5 | Precedência e composição entre modificadores | 08:10–09:20 | /dashboards |
| 6 | Encerramento — "faça você mesmo" | 09:20–10:00 | /dashboards |
Conteúdo#
CALCULAR é a função mais importante do motor depois das agregações básicas: ela troca o contexto de filtro de uma expressão antes de avaliá-la. Tudo que esta aula ensina depende de uma coisa que a aula 5 já preparou: sem entender contexto de filtro, os modificadores de CALCULAR parecem mágica; com ela, são só "troque o recorte e calcule de novo".
CALCULAR — a assinatura
CALCULAR(expr; [arg2]; [arg3]; [arg4]; [arg5]; [arg6]; [arg7]; [arg8]; [arg9])DIFERE do DAX na semântica, embora o nome lembre o CALCULATE: aqui os modificadores aceitos são um repertório fechado (condição solta, FILTRAR, TUDO, TUDO_EXCETO, REMOVER_FILTROS, ENTRE_DATAS, DATAS_NO_PERIODO, TRATAR_COMO, PRIMEIROS_N) — não há tabelas virtuais arbitrárias como no DAX completo. CALCULAR usa avaliação preguiçosa: ele escolhe o novo conjunto de linhas e só então avalia a expressão — por isso o resultado difere do que seria calcular a expressão antes e só depois trocar o contexto.
CALCULAR(SOMA(valor); FILTRAR(uf = "SP"))FILTRAR — recorta por uma condição
FILTRAR(expr)DIFERE do DAX: o FILTER do DAX recebe tabela + condição; aqui FILTRAR recebe só a condição — o motor já sabe que o "universo" é o visual atual. Fica só com as linhas em que a condição é verdadeira.
CALCULAR(SOMA(valor); FILTRAR(uf = "SP"))TUDO — ignora o grupo, sem argumento
TUDO()DIFERE do DAX de um jeito que pega muita gente: TUDO() não leva argumento. Significa "o visual inteiro", ponto. O ALL/REMOVEFILTERS do DAX recebem tabela ou coluna — se você escrever TUDO(produtos) aqui, o motor recusa:
CALCULAR(MEDIDA('Receita'); TUDO(produtos))Erro:
TUDO espera 0 argumentos. (Se você viuTUDO(produtos)em algum material — inclusive em alguma doc antiga do próprio produto — está desatualizado: registre como pedido de correção e não copie.) A forma certa, para remover o filtro inteiro, éTUDO()sem nada dentro:
CALCULAR(MEDIDA('Receita'); TUDO())É o padrão clássico de participação no total:
DIVIDIR(MEDIDA('Receita'); CALCULAR(MEDIDA('Receita'); TUDO()))TUDO_EXCETO — ignora o grupo, mas preserva uma coluna
TUDO_EXCETO(coluna; [arg2]; [arg3]; [arg4])Compatível com o ALLEXCEPT do DAX: ignora o filtro do grupo menos na(s) coluna(s) informada(s) — dá a "participação dentro da categoria" em vez da participação no total geral.
CALCULAR(MEDIDA('Receita'); TUDO_EXCETO(categoria))DIVIDIR(MEDIDA('Receita'); CALCULAR(MEDIDA('Receita'); TUDO_EXCETO(categoria)))Essa segunda fórmula dá a participação de cada produto dentro da sua categoria — diferente da Participação % da seção anterior, que compara contra o total geral.
REMOVER_FILTROS — o espelho do TUDO_EXCETO
REMOVER_FILTROS(coluna; [arg2]; [arg3]; [arg4])Compatível com REMOVEFILTERS: apaga o filtro só na(s) coluna(s) informada(s) e mantém o resto — é o contrário de TUDO_EXCETO, que mantém só a(s) coluna(s) informada(s) e apaga o resto.
CALCULAR(MEDIDA('Receita'); REMOVER_FILTROS(uf))Numa matriz por uf × categoria, essa fórmula soma todas as UFs, mas continua recortada pela categoria da célula.
MANTER_FILTROS — soma ao filtro, não substitui
MANTER_FILTROS(expr)Compatível com KEEPFILTERS. A diferença fina: um FILTRAR direto dentro de CALCULAR substitui o filtro daquela dimensão; embrulhado em MANTER_FILTROS, ele soma ao filtro do grupo — o recorte do visual continua valendo junto.
CALCULAR(MEDIDA('Receita'); MANTER_FILTROS(FILTRAR(canal = "loja")))Com uma condição simples sobre uma coluna que já está no eixo, MANTER_FILTROS não muda nada — ela só importa quando o filtro do grupo e o filtro novo podem conflitar.
Os cinco modificadores, lado a lado
| Modificador | O que faz com o filtro do grupo | Equivalente DAX |
|---|---|---|
FILTRAR(cond) | Substitui por uma condição | FILTER (semântica diferente) |
TUDO() | Remove tudo (visual inteiro) | ALL/REMOVEFILTERS (sem argumento aqui) |
TUDO_EXCETO(col) | Remove tudo, EXCETO a(s) coluna(s) citada(s) | ALLEXCEPT |
REMOVER_FILTROS(col) | Remove SÓ a(s) coluna(s) citada(s) | REMOVEFILTERS (com coluna) |
MANTER_FILTROS(expr) | Soma ao filtro do grupo, não substitui | KEEPFILTERS |
TUDO_EXCETO e REMOVER_FILTROS são opostos: o primeiro diz "só isto fica", o segundo diz "só isto some". Quando as duas colunas do seu visual coincidem, as duas fórmulas dão o mesmo resultado — a diferença aparece quando o visual tem mais de uma dimensão em jogo.
Erros comuns
- Passar coluna para
TUDO()— ela não aceita argumento; para preservar uma coluna, useTUDO_EXCETO. - Confundir
TUDO_EXCETO(categoria)(mantém categoria, ignora o resto) comREMOVER_FILTROS(categoria)(ignora só categoria, mantém o resto) — são opostos. - Esperar que o slicer "vaze" para dentro de uma medida que usa
TUDO()/REMOVER_FILTROS— é o comportamento pedido: a medida está deliberadamente ignorando aquele recorte.
Estado da capacidade
A semântica composta do CALCULAR e seus modificadores (C06.2) está em Preview, com precedência determinística entre modificadores — a mesma composição sempre produz o mesmo número, fixado por suíte de testes de referência.
Faça você mesmo#
No workspace de treino Aurora Varejo (abra /dashboards no console):
- Na biblioteca de medidas, crie Participação % com
DIVIDIR(MEDIDA('Receita'); CALCULAR(MEDIDA('Receita'); TUDO())). - Crie Participação na categoria % com
DIVIDIR(MEDIDA('Receita'); CALCULAR(MEDIDA('Receita'); TUDO_EXCETO(categoria))). - Coloque as duas numa tabela por produto e confirme que
Participação %soma 100% no total geral, eParticipação na categoria %soma 100% dentro de cada categoria. - Experimente digitar
TUDO(produtos)no editor e confira a mensagem de erro.
Você terminou quando as duas medidas de participação existirem e você souber explicar, sem olhar a doc, a diferença entre TUDO_EXCETO e REMOVER_FILTROS.
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#
- formulas/calcular
- formulas/tudo
- formulas/filtrar
- formulas/tudo_exceto
- formulas/remover_filtros
- formulas/manter_filtros
Capacidades ensinadas#
C06.2 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".