Tabeller
Obs
Microsoft Power Fx är det nya namnet på formelspråket för arbetsyteappar. Dessa artiklar är ett arbete som pågår när vi extraherar språket från program, integrerar det med andra Microsoft Power Platform produkter och gör det tillgängligt som öppen källkod. Börja med Microsoft Power Fx översikten för en introduktion till språket.
I Microsoft Power Fx, kan du skriva en formel som ger åtkomst till information i Microsoft Excel, SharePoint, SQL Server och flera andra resurser som lagrar data i poster och tabeller. Om du vill arbeta så effektivt som möjligt med den här typen av data, så är det viktigt att du studerar de begrepp som ligger bakom dessa strukturer.
- En post innehåller en eller flera typer av information om en person, en plats eller en sak. En post kan t.ex. innehålla en kunds namn, e-postadress och telefonnummer. Andra verktyg kan referera till en post som en "rad" eller ett "objekt".
- En tabell innehåller en eller flera poster som innehåller samma informationskategorier. En tabell kan t.ex. innehålla namn, e-postadress och telefonnummer för 50 kunder.
Du kan skapa flera olika formler som använder ett tabellnamn som argument, precis som en formel i Excel kan använda en eller flera cellreferenser som argument. Vissa formler i Power Fx returnerar en tabell som visar de övriga argument som du anger. Du kan t.ex. skapa en formel:
- för att uppdatera en post i en tabell genom att ange tabellen som en av flera argument för funktionen Patch
- för att lägga till, ta bort och byta namn på kolumner i en tabell genom att ange den tabellen som argument för funktionen AddColumns, DropColumns eller RenameColumns. Ingen av dessa funktioner påverkar den ursprungliga tabellen. I stället returnerar funktionen en annan tabell utifrån de argument som du anger.
Tabellelement
Poster
Varje post innehåller minst en informationskategori för en person, plats eller sak. I exemplet ovan visas en post för varje produkt (Chocolate, Bread, och Water) och en kolumn för varje informationskategori (Price, Quantity on Hand och Quantity on Order).
I en formel kan du referera till en post i sig, utanför tabellens kontext, genom att använda klammerparenteser. Exempel: posten { Name: "Strawberries", Price: 7.99 } är inte kopplad till någon tabell. Observera att fältnamn som namn och pris i det här exemplet är inte angivna inom dubbla citattecken.
Fält
Ett fält är en självständig informationsdel del i en post. Du kan visualisera den här typen av fält som ett värde i en viss posts kolumn.
Precis som när det gäller kontroller måste du referera till en posts fält med hjälp av .operator i posten. Exempel: First(Products).Name returnerar fältet Name för den första posten i tabellen Products.
Ett fält kan innehålla en annan post eller tabell, så som visas i exemplet med funktionen GroupBy. Du kan kapsla så många post- och tabellnivåer du vill.
Kolumner
En kolumn refererar till samma fält för en eller flera poster i en tabell. I exemplet ovan har varje produkt ett fält för pris, och det priset finns i samma kolumn för alla produkter. Tabellen ovan innehåller fyra kolumner, som visas vågrätt högst upp:
- Namn
- Pris
- Antal i lager
- Antal på beställning
Kolumnens namn indikerar innehållet i kolumnens fält.
Alla värden i en kolumn har samma datatyp. I exemplet ovan innehåller kolumnen Quantity on Hand alltid ett tal, och ingen av dess poster kan innehålla någon sträng, som t.ex. "12 units". Värdet i ett fält kan även vara tomt.
Du är kanske van från andra verktyg av att kalla kolumner för fält.
Tabell
En tabell består av en eller flera poster, som var och en innehåller flera fält som har enhetliga namn för alla poster.
En tabell som lagras i en datakälla eller en samling har ett namn som du använder när du refererar till tabellen och vidarebefordrar detta till funktioner som använder tabeller som argument. Tabeller kan också vara resultatet av en funktion eller en formel.
Som du ser av följande exempel kan du uttrycka en tabell i en formel genom att använda funktionen Table med en uppsättning poster som du anger mellan klammerparenteser:
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
Du kan även definiera en enkolumnstabell med hakparenteser. Ett annat sätt att skriva detta på är:
[ "Strawberry", "Vanilla" ]
Tabellformler
I Excel och Power Fx använder kan du använda formler för att ändra tal och textsträngar på liknande sätt:
- Skriv ett värde i Excel, t.ex. 42, i cell A1, och skriv sedan en formel som A1 + 2 i en annan cell, så att värdet 44 visas.
- I Power Apps, ange egenskapen Default för Slider1 till 42 och ange egenskapen Text för en etikett till Slider1.Value + 2 så visas värdet 44.
I båda fallen ändras det beräknade värdet automatiskt om du ändrar argumentens värden (t.ex. talet i cell A1 eller värdet för Slider1).
På samma sätt kan du använda formler för att få åtkomst till och hantera data i tabeller och poster. Du kan använda namn på tabeller som argument i vissa formler, t.ex. Min(Catalog, Price) om du vill visa det lägsta värdet i kolumnen Price i tabellen Catalog. Andra formler tillhandahåller hela tabeller som returvärden, t.ex. RenameColumns(Catalog, "Price", "Cost"), som returnerar alla poster från tabellen Catalog, men som ändrar namnet på kolumnen Price till Cost.
Precis som när det gäller tal så räknas formler som inbegriper tabeller automatiskt om när den underliggande tabellen eller de underliggande posterna ändras. Om kostnaden för en produkt i tabellen Catalog sjunker under tidigare minimivärde, så ändras returvärdet för formeln Min automatiskt så att det matchar kostnaden.
Tabellfunktioner och kontrollegenskaper
Tänk på funktionen Lower. Om variabeln welcome innehåller text strängen "Hello, World", returnerar formeln Lower( welcome ) och "hello, world". Funktionen fungerar inte på något sätt. Ändra värdet i den variabeln. Lower är en ren funktion i det att den bara bearbetar indata och producerar utdata. Det är allt; den har inga sidoeffekter. Alla funktioner i Excel och de flesta funktioner i Power Fx är rena funktioner som gör att arbetsboken eller programmet automatiskt kan beräknas om.
Power Fx tillhandahåller en uppsättning funktioner som fungerar på tabeller på samma sätt. Med de här funktionerna kan tabeller vara ingångs- och filter, sortera, transformera, minska och sammanfatta hela datatabeller. I själva verket kan Lower och många andra funktioner som vanligtvis ta ett enda värde kan också ta en tabell med en kolumn som ingång.
Många funktioner har en tabell med en kolumn som indata. Om en hel tabell endast innehåller en kolumn kan du ange den efter namn. Om en tabell har flera kolumner kan du ange en av dessa kolumner genom att använda Table.Column-syntax. Till exempel returnerar Products.Name tabellen med en kolumn endast namn-värden från tabellen produkter.
Du kan helt omforma en tabell hur du vill genom att använda funktionen AddColumns, RenameColumns, ShowColumns eller DropColumns. De här funktionerna ändrar endast utdata och inte deras källor.
Beteendeformler
Andra funktioner har utformats speciellt för att ändra data och ha sidoeffekter. Eftersom de här funktionerna inte är rena måste du skapa dem försiktigt och de kan inte delta i omberäkning av värden automatiskt i appen. Du kan använda dessa funktioner i beteendeformler.
Registrera omfång
Vissa funktioner utvärderar en formel för alla poster i en tabell individuellt. Formelns resultat används på olika sätt:
- AddColumns - Formel ger värdet för det tillagda fältet.
- Genomsnitt, Max, Min, Summa, StdevP, VarP - Formeln ger det värde som ska aggregeras.
- Filter, Lookup - Formel avgör om posten ska inkluderas i utdata.
- Concat - Formeln avgör vilka strängar som ska sammanfogas.
- Distinkt - Formel returnerar ett värde som används för att identifiera dubblettposter.
- ForAll - Formeln kan returnera vilket värde som helst, eventuellt med biverkningar.
- Sortera - Formel ger värdet att sortera posterna efter.
- With - Formeln kan returnera vilket värde som helst, eventuellt med biverkningar.
I de här formlerna kan du referera till fälten i den post som bearbetas. Var och en av de här funktionerna skapar ett ”postområde” där formeln utvärderas och där postens fält är tillgängliga som identifierare på toppnivå. Du kan också referera till kontrollegenskaper och andra värden från hela ditt program.
Ta till exempel en tabell över Produkter som är placerade i en global:
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 }
)
)
Om du vill fastställa om någon av dessa produkter har efterfrågats mer än vad som finns tillgängligt så gör du så här:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
Det första argumentet som ska filtreras är tabellen med de poster som ska bearbetas, och det andra argumentet är en formel. Filter skapar ett postomfång för utvärdering av den här formeln där fälten för varje post är tillgängliga, i det här fallet Produkt, Begärd kvantitet och Tillgänglig kvantitet. Resultatet av jämförelsen avgör om alla poster ska tas med i funktionens resultat:
Dessutom kan vi beräkna hur mycket av varje produkt som ska beställas:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
Här vi lägger till en beräknad kolumn till resultatet. AddColumns har ett eget postomfång som används för att beräkna skillnaden mellan vad som har begärts och vad som är tillgängligt.
Slutligen kan vi begränsa resultattabellen till enbart de kolumner vi är intresserade av:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Observera att vi används dubbla citattecken (") på vissa ställen ovan och enkla citattecken (') på andra. Enkla citattecken krävs när du refererar till ett objekts värde, t.ex. ett fält eller en tabell, i vilket objektets namn innehåller ett blanksteg. Dubbla citattecken används när vi inte refererar ett objekts värde, men istället talar om det, i synnerhet i situationer i vilka objektet ännu inte finns, som i fallet med AddColumns.
Disambiguering
Fältnamn som lagts till med postområdet åsidosätter samma namn från andra ställen i appen. När det händer så kan du fortfarande komma åt värden från utanför omfattningsposten med @ disambigueringsoperatorn:
- Om du vill komma åt värden från kapslade postområden använder du operatorn @ med namnet på den tabell som bearbetas, och med hjälp av följande mönster:
Tabell[@FieldName] - Om du vill komma åt globala värden, som datakällor, samlingar och kontextvariabler, använder du mönstret [@ObjectName] (utan tabellbeteckning).
Om den tabell som åtgärden utförs på är ett uttryck, t.ex. Filter(Table, ... ), så kan inte någon disambigueringsoperator användas. Endast det innersta postområdet har åtkomst till fält från det här tabelluttrycket genom att inte använda disambigueringsoperatorn.
Låt oss använda samlingen X som exempel:
Du kan skapa den här samlingen med ClearCollect( X, [1, 2] ).
Och så har vi samlingen Y:
Du kan skapa den här samlingen med ClearCollect(Y, ["A", "B"]).
Dessutom kan definiera en kontextvariabel med namnet Value med följande formel: UpdateContext( {Value: "!"} )
Låt oss lägga ihop dem. I det här sammanhanget använder vi då följande formel:
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
ger den här tabellen:
Vad är det som sker här? Den yttersta ForAll-funktionen definierar ett postområde för X, vilket tillåter åtkomst till Value-fältet för varje post som bearbetas. Du kan få åtkomst till helt enkelt genom att använda ordet Value eller genom att använda X[@Value].
Den innersta ForAll funktionen definierar en annan postomfattning för Y. Eftersom det också finns ett fält för Value definierat kommer användning av Value här referera till fältet i posten Y och inte längre den från X. Om du vill få tillgång till X's Value-fältet måste vi använda den längre versionen med disambigueringsoperatorn.
Eftersom Y är det innersta postområdet, så kräver åtkomst till fält i den här tabellen inte någon disambiguering, vilket innebär att vi kan använda den här formeln med samma resultat:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
Alla ForAll-postområdena åsidosätter det globala området. Den Value-kontextvariabel som vi definierade är inte tillgänglig via namn utan disambigueringsoperatorn. För åtkomst till detta värde, använd [@Value].
Dela upp grupp plattar ut resultatet eftersom kapslade ForAll-funktioner resulterar i en kapslad resultattabell.
Tabeller med en kolumn
Om du vill använda en enskild kolumn från en tabell använder du ShowColumns-funktionen på samma sätt som i det här exemplet:
ShowColumns( Products, "Product" )
Med den här formeln skapas tabellen med en kolumn:
Om du vill ha ett kortare alternativ anger Table.Column, som extraherar tabellen med en kolumn i endast Column från Table. Med den här formeln skapas till exempel exakt samma resultat som när du använder ShowColumns.
Products.Product
Infogade poster
Du uttrycker poster med hjälp av klammerparenteser som innehåller namngivna fältvärden. Du kan t.ex. uttrycka den första posten i tabellen i början av det här avsnittet genom att använda följande formel:
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
Du kan också bädda in formler i andra formler, så som visas i detta exempel:
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
Du kan kapsla poster genom att kapsla klammerparenteser, så som visas i detta exempel:
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
Omsluter varje kolumnnamn som innehåller specialtecken, t.ex. ett blanksteg eller ett kolon med enkla citattecken. Om du vill använda ett enkelt citattecken i ett kolumnnamn, så dubblera det.
Observera att värdet i kolumnen Price inte innehåller någon valutasymbol, t.ex. dollartecken. Den formateringen tillämpas när värdet visas.
Infogade tabeller
Du kan skapa en tabell med hjälp av Table-funktionen och en uppsättning poster. Du kan uttrycka tabellen i början av det här avsnittet genom att använda följande 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 även kapsla tabeller:
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
Infogade värdetabeller
Du kan skapa enkolumnstabeller genom att ange värden inom hakparentes. Den resulterande tabellen har en kolumn med namnet Value.
Till exempel [ 1, 2, 3, 4 ]
är lika med Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )
och returnerar följande tabell: