Förstå Power Query M-funktioner
På 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 tillhandahålla ett uttryck för att beräkna resultatet av funktionen. Funktionens brödtext följer symbolen goes-to (=>). Du kan också ange information om parametrar och funktionens returvärde. En funktion definieras och anropas i brödtexten i en let-instruktion . Parametrar och/eller returvärde kan vara implicita eller explicita. Implicita parametrar och/eller returvärde är av valfri typ. Skriv något som liknar en objekttyp på andra språk. Alla typer i M härleds från valfri typ.
En funktion är ett värde precis som ett tal eller ett textvärde och kan inkluderas på rad precis som andra uttryck. I följande exempel visas en funktion som är värdet för en Add-variabel , som sedan anropas eller körs från flera andra variabler. När en funktion anropas anges en uppsättning värden som logiskt ersätter den obligatoriska uppsättningen indatavärden i funktionstextuttrycket.
Exempel – Explicita parametrar och returvärde
let
AddOne = (x as number) as number => x + 1,
//additional expression steps
CalcAddOne = AddOne(5)
in
CalcAddOne
Exempel – Implicita parametrar och returvärde
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 null på annat sätt
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 prefixar du identifieraren med @.
let
fact = (num) => if num = 0 then 1 else num * @fact (num-1)
in
fact(5) // equals 120
Varje nyckelord
Varje nyckelord används för att enkelt skapa enkla funktioner. each ...
är syntaktisk socker för en funktionssignatur som tar parametern _
(_) => ...
.
Varje nyckelord är användbart när det kombineras med uppslagsoperatorn, som tillämpas som standard på _
.
Är till exempel each [CustomerID]
samma som each _[CustomerID]
, vilket är samma som (_) => _[CustomerID]
.
Exempel – Använda var och en i tabellradsfiltret
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"