Beräknar värden och utför åtgärder för alla poster i en tabell.

Beskrivning

Funktionen ForAll utvärderar en formel för alla poster i en tabell. Formeln kan beräkna ett värde och/eller utföra åtgärder, som att t.ex. modifiera data eller arbeta med en anslutning.

Fält i en aktuella posten är tillgängliga i formeln. Du bara referera till dem med deras namn, precis som ett annat värde. Du kan också referera till kontrollegenskaper och andra värden i hela din app. Mer information finns i exemplen nedan och arbeta med postomfång.

Returvärde

Resultatet av varje formelutvärdering returneras i en tabell i samma ordning som indatatabellen.

Om resultatet av formeln är ett enstaka värde kommer den resulterande tabellen att en enda kolumntabell. Om resultatet av formeln är en post kommer den resulterande tabellen att innehålla poster med samma kolumner som resulterande posten.

Om resultatet av formeln är ett tomt värde kommer det inte att finnas någon post i resultattabellen för denna indatapost. I det här fallet kommer det att vara färre poster i resultattabellen än källtabellen.

Vidta åtgärder

Formeln kan inkludera funktioner som utför åtgärder, till exempel att modifiera poster i en datakälla med funktionerna Patch och Collect. Formeln kan även anropa metoder för anslutningar. Flera åtgärderna kan utföras per post med hjälp av ; operatorn. Du kan inte modifiera tabellen som omfattas av funktionen ForAll.

När du skriver din formel ska du tänka på att poster kan bearbetas i valfri ordning och, när detta är möjligt, parallellt. Den första posten i tabellen kan bearbetas efter den sista posten. Se till att undvika sorteringsberoenden. Därför kan du inte använda funktionerna UpdateContext, Clear och ClearCollect inom en ForAll-funktion eftersom de enkelt kan användas för att innehålla variabler som är sårbara för detta. Du kan använda Collect, men den ordning i vilken poster läggs till är odefinierad.

Flera funktioner som ändrar datakällor inklusive Collect, Remove och Update returnerar den ändrade datakällan som deras returvärde. Dessa returvärden kan vara stora och förbruka avsevärda resurser om de returneras för varje post i tabellen ForAll. Du kan också upptäcka att dessa returvärden inte är de du förväntade dig, eftersom ForAll kan köras parallellt och kan separera dessa funktioners sidoeffekter från att få deras resultat. Om returvärdet från ForAll inte används, som ofta är fallet med funktioner för datamodifieringar, kommer som tur är inte returvärdet att skapas och det blir inga resurs- eller sorteringsproblem. Men om du använder resultatet av en ForAll och en av funktionerna som returnerar en datakälla, tänk noga igenom hur du strukturerar resultatet och testa det först på mindre datauppsättningar.

Alternativ

Många funktioner i PowerApps kan bearbeta fler än ett värde i taget genom användning av en tabell med en kolumn. Till exempel kan funktionen Len bearbeta en tabell med textvärden och returnera en tabell med längder, på samma sätt som ForAll kan. Detta kan i många fall eliminera behovet av att använda ForAll, och kan vara mer effektivt och enklare att läsa.

Ett annat övervägande är att ForAll inte kan delegeras, medan andra funktioner kan detta, till exempel Filter.

Delegering

Dessa funktioner kan inte delegeras när de används med en datakälla. Det är endast den första delen av datakällan som hämtas. Därefter tillämpas funktionen. Resultatet kanske inte är helt representativt. En blå punkt visas vid redigeringen för att påminna dig om den här begränsningen och föreslå att du växlar till alternativ som kan delegeras där det är möjligt. Mer information finns i Översikt över delegering.

Syntax

ForAll( Table, Formula )

  • Table – obligatoriskt. Tabell som ska åtgärdas.
  • Formula – obligatoriskt. Formel som ska utvärderas för alla poster i Table.

Exempel

Beräkningar

I följande exempel används Squares datakälla:

För att skapa den här datakällan som en samling anges OnSelect-egenskap för en Button-kontroll till den här formeln, öppna förhandsgranskningsläge och klicka eller tryck sedan på knappen:

  • ClearCollect( Squares, [ "1", "4", "9" ] )
Formel Beskrivning Resultat
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
För alla poster i indatatabellen beräknas kvadratroten ur Value-kolumnen. Funktionen Sqrt kan även användas för en tabell med en kolumn, vilket gör det möjligt för att utföra det här exemplet utan att använda ForAll.
ForAll( Squares, Power( Value, 3 ) ) För alla poster i indatatabellen höjs Value-kolumnen till tredje potens. Funktionen Power stöder inte tabeller med en kolumn. Därför måste ForAll användas i detta fall.

Använda en anslutning

I följande exempel används Expressions datakälla:

