Du kan skapa en app med åtkomst till information i Microsoft Excel, SharePoint, SQL Server och flera andra källor 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.

I din app använder du formler för att skapa, uppdatera och ändra poster och tabeller. Du kommer förmodligen att läsa och skriva data till en extern datakälla, i form av en utökad tabell. Dessutom kan du skapa en eller flera interna tabeller, vilka kallas samlingar.

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 PowerApps 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.

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:

  • Name
  • Price
  • Quantity on Hand
  • Quantity on Order

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.

Obs! För SharePoint- och Excel-datakällor som innehåller kolumnnamn med blanksteg ersätter PowerApps blankstegen med ”_x0020_”. Till exempel visas "Kolumnens namn" i SharePoint eller Excel som "Kolumnens_x0020_namn" i PowerApps när det visas i datalayouten eller används i en formel.

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 tabellfunktionen 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 PowerApps 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.
  • Ställ in egenskapen Default för Slider142 i PowerApps, och ställ in 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.

Låt oss se på några enkla exempel.

  1. Lägg till en textgallerikontroll och ställ in dess egenskap Items på namnet på en tabell.

    Galleriet visar som standard platshållartext från tabellen TextualGallerySample. Galleriets egenskap Items ställs automatiskt in på den tabellen.

    OBS! Vissa kontroller har ordnats om och förstorats för tydlighetens skull.

  2. I stället för att ställa in egenskapen Items till namnet på en tabell, så kan du ställa in den på en formel som inkluderar tabellens namn som ett argument, så som i följande exempel:
    Sort(TextualGallerySample, Heading, Descending)

    Den här formeln innehåller funktionen Sort, vilken har namnet på en tabell som sitt första argument och namnet på en kolumn i den tabellen som sitt andra argument. Funktionen stöder även ett valfritt tredje argument som anger att du vill sortera data i fallande ordning.

  3. Ställ in egenskapen Items så att den använder formeln från föregående steg som argument och returnerar en tabell, så som i följande exempel:
    FirstN(Sort(TextualGallerySample, Heading, Descending), 2)

    I den här formeln använder du funktionen FirstN för att visa ett visst antal poster i en tabell. Du använder funktionen Sort som det första argumentet för FirstN och ett tal (i det här fallet 2) som det andra argumentet, vilket anger hur många poster som ska visas.

    Hela formeln returnerar en tabell som innehåller de två första posterna för tabellen TextualGallerySample, sorterad efter kolumnen Heading i fallande ordning.

Tabellfunktioner och kontrollegenskaper

Många funktioner i PowerApps använder namnet på en tabell som argument, skapar en andra tabell som innehåller samma data, hanterar den nya tabellen med de andra argumenten och returnerar sedan resultatet. Dessa funktioner påverkar inte den ursprungliga tabellen – den fungerar enbart som datakälla.

  • Sort, Filter - Sorterar och filtrerar poster.
  • FirstN, LastN – Returnerar de första N eller sista N posterna i tabellen.
  • Abs, Sqrt, Round, RoundUp, RoundDown - Aritmetiska åtgärder på varje post i en enkolumnstabell som resulterar i en enkolumnstabell med resultat.
  • Left, Mid, Right, Replace, Substitute, Trim, Lower, Upper, Proper - Stränghantering för varje post i en enkolumnstabell som resulterar i en enkolumnstabell med strängar.
  • Len – Returnerar för en kolumn med strängar en enkolumnstabell som innehåller längden för varje sträng.
  • Concatenate – Sammanfogar flera kolumner med strängar, vilket resulterar i en enkolumnstabell med strängar.
  • AddColumns, DropColumns, RenameColumns, ShowColumns – Kolumnhantering av tabellen, vilket resulterar i en ny tabell med olika kolumner.
  • Distinct – Tar bort dubblettposter.
  • Shuffle – Flyttar runt poster i slumpmässig ordning.
  • HashTags - Söker efter hashtaggar i en sträng.
  • Errors – Tillhandahåller felinformation när du arbetar med en datakälla.

Du kan köra en funktion på en tabell som innehåller flera kolumner, även om funktionen kräver en kolumn som argument. Om du vill extrahera en kolumn från en tabell med flera kolumner, så använd funktionen ShowColumns som argument för den funktion som du vill använda, så som i följande exempel:
Lower(ShowColumns(Products, "Name"))

Den här formeln skapar en enkolumnstabell som innehåller alla data från kolumnen Name i tabellen Products, men den konverterar versaler till gemener. Om du anger en tabell som argument för funktionen AddColumns, RenameColumns eller DropColumns, så kan du helt omforma tabellen precis som du vill.

Om du anger en datakälla som argument för någon av dessa funktioner, så ändrar den posterna i den datakällan och returnerar vanligtvis datakällans nya värden som en tabell.

