Tabellen
Notitie
Microsoft Power Fx is de nieuwe naam voor de formuletaal van canvas-apps. Aan deze artikelen wordt gewerkt terwijl we de taal extraheren uit canvas-apps en deze integreren met andere Microsoft Power Platform-producten en het beschikbaar maken als open source. Begin met het Microsoft Power Fx-overzicht voor een inleiding in de taal.
In Microsoft Power Fx kunt u een formule schrijven die toegang geeft tot informatie in Microsoft Excel, SharePoint, SQL Server en verschillende andere bronnen die gegevens in records en tabellen opslaan. Om zo efficiënt mogelijk met dit soort gegevens te werken, moet u de concepten doornemen die ten grondslag liggen aan deze structuren.
- Een record bevat een of meer informatiecategorieën over een persoon, een plaats of een object. Een record kan bijvoorbeeld de naam, het e-mailadres en het telefoonnummer van één klant bevatten. Andere hulpprogramma's verwijzen naar een record als een 'rij' of een 'item'.
- Een tabel bevat een of meer records met dezelfde informatiecategorieën. Een tabel kan bijvoorbeeld de namen, de e-mailadressen en de telefoonnummers van 50 klanten bevatten.
Net zoals een formule in Excel een of meer celverwijzingen als argumenten heeft, kunt u verschillende formules maken die de naam van een tabel als een argument hebben. Sommige formules in Power Fx retourneren een tabel die de andere argumenten die u opgeeft, weerspiegelen. U maakt bijvoorbeeld een formule:
- om een record in een tabel bij te werken door deze tabel op te geven als een van meerdere argumenten voor de functie Patch
- om kolommen in een tabel toe te voegen, te verwijderen en de naam te wijzigen door deze tabel op te geven als een argument voor de functie AddColumns, DropColumns of RenameColumns. Geen van deze functies wijzigt de oorspronkelijke tabel. In plaats daarvan retourneert de functie een andere tabel op basis van de andere argumenten die u hebt opgegeven.
Elke record bevat ten minste één informatiecategorie voor een persoon, een plaats of een object. In het bovenstaande voorbeeld ziet u een record voor elk product (Chocolade, Brood en Water) en een kolom voor elke informatiecategorie (Prijs, Hoeveelheid in voorraad en Hoeveelheid in bestelling).
In een formule kunt u naar een record zelf verwijzen, buiten de context van een tabel, met behulp van accolades. Deze record { Naam: "Aardbeien", Prijs: 7,99 } is bijvoorbeeld niet gekoppeld aan een tabel. Houd er rekening mee dat veldnamen zoals Naam en Prijs (in dit voorbeeld) niet tussen dubbele aanhalingstekens komen te staan.
Een veld is een individueel gedeelte met informatie in een record. U kunt een dergelijk veld visualiseren als een waarde in een kolom voor een bepaalde record.
Net als met een besturingselement verwijst u naar een veld van een record met behulp van de --operator in de record. Zo retourneert bijvoorbeeld First(Products).Name het veld Naam voor de eerste record in de tabel Producten.
Een veld kan een andere record of tabel bevatten, zoals het voorbeeld voor de functie GroupBy weergeeft. U kunt zoveel niveaus van records en tabellen nesten als u wilt.
Een kolom verwijst naar hetzelfde veld voor een of meer records in een tabel. In het bovenstaande voorbeeld heeft elk product een prijsveld en die prijs bevindt zich in dezelfde kolom voor alle producten. De bovenstaande tabel heeft vier kolommen. Deze zijn bovenaan horizontaal weergegeven:
- Naam
- Prijs
- hoeveelheid op voorraad
- hoeveelheid op bestelling
De naam van de kolom geeft de velden in die kolom weer.
Alle waarden in een kolom zijn van hetzelfde gegevenstype. In het bovenstaande voorbeeld bevat de kolom 'Hoeveelheid in voorraad' altijd een getal en kan deze geen tekenreeks, zoals '12 eenheden', bevatten voor één record. De waarde van een willekeurig veld kan tevens leeg zijn.
In andere hulpprogramma's hebt u kolommen mogelijk 'velden' genoemd.
Een tabel bestaat uit een of meer records, elk met meerdere velden met consistente namen tussen de records.
Een tabel die in een gegevensbron of een verzameling is opgeslagen, heeft een naam. Deze gebruikt u om naar de tabel te verwijzen en deze door te geven aan functies die tabellen als argumenten hebben. Tabellen kunnen ook het resultaat zijn van een functie of een formule.
U kunt een tabel in een formule uitdrukken met behulp van de functie Table met een set records, die u tussen accolades zet, zoals in het volgende voorbeeld:
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
U kunt ook een tabel met één kolom definiëren met vierkante haken. U kunt het bovenstaande ook als volgt opschrijven:
[ "Strawberry", "Vanilla" ]
In Excel en Power Fx gebruikt u formules om getallen en tekstreeksen op vergelijkbare wijze te bewerken:
- Typ in Excel een waarde, zoals 42 in cel A1. Typ vervolgens een formule, zoals A1+2 in een andere cel om de waarde 44 weer te geven.
- In Power Apps stelt u de eigenschap Default van Slider1 in op 42 en stelt u de eigenschap Text van een label in op Slider1.Value + 2 om de waarde 44 weer te geven.
In beide gevallen wordt de berekende waarde automatisch gewijzigd als u de waarden van de argumenten wijzigt (bijvoorbeeld het getal in cel A1 of de waarde van Slider1).
Op vergelijkbare wijze kunt u formules gebruiken om gegevens in tabellen en records te openen en te bewerken. U kunt namen van tabellen gebruiken als argumenten in sommige formules, zoals Min(Catalog, Price) om de laagste waarde in de kolom Prijs van de tabel Catalogus weer te geven. Andere formules bieden hele tabellen als retourwaarden, zoals RenameColumns(Catalogus, "Prijs", "Kosten"), die alle records uit de tabel Catalogus retourneert, maar de naam van de kolom Prijs in Kosten wijzigt.
Net zoals met getallen worden formules die betrekking hebben op tabellen en records automatisch opnieuw berekend als de onderliggende tabel of record wordt gewijzigd. Als de kosten van een product in de tabel Catalogus onder het vorige minimum worden verlaagd, wordt de geretourneerde waarde van de formule Min automatisch gewijzigd, zodat deze hiermee overeenkomt.
Houd rekening met de functie Lower. Als de variabele welkom de tekenreeks "Hallo Wereld" bevat, geeft de formule Lower( welkom ) de waarde "hallo wereld" als resultaat. Deze functie verandert op geen enkele manier de waarde in die variabele. Lower is een zuivere functie in die zin dat het alleen invoer verwerkt en uitvoer produceert. Dat is alles; er zijn geen bijwerkingen. Alle functies in Excel en de meeste functies in Power Fx zijn pure functies, waarmee de werkmap of de app automatisch opnieuw kan worden berekend.
Power Fx biedt een reeks functies die op dezelfde manier op tabellen werken. Deze functies nemen tabellen als invoer en filteren, sorteren, transformeren, verminderen en vatten volledige tabellen met gegevens samen. Het is zelfs zo dat Lower en vele andere functies die doorgaans een enkele waarde hebben, ook een tabel met één kolom als invoer kunnen gebruiken.
Veel functies gebruiken een tabel met één kolom als invoer. Als een hele tabel maar één kolom heeft, kunt u deze bij naam specificeren. Als een tabel meerdere kolommen heeft, kunt u een van die kolommen specificeren met Table.Column-syntaxis. Zo retourneert products.Name de tabel met één kolom van alleen waarden Naam van de tabel Producten.
U kunt een tabel volledig opnieuw vormgeven zoals u wilt door de functie AddColumns, RenameColumns, ShowColumns of DropColumns te gebruiken. Nogmaals, deze functies veranderen alleen hun uitvoer, niet hun bron.
Andere functies zijn speciaal ontworpen om gegevens te wijzigen en hebben bijwerkingen. Omdat deze functies niet puur zijn, moet u ze zorgvuldig bouwen en kunnen ze niet deelnemen aan het automatisch herberekenen van waarden in de app. U kunt deze functies alleen gebruiken binnen gedragsformules.
Sommige functies worden uitgevoerd door een formule te evalueren voor alle records van een tabel afzonderlijk. Het resultaat van de formule wordt op verschillende manieren gebruikt:
- AddColumns - Formule geeft de waarde van het toegevoegde veld.
- Gemiddelde, Max, Min, Som, StdevP, VarP - De formule geeft de waarde die moet worden samengevoegd.
- Filter, Opzoeken - Formule bepaalt of de record in de uitvoer moet worden opgenomen.
- Concat - Formule die bepaalt welke strings aan elkaar gekoppeld moeten worden.
- Distinct - Formule retourneert een waarde die wordt gebruikt om dubbele records te identificeren.
- ForAll - Formule kan elke waarde retourneren, mogelijk met bijwerkingen.
- Sorteren - De formule geeft de waarde aan waarop de records moeten worden gesorteerd.
- Met - Formule kan elke waarde retourneren, mogelijk met bijwerkingen.
In deze formules kunt u verwijzen naar de velden van de record die wordt verwerkt. Elk van deze functies maakt een 'recordbereik' waarin de formule wordt geëvalueerd, waarbij de velden van de record beschikbaar zijn als id's op het hoogste niveau. U kunt in de app ook naar eigenschappen en andere waarden van de besturingselementen verwijzen.
Neem bijvoorbeeld een tabel met Producten die geplaatst zijn in een globale variabele:
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 }
)
)
Als u wilt bepalen of er meer naar een van deze producten is gevraagd dan er beschikbaar is:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
Het eerste argument van Filter is de tabel met records waarop de bewerking wordt toegepast en het tweede argument is een formule. Filter maakt een recordbereik voor het evalueren van deze formule waarin de velden van elk record beschikbaar zijn, in dit geval product, Gevraagde hoeveelheid en Beschikbare hoeveelheid. Het resultaat van de vergelijking bepaalt of elke record moet worden opgenomen in het resultaat van de functie:
Met betrekking tot dit voorbeeld kunnen we berekenen hoeveel we van elk product moeten bestellen:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
Hier voegen we een berekende kolom toe aan het resultaat. AddColumns heeft een eigen recordbereik dat wordt gebruikt om het verschil te berekenen tussen wat is aangevraagd en wat beschikbaar is.
Ten slotte kunnen we de resultaattabel beperken tot alleen de gewenste kolommen:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Houd er rekening mee dat we in het bovenstaande voorbeeld op sommige plekken dubbele aanhalingstekens (") hebben gebruikt en op andere plekken enkele aanhalingstekens ('). Enkele aanhalingstekens zijn vereist wanneer u verwijst naar de waarde van een object, zoals een veld of tabel, waarin de naam van het object een spatie bevat. Dubbele aanhalingstekens worden gebruikt wanneer er niet naar de waarde van een object wordt verwezen, maar wanneer erover wordt gepraat, met name in situaties waarin het object nog niet bestaat, zoals het geval is met AddColumns.
Veldnamen waarbij het recordbereik is toegevoegd, overschrijven dezelfde namen elders in de app. Als dit gebeurt, kunt u nog steeds toegang krijgen tot waarden buiten het recordbereik met de operator voor @ ondubbelzinnigheid:
- Als u toegang wilt krijgen tot waarden van geneste recordbereiken, gebruikt u de operator @ met de naam van de tabel die wordt bewerkt met behulp van dit patroon:
Tabel[@Veldnaam] - Als u toegang wilt krijgen tot globale waarden, zoals gegevensbronnen, verzamelingen en contextvariabelen, gebruikt u het patroon [@Objectnaam] (zonder een tabelaanduiding).
Als de tabel die wordt bewerkt een expressie is, zoals een Filter(Table, ... ), kan de operator voor ondubbelzinnigheid niet worden gebruikt. Alleen het binnenste recordbereik kan velden openen vanuit deze tabelexpressie door de operator voor ondubbelzinnigheid niet te gebruiken.
Stelt u zich bijvoorbeeld een verzameling X voor:
U kunt deze verzameling maken met ClearCollect( X, [1, 2] ).
En een andere verzameling Y:
U kunt deze verzameling maken met ClearCollect( Y, ["A", "B"] ).
Definieer daarnaast een contextvariabele met de naam Waarde met deze formule: UpdateContext( {Waarde: "!"} )
Laten we alles combineren. In deze context produceert de volgende formule:
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
de volgende tabel:
Wat is hier aan de hand? De buitenste functie ForAll definieert een recordbereik voor X, waardoor er toegang tot het veld Waarde van elke record mogelijk is, terwijl deze wordt verwerkt. Met behulp van het woord Waarde of met X[@Waarde] kan deze worden geopend.
De binnenste functie ForAll definieert een ander recordbereik voor Y. Aangezien deze tabel ook een veld Waarde heeft gedefinieerd, waarbij Waarde hier verwijst naar het veld in de record van Y en niet langer in die van X. Als we hier toegang willen krijgen tot het veld Waarde van X, moeten we de langere versie gebruiken met de ondubbelzinnige operator.
Aangezien Y het binnenste recordbereik is, vereist toegang tot de velden van deze tabel geen ondubbelzinnigheid, zodat we de volgende formule met hetzelfde resultaat kunnen gebruiken:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
Alle recordbereiken ForAll overschrijven het globale bereik. De contextvariabele Waarde die we hebben gedefinieerd, is niet beschikbaar op naam zonder de operator voor ondubbelzinnigheid. Gebruik [@Waarde] voor toegang tot deze waarde.
Met Ungroup wordt het resultaat afgeplat, omdat geneste ForAll functies resulteren in een geneste resultaattabel.
Gebruik de functie ShowColumns zoals in dit voorbeeld om op een enkele kolom van een tabel te werken:
ShowColumns( Products, "Product" )
Deze formule produceert deze tabel met één kolom:
Specificeer voor een korter alternatief Table.Column, waarmee de tabel met één kolom van alleen Kolom wordt geëxtraheerd van Tabel. Deze formule levert bijvoorbeeld exact hetzelfde resultaat op als het gebruik van ShowColumns.
Products.Product
U drukt records uit met behulp van accolades die veldwaarden met een naam bevatten. U kunt bijvoorbeeld de eerste record in de tabel aan het begin van dit onderwerp uitdrukken met de volgende formule:
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
U kunt ook formules in andere formules insluiten, zoals het onderstaande voorbeeld weergeeft:
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
U kunt records nesten door accolades te nesten, zoals het volgende voorbeeld weergeeft:
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
Sluit elke kolomnaam die een speciaal teken bevat, zoals een spatie of een dubbele punt, in met enkele aanhalingstekens. Als u een enkel aanhalingsteken in een kolomnaam wilt gebruiken, moet u deze verdubbelen.
Houd er rekening mee dat de waarde in de kolom Prijs geen valutasymbool bevat, zoals een dollarteken. Die opmaak wordt toegepast wanneer de waarde wordt weergegeven.
U kunt een tabel maken met de functie Table en een set records. U kunt de tabel aan het begin van dit onderwerp uitdrukken met de volgende formule:
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 }
)
U kunt ook tabellen nesten:
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
U kunt tabellen met één kolom maken door waarden op te geven tussen vierkante haken. De resulterende tabel heeft één kolom met de naam Waarde.
Zo is bijvoorbeeld [ 1, 2, 3, 4 ]
equivalent aan Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )
en retourneert deze tabel: