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

Jste zde: Úvodní stránka » excel » Query-editor » record-zaznam-power-query-M-komplet
Microsoft Excel logo

Redord záznam od A do Z - Power Query

Videokurzy Excel

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.

  • Teorie
  • Vložit
  • Upravit
  • Transformovat
  • Speciálnosti

Úvodem do záznamu (record)

Z důvodu přehlednsoti a možnosti dalšího doplňování článku je rozdělen na kapitoly (sekce):

  • Teorie záznamů - record
    • Co je záznam (record)
    • Proč používat záznam
    • Ukázky záznamu
  • Zadat záznam
    • Ručním zápisem
    • V M-kódu - komplexněji
    • Z listu (seznamu) záznam - Record.FromList
    • Z tabulky vytvořit záznam Record.FromTable
    • Z datum záznam - Date.ToRecord
    • List ze záznamu - Record.ToList
    • Tabulka ze záznamu - Record.ToTable
  • Informace o záznamech (record-ech)
    • Výběr hodnoty ze záznamu
    • Výběr hodnoty Využitím funkce - Record.Field
    • Počet polí v rekordu záznamu
    • Porovnávání záznamu record(u)
    • Obsahuje záznam pole?
    • ...
  • Transformace záznamu (recordu)
    • Slučování záznamu ručně
    • Slučování záznamu pomocí funkce
    • Přidání záznamu
    • Odstranění záznamu
    • Přejmenování záznamu
    • Přeuspořádat položky
    • Transformovat hodnotu v poli
  • Práce s poli v záznamu
    • Výběr hodnoty zvoleného pole (opakování)
    • Seznam názvu polí v záznamu – fieldNames
    • Hodnota z pole pokud pole existuje - FieldOrDefault
    • Hodnoty z vybraných polí
    • Hodnoty polí – všechny ze záznamu
  • Související články

Teorie záznam - record

V této kapitole se podívame na záznam record v Power Query Editoru teoreticky. Funguje v Excel i Power BI.

  • Co je záznam record
  • Proč používat
  • Ukázky záznamu

Co je záznam record

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.

Microsoft Power Query

Proč používat

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í:

  • záznam, bude předávat parametr(y) funkci
  • máte funkci, která vytváří záznam jako návratovou hodnotu
  • atd.

Ukázky záznamu

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 ]

Ukázka záznamu v Power Query Editoru

Microsoft Power Query

Konstrukce let in

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).

Zadat záznam do Power Query Editoru

Jako první se podíváme jak vytvořit záznam (record), máme několik možností:

  • Ručně
  • Ručně M-kódu
  • Record.FromList
  • Record.FromTable
  • Record.ToList
  • Record.ToTable
  • Date.ToRecord

Pojďme se na jednotlivé možnosti podívat podrobněji:

Ručním zápisem

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 ]

V M-kódu - komplexněji ukázka

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]

Jak z listu (seznamu) vytvořit záznam - Record.FromList

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(list as list, fields as any) as record
= Record.FromList({1, "Pavel", 42}, {"ID", "Jméno", "Věk"}) // [ID = 1, Jméno = "Pavel", Věk = 42]

Jak z tabulky vytvořit záznam Record.FromTable

Záznam lze vytvořit i z tabulky, bude-li potřeba, využijeme funkci:

  • Record.FromTable(table as table) as record

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

Funkce která z datum vytvoří záznam - Date.ToRecord

Další funkcí, která umí vytvořit záznam z datumu je funkce:

  • Date.ToRecord(date as date) as record

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))

List ze záznamu - Record.ToList

Podobné funkce, které ze záznamu mohou vytvořit List, je funkce.

  • Record.ToList(record as record) as list
=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])

Vytvořit tabulku ze záznamu - Record.ToTable

Podobně jako jsme mohli z tabulky udělat záznam, můžeme i ze záznamu udělat tabulku:

  • Record.ToTable(record as record) as table
= 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]])

Informace o záznamech

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:

  • Výběr hodnoty ze záznamu
  • Výběr hodnoty Využitím funkce - Record.Field
  • Počet polí v rekordu záznamu
  • Porovnávání záznamu record(u)
  • Obsahuje záznam pole?

