Funktionen ForAll

Gælder for: Lærredsapps Skrivebordsflows Modeldrevne apps Power Platform CLI

Beregner værdier og udfører handlinger for alle posterne i en tabel.

Beskrivelse

Funktionen ForAll evaluerer en formel for alle posterne i en tabel. Formlen kan beregne en værdi/udføre handlinger, f.eks. ændre data eller arbejde med en forbindelse. Brug With-funktionen til at evaluere formlen for en enkelt post.

Brug Sequence-funktionen sammen med ForAll-funktionen til at gentage baseret på en tælling.

Felter i den post, der behandles i øjeblikket, er tilgængelige i formlen. Brug ThisRecord-operatoren, eller referer blot til feltet med navn, som du ville gøre med en vilkårlig anden værdi. As-operatoren kan også bruges til at navngive den post, der behandles, hvilket kan hjælpe med at gøre din formel mere forståelig og gøre indlejrede poster tilgængelige. Du kan få flere oplysninger i eksemplerne nedenfor og arbejdet med posternes omfang.

Returværdi

Resultatet af hver formelevaluering returneres i en tabel i samme rækkefølge som i inputtabellen.

Hvis resultatet af formlen er en enkelt værdi, vil den returnerede tabel indeholde én kolonne. Hvis resultatet af formlen er en post, indeholder den returnerede tabel med de samme kolonner som resultatposten.

Hvis resultatet af formlen er værdien blank, er der ingen post i den returnerede tabel for den inputpost. I det tilfælde vil der være færre poster i den returnerede tabel end i kildetabellen.

Udfør en handling

Formlen kan indeholde funktioner, der udfører en handling, f.eks. ændre posterne i en datakilde ved hjælp af funktionerne Patch og Collect. Formlen kan også foretage kald til metoder på forbindelser. Der kan udføres flere handlinger pr. post ved hjælp af operatoren ;. Du kan ikke ændre den tabel, som funktionen ForAll køres mod.

Når du skriver formlen, skal du huske på, at poster kan behandles i enhver rækkefølge, og at de kan blive behandlet parallelt, når det er muligt. Den første post i tabellen kan derfor bliver behandlet efter den sidste post.

Undgå derfor elementer, som er afhængige af rækkefølgen. Du kan derfor ikke bruge funktionerne UpdateContext, Clear og ClearCollect i funktionen ForAll, da de nemt kan bruges til at indeholde variabler, der vil blive påvirket af dette. Du kan bruge Collect, men den rækkefølge, som posterne tilføjes i, kan ikke defineres.

Flere af de funktioner, der ændrer datakilder, herunder Collect, Remove og Update, returnerer den ændrede datakilde som returværdi. Returværdierne kan være store og lægge beslag på mange ressourcer, hvis de returneres for alle poster i den tabel, som ForAll bruges mod. Du kan også komme ud for, at du ikke får de forventede returværdier, da ForAll kan køre parallelt og derfor kan medføre, at disse funktioner ikke får noget resultat. Hvis returværdien fra ForAll ikke skal bruges, hvilke ofte er tilfældet med de funktioner, der ændrer data, oprettes der ikke nogen returværdi, og der vil derfor ikke være nogen problemer i forhold til ressourceforbrug og rækkefølge. Hvis du bruger resultatet af en ForAll og en af de funktioner, der returnerer en datakilde, skal du overveje, hvordan du strukturerer resultatet og først afprøve det på små datasæt.

Alternativer

Mange funktioner i Power Apps kan behandle flere værdier på én gang ved hjælp af en tabel med én kolonne. Funktionen Len kan f.eks. behandle en tabel med tekstværdier og returnere en tabel med længdeværdier på samme måde som funktionen ForAll. Det kan i mange tilfælde fjerne behovet for at bruge ForAll, det kan være mere effektivt, og det kan være nemmere at læse koden.

Husk også på, at ForAll ikke kan delegeres, selvom nogle andre funktioner kan, f.eks. Filter.

Delegering

Denne funktion kan ikke uddelegeres, når den bruges med en datakilde. Kun den første del af datakilden hentes, og derefter vil funktionen blive anvendt. Resultatet repræsenterer muligvis ikke hele historien. Der vises muligvis en advarsel på oprettelsestidspunktet for at minde dig om denne begrænsning og foreslå skift til alternativer, der kan uddelegeres, hvis det er muligt. Du kan finde flere oplysninger i uddelegeringsoversigten.

Syntaks

ForAll(Tabel, Formel)

  • Table – påkrævet. Den tabel, funktionen skal køres på.
  • Formel – påkrævet. Den formel, der skal evalueres for alle posterne i Table.

Eksempler

Beregninger

I de efterfølgende eksempler bruges Squares-datakilde:

Eksempel på Squares.

Hvis du vil oprette denne datakilde som en samling, skal du angive egenskaben OnSelect for et kontrolelement af typen Button til denne formel, åbne eksempeltilstand og derefter vælge knappen:

ClearCollect( Squares, [ "1", "4", "9" ] )

Formel Beskrivelse Resultat
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Kvadratroden af kolonnen Value beregnes for alle posterne i inputtabellen. Funktionen Sqrt kan også bruges sammen med en tabel med én kolonne, så eksemplet kan køres uden ForAll. Eksempel på Sqrt.
ForAll( Squares, Power( Value, 3 ) ) Værdien i kolonnen Value opløftes til tredje potens for alle posterne i inputtabellen. Funktionen Power understøtter ikke tabeller med én kolonne. Derfor skal du bruge ForAll i dette tilfælde. Eksempel på Power.

