De functie ForAll

Van toepassing op: Canvas-apps Bureaubladstromen Modelgestuurde apps Power Platform CLI

Berekent waarden en voert acties uit voor alle records in een tabel.

Beschrijving

De functie ForAll evalueert een formule voor alle records in een tabel. De formule kan een waarde berekenen en/of acties uitvoeren, zoals het wijzigen van gegevens of het werken met een verbinding. Gebruik de functie With om de formule voor een enkele record te evalueren.

Gebruik de functie Sequence met de functie ForAll om iteraties uit te voeren op basis van een telling.

Velden van de momenteel verwerkte record zijn beschikbaar in de formule. Gebruik de operator ThisRecord of verwijs gewoon met de naam naar velden, zoals u dat ook bij andere waarden zou doen. De operator As kan ook worden gebruikt om een naam te geven aan de record die wordt verwerkt, wat kan helpen uw formule begrijpelijker te maken en geneste records toegankelijk te maken. Meer informatie vindt u in de voorbeelden hieronder en in werken met recordbereik.

Retourwaarde

Het resultaat van elke formule-evaluatie wordt in een tabel geretourneerd in dezelfde volgorde als de invoertabel.

Als het resultaat van de formule één waarde is, zal de resulterende tabel een tabel met een enkele kolom zijn. Als het resultaat van de formule een record is, bevat de resulterende tabel records met dezelfde kolommen als de resultaatrecord.

Als het resultaat van de formule een lege waarde is, komt er geen record voor die invoerrecord voor in de resultaattabel. In dit geval zullen er minder records in de resultaattabel staan dan in de brontabel.

Actie uitvoeren

De formule kan functies bevatten die actie ondernemen, zoals het wijzigen van de records van een gegevensbron met de functies Patch en Collect. De formule kan ook methoden aanroepen bij verbindingen. Met de ;-operator kunnen meerdere acties per record worden uitgevoerd. U kunt de tabel die het onderwerp van de functie ForAll vormt niet wijzigen.

Houd bij het opstellen van uw formule in gedachten dat records in elke willekeurige volgorde en, indien mogelijk, parallel kunnen worden verwerkt. De eerste record van de tabel kan mogelijk na de laatste record worden verwerkt.

Wees voorzichtig om afhankelijkheden in de volgorde te voorkomen. U kunt daarom niet de functies UpdateContext, Clear en ClearCollect in een ForAll-functie gebruiken omdat ze gemakkelijk kunnen worden gebruikt om variabelen te bevatten die vatbaar zijn voor dit effect. U kunt Collect gebruiken, maar de volgorde waarin de records worden toegevoegd, is niet gedefinieerd.

Verschillende functies die gegevensbronnen kunnen wijzigen, inclusief Collect, Remove en Update, retourneren de gewijzigde gegevensbron als hun geretourneerde waarde. Deze geretourneerde waarden kunnen groot zijn en aanzienlijke bronnen gebruiken als ze voor elke record van de tabel ForAll worden geretourneerd. Mogelijk merkt u ook dat deze geretourneerde waarden niet aan uw verwachtingen voldoen omdat ForAll parallel kan werken en de neveneffecten van deze functies mogelijk kan scheiden, zodat hun resultaat niet wordt behaald. Als de geretourneerde waarde van ForAll niet daadwerkelijk wordt gebruikt, wat vaak het geval is met functies voor gegevensbewerkingen, zal de geretourneerde waarde gelukkig niet worden gemaakt en is er geen sprake van problemen met bronnen of volgorde. Als u echter het resultaat van een ForAll en een van de functies die een gegevensbron retourneert gebruikt, moet u zorgvuldig nadenken over de manier waarop u het resultaat structureert en deze eerst op kleine gegevenssets uitproberen.

Alternatieven

Veel functies in Power Apps kunnen meer dan een waarde tegelijk verwerken door het gebruik van een tabel met één kolom. De functie Len kan bijvoorbeeld een tabel met tekstwaarden verwerken en op dezelfde manier als ForAll een tabel met lengten retourneren. Dit kan in veel gevallen de noodzaak om ForAll te gebruiken wegnemen, en efficiënter en gemakkelijker te lezen zijn.

Een andere overweging is dat ForAll niet kan worden gedelegeerd, terwijl dat voor andere functies, zoals Filter, mogelijk wel kan.

Delegering

Als deze functie wordt gebruikt met een gegevensbron, kan deze niet worden overgedragen. Alleen het eerste deel van de gegevensbron wordt opgehaald en vervolgens wordt de functie toegepast. Het resultaat is mogelijk niet volledig. Tijdens het schrijven ziet u mogelijk een waarschuwing om u te herinneren aan deze beperking en om u erop te wijzen dat u waar mogelijk kunt overschakelen naar alternatieven met overdrachtmogelijkheden. Zie het overdrachtoverzicht voor meer informatie.

Syntaxis

ForAll(Table, Formule )

  • Table: vereist. Tabel waarvoor actie moet worden uitgevoerd.
  • Formula: vereist. De formule die moet worden geëvalueerd voor elke record van de Tabel.

Voorbeelden

Berekeningen

De volgende voorbeelden gebruiken de Kwadraten-gegevensbron:

Voorbeeld van vierkanten.

Stel de eigenschap OnSelect van een besturingselement Button in op de volgende formule, open de voorbeeldmodus en selecteer de knop om deze gegevensbron als een verzameling te maken:

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

Formule Beschrijving Resultaat
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Berekent voor alle records van de invoertabel de vierkantswortel van de kolom Waarde. De functie Sqrt kan ook worden gebruikt voor een tabel met één kolom, zodat dit voorbeeld kan worden uitgevoerd zonder ForAll te gebruiken. Voorbeeld van Sqrt.
ForAll( Squares, Power( Value, 3 ) ) Verhoogt de kolom Waarde voor alle records van de invoertabel tot de derde macht. De functie Power ondersteunt geen tabellen met één kolom. Daarom moet in dit geval ForAll worden gebruikt. Voorbeeld van Power.

Een verbinding gebruiken

De volgende voorbeelden gebruiken de Uitdrukkingen-gegevensbron:

Voorbeeld van expressies.

Stel de eigenschap OnSelect van een besturingselement Button in op de volgende formule, open de voorbeeldmodus en selecteer de knop om deze gegevensbron als een verzameling te maken:

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

Dit voorbeeld gebruikt ook een verbinding met Microsoft Translator. Raadpleeg het artikel over verbindingen beheren om deze verbinding aan uw app toe te voegen.

Formule Beschrijving Resultaat
ForAll( Uitdrukkingen, MicrosoftTranslator.Translate( Waarde, "es" ) ) Vertaal de inhoud van de kolom Waarde voor alle records in de tabel Uitdrukkingen in het Spaans (afgekort tot "es"). Voorbeeld met waarde
ForAll( Uitdrukkingen, MicrosoftTranslator.Translate( Waarde, "fr" ) ) Vertaal de inhoud van de kolom Waarde voor alle records in de tabel Uitdrukkingen in het Frans (afgekort tot "fr"). Voorbeeld met waarde

Een tabel kopiëren

Soms moet u gegevens filteren, vormen, sorteren en manipuleren. Power Apps biedt veel functies om dit te doen, zoals Filter, AddColumns en Sort. Power Apps behandelt elke tabel als een waarde, waardoor deze door formules kan stromen en gemakkelijk kan worden verbruikt.

En soms wilt u een kopie van dit resultaat maken voor later gebruik of wilt u informatie van de ene gegevensbron naar de andere overbrengen. Power Apps heeft de functie Collect om gegevens te kopiëren.

Denk voordat u een kopie maakt echter zorgvuldig na of deze wel nodig is. Veel situaties kunnen worden aangepakt door de onderliggende gegevensbron op aanvraag te filteren en vorm te geven met een formule. Een aantal nadelen van het maken van een kopie:

  • Twee kopieën van dezelfde informatie betekent dat een ervan mogelijk niet langer wordt gesynchroniseerd.
  • Het maken van een kopie kan veel computergeheugen, netwerkbandbreedte en/of tijd kosten.
  • Voor de meeste gegevensbronnen kan het kopiëren niet worden gedelegeerd, wat beperkingen inhoudt voor de hoeveelheid gegevens die kan worden verplaatst.