För att skapa den här datakällan som en samling anges OnSelect-egenskap för en Button-kontroll till den här formeln, öppna förhandsgranskningsläge och klicka eller tryck sedan på knappen:

  • ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

Det här exemplet använder även en Microsoft Translator-anslutning. Mer information om hur lägger till den här anslutningen till din app finns i avsnittet hantera anslutningar.

Formel Beskrivning Resultat
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) För alla poster i Expressions-tabellen översätts innehållet i Value-kolumnen till spanska (förkortat "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) För alla poster i Expressions-tabellen översätts innehållet i Value-kolumnen till franska (förkortat "fr").

Kopiera en tabell

Ibland behöver du filtrera, forma, sortera och manipulera data. PowerApps tillhandahåller ett antal funktioner för att göra detta, till exempel Filter, AddColumns och Sort. PowerApps behandlar varje tabell som ett värde, vilket gör att det snabbt kan strömma genom formler och användas.

Ibland vill du göra en kopia av resultatet för senare användning. Eller så vill du flytta information från en datakälla till en annan. PowerApps tillhandahåller Collect-funktionen för kopiering av data.

Men innan du gör denna kopia bör du noga tänka efter om den verkligen behövs. Många situationer kan lösas genom att på begäran filtrera och forma den underliggande datakällan med hjälp av en formel. Vissa av nackdelarna med att göra en kopia är:

  • Två kopior av samma information betyder att en av dem kan bli osynkroniserad.
  • Att göra en kopia kan konsumera mycket dataminne, nätverksbandbredd och/eller tid.
  • För de flesta datakällor gäller att kopiering inte kan delegeras, vilket begränsar mängden data som kan flyttas.

I följande exempel används Products datakälla:

För att skapa den här datakällan som en samling anges OnSelect-egenskap för en Button-kontroll till den här formeln, öppna förhandsgranskningsläge och klicka eller tryck sedan på knappen:

  • ClearCollect( 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 } ) )

Vårt mål är att arbeta med en härledd tabell som endast innehåller de objekt där mer har begärts än vad som är tillgängligt och för vilka vi måste göra en beställning:

Vi kan utföra den här uppgiften på olika sätt, alla ger samma resultat men har olika för- och nackdelar.

Tabellformning på begäran

Gör inte denna kopia! Vi kan använda följande formel överallt där vi behöver:

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

En postomfattning skapas av funktionerna Filter och AddColumns för att utföra jämförelse- och subtraktionsåtgärderna med hjälp av 'Quantity Requested'- och 'Quantity Available'-fälten i varje post.

I det här exemplet kan funktionen Filter delegeras. Detta är viktigt eftersom den kan hitta alla produkter som uppfyller kriterierna, även om det är bara ett fåtal poster i en tabell innehållande miljoner. För tillfället kan inte ShowColumns och AddColumns delegeras, så det faktiska antalet produkter som behöver beställas kommer att vara begränsat. Den här metoden är bra om du vet att storleken på resultatet alltid kommer vara relativt litet.

Och eftersom vi inte gjorde en kopia finns det ingen ytterligare kopia av informationen som måste hanteras eller blir inaktuell.

ForAll på begäran

En annan metod är att använda funktionen ForAll för att ersätta de tabellformande funktionerna:

  • ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )

Den här formeln kanske är enklare för vissa att läsa och skriva.

Ingen del av ForAll kan delegeras. Endast den första delen av tabellen Products kommer att utvärderas, vilket kan orsaka problem om tabellen är mycket stor. Eftersom Filter kunde delegeras i det föregående exemplet, kan det fungera bättre vid stora datamängder.

Samla in resultatet

I vissa situationer kan en kopia av data krävas. Du kan behöva flytta information från en datakälla till en annan. I det här exemplet placeras beställningar via en NewOrder-tabell på ett leverantörssystem. För snabba användarinteraktioner kan du vilja cachelagra en lokal kopia av en tabell så att det inte blir någon serverfördröjning.

Vi använder samma tabellformning som i föregående två exempel, men vi fångar resultatet i en samling:

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

  • ClearCollect( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

ClearCollect och Collect kan inte delegeras. Ett resultat är att mängden data som kan flyttas på det här sättet därför är begränsat.

Samla inom ForAll

Slutligen kan vi utföra Collect direkt inom ForAll:

  • Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

Återigen kan funktionen ForAll inte delegeras just nu. Om din Products-tabell är stor kommer ForAll endast att se till den första uppsättningen med poster och vi kan missa vissa produkter som behöver beställas. Men den här metoden är bra för tabeller som vi vet förblir små.

Observera att vi inte fångar resultatet av ForAll. Collect-funktionens anrop som görs inom den returnerar NewOrder-datakällan för alla poster, vilket skulle kunna lägga till stora mängder data om vi fångar den.