Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
V tomto článku se podíváme, jak pracovat se záznamy (rekordy) v Power Query Editoru za využití jazyka M (M language). Funguje v Excel i Power BI.
Z důvodu přehlednsoti a možnosti dalšího doplňování článku je rozdělen na kapitoly (sekce):
V této kapitole se podívame na záznam record v Power Query Editoru teoreticky. Funguje v Excel i Power BI.
Strukturovaná hodnoty (podobně jako list nebo tabulka). Record (záznam) je uvozen úvodní hranatou závorkou „[“ a ukončen uzavírací hranatou závorkou „]“. Záznam obsahuje jednotlivá pole. Pole je pár (dvojice) název pole/hodnota pole. Pokud je další pole, je odděleno čárkou. Záznamy obvykle obsahují minimálně jedno pole, mohou existovat i prázdná pole, což vypadá takto:
[] //jen hranaté závorky
Příkladem velmi jednoduchého recordu (záznamu) je například (obsahuje jedno pole, jméno pole je A a hodnota je jednička):
[A=1]
Nebo pro dvě pole v seznamu:
[A=1, B=2]
Konstrukce Let in je vlastně také záznam, ale o tom v samostatném článku, týkající se struktury M-kódu.
V naprosté většině případů je záznam (record) použit jako meziprodukt pro další dotazy. Pokud se záznam v Power Query Editoru načte do datového modelu, chová se jako tabulka. Názvy polí se stanou popisky sloupců a hodnoty polí se stanou hodnotami tabulky (viz samostatný článek o tabulkách).
Důvody pro použití záznamů v Power Query Editoru mohou zahrnovat následující:
Pár ukázek, jak mohou záznamy vypadat, v dalších kapitolách se na záznamy (v angličtině Record) vypadat:
=[] //prázdný
=[A=1, B=2]
= {[ Jmeno = "Pavel"], [ Jmeno = "Lucie" ]} //zaznamy v seznamu (listu)
= [R1=[ Jmeno = "Pavel"], R2=[ Jmeno2 = "Lucie" ]] // Záznam záznamu
= [A={1,2}, B=(x)=>x]
Komplexnější záznam, který obsahuje další hodnoty, funkce nebo struktury (list, tabulka):
=
[
Cislo = 42,
Pismeno = "A",
List={1,2,3},
Zaznam=[Jmeno = "Pavel",Prijmeni="Lasák"],
Tabulka = #table( {"Id","Jmeno"}, {{1,"Eva"},{2,"Jan"}} ),
Funkce=(x,y)=>x*y
]
Konstrukce let in je vlastně také záznam. O tom, ale v samostatném článku.
Základní konstrukce let in
let
Zdroj = "a"
in
Zdroj
Přepsání konstrukce let in na hranaté závorky [].
[
Zdroj = "a"
]
[Zdroj]
Samostatné kroky
[
Zdroj = "a"
]
Více v samostatném článku, který se týká konstrukce len in. Tento je zaměřen na záznam (record).
Jako první se podíváme jak vytvořit záznam (record), máme několik možností:
Pojďme se na jednotlivé možnosti podívat podrobněji:
Seznam lze vytvořit i ručním zápisem. Jelikož budeme testovat, nejlépe je vytvořit nový Prázdný dotaz na pásu karet Domů > Nový zdroj, nebo pravým tlačítkem nad seznamem dotazů a vybrat Nový dotaz > Prázdný dotaz
=[Jmeno = "Pavel"] //Jeden záznam
Případně dva záznamy, to co je za lomítky je poznámka to opisovat nemusíte ;)
=[Jmeno = "Pavel",Prijmeni="Lasák"] //Dva záznamy
// Dva záznamy o dvou záznamech
= [Osoba1=[Jmeno = "Pavel",Prijmeni="Lasák"],Osoba2=[Jmeno = "Pavel",Prijmeni="Lasák"]]
Poskládat záznaz z hodnot co již v polích záznamu jsou
= [
Jmeno = "Pavel",
Prijmeni = "Lasák",
#"Cele jmeno" = Jmeno & " " & Prijmeni
]
Pokud záznam používáte v M-kódu, případně potřebujete, aby výsledkem operací byl záznam První co může člověka napadnout obalit výsledek do hranatých závorek, což ale nebude fungovat, neobdržíte výsledek:
// nebude fungovat
let
A = 1,
B = 2,
Vysledek = A + B
in
[Vysledek]
Pokud víte že len in je vlastně zaznam, tak let a in vyměníte za hranaté závorky a dostanete výsledek, ale ten je jako hodnota, což opět není (nemusí být) to co potřebujete:(
// bude fungovat vrátí výsledek
[
A = 1,
B = 2,
Vysledek = A + B
]
[Vysledek] //3
Stejná situace nastane, když len in ponecháte a výsledek nebudete „obalovat“ do hranatých závorek, Výsledkem bude hodnota.
let
A = 1,
B = 2,
Vysledek = A + B
in
Vysledek //3
Pokud ale výsledek chcete jako záznam, tak obalení do hranatých závorek je správné (včetně ponechání let in, (pokud nahradíte [] nebude fungovat), jen z definice musíte přidat název pole do htranatých závarek ve výsledku
// výsledek jako record
let
A = 1,
B = 2,
Vysledek = A + B
in
[Vysledek = Vysledek]
// [Vysledek = 3]
Máte-li list (seznam) můžete vytvořit záznam s poli, jen potřebujete další seznam pro popis položek v záznamu
= Record.FromList({1, "Pavel", 42}, {"ID", "Jméno", "Věk"})
// [ID = 1, Jméno = "Pavel", Věk = 42]
Záznam lze vytvořit i z tabulky, bude-li potřeba, využijeme funkci:
Poznámka: Ono asi častěji budete potřebovat opak - ze záznamu tabulku.
Pozor tabulka musí nějak vypadat, tj. v prvním sloupci musí být názvy hodnot (Name), které jsou ve druhém sloupci (Value)
= Record.FromTable( #table({"Name","Value"}, {{"Id",1},{"Jméno","Jan"}}))
Nefunguje pokud nemáte správně pojmenováno
// nefunguje pokud nemáte správně pojmenováno
= Record.FromTable( #table({"x","y"}, {{"Id",1},{"Jméno","Jan"}}))
//tvorba tabulek v samostatném článku
Další funkcí, která umí vytvořit záznam z datumu je funkce:
Popisovat položky nemusíme, protože M-ko ví co v datum je den, měsíc a rok.
= Date.ToRecord(#date(2011, 12, 31))
Podobné funkce, které ze záznamu mohou vytvořit List, je funkce.
=Record.ToList([A = 1, B = 2, C = 3])
Případně záznam se jménem, věken atd.
= Record.ToList([Jméno = "Pavel", Věk = 42, Co = null])Podobně jako jsme mohli z tabulky udělat záznam, můžeme i ze záznamu udělat tabulku:
= Record.ToTable([ID = 1, Jméno = "Pavel", Věk = 42.2])
Pokud potřebuji záznamy záznamů...
= Record.ToTable([A=[ID = 1, Jméno = "Pavel", Věk = 42.2],B=[ID = 2, Jméno = "Jan", Věk = 42.2]])
Tvorbu záznamu máme za sebou, teď se podíváme na práci se záznamy, výběr záznamu, počet polí v záznamu, porovnávání záznamu, případně zda záznam obsahuje pole (hodnoty).
Blíže se podíváme na:
Nejdůležitějším požadavkem, asi bude zjistit hodnotu z vybraného pole:
Ze záznamu potřebuji hodnotu z pole, které se jemnuje A a záznam tuto pole obsahuje:
=[A=1, B=2] [A] // 1
Pokud chcete název pole které neexistuje obdržíte chybu
=[A=1, B=2] [C] // chyba
Pokud požadavek doplníte o otazník a daná položka nebude existovat neobdržíte chybu, ale hodnotu null
=[A=1, B=2] [C]? // null
Pokud máte záznamy se záznamy, opět následně můžete doplnit o otázníky:
= [A=[ID = 1, Jméno = "Pavel", Věk = 42.2],B=[ID = 2, Jméno = "Jan", Věk = 42.2]][A][Jméno] // Pavel
Případně v M-kódu
let
MujZaznam = [A=1, B=2],
Zdroj = MujZaznam[A]
in
Zdroj
Pokud hodnotu nechcete vybírat hranatou závorkou, můžete použít funkci:
Pokud položka existuje
=Record.Field([ID = 1, Jmeno = "Pavel", Vek = 42 ], "Jmeno") // Pavel
Pokud položka neexistuje:
= Record.Field([ID = 1, Jmeno = "Pavel", Vek = 42 ], "Jméno") // chyba položka Jméno není
Jeli potřeba spočítat počet polí v záznamu, lze využít funkci:
= Record.FieldCount([]) //0
= Record.FieldCount([A=1, B=2]) //2
= Record.FieldCount([A=1, B=2,C=3]) //3
Záznam se záznamy
// pokud jsou záznamy sloučené
= Record.FieldCount( [A=[ID = 1, Věk = 42.2, x=3],B=[ID = 2, Věk = 42.2, x=4]])
Pokud je potřeba porovnat záznamy, lze využít matematické operátory:
=[a=1, b=2] = [b=2, a=1] // true
=[a=1, b=2] = [a=1, b=2] // true
=[a=1, b=3] = [a=1, b=2] // false
=[a=1, b=2] <> [a=1, b=2] // false
=[a=1, b=3] <> [a=1, b=2] // true
=[a=1, b=3] < [a=1, b=2] // chyba
Kontrola zda pole obsahuje požadovaný záznam
= Record.HasFields([A=1, B=2], "A") // true
= Record.HasFields([A=1, B=2], "C") // false
V této kapitole se podíváme na možnosti transformace záznamů:
Slučovat záznamy lze využitím znaku &
= [ a = 1, b = 2 ] & [ c = 3 ] // [ a = 1, b = 2 , c = 3 ]
= [ a = 1, b = 2 ] & [ a = 3 ] // [ a = 3, b = 2]
= [ a = 3, b = 2 ] & [ a = 1 ] // [ a = 1, b = 2]
Připadně
=[ID = 1, Jméno = "Pavel"] & [Vek = 42] // [ID = 1, Jméno = "Pavel", Vek = 42]
Slučovat záznamy lze i využitím funkce
=Record.Combine({
[ID = 1, Jméno = "Pavel"],
[Vek = 42]
})
// [ID = 1, Jméno = "Pavel", Vek = 42]
Pokud do existujícího záznamu potřebujete přidat další položku a nechcete / nemůžete využít Record.Combine nebo znak &.
=Record.AddField([ID = 1, Jméno = "Pavel", Vek = 42], "Cena", "MVP")
// [ID = 1, Jméno = "Pavel", Vek = 42, Cena ="MVP"]
= Record.AddField([ID = 1, Jméno = "Pavel", Vek = 42], "Cena", "MVP" , false) // [ID = 1, Jméno = "Pavel", Vek = 42, Cena ="MVP"]
= Record.AddField([ID = 1, Jméno = "Pavel", Vek = 42], ("Cena"), ("MVP") )
// přidání více nefunguje … fieldName as text
= Record.AddField([ID = 1, Jméno = "Pavel", Vek = 42], {"A", "B"}, {"1", "2"}
K odstranění záznamu můžete využít funkci:
=Record.RemoveFields([ID = 1, Jméno = "Pavel", Vek = 42], "Vek")
// [ID = 1, Jméno = "Pavel"]
// odstranit více záznamu
= Record.RemoveFields([ID = 1, Jméno = "Pavel", Vek = 42], {"Vek" , "Jméno"}) // [ID = 1]
= Record.RemoveFields([ID = 1, Jméno = "Pavel", Vek = 42], "vek")
// chyba v záznamu není položka vek
Potřebujete-li přejmenovat pole záznamu:
=Record.RenameFields([ID = 1, Jméno = "Pavel", Vek = 42], {"Vek", "Staří"})
// [ID = 1, Jméno = "Pavel", Staří = 42]
=Record.RenameFields(
[ID = 1, Jméno = "Pavel", Vek = 42],
{
{"Vek", "Staří"},
{"ID", "Nr"}
}
)
// [Nr = 1, Jméno = "Pavel", Staří = 42]
Pokud je potřeba změnit pořadí polí v záznamů
= Record.ReorderFields(
[ID = 1, Jméno = "Pavel", Vek = 42],
{"Vek", "ID"})
// Přehodí se Vek a ID [Vek = 42, Jméno = "Pavel", ID = 1]
=Record.ReorderFields(
[ID = 1, Jméno = "Pavel", Vek = 42],
{"ID", "Vek"})
// zůstane stejné [ID = 1, Jméno = "Pavel", Vek = 42]
Potřebujete-li transformovat hodnotu, třeba text co vapadá jako číslo na číslo...
=Record.TransformFields(
[ID = "1", Jméno = "Pavel", Vek = "42"],
{"Vek", Number.FromText}
)
Pokud je potřeba transformovat více hodnot polí
// více položek v poli
=Record.TransformFields(
[ID = "1", Jméno = "Pavel", Vek = "42"],
{{"Vek", Number.FromText}, {"ID", Number.FromText}}
)
V této kapitole se podiváme na:
V předchozí kapitole již bylo zmíněno, pokud pro výběr pole nechcete využít hranaté závorky [], můžete využít funkci:
=Record.Field([ID = "1", Jméno = "Pavel", Vek = "42"], "ID")
// 1
=Record.Field([ID = "1", Jméno = "Pavel", Vek = "42"], "Nr")
// pokud neexistuje chyba
Viz Record.FieldOrDefault, pokud název pole neexistuje vrátí null, nebo hranaté závorky a otazník
Pokud potřebujete seznam všech názvů polí v záznamu, lze využít funkci:
=Record.FieldNames([ID = "1", Jméno = "Pavel", Vek = "42"])
// {ID, Jméno, Vek}
= Record.FieldNames([])
// Prázdný seznam
Další možnost jak zjistit hodnotu vybraného pole, je funkce FieldOrDefault, výhodou je v případě, že název pole neexistuje, tak se vrátí hodnota null, nebo pokud je vyplněn argument defaultValue, tak vratí vyplněnou hodnotu (například, že neexistuje,atd.).
pole existuje
=Record.FieldOrDefault([ID = "1", Jméno = "Pavel", Vek = "42"], "Vek")
// 42
neexistuje
=Record.FieldOrDefault([ID = "1", Jméno = "Pavel", Vek = "42"], "Věk")
// null
neexistuje – vlastní text
= Record.FieldOrDefault([ID = "1", Jméno = "Pavel", Vek = "42"], "Věk", "nenalezeno")
// nenalezeno
Nazvy polí umíme zjistit, ale někdy je potřeba jen hodnoty polí
= Record.FieldValues([ID = "1", Jméno = "Pavel", Vek = "42"])
// {1,Pavel,42}
Pokud potřebujete zízkat hodnoty z vybraných polí, můžete využít funkci:
= Record.SelectFields(
[ID = "1", Jméno = "Pavel", Vek = "42"],
{"ID", "Vek"})
// {1, 42}
Doporučuji články, které souvisejí s tématem M-language:
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: 13.11.2022 17:55
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.
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ů.
Můžete být prvními co zanechají smysluplný komentář.
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
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 - 2025 |