Funktionen ForAll

Gäller: Arbetsyteappar Datorflöden Modellbaserade appar Power Platform CLI

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. Använd funktionen With om du vill utvärdera formeln för en enskild post.

Använd funktionen Sequence med funktionen ForAll för att iterera baserat på ett antal.

Fälten för den post som bearbetas för närvarande är tillgängliga i formeln. Använd ThisRecord-operatorn eller referera bara till fälten med namn på samma sätt som med andra värden. As-operatorn kan också användas för att namnge posten som bearbetas, vilket kan göra att formeln blir lättare att förstå och göra kapslade poster tillgängliga. Mer information finns i exemplen nedan och i arbeta med postomfattning.

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 vara en tabell med en kolumn. Om resultatet av formeln är en post kommer den resulterande tabellen att innehålla poster med samma kolumner som resultatposten.

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 resultatet. Om returvärdet från ForAll inte används, som ofta är fallet med funktioner för datamodifieringar, kommer inte returvärdet att skapas och det blir inga resurs- eller orderproblem. 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 Power Apps 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

Det går inte att delegera funktionen när den används tillsammans med en datakälla. Endast den första delen av datakällan hämtas och sedan tillämpas funktionen. Resultatet kan inte representerar en fullständig överblick. En varning kan visas när du redigerar för att påminna dig om begränsningen och för att föreslå att du växlar till delegerbara alternativ när det är möjligt. Mer information finns i översikt över delegering.

Syntax

ForAll( Table, Formula )

  • Table – krävs. 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 rutordatakälla:

Exempel på rutor.

För att skapa den här datakällan som en samling anger du egenskapen OnSelect för en Button-kontroll till den här formeln, öppna förhandsgranskningsläge och 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. Exempel på Sqrt.
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. Exempel på kraft.

Använda en anslutning

I följande exempel används uttryckdatakälla:

Exempel på uttryck.

För att skapa den här datakällan som en samling anger du egenskapen OnSelect för en Button-kontroll till den här formeln, öppna förhandsgranskningsläge och 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 ditt program finns i artikeln 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"). Exempel med värde
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"). Exempel med värdet

Kopiera en tabell

Ibland behöver du filtrera, forma, sortera och manipulera data. Power Apps innehåller många funktioner för detta, t.ex Filter, AddColumns och Sort. Power Apps behandlar varje tabell som ett värde, vilket gör att det snabbt kan strömma genom formler och användas.

Du kanske vill göra en kopia av det här resultatet för senare användning eller flytta information från en datakälla till en annan. Power Apps 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 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 Produkterdatakällan:

Exempel på produktdatakälla.

För att skapa den här datakällan som en samling anger du egenskapen OnSelect för en Button-kontroll till den här formeln, öppna förhandsgranskningsläge och 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:

Exempel på derivattabell.

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:

// Table shaping on demand, no need for a copy of the result
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 Produkter kommer att utvärderas, vilket kan orsaka problem om tabellen är 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( NewOrder );
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 datakällan NewOrder för alla poster, vilket skulle kunna lägga till stora mängder data om vi fångar den.

Mappa tabell i en komponent

Visa Mapptabeller.