Dela via


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"