Présentation des fonctions Power Query M

Dans le langage de formule Power Query M, une fonction est un mappage entre un ensemble de valeurs d’entrée et une valeur de sortie unique. Une fonction est écrite en nommant d’abord les paramètres de fonction, puis en fournissant une expression pour calculer le résultat de la fonction. Le corps de la fonction suit le symbole =>. Vous pouvez éventuellement inclure des informations de type dans les paramètres et la valeur de retour de la fonction. Une fonction est définie et appelée dans le corps d’une instruction let. Les paramètres et/ou la valeur de retour peuvent être implicites ou explicites. Les paramètres et/ou la valeur de retour implicites sont de type any (indifférent). Le type any est similaire à un type d’objet dans d’autres langages. Tous les types dans M dérivent du type any.

Une fonction est une valeur à l’instar d’un nombre ou d’une valeur de texte, et peut être incluse en ligne comme toute autre expression. L’exemple suivant montre une fonction qui est la valeur d’une variable Add qui est ensuite appelée, ou exécutée, à partir de plusieurs autres variables. Quand une fonction est appelée, un ensemble de valeurs est spécifié, puis logiquement substitué à l’ensemble de valeurs d’entrée nécessaire au sein de l’expression du corps de la fonction.

Exemple : paramètres et valeur de retour explicites

let  
    AddOne = (x as number) as number => x + 1,  
    //additional expression steps  
    CalcAddOne = AddOne(5)  
in  
    CalcAddOne  

Exemple : paramètres et valeur de retour implicites

let  
    Add = (x, y) => x + y,  
    AddResults =   
        [  
            OnePlusOne = Add(1, 1),     // equals 2  
            OnePlusTwo = Add(1, 2)      // equals 3  
    ]  
in  
    AddResults  

Rechercher le premier élément supérieur à 5 dans une liste, ou sinon la valeur Null

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  

Les fonctions peuvent être utilisées de manière récursive. Pour faire référence à la fonction de manière récursive, préfixez l’identificateur avec @.

let   
    fact = (num) => if num = 0 then 1 else num * @fact (num-1)   
in   
    fact(5) // equals 120  

Mot clé each

Le mot clé each est utilisé pour créer facilement des fonctions simples. Le mot clé « each... » est du sucre syntaxique pour une signature de fonction qui accepte le paramètre « (_) => ... »

Il s’avère utile quand il est associé à l’opérateur de recherche, appliqué par défaut à _
Par exemple, each [CustomerID] est identique à _[CustomerID], lui-même identique à (_) => _[CustomerID]

Exemple : Utilisation du mot clé each dans un filtre de ligne de table

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"