Táblák

Feljegyzés

A Microsoft Power Fx a vászonalapú alkalmazások képletnyelvének új neve. Ezek a cikkek még nem véglegesek; miközben kinyerjük a vászonalapú alkalmazás nyelvét, integráljuk más Microsoft Power Platform-termékekkel, és nyílt forráskódúként elérhetővé tesszük. A nyelv megismeréséhez először olvassa el A Microsoft Power Fx áttekintése című cikket.

A Microsoft Power Fx szolgáltatásban írhatók olyan képletek, amelyekkel hozzáférhet a Microsoft Excel, a SharePoint és az SQL Server adataihoz, illetve számos olyan forrás adatához, amely rekordokban és táblákban tárolja az adatokat. Annak érdekében, hogy az ilyen adatokkal a leghatékonyabban tudjon dolgozni, érdemes áttekinteni azokat a fogalmakat, amelyek fontosak az ilyen adatstruktúrákban.

  • Egy rekord egy vagy több kategóriába tartozó információt tárol például személyekről, helyekről vagy tárgyakról. Így egy rekord tartalmazhatja például egy meghatározott felhasználó nevét, e-mail-címét és telefonszámát. Előfordulhat, hogy más források és eszközök a rekordokat „sor” vagy „tétel” néven említik.
  • Egy tábla egy vagy több olyan rekordot tartalmaz, amelyek mind ugyanolyan kategóriájú információt tárolnak. Így például egy táblában tárolható 50 ügyfél neve, e-mail-címe és telefonszáma.

Sokféle képletet hozhat létre, amelyek argumentumként egy tábla nevét kérik ahhoz hasonlóan, ahogy az Excelben hozhat létre olyan képleteket, amelyek argumentuma egy vagy több cellára való hivatkozás lehet. A Power Fxben használhatók olyan képletek is, amelyek egy másik argumentumhoz használható táblát adnak vissza. Képletek hozhatók létre többek között az alábbi feladatokra:

  • egy táblázat rekordjának frissítése úgy, hogy az adott táblát a Patch függvény egyik argumentumaként adja meg
  • egy tábla oszlopainak hozzáadása, eltávolítása vagy átnevezése úgy, hogy a táblát az AddColumns (oszlopok hozzáadása), a DropColumns (oszlopok törlése) vagy a RenameColumns (oszlopok átnevezése) függvény argumentumaként adja meg. Ezek közül egyik függvény sem módosítja az eredeti táblát, hanem a megadott argumentumok alapján egy új táblát ad vissza.

A tábla elemei

A táblázat elemei.

Rekordok

Minden rekord legalább egy információtípust tartalmaz egy személyről, egy helyről vagy egy tárgyról. A fenti példában egy olyan rekord látható, amelyben van egy-egy rekord minden termékhez (Chocolate – csokoládé, Bread – kenyér, valamint Water – víz), és egy-egy oszlop tartozik minden információkategóriához (Price – ár, Quantity on Hand – rendelkezésre álló mennyiség, valamint Quantity on Order – megrendelt mennyiség).

Képletekben egy rekordra hivatkozni önmagában, a tábla kontextusán kívül kapcsos zárójelek használatával lehet. Ez a rekord például nem hivatkozik táblára: { Name: "Strawberries", Price: 7.99 }. Vegye figyelembe, hogy a mezőnevek, mint a példában szereplő Name (Név) és Price (Ár), nem kerülnek idézőjelek közé.

Mezők

A mező egy rekordon belüli önálló információegység. A mező úgy is elképzelhető, mint egy adott rekord oszlopának értéke.

A vezérlőkhöz hasonlatosan a rekordok mezőire is a rekord .operátorával lehet hivatkozni. Például a First(Products).Name a Products tábla első (First = első) rekordjának Name mezőjét adja vissza.

Egy mező tartalmazhat egy újabb rekordot vagy táblát is, ahogy az a GroupBy függvénynél is látható. A rekordok és táblák egymásba ágyazása korlátlanul folytatható.

Oszlopok

Az oszlop egy táblázat egy vagy több rekordjának ugyanazon mezőjére utal. A fenti példában minden termékhez tartozik egy „price” (ár) mező, amely minden termék esetében ugyanabban az oszlopban található. A fenti példában szereplő táblának négy oszlopa van, amelyek vízszintesen a tábla tetején láthatóak:

  • Név
  • Ár
  • Meglévő mennyiség
  • Megrendelt mennyiség

Az oszlop neve az oszlopban található mező neve is egyben.

Egy oszlopban minden érték ugyanabba az adattípusba tartozik. A fenti példában a „Quantity on Hand” (Elérhető mennyiség) oszlop minden esetben számot tartalmaz, és egyetlen rekordnál sem tartalmazhat sztringet, pl. „12 darab”. Bármely mező rendelkezhet blank, azaz üres értékkel is.

Az oszlopokat más eszközökben „field” vagy „mező” néven is ismerheti.

Tábla

Egy tábla egy vagy több rekordot tartalmaz, amelyekben több mező található, és a mezőnevek minden rekord esetében változatlanok.

Az adatforrásokban vagy gyűjteményekben tárolt táblák mindig rendelkeznek névvel is, amelyet függvények argumentumaként megadva az adott táblára hivatkozhat. Táblát függvények és képletek is adhatnak eredményül.

Ahogy az alábbi példában látható, képletben a Table függvény használatával is megadható táblázat, amelynek értékeit kapcsos zárójelek közé kell tenni:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Egyoszlopos táblát szögletes zárójelek között is lehet definiálni: A fentivel megegyező eredményt adja az alábbi:

[ "Strawberry", "Vanilla" ]

Táblaképletek

Az Excelben és a Power Fxben hasonlóképpen használhatóak a képletek számok és sztringet tartalmazó szövegek kezelésére:

  • Az Excelben beírhatja például a 42 értéket az A1 cellába, majd egy másik cellába beírhatja például az A1+2 képletet, ami a 44 értéket jeleníti meg.
  • A Power Appsben ugyanez így végezhető el: állítsa a Csúszka1 vezérlő Default (alapértelmezett) tulajdonságát 42 értékre, majd egy címke Text tulajdonságát állítsa Slider1.Value + 2 értékre, így az a 44 értéket fogja megjeleníteni.

A kiszámított érték mindkét esetben automatikusan megváltozik, ha az argumentumok értéke (például az A1 cellában lévő szám, vagy a Csúszka1 értéke) megváltozik.

Képleteket ehhez hasonlóan arra is használhat, hogy táblák adatait vagy rekordjait érje el vagy módosítsa. Egyes képletekben a táblanevek argumentumként is használhatóak, így például a Min(Catalog, Price) a Catalog tábla Price (ár) oszlopának legalacsonyabb értékét mutatja meg. Olyan képletek is vannak, amelyek teljes táblát adnak visszatérési értékként. Ilyen többek között a RenameColumns(Catalog, "Price", "Cost"), amely a Catalog tábla minden rekordját visszaadja, de a Price (ár) oszlop nevét Cost (költség) névre változtatja.

Ahogy azt a számoknál is láttuk, a táblákat és a rekordokat érintő képletek automatikusan frissülnek, ha az érintett tábla rekordjai megváltoznak. Ha a Catalog táblában szereplő egyik termék ára alacsonyabbá válik, mint a korábban visszaadott minimum érték, akkor a Min képlet automatikusan tükrözi majd ezt a változást.

Táblafüggvények és vezérlőelem-tulajdonságok

Fontolja meg a Lower függvény használatát. Ha az üdvözöljük változó a "Helló, világ" szöveges karakterláncot tartalmazza, akkor a Lower (üdvözöljük) függvény "helló, világ" értéket ad vissza. Ez a funkció semmilyen módon nem változtatja meg az adott változó értékét. A Lower egy olyan tiszta függvény, amely csak bemenetet dolgoz fel és kimenetet állít elő. Ez minden; nincs mellékhatása. Az Excel alkalmazás összes függvénye, és a Power Fx legtöbb függvénye tiszta függvény, amelyek lehetővé teszik a munkafüzet vagy az alkalmazás automatikus újraszámítását.

A Power Fx a táblákat azonos módon kezelő függvények halmazát nyújtja. Ezek a függvények bemenetként táblázatokat használnak, és adatok teljes táblázatait szűrik, rendezik, alakítják át, csökkentik és összegzik. Valójában a Lower és sok más függvény, amely általában egyetlen értéket használ fel, egyoszlopos táblázatot is felhasználhatnak bemenetként.

Számos függvény bemeneti adatként egy oszlopos táblázatot tartalmaz. Ha egy teljes táblának csak egy oszlopa van, akkor név szerint megadhatja azt. Ha egy táblának több oszlopa van, akkor adja meg az oszlopok egyikét a Table.Column szintaxis használatával. A Products.Namepéldául a Termékek táblázatból csak az Név értékek egyoszlopos táblázatát adja eredményül.

Az AddColumns, RenameColumns, ShowColumns vagy DropColumns függvény használatával teljes mértékben átalakíthatja a táblázatot. Ismét, ezek a függvények csak a kimenetüket változtatják meg, nem a forrásukat.

Viselkedési képletek

Az egyéb függvények kifejezetten az adatok módosítására szolgálnak, és mellékhatásokkal rendelkeznek. Mivel ezek a függvények nem tiszták, körültekintően kell felépíteni őket, és nem vehetnek részt az alkalmazásban szereplő értékek automatikus újraszámításában. Ezek a függvények csak viselkedésszabályozó képletekben használhatók.

Rekordhatókör

Bizonyos függvények a képletet egy adott tábla minden egyes rekordjára vonatkozólag kiértékelik. A képlet eredménye különféle módon használható:

  • AddColumns - A képlet tartalmazza a hozzáadott mező értékét.
  • Average, Max, Min, Sum, StdevP, VarP - A képlet tartalmazza az összesítendő értékeket.
  • Filter, Lookup - A képlet határozza meg, hogy a rekord része legyen-e a kimenetnek.
  • Concat - A képlet határozza meg, mely sztringeket kell összefűzni.
  • Distinct - A képlet egy olyan értékkel tér vissza, amellyel duplikátumrekordok azonosíthatók.
  • ForAll - A képlet bármilyen értékkel vissza tud térni, esetleg valamilyen mellékhatással.
  • Sort - A képlet tartalmazza a rekordok sorba rendezéséhez használt értéket.
  • With - A képlet bármilyen értékkel vissza tud térni, esetleg valamilyen mellékhatással.

Ezekben a képletekben hivatkozhat a feldolgozandó rekord mezőire. Ezek közül minden függvény létrehoz egy „rekordhatókört”, amelyben a képlet kiértékelése történik, ahol a rekord mezői felső szintű azonosítókként érhetőek el. Az alkalmazás egészéből hivatkozhatók vezérlőtulajdonságok és további értékek is.

Tegyük fel például, hogy egy globális változóban elhelyezett Termékek táblázatát veszi fel:

Kért táblázatok.

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

Az alábbi módon lehet megállapítani, hogy van-e olyan termék, amelyből több a rendelés, mint amennyi rendelkezésre áll belőle:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

A Filter (Szűrés) első argumentuma az a tábla, amely a megfelelő rekordokat tartalmazza, a második argumentum pedig egy képlet. A Filter olyan rekordhatókört hoz létre ennek a képletnek a kiértékeléséhez, amelyben minden rekord mezője elérhető – ebben az esetben a Product, a Quantity Requested és a Quantity Available mezők. Az összehasonlítás eredménye minden egyes rekord esetén meghatározza, hogy az adott rekord bekerüljön-e a függvény eredményébe:

Szükséges táblázatok.

Ugyanezt a példát kibővíthetjük úgy, hogy azt is megmutassa, mennyit kell rendelni az egyes termékekből:

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

Itt egy számított oszlopot adunk hozzá az eredményhez. Az AddColumns saját rekordhatókörrel rendelkezik, amelyet ahhoz használ, hogy kiszámítsa a rendelkezésre álló készlet és a rendelések közötti különbséget.

Adjon hozzá oszlopokat.

Végül szűkíthetjük az eredménytáblát úgy, hogy csak a szükséges oszlopokat tartalmazza:

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Csak rendelésre.

Figyelje meg, hogy a fenti példákban néhol idézőjeleket ("), máshol pedig félidézőjelet (') használtunk. A félidézőjel akkor szükséges, amikor egy objektum olyan értékére, például mezőre vagy táblára hivatkozunk, amelyben az objektum neve szóközt tartalmaz. A dupla idézőjellel nem hivatkozunk objektum értékére, hanem említjük azt, különösen is ha az objektum maga még nem is létezik, mint például az AddColumns esetén.

Egyértelműsítés

A rekordra vonatkozó hatókörrel felvett mezőnevek felülbírálják az alkalmazásban máshol előforduló azonos neveket. Ilyenkor a @ egyértelműsítő operátorral továbbra is elérhetők a rekord hatókörén kívüli értékek:

  • A rekordra vonatkozó beágyazott hatókörök értékeit a @ operátor és a műveleti tábla nevének együttes használatával érheti el. Használandó minta:
    Tábla[@MezőNév]
  • A globális értékek (például adatforrások, gyűjtemények és környezeti változók) elérésére használja a következő mintát: [@ObjektumNév] (tábla megadása nélkül).

Ha a művelettel megcélzott tábla kifejezés, például Filter(Tábla, ... ), akkor az egyértelműsítő operátor nem használható. Ebben a táblában csak a legbelső rekordhatókör tud hozzáférni a mezőkhöz az egyértelműsítő operátor használata nélkül.

Tegyük fel például, hogy van egy X gyűjteményünk:

X érték.

Ezt a gyűjteményt így lehet létrehozni: ClearCollect( X, [1, 2] ).

Vegyen fel egy újabb gyűjteményt Y néven:

Y érték.

Ehhez használja ezt a képletet: ClearCollect( Y, ["A", "B"] ).

Definiáljon még meg egy Value nevű változót ezzel a képlettel: UpdateContext( {Value: "!"} )

Nézzük most meg összességében. Ebben a kontextusban ez a képlet:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

ezt a táblát eredményezi:

XY érték.

Vajon mi történt? A legkülső ForAll függvény meghatározza az X rekordhatókörét, így hozzáférhetővé válik minden egyes rekord Value nevű mezője a feldolgozás során. A hozzáférés egyszerűen a Value szó vagy az X[@Value] használatával történik.

A legbelső ForAll függvény egy másik, Y rekordhatókört határoz meg. Mivel ez a tábla szintén tartalmaz egy definiált Value mezőt, az itt használt Value az Y rekordján belüli mezőre hivatkozik, és nem az X-ére. Ha itt szeretnénk hozzáférni az X-hez tartozó Value mezőhöz, akkor az egyértelműsítő operátort tartalmazó hosszabb változatot kell használnunk.

Mivel az Y a legbelső rekordhatókör, ennek a táblának a mezői egyértelműsítés nélkül is elérhetőek, így használhatjuk ezt a képletet ugyanazzal az eredménnyel:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

A ForAll rekordhatókörei mindig felülírják a globális hatókört. A definiált Value környezeti változó az egyértelműsítő operátor használata nélkül nem érhető el. Az érték eléréséhez használja a [@Value] elemet.

Az Ungroup egybesimítja az eredményt, mivel a beágyazott ForAll függvények beágyazott eredménytáblát eredményeznek.

Egyoszlopos táblák

Ha egy tábla egyetlen oszlopán szeretne dolgozni, használja a ShowColumns függvényt az ebben a példában megadott módon:

ShowColumns( Products, "Product" )

Ez a képlet ezt az egyoszlopos táblázatot állítja elő:

Egyetlen oszlop.

Rövidebb alternatíva érdekében adja meg a Table.Column elemet, amely kinyeri a csak Oszlop egyoszlopos táblázatot a Táblázat elemből. Ez a képlet például pontosan ugyanazt az eredményt adja, mint a ShowColumns használata.

Products.Product

Belső rekordok

A rekordokat kapcsos zárójelek közé kell tenni, amelyben a mezők nevei és értékei szerepelnek. A témakör elején szereplő tábla első rekordját az alábbi képlettel lehet kifejezni:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Képleteket más képletekbe is be lehet ágyazni, ahogy az alábbi példában látható:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

A rekordokat beágyazni a kapcsos zárójelek beágyazásával lehet, ahogy az alábbi példában látható:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Minden olyan oszlopnevet, amely speciális karaktereket (például szóközt vagy kettőspontot) tartalmaz, egyszeres idézőjelek közé kell tenni. Ha az oszlopnévben egyszeres idézőjelet (aposztrófot) szeretne használni, akkor duplán kell írni az egyszeres idézőjelet.

Figyelje meg, hogy a Price (Ár) oszlopban található értékek nem tartalmaznak pénznem (például dollár) jelet. Ezt a formázást az érték megjelenítésénél lehet elvégezni.

Belső táblázatok

Táblát a Table függvénnyel és rekordok megadásával hozhat létre. A témakör elején szereplő tábla az alábbi képlettel fejezhető ki:

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

Táblákat be is lehet ágyazni:

Table( 
	{ Name: "Chocolate", 
	  'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
	                             { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
	}
)

Belső értéktáblázatok

Egyetlen oszlopot tartalmazó táblát úgy hozhat létre, hogy szögletes zárójelek között adja meg az értékeket. Az eredményül kapott táblának egyetlen, Value nevű oszlopa van.

Például az [ 1, 2, 3, 4 ] megegyezik a Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) elemmel, és a következő táblázatot adja vissza:

Beágyazott táblázat.