fx

Power Query (M)

Palavras-chave M

As 32 palavras-chave reservadas da linguagem Power Query M, mais o catch, com exemplo — e as regras de escrita: nomes com #"...", comentários, escapes, each, try/catch e recursão.

33 palavras-chave

Estrutura

  • let

    Abre um bloco de passos. Cada passo é nome = expressão, separado por vírgula; o valor devolvido é a expressão depois de in.

    Exemplo: let Origem = 10, Dobro = Origem * 2 in Dobro

  • in

    Fecha o let e indica o valor devolvido. No Editor Avançado, costuma apontar para o último passo.

    Exemplo: let x = 1 in x + 1

  • each

    Atalho para uma função de um parâmetro chamado _: each [Valor] > 100 é o mesmo que (_) => _[Valor] > 100.

    Exemplo: Table.SelectRows(Vendas, each [Valor] > 100)

  • section

    Declara um documento de seção: um módulo com membros nomeados. As consultas comuns do Power Query não usam seções; aparecem em conectores personalizados.

    Exemplo: section Utilitarios; Dobro = (x) => x * 2;

  • shared

    Marca um membro de seção como visível fora dela.

    Exemplo: shared Dobro = (x) => x * 2;

  • #sections

    Registro com todas as seções do documento e seus membros.

    Exemplo: #sections[Utilitarios][Dobro]

  • #shared

    Registro com todos os membros compartilhados do ambiente, incluindo as funções da biblioteca padrão. Útil para listar o que está disponível.

    Exemplo: Record.ToTable(#shared)

Condição e lógica

  • if

    Abre uma expressão condicional: if <condição> then <valor> else <valor>. O else é obrigatório.

    Exemplo: if [Valor] >= 1000 then "Alto" else "Baixo"

  • then

    Separa a condição do valor devolvido quando ela é true.

    Exemplo: if [Ativo] then "Sim" else "Não"

  • else

    Valor devolvido quando a condição é false. Obrigatório; encadeie com else if para mais de duas saídas.

    Exemplo: if [Nota] >= 9 then "A" else if [Nota] >= 7 then "B" else "C"

  • and

    E lógico com curto-circuito: se o lado esquerdo é false, o direito não é avaliado.

    Exemplo: [Qtd] > 0 and [Valor] / [Qtd] > 10

  • or

    OU lógico com curto-circuito: se o lado esquerdo é true, o direito não é avaliado.

    Exemplo: [UF] = "SP" or [UF] = "RJ"

  • not

    Inverte um valor lógico. Aplicado a null, devolve null.

    Exemplo: not List.IsEmpty(Lista)

Erros

  • try

    Avalia uma expressão protegendo-a de erro. Sem otherwise ou catch, devolve um registro: [HasError = false, Value = ...] ou [HasError = true, Error = [Reason, Message, Detail]].

    Exemplo: try Number.FromText("abc")

  • otherwise

    Valor alternativo quando a expressão do try dá erro.

    Exemplo: try Number.FromText([Texto]) otherwise null

  • catch

    Função chamada quando o try dá erro. Com um parâmetro, recebe o registro do erro; sem parâmetro, equivale ao otherwise. Existe desde maio/2022, mas não aparece na lista de palavras-chave da especificação.

    Exemplo: try Number.FromText([Texto]) catch (e) => e[Message]

  • error

    Gera um erro a partir de um texto ou de um registro criado com Error.Record.

    Exemplo: if [Qtd] < 0 then error "Quantidade negativa" else [Qtd]

Tipos

  • type

    Cria um valor de tipo: primitivo (type number), de lista (type {text}), de registro (type [Nome = text]), de tabela ou de função.

    Exemplo: type table [Produto = text, Valor = Currency.Type]

  • as

    Declara o tipo de um parâmetro ou do retorno de uma função, ou afirma o tipo de um valor. Se o valor não for compatível, dá erro.

    Exemplo: (x as number) as number => x * 2

  • is

    Testa se um valor é compatível com um tipo primitivo e devolve true ou false.

    Exemplo: if [Valor] is number then [Valor] else null

  • meta

    Anexa um registro de metadados a um valor. Leia os metadados com Value.Metadata.

    Exemplo: Value.Metadata("Mozart" meta [Nota = 5])

Literais

  • true

    Valor lógico verdadeiro. Em M, lógico não vira número: true = 1 é false.

    Exemplo: Table.SelectRows(Clientes, each [Ativo] = true)

  • false

    Valor lógico falso.

    Exemplo: [Cancelado] = false

  • null

    Valor ausente. null = null é true, e contas com null devolvem null (6 * null = null). Use ?? para trocar por um padrão.

    Exemplo: [Desconto] ?? 0

  • #infinity

    Infinito positivo; -#infinity é o negativo. As contas numéricas não estouram: devolvem infinito.

    Exemplo: 1 / 0 = #infinity

  • #nan

    Não é um número (NaN): resultado de contas inválidas, como zero dividido por zero.

    Exemplo: Number.IsNaN(0 / 0)

Construtores

  • #date

    Cria uma data: #date(ano, mês, dia).

    Exemplo: #date(2026, 9, 24)

  • #time

    Cria uma hora: #time(hora, minuto, segundo).

    Exemplo: #time(14, 30, 0)

  • #datetime

    Cria data e hora: #datetime(ano, mês, dia, hora, minuto, segundo).

    Exemplo: #datetime(2026, 9, 24, 14, 30, 0)

  • #datetimezone

    Cria data e hora com fuso: os dois últimos argumentos são o deslocamento em horas e minutos.

    Exemplo: #datetimezone(2026, 9, 24, 14, 30, 0, -3, 0)

  • #duration

    Cria uma duração: #duration(dias, horas, minutos, segundos). Soma e subtrai de datas e horas.

    Exemplo: #date(2026, 1, 1) + #duration(30, 0, 0, 0)

  • #binary

    Cria um valor binário a partir de uma lista de bytes ou de um texto em Base64.

    Exemplo: #binary({0x48, 0x69})

  • #table

    Cria uma tabela a partir dos nomes (ou do tipo) das colunas e de uma lista de linhas.

    Exemplo: #table({"Produto", "Valor"}, {{"A", 10}, {"B", 20}})

Regras de escrita da linguagem M

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)

FormaQuando usarExemplo
NormalLetras, 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"
GeneralizadoDentro 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 deEscrevaResultado
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 longa

6. 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)   // 120

8. ... 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 ...

Fontes