A estrutura let ... in
Toda consulta M é uma expressão let: uma sequência de variáveis nomeadas e, no final, o in que diz qual delas é o resultado. Não existe 'ordem de execução' obrigatória — o M resolve as dependências.
Os três tipos estruturados
| Tipo | Sintaxe | Acesso |
|---|---|---|
| Lista | {1, 2, 3} ou {"a".."z"} | Lista{0} → primeiro item |
| Registro | [ Nome = "Ana", Idade = 30 ] | Registro[Nome] |
| Tabela | #table({"A","B"}, {{1,2},{3,4}}) | Tabela{0}[A] → célula |
Linguagem MBrincando com os três
let Lista = {10, 20, 30, 40}, Soma = List.Sum(Lista), // 100 Media = List.Average(Lista), // 25 Registro = [ Produto = "Teclado", Preco = 199.90 ], Preco = Registro[Preco], // 199.9 Tabela = #table( {"Produto", "Preco"}, {{"Teclado", 199.90}, {"Mouse", 89.90}} ), PrimeiroProduto = Tabela{0}[Produto] // "Teclado"in [ Soma = Soma, Media = Media, Preco = Preco, Primeiro = PrimeiroProduto ]each e o sublinhado
each é açúcar sintático para (_) =>. Dentro de uma transformação de tabela, _ representa a linha atual (um registro). Por isso [Coluna] funciona: é atalho para _[Coluna].
Linguagem MAs três formas equivalentes
Table.AddColumn(t, "Total", each [Qtd] * [Preco])Table.AddColumn(t, "Total", each _[Qtd] * _[Preco])Table.AddColumn(t, "Total", (linha) => linha[Qtd] * linha[Preco])Tratamento de erro com try/otherwise
Linguagem MCapturando o motivo do erro
Table.AddColumn( Etapa_Anterior, "Diagnostico", each let tentativa = try Number.FromText([ValorTexto], "pt-BR") in if tentativa[HasError] then "ERRO: " & tentativa[Error][Message] else "OK", type text)Funções que você mais vai usar
- Text: Trim, Upper, Proper, Contains, Start, End, BetweenDelimiters, PadStart, Replace.
- Date: From, Year, Month, StartOfMonth, EndOfMonth, AddDays, AddMonths, DayOfWeek, IsInCurrentYear.
- Number: From, Round, RoundDown, Abs, IntegerDivide, Mod.
- List: Sum, Average, Max, Min, Count, Distinct, Select, Transform, Contains, Generate, Dates.
- Table: SelectRows, SelectColumns, AddColumn, Group, Sort, Distinct, RemoveColumns, Buffer.