1. Maiúsculas e minúsculas
M diferencia maiúsculas de minúsculas em tudo: palavras-chave, nomes de
passo e funções. Let, IF ou table.selectrows dão erro.
2. Nomes (identificadores)
| Forma | Quando usar | Exemplo |
|---|---|---|
| Normal | Letras, números, _ e ponto, começando por letra ou _ | Origem, Vendas_2026, Table.SelectRows |
#"..." | Nome com espaço, com caractere como +, - ou /, que começa com número ou que é palavra-chave | #"Linhas Filtradas", #"Total + Frete" |
| Generalizado | Dentro de [ ] de registro, espaços e palavras-chave são aceitos sem #"..." | [Base Line = 100][Base Line] |
Os nomes de passos criados pela interface com espaço aparecem como
#"Nome do Passo" no Editor Avançado.
3. Comentários
// comentário de uma linha
/* comentário
de várias linhas */Comentários não se aninham e não valem dentro de texto entre aspas.
4. Texto e sequências de escape
| Precisa de | Escreva | Resultado |
|---|---|---|
| Aspas dentro do texto | "" | "O ""melhor"" preço" → O "melhor" preço |
| Quebra de linha | #(cr,lf) ou #(lf) | "Linha 1#(lf)Linha 2" |
| Tabulação | #(tab) | "A#(tab)B" |
| Caractere Unicode | #(00E9) | é |
O próprio #( | #(#)( | #( literal |
5. each e o _
each cria uma função de um parâmetro chamado _. Dentro dela, [Campo]
é atalho para _[Campo]:
Table.SelectRows(Vendas, each [Valor] > 100)
Table.SelectRows(Vendas, (_) => _[Valor] > 100) // equivalente
Table.SelectRows(Vendas, (linha) => linha[Valor] > 100) // mais legível em lógica longa6. try, otherwise e catch
let
Resultado = try Number.FromText("abc"),
// [HasError = true, Error = [Reason = "DataFormat.Error", Message = ..., Detail = ...]]
ComPadrao = try Number.FromText("abc") otherwise null,
ComMensagem = try Number.FromText("abc") catch (e) => "Erro: " & e[Message]
in
ComMensagem⚠️ Trate o erro perto de onde ele nasce. O M é preguiçoso: um erro dentro
de um campo de registro ou de um passo que ainda não foi lido só aparece
quando alguém o lê — e aí o try que estava "em volta" já passou.
7. Recursão com @
Uma função só enxerga o próprio nome com @:
let
Fatorial = (n) => if n = 0 then 1 else n * @Fatorial(n - 1)
in
Fatorial(5) // 1208. ... para código em construção
... gera o erro "Not Implemented" e deixa o resto da consulta rodar:
(x, y) => if x > y then x - y else ...