Följande kontroller har egenskaper som är tabeller:

  • Items – Gäller för gallerier och listrutor. Tabell som visas i galleriet.
  • SelectedItems – Gäller för listrutor. Tabell med objekt som användaren har valt.

Registrera formler

Du kan också skapa en formel som beräknar data för en enskild post, använder en enskild post som argument och tillhandahåller en enskild post som returvärde. Låt oss gå tillbaka till galleriexemplet ovan och använda egenskapen Gallery1.Selected för att visa information från vilken post som helst i galleriet som användaren väljer.

  1. Lägg till en knapp och ge dess egenskap OnSelect egenskapen följande formel:
    Collect(SelectedRecord, Gallery1.Selected)
  2. Om knappen inte har valts, markerar du den genom att klicka på den, och klicka sedan på den en gång till för att köra formeln.
  3. Välj SamlingarArkiv-menyn.

Den här formeln returnerar en post som inte bara innehåller data från den markerade posten, utan även från alla kontroller i galleriet. Posten innehåller t.ex. både en Body-kolumn som matchar Body-kolumn i den ursprungliga tabellen, och en Body1-kolumn, som representerar den etikett som visar data från den kolumnen. Markera tabellikonen i Body1-kolumnen om du vill öka detaljnivån för dessa data.

Nu när du har den valda posten kan du extrahera enskilda fält från den med . -operatorn.

  1. Gå tillbaka till standardarbetsytan genom att trycka på Esc och lägg sedan till en etikett under galleriet.

  2. Ställ in etikettens egenskap Text på den här formeln:
    Gallery.Selected.Heading

Du har valt egenskapen Selected, som är en post, och sedan extraherat egenskapen Heading från den.

Du kan också använda en post som en generell behållare för relaterade namngivna värden.

  • Om du bygger en formel runt funktionerna UpdateContext och Navigate, så använd en post för att samla in de kontextvariabler som du vill uppdatera.
  • Använd egenskapen Updates på en formulärredigeringskontroll om du vill samla in de ändringar som har gjorts av användaren i ett formulär.
  • Använd Patch-funktionen om du vill uppdatera en datakälla, men du kan även använda den om du vill sammanfoga poster.

I dessa fall har posterna aldrig ingått i någon tabell.

Postfunktioner och kontrollegenskaper

Funktioner som returnerar poster:

  • FirstN, LastN – Returnerar den eller de första posterna i tabellen.
  • Lookup – Returnerar den första posten från en tabell som matchar ett eller flera kriterier.
  • Patch – Uppdaterar en datakälla eller sammanfogar poster.
  • Defaults – Returnerar standardvärden för en datakälla.

Egenskaper som returnerar poster:

  • Selected – Gäller för gallerier och listrutor. Returnerar den för tillfället markerade posten.
  • Updates – Gäller för gallerier. Sammanställer alla ändringar som en användare gör i ett formulär för inmatning av data.
  • Update – Gäller för indatakontroller, t.ex. textinmatningskontroller och skjutreglage. Konfigurerar enskilda egenskaper för galleriet så att de samverkar.

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:

  • Filter, Lookup – Formeln anger om posten ska tas med i resultatet.
  • Sort – Formeln tillhandahåller det värde som posterna ska sorteras efter.
  • Concat – Formeln avgör vilka strängar som ska sammanfogas.
  • ForAll – Formeln kan returnera vilket värde som helst, eventuellt med en biverkning.
  • Distinct – Formeln returnerar ett värde som används för att identifiera dubblettposter.
  • AddColumns – Formeln innehåller värdet för det fält som har lagts till.
  • Average, Max, Min, Sum, StdevP, VarP – Formeln tillhandahåller de värden som ska sättas samman.

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 i hela din app.

Låt oss t.ex. ta en tabell med Products:

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. Med Filter skapar du ett postområde för att kunna utvärdera den här formeln i vilken fälten för respektive post är tillgängliga. I det här fallet rör det sig om Product, Quantity Requested och Quantity Available. 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 sitt eget postområde 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 postområdet med @disambigueringsoperatorn:

  • Om du vill komma åt värden från kapslade postområden använder du operatorn @ med namnet på den tabellen som bearbetas, och med hjälp av mönstret Table[@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 postområdet för Y. Eftersom den här tabellen har också ett definierat Value-fält, så refererar användningen av Value här till fältet i Y-posten och inte till det från X. Om du vill få åtkomst till Value-fältet för X här måste du 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 att få åtkomst till det här värdet måste vi använda [@Value].

Ungroup plattar ut resultatet, eftersom kapslade ForAll-funktioner resulterar i en kapslad resultattabell.

Infogad syntax

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.

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

Värdetabeller

Du kan skapa enkolumnstabeller genom att ange värden inom hakparentes. Den resulterande tabellen har en kolumn med namnet Value.

Exempel: [1, 2, 3, 4] motsvarar Table({Value: 1}, {Value: 2}, {Value: 3}, {Value: 4}) och returnerar följande tabell: