Tabeller
Bemærk
Microsoft Power Fx er det nye navn til formelsproget for lærredapps. Vi arbejder på disse artikler, mens vi udtrækker sproget fra lærredapps, integrerer det i andre Microsoft Power Platform-produkter og gør det tilgængeligt som open source. Start med Microsoft Power Fx-oversigten for at få en introduktion til sproget.
I Microsoft Power Fx kan du skrive en formel, der giver adgang til oplysninger i Microsoft Excel, SharePoint, SQL Server og flere andre kilder, hvor data lagres i poster og tabeller. For at kunne arbejde effektivt med denne type data bør du gennemse de begreber, der ligger til grund for disse strukturer.
- En post indeholder en eller flere kategorier af oplysninger om en person, et sted eller en ting. En post kan for eksempel indeholde navnet, mailadressen og telefonnummeret på en enkelt kunde. Andre værktøjer refererer til en post som en "række" eller et "element".
- En tabel indeholder en eller flere poster, der indeholder de samme kategorier af oplysninger. En tabel kan f.eks. indeholde navnene, mailadresserne og telefonnumrene på 50 kunder.
Du kan oprette forskellige formler, der opfatter navnet på en tabel som et argument på samme måde som en formel i Excel bruger en eller flere cellereferencer som argumenter. Nogle formler i Power Fx returnerer en tabel, der afspejler de argumenter, som du angiver. Du kan f.eks. oprette en formel:
- for at opdatere en post i en tabel ved at angive denne tabel som et af flere argumenter for funktionen Patch.
- for at tilføje, fjerne og omdøbe kolonner i en tabel ved at angive en tabel som et argument for funktionen AddColumns, DropColumns eller RenameColumns. Ingen af disse funktioner ændrer den oprindelige tabel. Funktionen returnerer i stedet en anden tabel, der er baseret på de argumenter, som du angiver.
Hver post indeholder mindst én kategori af oplysninger om en person, et sted eller en ting. Ovenstående eksempel viser en post for hvert produkt (Chocolate (Chokolade), Bread (Brød) og Water (Vand)) og en kolonne for hver kategori af oplysninger (Price (Pris), Quantity on hand (Lager) og Quantity on Order (Antal, der er i bestilling)).
I en formel kan du henvise til en post i sig selv uden for konteksten af en tabel ved hjælp af krøllede klammeparenteser. Posten { Name: "Strawberries", Price: 7.99 } er f.eks. ikke tilknyttet en tabel. Bemærk, at feltnavne som f.eks Name (Navn) og Price (Pris) i dette eksempel ikke er omsluttet af dobbelte anførselstegn.
Et felt er en enkelt oplysning i en post. Du kan visualisere denne form for felt som en værdi i en kolonne for en bestemt post.
På samme måde som et kontrolelement refererer du til et felt i en post ved at bruge .-operatoren på posten. First(Products).Name returnerer f.eks. feltet Name (Navn) for den første post i tabellen Products (Produkter).
Et felt kan indeholde en anden post eller tabel, for eksempel det funktionen GroupBy viser. Du kan indlejre lige så mange niveauer af poster og tabeller, som du vil.
En kolonne henviser til det samme felt for en eller flere poster i en tabel. I ovenstående eksempel har hvert produkt et prisfelt, og den pris er i den samme kolonne for alle produkter. Ovenstående tabel har fire kolonner, der vises vandret øverst:
- Navn
- Pris
- Antal på lager
- Antal på bestilling
Kolonnens navn afspejler felterne i den pågældende kolonne.
Alle værdier i en kolonne er af samme datatype. I ovenstående eksempel indeholder kolonnen "Salgsklar mængde" altid et tal og må ikke indeholde en streng som f.eks "12 enheder" for en post. Værdien i et felt kan også være tom.
Du kan have henvist til kolonner som "felter" i andre værktøjer.
En tabel består af en eller flere poster, hver med flere felter, som har ensartede navne på tværs af posterne.
Alle tabeller, der er gemt i en datakilde eller en samling, har et navn, som du kan bruge til at henvise til tabellen og sende dem til funktioner, der bruger tabeller som argumenter. Tabeller kan også være resultatet af en funktion eller formel.
Som det fremgår af følgende eksempel, kan du udtrykke en tabel i en formel ved hjælp af funktionen Table med et sæt poster, som du sætter i krøllede klammeparenteser:
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
Du kan også definere en tabel med en enkelt kolonne tabel med kantede parenteser. En tilsvarende måde at skrive ovenstående på:
[ "Strawberry", "Vanilla" ]
I Excel og Power Fx kan du bruge formler til at manipulere med tal og tekststrenge på samme måde:
- Skriv en værdi i Excel, f.eks. 42 i celle A1, og skriv derefter en formel, f.eks. A1+2 i en anden celle for at få vist værdien 44.
- I Power Apps skal du angive egenskaben Default for Slider1 til 42 og angive egenskaben Text for en etiket til Slider1.Value + 2 for at få vist værdien 44.
I begge tilfælde ændres den beregnede værdi automatisk, hvis du ændrer værdierne for argumenterne (for eksempel tallet i celle A1 eller værdien af Slider1).
På samme måde kan du bruge formler til at få adgang til og manipulere data i tabeller og poster. Du kan bruge navnene på tabeller som argumenter i nogle formler, f.eks. Min(Catalog, Price) for at få vist den laveste værdi i kolonnen Price (Pris) i tabellen Catalog (Katalog). Andre formler indeholder hele tabeller som returværdier, f.eks. RenameColumns(Catalog, "Price", "Cost"), som returnerer alle poster fra tabellen Catalog (Katalog), men ændrer navnet på kolonnen Price (Pris) til Cost (Omkostninger).
Ligesom med tal genberegnes formler, der omfatter tabeller og poster automatisk, når den underliggende tabel eller post ændres. Hvis omkostningen for et produkt i tabellen Catalog (Katalog) reduceres til under den tidligere minimumværdi, ændres returværdien for formlen Min automatisk, så den passer til værdien.
Overvej funktionen Lower. Hvis variablen welcome indeholder tekststrengen "Hello, World", vil formlen Lower( welcome ) returnere "Hello, World". Denne funktion kan på ingen måde ændre værdien i den pågældende variabel. Lavere er en ren funktion, idet den kun behandler input og producerer output. Det er det hele. Der er ingen andre effekter. Alle funktioner i Excel og de fleste funktioner i Power Fx er rene funktioner, så projektmappen eller appen kan genberegnes automatisk.
Power Fx indeholder en række funktioner, der fungerer på samme måde for tabeller. Disse funktioner tager tabeller som input og filtrerer, sorterer, transformerer og opsummerer hele datatabeller. Faktisk kan Lower og mange andre funktioner, der som regel tager en enkelt værdi, også bruge en tabel med en enkelt kolonne som input.
Mange funktioner bruger en tabel med en enkelt kolonne som input. Hvis en hel tabel kun har én kolonne, kan du angive den efter navn. Hvis en tabel har flere kolonner, kan du angive en af disse kolonner ved hjælp af syntaksen Table.Column. Products.Name returnerer f.eks. kun tabellen med én kolonne med værdier for Name (Navn) i tabellen Products (Produkter).
Du kan omforme en tabel fuldstændigt, men du skal gøre det ved at bruge funktionen AddColumns, RenameColumns, ShowColumns eller DropColumns. Disse funktioner ændrer igen kun deres output og ikke deres kilde.
Andre funktioner er specifikt udviklet til at ændre data og have andre effekter. Da disse funktioner ikke er rene, skal du bygge dem omhyggeligt, og de kan ikke deltage i automatisk genberegning af værdier i appen. Du kan kun bruge disse funktioner i formler for funktionsmåde.
Nogle funktioner fungerer ved at evaluere en formel separat på tværs af alle posterne i en tabel. Formlens resultat bruges på forskellige måder:
- AddColumns - Formel angiver værdien af det tilføjede felt.
- Gennemsnit,Maks.,Min .,Sum,StdevP,VarP - Formlen giver den værdi, der skal aggregeres.
- Filter,Opslag - Formlen bestemmer, om posten skal medtages i outputtet.
- Sammenkædning - Formlen bestemmer de strenge, der skal sammenkædes.
- Distinkt – Formlen returnerer en værdi, der bruges til at identificere dublerede poster.
- ForAll - Formula kan returnere en hvilken som helst værdi, muligvis med bivirkninger.
- Sortér - Formlen giver den værdi, posterne skal sorteres efter.
- Med - Formlen kan returnere en hvilken som helst værdi, eventuelt med bivirkninger.
I disse formler kan du henvise til felterne for den post, der behandles. Hver af disse funktioner opretter et "postområde", hvor formlen evalueres, og hvor felterne i posten fås som id'er på øverste niveau. Du kan også referere til kontrolelementers egenskaber og andre værdier via appen.
Du kan f.eks. bruge en tabel over produkter, der er placeret i en global variabel:
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 }
)
)
For at finde ud af om der er blevet bestilt flere af disse produkter, end der er på lager:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
Det første argument, der hvor du skal bruge funktionen Filter, er den tabel med poster, der skal bearbejdes, og det andet argument er en formel. Filter opretter et postområde til evaluering af denne formel, hvor felterne for hver post er tilgængelige, i dette tilfælde Produkt, Anmodet antal ogDisponibelt antal. Resultatet af sammenligningen bestemmer, om hver post skal medtages i resultatet af funktionen:
Lad os bygge videre på eksemplet og beregne, hvor meget af hvert produkt vi skal bestille:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
Her føjer vi en beregnet kolonne til resultatet. AddColumns har sit eget postområde, som bruges til at beregne forskellen mellem det, der er blevet anmodet om, og det, der er tilgængeligt.
Endelig kan vi reducere resultattabellen til de ønskede kolonner:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Bemærk, at vi bruger dobbelte anførselstegn (") nogle steder og et enkelt anførselstegn (') andre steder. Enkelte anførselstegn er påkrævede, når der refereres til værdien af et objekt, f.eks et felt eller en tabel, hvor navnet på objektet indeholder et mellemrum. Dobbelte anførselstegn benyttes, når vi ikke refererer til værdien af et objekt, men i stedet taler om det, især i situationer, hvor objektet endnu ikke findes, hvilket er tilfældet med AddColumns.
De feltnavne, der tilføjes sammen med postområdet, tilsidesætter de samme navne fra andre steder i appen. Når det sker, kan du stadig få adgang til værdier uden for postområdet med operatoren @ fjernelse af flertydige udtryk:
- Du kan få adgang til værdier fra indlejrede postområder ved at bruge operatoren @ sammen med navnet på den tabel, der arbejdes på, ved hjælp af mønsteret:
Tabel[@FieldName] - Du kan få adgang til globale værdier, som f.eks. datakilder, samlinger og kontekstvariabler, ved at bruge mønsteret [@ObjectName] (uden en tabelangivelse).
Hvis den tabel, der arbejdes med, er et udtryk som f.eks. Filter(Tabel, ... ), kan operatoren til fjernelse af flertydige udtryk ikke benyttes. Det er kun det inderste postområde, der kan få adgang til felter fra dette tabeludtryk ved ikke at bruge operatoren til fjernelse af flertydige udtryk.
Forestil dig, at du f.eks. har en samling X:
Du kan oprette denne samling med ClearCollect( X, [1, 2] ).
Og en anden samling Y:
Du kan oprette denne samling med ClearCollect( Y, ["A", "B"] ).
Derudover skal du definere en kontekstvariabel ved navn Value (Værdi) med denne formel: UpdateContext( {Value: "!"} )
Lad os samle det hele. I denne sammenhæng giver følgende formel:
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
denne tabel:
Hvad foregår der her? Den yderste funktion ForAll definerer et postområde for X, der giver adgang til feltet Value (Værdi) for hver post, når de behandles. Der kan opnås adgang til feltet ved blot at bruge ordet Value eller ved hjælp af X[@Value].
Den inderste funktion ForAll definerer et andet postområde for Y. Da der også er defineret et Value-felt for denne tabel , refererer brugen af Value her til feltet i posten for Y og ikke længere for X. Her skal du bruge den længere version sammen med operatoren for fjernelse af flertydige udtryk, hvis du vil have adgang til feltet Value i posten for X.
Eftersom Y er det inderste postområde, kræver adgang til felter i denne tabel ikke fjernelse af flertydige udtryk, hvilket gør det muligt at benytte denne formel med det samme resultat:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
Alle postområder af typen ForAll tilsidesætter det globale område. Kontekstvariablen Value, som vi definerede, er ikke tilgængelig efter navn uden operatoren til fjernelse af flertydige udtryk. Hvis du vil have adgang til denne værdi, skal du bruge [@Value].
Opdel gruppe samkopierer resultatet, fordi indlejrede ForAll-funktioner resulterer i en indlejret resultattabel.
Hvis du vil udføre handlinger på en enkelt kolonne i en tabel, skal du bruge funktionen ShowColumns som i dette eksempel:
ShowColumns( Products, "Product" )
Denne formel opretter denne tabel med én kolonne:
Du kan få et kortere alternativ ved at angive Table.Column, der udtrækker tabellen med en enkelt kolonne kun med Column fra Table. Denne formel giver f.eks. det samme resultat som ved brug af ShowColumns.
Products.Product
Du udtrykker poster ved hjælp af krøllede klammeparenteser, som indeholder navngivne feltværdier. Du kan for eksempel udtrykke den første post i tabellen i begyndelsen af dette emne med følgende formel:
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
Du kan også integrere formler i andre formler, som dette eksempel viser:
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
Du kan indlejre poster ved at indlejre krøllede klammeparenteser, som dette eksempel viser:
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
Sæt hvert kolonnenavn, der indeholder et specialtegn, f.eks. et mellemrum eller et kolon, i enkelte anførselstegn. Hvis du vil bruge et enkelt anførselstegn inden for et kolonnenavn, skal du fordoble det.
Bemærk, at værdien i kolonnen Price (Pris) ikke omfatter et valutasymbol, f.eks. et dollartegn. Denne formatering anvendes, når værdien vises.
Du kan oprette en tabel ved hjælp funktionen Table og et sæt poster. Du kan udtrykke tabellen i begyndelsen af dette emne ved hjælp af følgende formel:
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 }
)
Du kan også indlejre tabeller:
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
Du kan oprette tabeller med én kolonne ved at angive værdier i kantede parenteser. Den resulterende tabel har en enkelt kolonne med navnet Value.
F.eks. er [ 1, 2, 3, 4 ]
ækvivalent med Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )
og returnerer denne tabel: