Tabulky
Poznámka:
Microsoft Power Fx je nový název jazyka vzorců pro aplikace plátna. Práce na těchto článcích stále probíhá, jak extrahujeme jazyk z aplikací plátna, integrujeme jej s ostatními produkty Microsoft Power Platform a zpřístupňujeme jako open source. Začněte v části Přehled jazyka Microsoft Power Fx obsahující úvod do jazyka.
V Microsoft Power Fx můžete napsat vzorec, který přistupuje k informacím v Microsoft Excel, SharePoint, SQL Server a několika dalších zdrojích, které uchovávají data v záznamech a tabulkách. Abyste mohli tento typ dat využít na maximum, projděte si koncepty, které tvoří základ těchto struktur.
- Záznam obsahuje jednu či více kategorií informací o osobě, místě nebo objektu. Záznam může například obsahovat jméno, e-mailovou adresu a telefonní číslo jednoho zákazníka. Jiné nástroje odkazují na záznam jako na řádek nebo položku.
- Tabulka uchovává jeden nebo více záznamů, které obsahují stejné kategorie informací. Tabulka může třeba obsahovat jména, e-mailové adresy a telefonní čísla padesáti zákazníků.
Můžete si vytvořit různé vzorce, které budou název tabulky používat jako argument stejným způsobem, jako vzorce v Excelu používají jako argumenty odkazy na buňky. Některé vzorce v Power Fx vrací tabulku odrážející další argumenty, které zadáte. Můžete například vytvořit vzorec, který zajistí:
- Aktualizaci záznamu v tabulce. Uděláte to tak, že zadáte danou tabulku jako jeden z více argumentů funkce Patch.
- Přidání, odebrání a přejmenování sloupců v tabulce. Uděláte to tak, že zadáte danou tabulku jako argument funkce AddColumns, DropColumns nebo RenameColumns. Ani jedna z těchto funkcí nezmění původní tabulku. Místo toho funkce vrátí jinou tabulku založenou na dalších argumentech, které zadáte.
Prvky tabulky
Záznamy
Každý záznam obsahuje minimálně jednu kategorii informací pro osobu, místo nebo objekt. Příklad uvedený výše zobrazuje záznam pro každý produkt (Chocolate, Bread a Water) a sloupec pro každou kategorii informací (Price, Quantity on Hand a Quantity on Order).
Ve vzorci můžete pomocí složených závorek odkazovat na samotný záznam, který se nachází mimo kontext tabulky. Tento záznam například { Name: "Strawberries", Price: 7.99 } není přidružený k tabulce. Všimněte si, že názvy polí jako Name a Price v tomto příkladu nejsou ve dvojitých uvozovkách.
Pole
Pole tvoří jednotlivé údaje v záznamu. Tento typ pole můžete vizualizovat jako hodnotu ve sloupci pro konkrétní záznam.
Stejně jako u ovládacího prvku odkazujete i na pole záznamu pomocí operátoru . u záznamu. First(Products).Name například vrátí pole Name pro první záznam v tabulce Products.
Pole může obsahovat jiný záznam nebo tabulku, jak znázorňuje příklad funkce GroupBy. Můžete vnořit tolik úrovní záznamů a tabulek, kolik chcete.
Sloupce
Sloupec odkazuje na stejné pole u jednoho nebo více záznamů v tabulce. V příkladu výše má každý produkt pole s cenou a tato cena se pro všechny produkty nachází ve stejném sloupci. Uvedená tabulka obsahuje čtyři sloupce, které jsou zobrazeny vodorovně v horní části:
- Jméno
- Cena
- Množství na ruce
- Množství na objednávku
Název sloupce odráží pole v daném sloupci.
Všechny hodnoty v rámci sloupce mají stejný datový typ. V příkladu výše sloupec Quantity on Hand vždy pro jeden záznam obsahuje číslo a nemůže obsahovat řetězec, například 12 jednotek. Hodnota kteréhokoli pole může také být prázdná.
V jiných nástrojích jste možná na sloupce odkazovali jako na pole.
Tabulka
Tabulku tvoří jeden nebo více záznamů, z nichž každý obsahuje několik polí, která mají v rámci záznamů konzistentní názvy.
Kterákoli tabulka uložená ve zdroji dat nebo kolekci má název, pomocí něhož na ni můžete odkazovat a předat ji funkcím, které používají tabulky jako argumenty. Tabulky také mohou být výsledkem funkce nebo vzorce.
Stejně jako v následujícím příkladu můžete vyjádřit tabulku ve vzorci pomocí funkce Table se sadou záznamů, které uvedete ve složených závorkách:
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
Můžete také definovat tabulku s jedním sloupcem, a to pomocí hranatých závorek. Uvedený vzorec můžete napsat také takto:
[ "Strawberry", "Vanilla" ]
Tabulkové vzorce
V Excelu i Power Fx slouží k práci s čísly a textovými řetězci podobným způsobem vzorce:
- V Excelu zadejte hodnotu, třeba 42, do buňky A1 a potom do jiné buňky zadejte vzorec, třeba A1+2, aby se zobrazila hodnota 44.
- V Power Apps nastavte vlastnost Default prvku Slider1 na 42 a nastavte vlastnost Text popisku na Slider1.Value + 2, aby se zobrazila hodnota 44.
V obou případech se vypočítané hodnoty automaticky změní, když změníte hodnoty argumentů (například číslo v buňce A1 nebo hodnotu prvku Slider1).
Podobně také můžete vzorce použít k přístupu k datům v tabulkách a záznamech a k práci s nimi. V některých vzorcích se používají názvy tabulek jako argumenty, například Min(Catalog; Price), k zobrazení nejnižší hodnoty ve sloupci Price v tabulce Catalog. Jiné vzorce poskytují celé tabulky jako návratové hodnoty, jako je vzorec RenameColumns(Catalog; "Price"; "Cost"), který vrátí všechny záznamy z tabulky Catalog, ale změní název sloupce Price na Cost.
Stejně jako u čísel i vzorce, které zahrnují tabulky a záznamy, se automaticky přepočítají, když se změní podkladová tabulka nebo záznam. Pokud náklady na produkt v tabulce Catalog klesnou pod předchozí minimum, návratová hodnota vzorce Min se automaticky změní, aby odpovídala.
Funkce tabulky a vlastnosti ovládacích prvků
Zvažte funkci Lower. Pokud proměnná welcome obsahuje textový řetězec "Hello, World", vzorec Lower( welcome ) vrátí "hello, world". Tato funkce nijak nemění hodnotu v této proměnné. Lower je čistá funkce v tom, že zpracovává pouze vstup a vytváří výstup. To je vše; nemá žádné vedlejší účinky. Všechny funkce v Excelu a většina funkcí v Power Fx jsou čistě funkce, které umožňují automatický výpočet sešitu nebo aplikace.
Power Fx nabízí sadu funkcí, které pracují s tabulkami stejným způsobem. Tyto funkce berou tabulky jako vstup a filtrují, třídí, transformují, redukují a shrnují celé tabulky dat. Ve skutečnosti funkce Lower a spousta dalších, které běžně berou jednu hodnotu, mohou jako vstup také brát tabulku single-column.
Mnoho funkcí používá jako vstup tabulku s jedním sloupcem. Pokud má celá tabulka pouze jeden sloupec, můžete ji určit podle názvu. Pokud tabulka obsahuje více sloupců, můžete určit jeden z těchto sloupců pomocí syntaxe Table.Column. Funkce Products.Name například vrací tabulku o jednom sloupci pouze s hodnotami Name z tabulky Products.
Tabulku však můžete zcela přetvořit pomocí funkce AddColumns, RenameColumns, ShowColumns nebo DropColumns. Tyto funkce opět mění pouze výstup, nikoli zdroj.
Vzorce chování
Ostatní funkce jsou speciálně navrženy pro úpravu dat a mají vedlejší účinky. Protože tyto funkce nejsou čisté, musíte je sestavovat pečlivě a nemohou se podílet na automatickém přepočtu hodnot v aplikaci. Tyto funkce se dají použít jenom ve vzorcích chování.
Obor záznamů
Některé funkce pracují tak, že jednotlivě vyhodnocují vzorec napříč všemi záznamy v tabulce. Výsledek vzorce se používá různě:
- AddColumns - Vzorec poskytuje hodnotu přidaného pole.
- Průměr, Max, Min, Součet, StdevP, VarP - Vzorec poskytuje hodnotu, která se má agregovat.
- Filtr, Vyhledat - Vzorec určuje, zda má být záznam zahrnut do výstupu.
- Concat - Vzorec určuje řetězce, které se mají zřetězit dohromady.
- Distinct – Vzorec vrací hodnotu, která se používá k identifikaci duplicitních záznamů.
- ForAll - Vzorec může vrátit jakoukoli hodnotu, potenciálně s vedlejšími účinky.
- Seřadit – Vzorec poskytuje hodnotu, podle které se mají záznamy třídit.
- S - Formule může vrátit jakoukoli hodnotu, potenciálně s vedlejšími účinky.
Uvnitř těchto vzorců můžete odkazovat na pole zpracovávaného záznamu. Každá z těchto funkcí vytvoří obor záznamů, ve kterém se vzorec vyhodnotí a kde jsou pole záznamu k dispozici jako identifikátory nejvyšší úrovně. Z aplikace také můžete odkazovat na vlastnosti ovládacího prvku a jiné hodnoty.
Vezměte si například tabulku Produkty v globální proměnné:
Set( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
Pokud chcete určit, zda se některého produktu požaduje více, než je dostupné, použijte vzorec:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
Prvním argumentem funkce Filter je tabulka záznamů, se kterou se bude pracovat, a druhým argumentem je vzorec. Filtr vytváří rozsah záznamu pro vyhodnocení tohoto vzorce, ve kterém jsou k dispozici pole každého záznamu, v tomto případě Produkt, Požadované množství a Dostupné množství. Výsledek porovnání určuje, zda se má záznam zahrnout do výsledku funkce:
V tomto příkladu navíc vypočítáme, jaké množství každého produktu se má objednat:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
Tady přidáváme do výsledku vypočítaný sloupec. AddColumns má svůj vlastní rozsah záznamů, který používá k výpočtu rozdílu mezi tím, co bylo požadováno, a tím, co je k dispozici.
Nakonec zmenšíme výslednou tabulku pouze na ty sloupce, které chceme:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Všimněte si, že v uvedeném příkladu jsme na některých místech použili dvojité uvozovky (") a na jiných jednoduché ('). Jednoduché uvozovky jsou povinné, když odkazujete na hodnotu objektu, jako je pole nebo tabulka, ve které název objektu obsahuje mezery. Dvojité uvozovky se používají, když neodkazujete na hodnotu objektu, ale když o něm mluvíte, zejména v situacích, ve kterých objekt ještě neexistuje, jako tomu je v případě funkce AddColumns.
Mnohoznačnost
Názvy polí přidané prostřednictvím oboru záznamů přepíší stejné názvy v aplikaci pocházející odjinud. Pokud k tomu dojde, můžete k hodnotám mimo obor záznamů nadále přistupovat pomocí operátoru mnohoznačnosti : @ disambiguation:
- Pro přístup k hodnotám z vnořených oborů záznamů použijte operátor @ s názvem tabulky, se kterou se pracuje, a to podle tohoto vzoru:
Tabulka[@Název pole] - Pro přístup ke globálním hodnotám, jako jsou zdroje dat, kolekce a kontextové proměnné, použijte vzor [@NázevObjektu] (bez označení tabulky).
Pokud je tabulka, se kterou se pracuje, výrazem, například Filter(Table, ... ), není možné operátor mnohoznačnosti použít. Pouze nejvnitřnější obor záznamů má přístup k polím z tohoto výrazu tabulky bez použití operátoru mnohoznačnosti.
Představme si například, že máme kolekci X:
Tuto kolekci můžete vytvořit pomocí vzorce ClearCollect(X, [1, 2] ).
A další kolekci Y:
Tuto kolekci můžete vytvořit pomocí vzorce ClearCollect( Y; ["A"; "B"] ).
Kromě toho definujte kontextovou proměnnou s názvem Value pomocí tohoto vzorce: UpdateContext( {Value: "!"} )
A teď to dejme všechno dohromady. V tomto kontextu následující vzorec:
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
vytvoří tuto tabulku:
K čemu tady došlo? Nejkrajnější funkce ForAll definuje obor záznamů pro X a umožňuje přístup k poli Value každého záznamu postupně tak, jak se zpracovávají. Přistupovat k němu můžete jednoduše pomocí slova Value nebo pomocí X[@Value].
Nejvnitřnější funkce ForAll definuje jiný rozsah záznamu pro Y. Vzhledem k tomu, že má tato tabulka definované také pole Value, použití Value zde odkazuje také na záznam hodnoty Y a nikoli dále na záznam z X. Pokud zde chceme přejít na pole X Value, musíme použít delší verzi s operátorem nejednoznačnosti.
Protože Y je nejvnitřnějším oborem záznamů, nevyžaduje přístup k polím této tabulky mnohoznačnost, a my můžeme použít tento vzorec se stejným výsledkem:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
Všechny obory záznamů ForAll přepíší globální obor. Kontextová proměnná Value, kterou jsme definovali, není dostupná podle názvu bez operátoru mnohoznačnosti. Pro přístup k této hodnotě použijte [@Value].
Ungroup sloučí výsledek, protože vnořené ForAll funkce vedou k vnořené výsledkové tabulce.
Tabulky s jedním sloupcem
Pokud chcete provozovat jeden sloupec z tabulky, použijte funkci ShowColumns jako v tomto příkladu:
ShowColumns( Products, "Product" )
Tento vzorec vytváří tuto tabulku s jedním sloupcem:
Pro kratší alternativu zadejte Table.Column, který extrahuje tabulku s jedním sloupcem pouze Column z Table. Tento vzorec například poskytuje přesně stejný výsledek jako použití Zobrazit sloupce.
Products.Product
Vnořené záznamy
Záznamy vyjádříte pomocí složených závorek, které obsahují hodnoty pojmenovaných polí. První záznam v tabulce ze začátku tohoto tématu můžete například vyjádřit pomocí tohoto vzorce:
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
Vzorce také můžete vložit do jiných vzorců, jak uvádí tento příklad:
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
Záznamy můžete vnořit pomocí vnoření složených závorek, jako je tomu v tomto příkladu:
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
Názvy jednotlivých sloupců, které obsahují speciální znaky (třeba mezeru nebo středník), uzavřete do jednoduchých uvozovek. Pokud chcete v názvu sloupce použít jednoduchou uvozovku, uveďte ji dvakrát.
Všimněte si, že hodnota ve sloupci Price neobsahuje symbol měny, jako je znak dolaru. Toto formátování se použije až při zobrazení hodnoty.
Vložené tabulky
Tabulku můžete vytvořit pomocí funkce Table a sady záznamů. Tabulku ze začátku tohoto tématu můžete vyjádřit pomocí tohoto vzorce:
Table(
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 }
)
Tabulky můžete také vnořit:
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
Vložené tabulky hodnot
Tabulky s jedním sloupcem můžete vytvořit tak, že zadáte hodnoty do hranatých závorek. Výsledná tabulka má jeden sloupec, který nese název Value.
[ 1, 2, 3, 4 ]
je například ekvivalent pro Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )
a vrací tuto tabulku: