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ätts med 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. "varje ..." är syntaktisk socker för en funktionssignatur som tar _-parametern "(_) => ..."

Var och en är användbar när den kombineras med uppslagsoperatorn, som tillämpas som standard på _
Till exempel är varje [CustomerID] samma som varje _[CustomerID], som ä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"