Tento článek popisuje nejzákladnější pravidla pro práci s jazykem M, který slouží k tvorbě dotazů v Power Query (Načíst a transformovat) v Excelu a stejně tak pro tvorbu dotazů v Power BI.

Jazyk M, upřímně řečeno, ani nemusíte znát pokud dotazy vytváříte – většinu věcí si naklikáte a do M kódu v pozadí si to Excel nebo Power BI přepíší sami. Tento článek je tedy spíše pro zvídavé nebo pro pokročilejší – kteří díky psaní kódu mohou zvládnout i něco, co naklikat nejde (příklady toho, co naklikat nejde viz tady).

Ještě než se pustím do konkrétních pravidel syntaxe, tak upozorňuji, že M rozlišuje mezi malými a velkými písmeny v názvech funkcí i proměnných – tedy když chcete napsat např. název funkce If, nesmíte napsat IF. To je trochu chyták, protože další jazyky, o kterých tady píšeme, takové fajnovky co se týká názvů funkcí nejsou. 

  • Běžné vzorce v Excelu můžete psát jakkoliv a Excel si názvy funkcí sám změní na všechna velká. Tedy např. “if” se změní na “IF”.
  • DAX vás nechá napsat malá nebo velká písmena.
  • VBA si syntaxi samo upraví, ve funkcích obvykle na první velké písmena a ostatní malá.

Takže v Mku musíme dávat pozor na velikost písmenek. A dál?

Základ

Základní logika je vlastně jednoduchá. Zápis dotazu do dat má vždy dva bloky – “let” a “in”. “Let” je víceřádková definice proměnných, zatímco “in” je výstup. Ano, “in” je opravdu to, co jde ven – netvrdím, že to dává smysl…

Zápis tedy může vypadat třeba takto:

let
   my_variable = “hello world”
in
   my_variable

V našem příkladu bude výstupem “hello world”, tedy hodnota proměnné “my_variable”, která se objeví na výstupu. Pokud toto zapíšete nebo zkopírujete do rozšířeného editoru v Power Query nebo v Power BI, opravdu uvidíte na výstupu opravdu “hello wordl”.

Jenomže dotazy většinou nepíšeme proto, abychom zobrazovali “Hello world”. Takto tedy vypadá dotaz, který v původním zdroji vezme sloupec “Revenue” a vydělí ho tisícovkou.

let
   Source = my_source,
   #”Divided Column” = Table.TransformColumns(Source, {{“Revenue”, each _ / 1000, type number}})
in
   #”Divided Column”

Proměnné

Zjednodušeně lze říci, že každý řádek se nějak odvozuje z toho předchozího. Tedy poslední řádek (in) se jmenuje “Divided Column” a počítá se ze Source pomocí funkce Table.TransformColumns. Source se počítá z “my_source” a tak až na začátek, třeba i pro velké množství řádků.

Názvy kroků (nebo, chcete-li, proměnných), mohou být libovolné – pokud byste místo “Source” psali “xy”, bude to fungovat také – jen to musíte použít jak v řádku, kde tato proměnná vzniká, tak v tom, kde je použitá. 

Pokud má proměnná více slov, pak je třeba dát jí do uvozovek a před ní psát křížek – tedy např.

  • xy

ale

  • #”x y”

Funkce

Funkce se volají tak, že se napíše jejich název, a jejich vstupy – např. takto:

  • Text.Start(“abcd”, 2)

vytáhneme z textu první dva znaky (obdoba funkce ZLEVA v Excelu).

Komentáře

Komentář, tedy část kódu, která nemá vliv na funkci, napíšete buď pro jeden řádek s dvojitým lomítkem:

  • // tady je můj komentář

nebo pro více řádků 

  • */ tady je můj
    komentář */

Tak asi tak… v kostce…