Power BI desktop Pavel Lasák - Excel, Power BI, G-tabulky Načtení Vizualizace SdíleníÚprava Propojení Power BI Desktop Soubory (xls, csv, pdf) Složky Web Databáze Práce s řádky Úpravy se sloupci Řazení filtrování Transformace M - jazyk Propojení,slučování Hierarchie Vazby DAX Grafy Ovládací prvky Texty Obrázky Pdf Csv Cloud …. Power Query – M-ko •M-kód •O co jde •Jaká je syntaxe •Jak zprovoznit •Objekty v M-language (List, Záznam, Tabulka) •Konstrukce Let in •Funkce •Konstrukce If then, Each, _ O jazyku M •Označován • M-kód • M-jazyk • M-code • M-language • Query jazyk • … A O jazyku M • Ústřední konstrukcí jazyka M je výraz. • Výraz je možné vyhodnocovat (počítat), čímž se získá hodnota. • Jde o jazyk pro vytváření dotazu na práci s tabulkami. • Viz dále co je tabulka z čeho se skládá • V základu si jej píše Power BI (Excel) v Power Query sám • Efektivní využití schopností M-kódu vám ušetří • spoustu práce • času O jazyku M • Case-sensitive ! • Rozlišuje velká malá písmena • Čistý • Přehledný • „Částečně“ líný • Nedělá co nemusí • Datově typový • Sloupce musí mít typ • Nesečtu „1“ a 1 • Inspirace jazykem F# A Proč upravovat M - language • Méně kroků > podstatně rychlejší • Přehlednější • Pro opravy • Vylepšování doplňování > Poznámky • Hledání problémů • Univerzálnost • Spoustu úprav „nenakliknete“ v GUI  • Hlavně pokročilé věci (?, další parametry funkcí, atd.) A Kde můžete (část) M-kód vidět • Řádek vzorců A Spuštění M-ka – pokročilý editor • Home > Advanced Editor EN • Domů > Rozšířený editor CZ • Tip přemístit na rychlý pás karet A EN CZ Rozšířený editor • Jméno Dotazu (Query) Stav M kódu M kód M kód vylepšení zobrazení A Nastavení rozšířeného editoru • Zobrazovat čísla řádku • Prázdné znaky • „Minimapa“ • Pro velké a dlouhé kódy M kód vylepšení zobrazení A Zpřehlednění M-kódu • Pro zpřehlednění kód formátovat • Podobně jako DAX • Tip: později podrobněji A Formátování • https://www.powerqueryformatter.com/formatter A Formátovaný kód • Fo A Další vylepšení M-ka při tvorbě v GUI • Názvy kroků (bez mezer) • Řádek nový • NovyRadek • New Row • NewRow • Tip • Bez háčku a čárek • Bez mezer • Raději Anglicky A Další vylepšení Mka při tvorbě v GUI • Názvy > Přejmenovat • Už umíme A Poznámky A Základní znaky (operátory) v syntaxi M • Matematické operátory • Porovnávací operátory • Logické operátory • Speciální znaky B M-ko a znaky - Matematické operátory • + • • * • / • ^ • Tip – (mínus) lze použít také jako unární operátor B M-ko a znaky - Porovnávací operátory • > • < • >= • <= • <> • = B M-ko a znaky - Porovnávací operátory Výsledek TRUE , FALSE • x = y se vyhodnotí jako true, pokud x se rovná y • x > y se vyhodnotí jako true, pokud x je větší než y • x < y se vyhodnotí jako true, pokud x je menší než y • x <= y se vyhodnotí jako true, pokud x je menší nebo rovno y • x >= y se vyhodnotí jako true, pokud x je větší nebo rovno y • x <> y se vyhodnotí jako true, pokud x není rovno y • = může jít i o přiřazení B Logické operátory • Operátory: • not - negace / opak • and - a • or - nebo • Ukázky • [Number] > 8 and [Number] < 25 • [Number]< 15 or [Number] > 25 • not ([Number] < 25) B M-ko a znaky • Speciální operátory _ pro každý prvek (viz each) .. Rozsah od do (viz List - seznamy) # pro názvy spolu s uvozovkami #“A b c“ ? Pokud nebude nalezeno null [] Record nebo název sloupce záznamu (viz Record – Záznam) {} List nebo číslo řádku, pořadí prvku (viz List - seznamy) " správné horní uvozovky – (palec „inch”) & spojení • Bude vysvětleno dále B Další operátory • is Výraz x je y vrátí hodnotu true, pokud je typ x kompatibilní s y, a vrátí hodnotu false, pokud typ x není kompatibilní s y. • as Výraz x jako y určuje, že hodnota x je kompatibilní s y podle operátoru. • Viz_dále B is, as - příklady • 1 as number // 1 viz dále • "A" as number // error • null as nullable number // null • = null is null // true • = null is number // false B Poznámky B Sekce co může M-kód obsahovat C „Sekce“ kroky v M-ku • Hodnoty (Values) • Konstanty „jednoduché“ • Strukturované (list, record, tabulka) • Dotazy / výrazy (Expressions) • Funkce - někdy samostatná sekce • Poznámky C Sekce co může M-kód obsahovat let Konstanta = 10, // poznámka Tabulka = #table({"Pism", "Čís"}, {{"A", 1}, {"B", 2}), List = {1,"Pavel", true, Tabulka, {1,2,3}, (x)=>x*x}, Record = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"], /* Víceřádková poznámka */ Source = "Demo ukázka sekce" in Source List (Seznam) TabulkaKonstanta Poznámka Záznam (Record) C Dotaz Hodnoty (Values) • Hodnota je kus datové informace nebo-li: • Druhy hodnot: • Hodnoty jednoduché: • Hodnoty strukturované: C Hodnoty (Values) • Hodnoty jednoduché: • čísla • text • logická hodnota • binární • datu • čas • ... C Hodnoty (Values) • Hodnoty strukturované: • List – seznam samostatná sekce • Record – záznam samostatná sekce • Tabulka – Table samostatná sekce • seznamy seznamů atd. • seznamy tabulek • ... C Dotazy / Výrazy (Expressions) • Dotaz je něco, co se dá vyhodnotit. • Dotazem se rozumí datový podklad se všemi úpravami, které provádíme nad datovým zdrojem pomocí dotazů v jazyce M • Pokud vyhodnocuji mohu vrátit zpět nějakou "hodnotu". • Z dotazu 1 + 1 tento výraz se vyhodnotí a získáte hodnotu 2. C Dotazy / Výrazy (Expressions) Soucet = 1 + 1 Tabulka = #table({"Pism", "Čís"}, {{"A", 1}, {"B", 2}) • Each… • If .. then • .. C Funkce • Někdo řadí samostatně • Viz samostatná sekce • Tip Google C =#shared • Nový dotaz • Tip Google C Poznámky • Pořádek v kódech • Nejsou nezbytné pro funkci kódu, • Vhodné pro lepší přehled a orientaci // komentář jednořádkový */ pro víceřádkový komentář */ C Prostor pro poznámky C Hodnoty – Konstanty • Prvkem pro všech ostatních hodnoty • Záznam, seznam se skládá ze samostatných hodnot D Samostatné hodnoty • Typy • 125.44 - číslo • "JakNaExcel" - text • true - logická hodnota • (pozor na velikost písmen) • null - skutečně prázdná hodnota (null) • Prázdné (pozor null a nula – zero a prázdná „“) • Mezera • atd. D Samostatné hodnoty vytvořené funkcí • Pomocí funkcí můžete sestavit časové a datumové údaje: • #time (hodiny, minuty, sekundy) • - vytvoření času - #time (10, 42, 20) • #date (roky, měsíce, dny) • - vytvoření datum - #date (2018, 12, 31) • #datetime (roky, měsíce, dny, hodiny, minuty, sekundy) - - ... • #datetimezone (roky, měsíce, dny, hodiny, minuty, sekundy, offset-hodiny, offset-minuty) - - ... • #duration (dny, hodiny, minuty, sekundy) - - ... D Speciální konstanty • ∞ kladné nekonečno = 1/0 • - ∞ záporné nekonečno = -1/0 • NaN není číslo = 0/0 • Not a number • V tabulce Power Query • -Infinity • NaN • Infinity D Poznámky D List - Seznam - Vektor • Řada hodnot • Primitivní • Strukturované • Není limitován počtem hodnot • Limit je u funkcí (pokud budou list zpracovávat) • Limit HW • Bez vektoru se neobejdete • Vektor může obsahovat vektor, tabulku atd… • Tip: Sloupec jako seznam E List - Seznam - Vytvoření • 1) V PQ • Drill Down • Procházet hierarchií v CZ E ENCZ List - Seznam - Vytvoření • (1) V PQ druhá možnost • Převést na seznam • Convert to List E List - Seznam - Vytvoření • 2) List vytvořit pomocí funkce • List.Dates(), • List.Numbers() • List.Random() • Text.ToList() • TableToList() • Table.ColumnName() • .. E List - Seznam – Vytvoření (3) List lze vytvořit „Ručně“ ={1,2} ={1..2} ={{1, 2}, {3, 4, 5}} = {"a".."f"} … E List - Seznam – Vytvoření „Ručně“ = {1,"Pavel", true, Tabulka, {1,2,3}, (x)=>x*x} • Může obsahovat funkci, odkaz na jiný dotaz Tabulka atd • Nebo lépe • = {1,"Pavel", true, Tabulka, {1,2,3}, (x as number) as number=>x*x} • Definováno ve funkci (viz typ) E Kde lze využít? ={1..12} • Měsíce v roce? ={1..7} ={1..5} • Dny v týdnu (Po - Pá) ={"po", ….} E Klasický seznam výběr prvku • Vybere první prvek • Nula první • Jedna druhý • Programátorský počet • Viz indexace od 0 • První prvek = {1, 2, 3}{0} E Klasický seznam výběr prvku • V Módu před odkaz na dotaz let Seznam = {1,2,3}, Source = Seznam{1} in Source E Klasický seznam - odkazování = List_vycet_prvku{1} • Získám druhý prvek ze seznamu List_vycet_prvku = List_vycet_prvku{7} • Chci osmý prvek, ale není v seznamu List_vycet_prvku • Chyba! = List_vycet_prvku{7}? • Chci osmý prvek, není vratí null protože není > neskončí chybou = List_vycet_prvku{-7}? • Chyba -7 prvek nemůže existovat, 7 může E Otazník je skvělá věc !!! Klasický seznam – výběr prvku • První prvek ze seznamu = List.First({1, 2, 3}) • Poslední prvek ze seznamu = List.Last({1, 2, 3}) • První dva prvky ze seznamu = List.FirstN({1, 2, 3},2) E Poslední využitím funkce • Poslední dva prvky ze seznamu = List.LastN({1, 2, 3},2) • Poslední větší rovno 2 než = List.LastN({1,2,3,1,2,3}, each _ >= 2) // 2,3 E List - Seznam – Hrátky… MyText = "5;6;9", MyList = Text.Split(MyText, ";"), Myitem=MyList{2} E List - Seznam - Poznámky • Odkaz_web E Záznam Rekord • Strukturovaný datový typ • Skupina pojmenovaných hodnot • Název hodnoty, Hodnota • Záznam je v každém PQ • Let .. in… je vlastně záznam – viz dále F Vytvoření Recort - záznam • (1) V Power Query Editoru Jen zaobalí do Let In Viz dále F Vytvoření Recort - záznam • (2) Využiji funkce = DateTime.LocalNow() – vrátí aktuální čas • Převedení času na zaznam = DateTime.ToRecord (DateTime.LocalNow()) F Záznam (Record) ze Seznamu (List) (2) Využiji funkce = Record.FromList({1, "Pavel", "MVP"}, type [ID = number, Jmeno = text, Úspěch = text]) Viz dále ruční vytvoření F (3) Ruční zadání - Záznam Rekord •Definuje pomocí hranatých závorek [] •Jméno které toto pole identifikuje •Znaménko rovná se. •Hodnota tohoto pole. • = [Jméno = "Pavel"] F Identifikátor Hodnota (3) Record Ručně = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] = [Osoba = [Jméno = "Jan", Věk = 38], Povolani = "Důchod"] F Práce se záznamy-vyběr záznamu • Výběr prvku • Má pojmenování • Potřebuji jméno = [Jméno = "Pavel", Titul = "MVP", Město="Brno"][Jméno] F Poznámky – práce se záznamy • Využitím funkce = Record.Field([ID = 1, Jmeno = "Pavel", Titul = "MVP"], "Jmeno") Není lepší? = [Jméno = "Pavel", Titul = "MVP", Město="Brno"][Jméno] F Z Record (Záznam) List (Seznam) = Record.FieldValues([Jméno = "Pavel", Titul = "MVP", Město="Brno"]) • opačně Record.FromList F Nepřipomíná vám něco? let Source = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] in Source Co záměna let in znaky []? F Nepřipomíná vám něco? let Source = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] in Source ------------------------ [ Source = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] ] [Source] F Nepřipomíná vám něco? Nebo lépe [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] F Prostor pro poznámky F Tabulky (Table) • Uspořádaná posloupnost řádků, kde každý řádek je seznam • (viz popis seznamu výše). • Uspořádání hodnot do řádků a sloupců • Má definované datové typy • Platí nad celým sloupcem • PQ pracuje a celým sloupcem • Nezáleží na pořadí sloupců • Tabulky jsou nutnost! G Vytvoření tabulky • (1)V PQE • (2)Funkci • Table.FromRows • Table.FromList() • (3)Ručně • #table G (1) V PQE • Využitím PQ G (2) Funkci vytvoření z List = Table.FromList({"a", "b", "c", "d"}, null, {"Písmena"}) G (2)Funkci vytvoření z Record = Table.FromRecords({[ID = 1, Jmeno = "Pavel", Tit = "MVP"], [ID = 2, Jmeno = "Eva", Tit = "Ing"], [ID = 3, Jmeno = "Iva", Tit = null]}) G (2) Funkci načtení tabulky z Excel • Source = Excel.Workbook(File.Contents("D:\dotaznik.xlsx" ), null, true){0}[Data] G (2) Funkci další možnost • Table.FromRows(Json.Document(Binary.Decompress( Binary.FromText("i45WCkgsS81R0lHySSw+vDBbKVYnWs m1LBEo4JuYc3ghmO8J5oel5mSDBGIB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Jméno = _t, Přijmení = _t]), G #table ( type table [ Jméno = text, Výška = number ], { {"Pavel", 183}, {"Eva", 182} } ) G Jméno funkce Definice datové typy Názvy sloupců datové typy sloupců Data pro první řádek Data pro druhý řádek (3) Ručně • Tabulka se sestaví pomocí funkce #table • první seznam názvy sloupců {"NázevSloupec", „Sl2"} • jednotlivé řádky se zapisují opět jako seznam {"A", 1} • s skupina záznamu je opět ve složených závorkách. G (3) Ručně – názvy sloupců = #table({"Pismena", "Čísla"}, {{"A", 1}, {"B", 2}, {"C", 3}}) G (3) ručně-bez názvů sloupců = #table( 2,{{"A", 1}, {"B", 2}, {"C", 3}}) G (3) Ručně – názvy sloupců a typ hodnoty = #table(type table [Jméno = text, Výška = number], {{"Pavel", 183}, {"Eva", 182}}) Práce s tabulkou •Co potřebujete •Celý sloupec •Celý řádek •Jednu „buňku“ •– průsečík řádek sloupec •Asi už tušíte …. [], {} G Práce s tabulkou - sloupec = #table(type table [Jméno = text, Vyška = number], {{"Pavel", 183}, {"Eva", 182}})[Jméno] G Práce s tabulkou - sloupec • Případně přehledněji let Source = #table(type table [Jméno = text, Vyška = number], {{"Pavel", 183}, {"Eva", 182}}), Sloupec = Source[Jméno] in Sloupec G Práce s tabulkou - řádek • Pokud chci druhý řádek (první je nula) = #table(type table [Jméno = text, Vyška = number], {{"Pavel", 183}, {"Eva", 182}}){1} G Práce s tabulkou - buňka = #table(type table [Jméno = text, Vyška = number], {{"Pavel", 183}, {"Eva", 182}})[Jméno]{1} G Práce s tabulkou - buňka = #table(type table [Jméno = text, Vyška = number], {{"Pavel", 183}, {"Eva", 182}}){1} [Jméno] G Práce s tabulkou - buňka • Nezáleží zda vyberete: • Řádekanásleněsloupce • Sloupecanásledněřádek • Což je logické G Práce s tabulkou – buňka-otazník? • Nezapomenout na otazník • Co když neexistuje název sloupce • Co když neexistuje název řádku MojeTabulka[Sloupec]?{0}? G Tabulky - poznámky G Expressions • Dotaz (výrazy, vzorec, expressions, krok) • Cokoli, co lze vyhodnotit a vrátit „hodnotu“ • List, Record, Tabulku • z A získat B • Mnohdy využijete X kroků • Vysledek = Operace(Neco) • Ono i hodnota je vlastně dotaz ;) • DPH = 21 • Funkce, operace, výpočty J Matematické • Soucet = 1 + 1 //2 • Nebo v M-ku C=1 B=2 A=B+C J Porovnávací • Porovnani = 3 > 2 //true • Použití v logických funkcích J Spojovací = "Hello " & "World" AhojSvete = "Hello " & "World" J Funkce = Text.Upper("Hello World") • Viz samostatná kapitola VelkaPismena = Text.Upper("Hello World") //"HELLO WORLD" • Viz dále J Poznámky Let In - konstrukce • Víme sekce co M-kód obsahuje • Zobrazení konstrukce Let In • Tušíme co znamená K Let in • Let in • Je vlastně záznam ;) • jen [] se použije konsturuce let in • Aby kód nevypadal tak strašidelně ;) K Let in - náhrada Let in >> [] let Source = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] in Source • náhrada [Source = [Jméno = "Pavel", Funkce = "MVP", Město="Brno"]] • náhrada [Jméno = "Pavel", Funkce = "MVP", Město="Brno"] K Let In - konstrukce K Blank Query – Prázdný dotaz let Source = "" in Source KK M-ko vs Editor Power Query • // poznámky K Pořadí kroků let A = 1, B = 2, C = A + B in C let C = A + B, A = 1, B = 2 in C K Názvy kroků let #"A a" = 1, #„B b" = 2, #„C c" = #"A a" + #„B b" in #„C c" K Nepotřebné kroky K let A = 1, B = 2, X = 1111 + 5555, C = A + B in C Poznámky let A = 1, B = 2, // Toto je poznámka C = A + B in C K Poznámka k let-in Each – pro každý • Slouží ke snadnému vytváření funkcí • Proveď pro každý záznam („řádek“) • Each "každý..." je „syntaktický cukr“ • nahrazuje znak (_) • "(_) => ... " • Each je užitečné v kombinaci s operátorem pro vyhledávání, který se standardně používá s _. • Each [CustomerID] • _[CustomerID], • (_) => _[CustomerID] L Each – vynásob dvěma Ukázka 1 let Zdroj = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), NovySloupec = Table.AddColumn(Zdroj, "Double", each 2*[Numbers]) in NovySloupec Ukázka 2 let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), NovySloupec = Table.AddColumn(Source, "Double", (_) => 2*_[Numbers]) in NovySloupec L Each - zopakuj L let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), NovySloupec = Table.AddColumn(Source, "Zopakuj", (_) => _ ) in NovySloupec Each - zopakuj L let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), NovySloupec = Table.AddColumn(Source, "Zopakuj", (_) => _[Numbers] ) in NovySloupec Each - zopakuj L let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), NovySloupec = Table.AddColumn(Source, "Zopakuj", each [Numbers] ) in NovySloupec Each - zopakuj L let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), NovySloupec = Table.AddColumn(Source, "Zopakuj", each _) in NovySloupec Each - filtry let sample_table = Table.FromColumns({ {"Pavel", "Eva", "Iva", "Jan"}, {1, 2, 3, 4}, {5, 2, 5, 1}}, {"Jméno", "Znamka_1", "Znamka_2"}), filter_znamka_5 = Table.SelectRows(sample_table, each ([Znamka_2] = 5)) in filter_znamka_5 L Each - filtry let sample_table = Table.FromColumns({ {"Pavel", "Eva", "Iva", "Jan"}, {1, 2, 3, 4}, {5, 2, 5, 1}}, {"Jméno", "Znamka_1", "Znamka_2"}), filter_znamka_5 = Table.SelectRows(sample_table, (_) => _[Znamka_2] = 5) in filter_znamka_5 L Poznámky each L Podmínky - if then else • V Excel KDYŽ (IF) • Pokud splněno proveď A jinak B M Podmínky - If then else if [logický výraz k testování] then [když je výraz pravda tak se provede] else [jinak se provede toto] if [logický výraz k testování] then [když je výraz pravda tak se provede] else if [pokud předchozí není pravda, logický výraz k testování] then [když je výraz pravda tak se provede] else [jinak se provede toto] M Logické operátory • Operátory: • not - negace / opak • and - a • or - nebo • Ukázky • [Number] > 8 and [Number] < 25 • [Number]< 15 or [Number] > 25 • not ([Number] < 25) M Data • Mějme tabulku let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), in Source M Podmínky - if then else –ručně-opakování • V PQE nakliknutí - Přídání sloupce – opakování • > 3 „Velké“, jinak „Malé“ M Výsledek let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), #"Podmíněný sloupec je přidaný" = Table.AddColumn(Source, "Podm_1", each if [Numbers] > 3 then "Velké" else "Malé") in #"Podmíněný sloupec je přidaný„ Nezměnit název #"Podmíněný sloupec je přidaný" M Podmínky - If then else – základ if [Čísla] > 3 then "Velké" else "Malé" Podmínka = Table.AddColumn(#"Renamed Columns", "Vlastní", each if [Čísla] >3 then "Velké"else"Malé") M Podmínky - If then else • Vlastní sloupec M Podmínky - If then - více podmínekvnoření if [Čísla] > 4 then ">4" else if [Čísla] > 2 then ">2 <=4" else "<=2" M Podmínky - If then else- or let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), Sloupec = Table.AddColumn(Source, "Podm_1", each if [Numbers] = 3 or [Numbers] = 2 then "3 nebo 2" else "jiné") in Sloupec M Speciální podmínky or and null • if [A] <> null or [B] = „OK" then „Hotovo" else null M Neexistující sloupec let Source = #table({"Numbers"}, {{1}, {2}, {3}, {4}, {5}}), // Sloupec neexistuje? Sloupec = Table.AddColumn(Source, "Podm_1", each if [C] = 3 or [C] = 2 then "3 nebo 2" else "jiné") in Sloupec • Ošetřit chyby? M Ošetření chyb - try otherwise • Ošetření chyb v M-ku • Konstrukce try … otherwise • V případě chyby zobrazí požadovanou hodnotu O Příklad • Sčítejme dva sloupce • Kdy se ve sloupci mohu nacházet písmena • Klasické sečtení • Číslo + Číslo > číslo • Číslo + Psímeno > Chyba • Potřebujeme ošetřit O Potřebuji pronásobit dva sloupce let Zdroj = #table({"Číslo", "Číslo_text"},{{1,2},{1,"a"}}), Sloupec = Table.AddColumn(Zdroj, "Vypocet", each [Číslo]*[Číslo_text]) in Sloupec O Potřebuji pronásobit dva sloupce let Zdroj = #table({"Číslo", "Číslo_text"},{{1,2},{1,"a"}}), Sloupec = Table.AddColumn(Zdroj, "Vypocet", each try [Číslo]*[Číslo_text] otherwise 0) in Sloupec O Ošetření chyb - Try otherwise • Dělení nulou • try otherwise O Načítaní dvou různých souborů • f O Další možností ošetření • Otazník • {}? • []? O Poznámky O Funkce v Mku - kategorie • Funkce Lines • Logické funkce • Rozdělovací funkce • Tabulkové funkce • Textové funkce • Časové funkce • Funkce pro typy • Funkce identifikátorů URI • Funkce pro přístup k datům • Binární funkce • Kombinační funkce • Porovnávací funkce • Datové funkce • Funkce DateTime • Funkce DateTimeZone • Funkce pro dobu trvání • Funkce výrazů • Hodnoty funkcí • Funkce seznamů • Funkce čísel • Funkce záznamu • Nahrazovací funkce • Funkce pro hodnoty • Zpracování chyb Q Jak na funkce - syntaxe • „Nakliknutí“ vs ruční zápis • Ručně výhody • Lze využít skryté možností funkce Q Jak na funkce - syntaxe prakticky • Chci z tabulky slova obsahující „*Sto*“ • Všechna! • Stokoruna • Stovka • Tisíc • Milión • Tip Velikost písmen Q Vytvořím tabulku slov // Vytvořit tabulku let Source = #table({"Slova"}, {{"Stokoruna"}, {"Sto"}, {"Stovka"}, {"Tisíc"}}), in Source Q Potřebuji slova se „sto“ • Budu filtrovat • (1) Vyberu co chci • = Table.SelectRows(Source, each ([Slova] = "Sto" or [Slova] = "Stokoruna")) • (2) Co když co nechci bude málo …. • = Table.SelectRows(Source, each ([Slova] <> "Tisíc")) • (3) Má na začátku • = Table.SelectRows(Source, each Text.StartsWith([Slova], "Sto")) • (4) Obsahuje • = Table.SelectRows(Source, each Text.Contains([Slova], "Sto")) Q Jaký je rozdíl? • … • Co další data… • Velká malá písmena? Q Co další data ve sloupci? • Co malá / velká písmena? • Předem • Duplikuji sloupec • Vše upravím na velká „malá“ • I ve vyhledávaném dotazu… • Následně vyhodnotím? • Odstraním sloupec • Nebo… • Text.Contains(text as nullable text, substring as text, optional comparer as nullable function) as nullable logical Q Google Q Rozlišuj malé velká • = Table.SelectRows(Source, each Text.Contains([Slova], "Sto", Comparer.OrdinalIgnoreCase)) Q Vlastní funkce • Bez Google ani ránu Q Vlastní funkce // přičti jedničku let PrictiJednicku = (x) => x + 1, // Volání funkce Výsledek = PrictiJednicku (10) in Výsledek Q Vlastní funkce // a * b + 100 let Produkt = (x, y) => x * y + 100, Výsledek = Produkt (2,3) in Výsledek Q Odkazování se na proměnné • Viz List, Record, Tabulka …… Q Poznámky Q Tip Google a nápověda… • Název listu vs pořadové číslo listu v Excel R Načítání Excel • Co se nám nelíbilo / způsobilo problém? • Název listů • Co pořadí listu • Zjednodušení? • Počet řádků • Zrychlení… R (1) Název vs pořadové číslo listu v Excel // UpravitŘádky_Sheet = Source{[Item="UpravitŘádky",Kind="Sheet"]}[Data], // Source{0}[Data] UpravitŘádky_Sheet = Source{0}[Data], R Listy … • Další řešení? • Google • ….. Další informace • https://office.lasakovi.com/excel/Query-editor/struktura-M-kodu- Editor-Power-Query/ Kam dále o M •Videa •Knihy Z Knihy • https://www.amazon.com/Data-Monkey-Guide-Language- Excel/dp/1615470344 Z Weby o Mku • Imke Feldmann • https://www.linkedin.com/in/imkefeldmann?originalSubdomain=de • https://www.thebiccountant.com/ • Chris Webb • https://blog.crossjoin.co.uk/ Z Weby o Mku Guy in a Cube https://www.youtube.com/results?search_query=guy+in+cube Ken Puls https://www.youtube.com/watch?v=1Pym6Z36S0U&ab_channel=PowerBI%C4%B0stanbul Curbal https://www.youtube.com/c/CurbalEN https://curbal.com/contact Matt Allington https://exceleratorbi.com.au/ https://www.youtube.com/watch?v=1KKalqmpcDg&ab_channel=DAXTIPS Marco Russo https://www.sqlbi.com/ Alberto Ferrari https://www.linkedin.com/in/albertoferrarisqlbi/ Z Weby o Mku • Reza Rad • https://radacad.com/reza • https://radacad.com/blog • https://www.youtube.com/channel/UCsOfIwAXj1fT6LDqEDEAb4g • Guy in a Cube • https://www.youtube.com/results?search_query=guy+in+cube Z Poznámky Z