Výběr hodnoty ze záznamu

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

Výběr hodnoty Využitím funkce - Record.Field

Pokud hodnotu nechcete vybírat hranatou závorkou, můžete použít funkci:

  • Record.Field(record as record, field as text) as any

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í

Počet polí v rekordu záznamu

Jeli potřeba spočítat počet polí v záznamu, lze využít funkci:

  • Record.FieldCount Returns the number of fields in a record.
= 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]])

Porovnávání záznamu record(u)

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

Obsahuje záznam pole?

Kontrola zda pole obsahuje požadovaný záznam

  • Record.HasFields(record as record, fields as any) as logical
= Record.HasFields([A=1, B=2], "A") // true = Record.HasFields([A=1, B=2], "C") // false

Transformace záznamu

V této kapitole se podíváme na možnosti transformace záznamů:

  • Slučování záznamu ručně
  • Slučování záznamu pomocí funkce
  • Přidání záznamu
  • Odstranění záznamu
  • Přejmenování záznamu
  • Přeuspořádat položky
  • Transformovat hodnotu v poli

Slučování záznamu ručně

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čování záznamu pomocí funkce

Slučovat záznamy lze i využitím funkce

  • Record.Combine(records as list) as record
=Record.Combine({ [ID = 1, Jméno = "Pavel"], [Vek = 42] }) // [ID = 1, Jméno = "Pavel", Vek = 42]

Přidání záznamu

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(record as record, fieldName as text, value as any, optional delayed as nullable logical) as record
=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"}

Odstranění záznamu

K odstranění záznamu můžete využít funkci:

  • Record.RemoveFields(record as record, fields as any, optional missingField as nullable number) as record
=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

Přejmenování záznamu

Potřebujete-li přejmenovat pole záznamu:

  • Record.RenameFields(record as record, renames as list, optional missingField as nullable number) as record
=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]

Přeuspořádat položky

Pokud je potřeba změnit pořadí polí v záznamů

  • Record.ReorderFields(record as record, fieldOrder as list, optional missingField as nullable number) as record
= 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]

Transformovat hodnotu v poli

Potřebujete-li transformovat hodnotu, třeba text co vapadá jako číslo na číslo...

  • Record.TransformFields(record as record, transformOperations as list, optional missingField as nullable number) as record
=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}} )

Práce s poli

V této kapitole se podiváme na:

  • Výběr hodnoty zvoleného pole (opakování)
  • Seznam názvu polí v záznamu – fieldNames
  • Hodnota z pole pokud pole existuje - FieldOrDefault
  • Hodnoty z vybraných polí
  • Hodnoty polí – všechny ze záznamu

Výběr hodnoty zvoleného pole (opakování)

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(record as record, field as text) as any
=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

Seznam názvu polí v záznamu – fieldNames

Pokud potřebujete seznam všech názvů polí v záznamu, lze využít funkci:

  • Record.FieldNames(record as record) as list
=Record.FieldNames([ID = "1", Jméno = "Pavel", Vek = "42"]) // {ID, Jméno, Vek} = Record.FieldNames([]) // Prázdný seznam

Hodnota z pole pokud pole existuje - FieldOrDefault

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.).

  • Record.FieldOrDefault(record as nullable record, field as text, optional defaultValue as any) as any

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

Hodnoty všech polí - FieldValues

Nazvy polí umíme zjistit, ale někdy je potřeba jen hodnoty polí

  • Record.FieldValues(record as record) as list
= Record.FieldValues([ID = "1", Jméno = "Pavel", Vek = "42"]) // {1,Pavel,42}

Hodnoty z vybraných polí

Pokud potřebujete zízkat hodnoty z vybraných polí, můžete využít funkci:

  • Record.SelectFields(record as record, fields as any, optional missingField as nullable number) as record
= Record.SelectFields( [ID = "1", Jméno = "Pavel", Vek = "42"], {"ID", "Vek"}) // {1, 42}

Související články

Doporučuji články, které souvisejí s tématem M-language:

Excel

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: 13.11.2022 17:55

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 - 2025 |