Brug af en forbindelse

I de efterfølgende eksempler bruges Expressions-datakilden:

Eksempel på Expressions.

Hvis du vil oprette denne datakilde som en samling, skal du angive egenskaben OnSelect for et kontrolelement af typen Button til denne formel, åbne eksempeltilstand og derefter vælge knappen:

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

Dette eksempel bruger også en forbindelse til Microsoft Translator. Hvis du vil tilføje denne forbindelse i din app, skal du se artiklen om at administrere forbindelser.

Formel Beskrivelse Resultat
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) For alle posterne i tabellen Expressions oversættes indholdet af kolonnen Value til spansk (forkortet til "es"). Eksempel med værdien
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) For alle posterne i tabellen Expressions oversættes indholdet af kolonnen Value til fransk (forkortet til "fr"). Eksempel med værdien

Kopiér en tabel

Nogle gange har du brug for at filtrere, forme, sortere og manipulere data. Power Apps indeholder mange funktioner til dette, f.eks. Filter, AddColumns og Sort. Power Apps behandler hver tabel som en værdi, så det er nemt at beregne og bruge formler.

Nogle gange vil du også have brug for en kopi af resultatet til senere brug., eller du vil flytte oplysninger fra en datakilde til en anden. I Power Apps kan du bruge funktionen Collect til at kopiere data.

Inden du opretter kopien, skal du dog overveje, om du har brug for den. Der er mange situationer, hvor du kan bruge en formel til at filtrere og forme den underliggende datakilde efter behov. Nogle af ulemperne ved at oprette en kopi omfatter:

  • Med to kopier af de samme oplysninger kan den ene af dem blive forældet.
  • Hvis du opretter en kopi, kan det forbruge en del computerhukommelse, netværksbåndbredde og/eller tid.
  • For de fleste datakilder kan kopiering ikke delegeres, og det begrænser, hvor mange data der kan flyttes.

I de efterfølgende eksempler bruges Products-datakilden:

Eksempel på produkters datakilde.

Hvis du vil oprette denne datakilde som en samling, skal du angive egenskaben OnSelect for et kontrolelement af typen Button til denne formel, åbne eksempeltilstand og derefter vælge 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 }
    )
)

Vores mål er at arbejde med en afledt tabel, der kun indeholder de varer, hvor der er anmodet om flere, end der er tilgængelige, og som vi skal oprette en ordre for:

Eksempel på afledt tabel.

Opgaven kan udføres på forskellige måder, der alle giver det samme resultat, og som har hver deres fordele og ulemper.

Tabelformning efter behov

Opret ikke en kopi! Du kan i stedet bruge denne formel, når der er brug for det:

// 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"
)

Der oprettes et postområde ved hjælp af funktionerne Filter og AddColumns for at udføre sammenligning og subtrahering med felterne 'Quantity Requested' og 'Quantity Available' for hver post.

I dette eksempel kan funktionen Filter delegeres. Det er vigtigt, da det kan finde alle de produkter, der opfylder kriterierne, også selv der kun er nogle få poster i en tabel med millioner af poster. På nuværende tidspunkt kan ShowColumns og AddColumns ikke delegeres, så det faktiske antal produkter, der skal bestilles, vil være begrænset. Denne fremgangsmåde kan bruges, hvis du ved, at størrelsen af resultatet altid vil være relativt lille.

Da vi ikke har oprettet en kopi, er der ikke nogen ekstra kopi af oplysninger, som skal administreres eller bliver forældede.

ForAll efter behov

En anden fremgangsmåde er at bruge funktionen ForAll for at erstatte funktioner til tabelformning:

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

Denne formel kan være lettere at læse og skrive for visse brugere.

Ingen del af funktionen ForAll kan delegeres. Det er kun den første del af tabellen Products, der evalueres, og det kan være et problem, hvis tabellen er stor. Da Filter kunne delegeres i det tidligere eksempel, vil den virke bedre med store datasæt.

Indsaml resultatet

I nogle situationer kan det være nødvendigt med en kopi af dataene. Du skal måske flytte oplysninger fra en datakilde til en anden. I dette eksempel placeres ordrerne via tabellen NewOrder i en leverandørs system. Du kan give brugerne hurtigere interaktioner ved at cachelagre en lokal kopi af tabellen, så du undgår serverforsinkelser.

Vi bruger den samme tabelformning som i de to foregående eksempler, men resultatet gemmes 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 og Collect kan ikke delegeres. Det er derfor begrænset, hvor mange data der kan flyttes på denne måde.

Collect i ForAll

Endelig kan vi udføre en Collect direkte i ForAll:

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

Igen kan funktionen ForAll ikke delegeres på nuværende tidspunkt. Hvis tabellen Products er stor, vil ForAll kun søge efter de første sæt af poster, og vi kan overse nogle af de produkter, der skal bestilles. For de tabeller, der forbliver små, er denne fremgangsmåde imidlertid fin.

Bemærk, at vi ikke registrerer resultatet af ForAll. Funktionskaldene til Collect vil returnere datakilden NewOrder for alle posterne, hvilket kan blive til mange data, hvis resultatet af hvert kald registreres.

Tilknyt tabel i en komponent

Se Tilknyt tabeller.