Principy funkcí Power Query M
V jazyce vzorců Power Query M je funkce mapování ze sady vstupních hodnot na jednu výstupní hodnotu. Funkce je napsána prvním pojmenováním parametrů funkce a poskytnutím výrazu pro výpočet výsledku funkce. Tělo funkce se řídí symbolem goes-to (=>). Volitelně lze informace o typech zahrnout do parametrů a návratové hodnoty funkce. Funkce je definována a vyvolána v těle příkazu let . Parametry a/nebo návratová hodnota mohou být implicitní nebo explicitní. Implicitní parametry a/nebo návratová hodnota jsou typu jakékoli. Jakýkoli typ objektu je podobný typu v jiných jazycích. Všechny typy v jazyce M jsou odvozeny od typu.
Funkce je hodnota stejně jako číslo nebo textová hodnota a může být zahrnuta v řádku stejně jako jakýkoli jiný výraz. Následující příklad ukazuje funkci, která je hodnotou add proměnné, která je následně vyvolána nebo spuštěna z několika dalších proměnných. Při vyvolání funkce se zadává sada hodnot, která logicky nahradí požadovanou sadu vstupních hodnot v rámci výrazu těla funkce.
Příklad – explicitní parametry a návratová hodnota
let
AddOne = (x as number) as number => x + 1,
//additional expression steps
CalcAddOne = AddOne(5)
in
CalcAddOne
Příklad – implicitní parametry a návratová hodnota
let
Add = (x, y) => x + y,
AddResults =
[
OnePlusOne = Add(1, 1), // equals 2
OnePlusTwo = Add(1, 2) // equals 3
]
in
AddResults
Vyhledání prvního prvku seznamu většího než 5 nebo null jinak
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
Funkce je možné používat rekurzivně. Chcete-li rekurzivně odkazovat na funkci, předpona identifikátoru @.
let
fact = (num) => if num = 0 then 1 else num * @fact (num-1)
in
fact(5) // equals 120
Každé klíčové slovo
Každé klíčové slovo slouží k snadnému vytváření jednoduchých funkcí. each ...
je syntaktický cukr pro podpis funkce, který přebírá _
parametr (_) => ...
.
Každé klíčové slovo je užitečné v kombinaci s vyhledávacím operátorem, který se ve výchozím nastavení použije na _
.
Například each [CustomerID]
je stejný jako each _[CustomerID]
, což je stejné jako (_) => _[CustomerID]
.
Příklad – Použití každého z nich ve filtru řádků tabulky
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"