Přeskočit navigaci | Přeskočit na novinky
     

Jste zde: Úvodní stránka » excel » Query-editor » struktura-M-kodu-Editor-Power-Query
Microsoft Excel logo

Struktura jazyka M - Power Query (Power BI)

Videokurzy Excel

Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:

Základy k pochopení jazyka M v Editoru Power Query. Není pro práci v Editoru Power Query nezbytné, ale když ho pochopíte, dokážete vytvářet různá prospěšná kouzla při zpracování dat.

Lze aplikovat v Excel (jak jinak), ale i Power BI.

Úvodem do struktury M kódu (M-language)

Jak na M-kód co který řádek znamená, jak vypadá, jak vložit poznámky a spousta dalších zajímavých a potřebných informací. Pro přehlednost je článek rozdělen do kapitol.

Zobrazení rozšířeného editoru

Chcete-li upravovat M-kód musíte vstoupit do Editoru M-kódu, který se nachází v Editoru Power Query. Předpokládám, že jste v Editoru Power Query. Stačí v menu

Menu: Struktura M-kódu Edotor Power Query
Rozsireny Editor: Struktura M-kódu Edotor Power Query

V dialogovém okně si můžete všimnout, že možnosti jsou v tuto chvíli velice omezené. Rozšířený editor je v podstatě jen textový editor (který obarvuje některé písmena). S kontrolou syntaxe v levém dolním rohu a malých možností zobrazení v pravém horním rohu.

Rozsireny Editor: Struktura M-kódu Editor Power Query

Po úpravách může být okno trochu upraveno (můžete mít číslované řádky, což se hodí).

Rozsireny Editor: Struktura M-kódu Editor Power Query

Předpokládám, že Microsoft brzo do tohoto okna ještě zainvestuje a podstatně ho vylepší (přeci jen možností M-kódu jsou obrovské, tak proč tuto obrovskou sílu nevyužít a okno nevylepšit o prvky programovacího editoru). Bohužel v současnosti (01/2022) je to v podstatě obyčejné textové barevné pole.

Struktura jednoduchého kódu

Uvnitř rozšířeného editoru se může nacházet podobný jednoduchý kód:

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content] in Zdroj Struktura M-kódu Edotor Power Query

Tento kód obsahuje několik klíčových částí, které jsou nutné k sestavení úspěšného M dotazu. Pro pochopení si tento kód rozdělíme na jednotlivé řádky.

  • První řádek většinou začíná slovem let (nemusí platít pro každý kód, například u funkcí, funkcím se věnuji v jiném článku, příapdně jiných speciálních případů), na tento řádek pak nepatří vůbec nic jiného
  • Druhý řádek začíná slovem Zdroj (v angličtině většinou Source). To je důležité, protože se jedná o název kroku (Krok v Editoru Power Query v sekci Použitý postup). Právě prostřednictvím tohoto názvu kroku můžete zjistit, který řádek kódu se vztahuje ke kroku, který chcete zkoumat (upravit). V ukázce vidíte, že při vytvoření nového dotazu Zdroj vyvolal Editor Power Query z aplikace Excel aktuální sešit Excel.CurrentWorkbook(). Poté připojil k tabulce jako tabulka {[Name="Tabulka1"]}, která se naimportovala. Nakonec, se "zavrtal" do záznamů této tabulky [Content].
  • Třetí (předposlední) řádek zde je většinou jediné slovo in. Nemusí jít vždy o třetí řádek, pokud je více kroku tak jde o řádek předposlední (při pokročilých činostech, tvořbě hlastních M-kódu, může obsahovat výraz s funkcemi, případně několik vnořených funkcí)
  • Čtvrtý (poslední) řádek je jediné slovo Zdroj, který se odkazuje na krok obsahující výstup, který chcete na konci vrátit dotazu (nemusí se vždy jednat o poslední krok v použitém postupu). Ač obvykle se s poslední krok jedná.

Ve speciláních případech (přesahuji rámec tohoto článku a nechci vás vyděsit) skladba M kódu nemusí obsahovat konstrukci Let In. Za tip na dolnění děkuji Pavel Ondra.

= Table.TransformColumnTypes(Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content],{{"ID", Int64.Type}})

Popis speciálních znaků {}, []

Seznam speciálních znaků a co znamenají. Vložil jsem do tabulky.

Znak Popis
(Parametry) Pro parametry funkce.
{List} Složené závorky obklopující položky seznamu. Viz dále případně samostatný článek.
[Record] Obklopující záznamy. Viz samostatný článek
"Text" Hodnoty, stringy. Uvozovky obklopují tento text.
#"Název kroku" Odkazující na název kroku, který obsahuje mezery nebo jiné vyhrazené znaky
NazevKroku Odkazující na název kroku, kdy krok nemá v názvu mezery
//comment Komentování jednoho řádku kódu
/* komentář dvouřádkový*/ Komentování více řádků kódu začátek /* (lomítko hvězdička), konec */ (hvezdička lomítko)
.. Pro rozsah např. u seznamu, jako řada číslel 1 až 365 ={1..365}
= Přiřazení hodnoty, například pro parametr

Rychlý přehled základních speciálních znaků. Napadá vás co doplnit můžete zmínit v komentářích

Význam znaku #

Druhá věc, které byste si mohli všimnout je, že před názvem nějakého kroku je znak # doplněný o uvozovky ". například: #"Změněný typ" (#"Changed Type").

Konstrukce #"" uvozují název kroku (transformačního korku), který ve svém názvu obsahuje mezeru a jiné neASCII znaky.

