Como entender as funções do Power Query M
Na linguagem de fórmula Power Query M, uma função é um mapeamento de um conjunto de valores de entrada para um único valor de saída. Uma função é gravada primeiro nomeando os parâmetros de função e, em seguida, fornecendo uma expressão para calcular o resultado da função. O corpo da função segue o símbolo de ir para (=>). Opcionalmente, as informações de tipo podem ser incluídas em parâmetros e o valor retornado da função. Uma função é definida e invocada no corpo de uma instrução let. Os parâmetros e/ou o valor retornado podem ser implícitos ou explícitos. Os parâmetros e/ou o valor retornado implícitos são do tipo qualquer. O tipo qualquer é semelhante a um tipo de objeto em outras linguagens. Todos os tipos em M derivam do tipo qualquer.
Uma função é um valor como um número ou um valor de texto e pode ser incluída em linha, assim como qualquer outra expressão. O exemplo a seguir mostra uma função que é o valor de uma variável Add, que é invocada ou executada de várias outras variáveis. Quando uma função é chamada, um conjunto de valores é especificado, que são substituídos logicamente pelo conjunto necessário de valores de entrada dentro da expressão do corpo da função.
Exemplo – parâmetros explícitos e valor retornado
let
AddOne = (x as number) as number => x + 1,
//additional expression steps
CalcAddOne = AddOne(5)
in
CalcAddOne
Exemplo – parâmetros implícitos e valor retornado
let
Add = (x, y) => x + y,
AddResults =
[
OnePlusOne = Add(1, 1), // equals 2
OnePlusTwo = Add(1, 2) // equals 3
]
in
AddResults
Localizar o primeiro elemento de uma lista maior que 5 ou nulo, caso contrário
let
FirstGreaterThan5 = (list) =>
let
GreaterThan5 = List.Select(list, (n) => n> 5),
First = List.First(GreaterThan5)
in
First,
Results =
[
Found = FirstGreaterThan5({3,7,9}), // equals 7
NotFound = FirstGreaterThan5({1,3,4}) // equals null
]
in
Results
As funções podem ser usadas recursivamente. Para referenciar recursivamente a função, prefixe o identificador com @.
let
fact = (num) => if num = 0 then 1 else num * @fact (num-1)
in
fact(5) // equals 120
Palavra-chave each
A palavra-chave each é usada para criar facilmente funções simples. "each ..." é uma simplificação sintática para uma assinatura de função que usa o parâmetro _ "(_) => ..."
Each é útil quando combinada ao operador lookup, que é aplicado por padrão a _
Por exemplo, each [CustomerID] é o mesmo que each _[CustomerID], que é o mesmo que (_) => _[CustomerID]
Exemplo – usando each um no filtro de linha de tabela
Table.SelectRows(
Table.FromRecords({
[CustomerID = 1, Name = "Bob", Phone = "123-4567"],
[CustomerID = 2, Name = "Jim", Phone = "987-6543"] ,
[CustomerID = 3, Name = "Paul", Phone = "543-7890"] ,
[CustomerID = 4, Name = "Ringo", Phone = "232-1550"]
}),
each [CustomerID] = 2
)[Name]
// equals "Jim"