Freigeben über


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"