De volgende voorbeelden gebruiken de Producten-gegevensbron:

Voorbeeld van gegevensbron voor producten.

Stel de eigenschap OnSelect van een besturingselement Button in op de volgende formule, open de voorbeeldmodus en selecteer de knop om deze gegevensbron als een verzameling te maken:

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

Het is ons doel om te werken met een afgeleide tabel die alleen de artikelen bevat waarvan er meer zijn gevraagd dan er beschikbaar zijn, en waarvoor we dus een bestelling moeten plaatsen:

Voorbeeld van afgeleide tabel.

We kunnen deze taak uitvoeren op een aantal verschillende manieren die allemaal hetzelfde resultaat met diverse voordelen en nadelen opleveren.

Tabel vormgeven op aanvraag

Maak geen kopie! We kunnen de volgende formule gebruiken waar we hem maar nodig hebben:

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

Er wordt een recordbereik door de functies Filter en AddColumns gemaakt om de vergelijkings- en aftrekbewerkingen uit te voeren met de velden 'Gevraagde hoeveelheid' en 'Beschikbare hoeveelheid' van elk record.

In dit voorbeeld kan de functie Filter worden gedelegeerd. Dit is belangrijk omdat hij alle producten kan vinden die aan de criteria voldoen - zelfs als dat slechts een paar records uit een tabel met miljoenen records zijn. Op dit moment kunnen ShowColumns en AddColumns niet worden gedelegeerd. Daarom zal het daadwerkelijke aantal producten dat moet worden besteld beperkt zijn. Deze benadering werkt prima als u weet dat de omvang van dit resultaat altijd relatief klein is.

Omdat we geen kopie hebben gemaakt, is er ook geen extra kopie van de informatie die moet worden beheerd of die kan verouderen.

ForAll op aanvraag

Een andere benadering is het gebruik van de functie ForAll om de functies voor het vormgeven van de tabel te vervangen:

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

Deze formule is voor sommige mensen mogelijk eenvoudiger te lezen en te schrijven.

Geen deel van ForAll kan worden gedelegeerd. Alleen het eerste deel van de tabel Producten zal worden geëvalueerd. Dat kan een probleem zijn als deze tabel groot is. Omdat Filter in het vorige voorbeeld kan worden gedelegeerd, kan deze mogelijk beter werken met grote gegevenssets.

Het resultaat verzamelen

In sommige gevallen is mogelijk een kopie van gegevens vereist. U moet mogelijk informatie van de ene gegevensbron naar de andere verplaatsen. In dit voorbeeld worden bestellingen geplaatst via een tabel NieuweBestelling in het systeem van de leverancier. U wilt voor snelle gebruikersinteracties mogelijk een lokale kopie van een tabel in het cachegeheugen opslaan, zodat er geen sprake is van serverlatentie.

We gebruiken dezelfde tabelvormgeving als in de vorige twee voorbeelden, maar we leggen het resultaat vast in een verzameling:

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 en Collect kunnen niet worden overgedragen. Als gevolg daarvan is de hoeveelheid gegevens die op deze manier kan worden verplaatst beperkt.

Collect binnen ForAll

Ten slotte kunnen we Collect rechtstreeks binnen ForAll uitvoeren:

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

De functie ForAll kan opnieuw niet worden gedelegeerd. Als onze tabel Producten te groot is, zal ForAll alleen naar de eerste set met records kijken en missen we mogelijk bepaalde producten die moeten worden besteld. Deze benadering werkt echter prima voor tabellen waarvan we weten dat ze klein blijven.

Houd er rekening mee dat we het resultaat van ForAll niet vastleggen. De aanroepen van de functie Collect die van daaruit worden gemaakt, zullen de gegevensbron NieuweBestelling voor alle records retourneren, wat een groot aantal gegevens kan opleveren als we die zouden vastleggen.

Tabel toewijzen in een onderdeel

Zie Tabellen toewijzen.