Verstehen von Power Query M-Funktionen
In der Power Query M-Formelsprache handelt es sich bei einer Funktion um eine Zuordnung mehrerer Eingabewerte zu einem einzelnen Ausgabewert. Beim Schreiben einer Funktion werden die Funktionsparameter zuerst benannt und dann ein Ausdruck bereitgestellt, um das Ergebnis der Funktion zu berechnen. Der Text der Funktion folgt dem „Gehe zu“-Symbol (=>). Optional können Typinformationen in Parametern und den Rückgabewert der Funktion hinzugefügt werden. Eine Funktion wird im Text einer let-Anweisung definiert und aufgerufen. Parameter und/oder Rückgabewerte können implizit oder explizit sein. Implizite Parameter und/oder Rückgabewerte sind vom Typ any. Der Typ any ähnelt einem Objekttyp in anderen Sprachen. Alle Typen in M werden vom Typ any abgeleitet.
Eine Funktion ist ein Wert wie eine Zahl oder ein Textwert und kann wie jeder andere Ausdruck inline eingefügt werden. Im folgenden Beispiel wird eine Funktion gezeigt, die der Wert einer Add-Variablen ist, die dann aus mehreren anderen Variablen aufgerufen oder ausgeführt wird. Beim Aufruf einer Funktion werden mehrere Werte angegeben, die logisch für die erforderlichen Eingabewerte innerhalb des Funktionstextausdrucks ersetzt werden.
Beispiel: Explizite Parameter und Rückgabewert
let
AddOne = (x as number) as number => x + 1,
//additional expression steps
CalcAddOne = AddOne(5)
in
CalcAddOne
Beispiel: Implizite Parameter und Rückgabewert
let
Add = (x, y) => x + y,
AddResults =
[
OnePlusOne = Add(1, 1), // equals 2
OnePlusTwo = Add(1, 2) // equals 3
]
in
AddResults
Sucht das erste Element einer Liste, das größer als 5 oder andernfalls NULL ist.
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
Funktionen können rekursiv verwendet werden. Um rekursiv auf die Funktion zu verweisen, stellen Sie dem Bezeichner ein @-Element voran.
let
fact = (num) => if num = 0 then 1 else num * @fact (num-1)
in
fact(5) // equals 120
Schlüsselwort „each“
Das Schlüsselwort each wird verwendet, um mühelos einfache Funktionen zu erstellen. „each ...“ ist syntaktischer Zucker für eine Funktionssignatur, die den _-Parameter „(_) => ....“ übernimmt.
„each“ ist nützlich, wenn es mit dem Suchoperator kombiniert wird, der standardmäßig auf „_“ angewendet wird.
Beispielsweise ist „each [CustomerID]“ dasselbe wie „each _[CustomerID]“, das wiederum mit „(_) => _[CustomerID]“ identisch ist.
Beispiel: Verwenden der einzelnen Tabellenzeilenfilter
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"