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. Das folgende Beispiel zeigt eine Funktion, die den Wert einer Add-Variable darstellt, die dann aus mehreren anderen Variablen aufgerufen oder ausgeführt wird. Wenn eine Funktion aufgerufen wird, wird eine Gruppe von Werten angegeben, die den erforderlichen Satz von Eingabewerten innerhalb des Funktionstextausdrucks logisch ersetzen.
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 (_) => ...
verwendet.
Jedes Schlüsselwort ist nützlich, wenn es mit dem Nachschlageoperator kombiniert wird, der standardmäßig auf _
.
Ist z. B each [CustomerID]
. identisch mit each _[CustomerID]
, das ist identisch mit (_) => _[CustomerID]
.
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"