Förstå Power Query M-funktioner
I formelspråket Power Query M är en funktion en mappning från en uppsättning indatavärden till ett enda utdatavärde. En funktion skrivs genom att först namnge funktionsparametrarna och sedan ange ett uttryck som beräknar resultatet av funktionen. Funktionstexten kommer efter likhetstecknet (=>). Du kan även ange information som ska inkluderas i parametrar och i funktionens returvärde. En funktion definieras och anropas i texten för en let-instruktion. Parametrar och/eller returvärden kan vara implicita eller explicita. Implicita parametrar och/eller returvärden är av typen any. Att skriva any liknar en objekttyp på andra språk. Alla typer i M härleds från typen any.
En funktion är ett värde precis som ett tal eller ett textvärde och kan inkluderas på raden på samma sätt som andra uttryck. I följande exempel visas en funktion som är värdet för variabeln Lägg till som sedan anropas, eller körs, från flera andra variabler. När en funktion anropas, anges en uppsättning värden som är logiskt ersatta med den obligatoriska uppsättningen indatavärden i uttrycket för funktionstexten.
Exempel – Explicita parametrar och returvärden
let
AddOne = (x as number) as number => x + 1,
//additional expression steps
CalcAddOne = AddOne(5)
in
CalcAddOne
Exempel – Implicita parametrar och returvärden
let
Add = (x, y) => x + y,
AddResults =
[
OnePlusOne = Add(1, 1), // equals 2
OnePlusTwo = Add(1, 2) // equals 3
]
in
AddResults
Hitta det första elementet i en lista som är större än 5, eller annars null
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
Funktioner kan användas rekursivt. För att rekursivt referera till funktionen prefixet identifieraren med @.
let
fact = (num) => if num = 0 then 1 else num * @fact (num-1)
in
fact(5) // equals 120
Each-nyckelord
Nyckelordet each används till skapa enkla funktioner. "varje ..." är syntaktisk socker för en funktionssignatur som tar _ parametern "(_) => ..."
Each är användbar när den kombineras med sökoperatorn, som används som standard i _
Till exempel är varje [CustomerID] samma som varje _[CustomerID], som är samma som (_) => _[CustomerID]
Exempel – Använda each i tabellradsfilter
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"