Ukázky rozšířeného editoru po přidání nového kroku, kdy změníte typ prvního sloupce na číslo. Přidá se nový krok, který se jmenuje Změněný typ. Tj. Název kroku obsahuje mezeru oproti předchozímu kroku Zdroj.

Struktura M-kódu Editor Power Query
let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], #"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}) in #"Změněný typ"

To způsobí, že Power Query s těmito dvěma slovy zachází jako se samostatnými výrazy. Aby se s tímto Editor Power Query vypořádal a zacházel se slovem Změněný typ jako s jedním slovem, přidá před slovo znakem # a spojení zabalí do uvozovek.

Bohužel se s takovýmto postupem setkáte nejčastěji. Editor Power Query použáívá výchozí názvy kroků jako dvouslovné s mezerou. Třeba časem upraví a buň bude mít názvy jednoslovné Změněno, nebo využije velbloudí konvenci ZměněnýTyp.

Za mě budou minimálně dva přínosy:

  • Zpřehlednění kódu - ubyde znaků #
  • Větší ochota se M-ko učit - už kód nebude tak strašidelný
  • Kratší délka řádku pro publikaci ukázek - to je spíše pro mně

Do doby než k tomu dojde můžete jednoduše přes pravé tlačítko krok přejmenovat a kód se zjednodušší.

Struktura M-kódu Editor Power Query

Není kód bez # a "" přehlednější:

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}) in ZmenenyTyp

Lepší než ten původní kód s #?

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], #"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}) in #"Změněný typ"

Poznámka: Ono formátování (jak kod vidíte) nemá vliv na funkci kódu, důležité jsou speciální znaky, například čárky pro oddělení query (kroku). Pokud v kódu odmažete konce řádku, stále bude fungovat. Za tip děkuji Pavel Adam.

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}) in ZmenenyTyp

Odkazování se na předešlé kroky

Průběh zpracování dat v M-kódu jde krok za krokem, tj. v následujícím kroku se odkazujete na ten předchozí. Pokud se podíváte na fragment předchozího kódu.

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}) in ZmenenyTyp

Zaměříme se na dva řádky:

Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}})

První řádek Zdroj = ... načte data ze sešitu. Druhý řádek ZmenenyTyp = ... se odkazuje na předchozí krok:Zdroj.

ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}})

Vždy na konci kroku musí být čárka

Další kód

Přidám další kus kódu, chci mít zobrazeny jen první dva řádky tabulky, mějte tedy kus kódu:

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}), PrvnichXRadku = Table.FirstN(ZmenenyTyp,2) in PrvnichXRadku

Číslo z tabulky

Podívám se do předchozího kroku PrvnichXRadku z tabulky se podívám do sloupce [ID] a následně na druhý řádek {1}

CisloZTabulky = PrvnichXRadku[ID]{1}

Výsledek:

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}), PrvnichXRadku = Table.FirstN(ZmenenyTyp,2), CisloZTabulky = PrvnichXRadku[ID]{1} in CisloZTabulky

Nebo-li získáte číslo 2. Stejného stavu dosáhnete, když se odkážete na první krok

CisloZTabulky = Zdroj[ID]{1}

Výsledek:

let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}), PrvnichXRadku = Table.FirstN(ZmenenyTyp,2), CisloZTabulky = Zdroj[ID]{1} in CisloZTabulky Struktura M-kódu Editor Power Query

Takto můžete tvořit zajímavé kódy. Kdy se odkážete na předchozí kroky (hodnoty z tabulek atd.)

Komentáře v kódu

Pokud jde o složitější konstrukce, je vhodné je doplnit o poznámky. Poznámky mohou být:

  • jednořádkové - stačí dvě zpětná lomítka // a za něj text poznámky
  • víceřádkové - kdy na prvním řádku je lomítko a hvězdička /* a na posledním řádku s poznámkou hvězdička a lomítko */
let Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content], // Komentář jednořádkový ZmenenyTyp = Table.TransformColumnTypes(Zdroj,{{"ID", Int64.Type}}) in /* komentář víceřádkový druhý řádek komentáře třetí a poslední řádek */ ZmenenyTyp Struktura M-kódu Editor Power Query

Návaznost kroků

Aneb kroky nemusí jít postupně a můžete se odkazovat na jiné.

Výsledkem následujícího kódu bude 3:

let A = 1, B = 2, C = A + B in C

Stejně tak výsledkem následujícího kódu bude 3:

let C = A + B, A = 1, B = 2 in C

Klidně se můžete podívat na první krok kdy výsledkem bude 1:

let A = 1, B = 2, C = A + B in A

Konstatny

Pro budoucnost si odložím jak v M-ku zadávat konstanty, typu číslo, text, datum:

let Cislo = 42, Text = "Pavel", Logicka = true, // Nebo false UplneNic = null, Binarne = #binary({0x42}), Datum = #date(2022, 1, 19), Cas = #time(12, 42, 11), DatumCas = #datetime(2022, 1, 19, 10, 42 ,0), DateCasovaZona = #datetimezone(2022, 1, 19, 0, 0 ,0, 1, 0), Trvani = #duration(0, 4, 2, 0) in // Můžete měnit za Datum Text

Závěrem

Narazili jste na nějaké problémy, máte tip na vylepšení nebo doplnění článku, můžete se zmínit v komentářích.

Článek byl aktualizován: 19.01.2022 13:32

Odměna

Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.


Pavel Lasák - autor webu

Pavel Lasák

Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil


Komentáře zatím nejsou

Můžete být prvními co zanechají smysluplný komentář.






Excel


Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Reklama


TOPlist Licence Creative Commons webarchiv rss XML

Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2021 |