De functie ForAll in PowerAppsForAll function in PowerApps

Berekent waarden en voert acties uit voor alle records van een tabel.Calculates values and performs actions for all records of a table.

BeschrijvingDescription

De functie ForAll evalueert een formule voor alle records van een tabel.The ForAll function evaluates a formula for all records of a table. De formule kan een waarde berekenen en/of acties uitvoeren, zoals het wijzigen van gegevens of het werken met een verbinding.The formula can calculate a value and/or perform actions, such as modifying data or working with a connection.

Fields of the record currently being processed are available within the formula. You simply reference them by name as you would any other value. You can also reference control properties and other values from throughout your app. For more details, see the examples below and working with record scope.

RetourwaardeReturn value

Het resultaat van elke formule-evaluatie wordt in een tabel geretourneerd in dezelfde volgorde als de invoertabel.The result of each formula evaluation is returned in a table, in the same order as the input table.

Als het resultaat van de formule één waarde is, zal de resulterende tabel een tabel met één kolom zijn.If the result of the formula is a single value, the resulting table will be a single column table. Als het resultaat van de formule een record is, zal de resulterende tabel records bevatten met dezelfde kolommen als de resultaatrecord.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Als het resultaat van de formule een lege waarde is, zal er geen record voor die invoerrecord in de resultaattabel zijn.If the result of the formula is a blank value, then there will be no record in the result table for that input record. In dit geval zullen er minder records in de resultaattabel staan dan in de brontabel.In this case, there will be fewer records in the result table than the source table.

Actie uitvoerenTaking action

De formule kan functies bevatten die actie ondernemen, zoals het wijzigen van de records van een gegevensbron met de functies Patch en Verzamelen.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. De formule kan ook methoden aanroepen bij verbindingen.The formula can also call methods on connections. Met de ;-operator kunnen meerdere acties per record worden uitgevoerd.Multiple actions can be performed per record by using the ; operator. U kunt de tabel die het onderwerp van de functie ForAll vormt niet wijzigen.You can't modify the table that is the subject of the ForAll function.

Houd bij het opstellen van uw formule in gedachten dat records in elke willekeurige volgorde en, indien mogelijk, parallel kunnen worden verwerkt.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. De eerste record van de tabel kan mogelijk na de laatste record worden verwerkt.The first record of the table may be processed after the last record. Wees voorzichtig om afhankelijkheden in de volgorde te voorkomen.Take care to avoid ordering dependencies. U kunt daarom niet de functies UpdateContext, Wissen en ClearCollect in een ForAll-functie gebruiken omdat ze gemakkelijk kunnen worden gebruikt om variabelen te bevatten die vatbaar zijn voor dit effect.For this reason, you can't use the UpdateContext, Clear, and ClearCollect functions within a ForAll function because they could easily be used to hold variables that would be susceptible to this effect. U kunt Verzamelen gebruiken, maar de volgorde waarin de records worden toegevoegd, is niet gedefinieerd.You can use Collect, but the order in which records are added is undefined.

Verschillende functies die gegevensbronnen kunnen wijzigen, inclusief Verzamelen, Verwijderen en Bijwerken, retourneren de gewijzigde gegevensbron als hun geretourneerde waarde.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Deze geretourneerde waarden kunnen groot zijn en aanzienlijke bronnen gebruiken als ze voor elke record van de tabel ForAll worden geretourneerd.These return values can be large and consume significant resources if returned for every record of the ForAll table. 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.You may also find that these return values are not what you expect, because ForAll can operate in parallel and may separate the side effects of these functions from obtaining their result. 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 volgordes.Fortunately, if the return value from ForAll is not actually used, which is often the case with data modification functions, then the return value will not be created and there are no resource or ordering concerns. 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.But if you are using the result of a ForAll and one of the functions that returns a data source, think carefully about how you structure the result and try it out first on small data sets.

AlternatievenAlternatives

Veel functies in PowerApps kunnen meer dan een waarde tegelijk verwerken door het gebruik van een tabel met één kolom.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. De functie Len kan bijvoorbeeld een tabel met tekstwaarden verwerken en op dezelfde manier als ForAll een tabel met lengten retourneren.For example, the Len function can process a table of text values, returning a table of lengths, in the same manner that ForAll could. Dit kan in veel gevallen de noodzaak om ForAll te gebruiken wegnemen, en efficiënter en gemakkelijker te lezen zijn.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Een andere overweging is dat ForAll niet kan worden gedelegeerd, terwijl dat voor andere functies, zoals Filter, mogelijk wel kan.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

DelegeringDelegation

When used with a data source, this function can't be delegated. Only the first portion of the data source will be retrieved and then the function applied. The result may not represent the complete story. A blue dot will appear at authoring time to remind you of this limitation and to suggest switching to delegable alternatives where possible. For more information, see the delegation overview.

SyntaxisSyntax

ForAll( Tabel, Formule )ForAll( Table, Formula )

  • Tabel - vereist.Table - Required. Tabel waarvoor actie moet worden uitgevoerd.Table to be acted upon.
  • Formule - vereist.Formula - Required. De formule die moet worden geëvalueerd voor elke record van de Tabel.The formula to evaluate for all records of the Table.

VoorbeeldenExamples

BerekeningenCalculations

De volgende voorbeelden gebruiken de gegevensbron Kwadraten:The following examples use the Squares data source:

Stel de eigenschap OnSelect van een Knop-besturingselement in op de volgende formule, open de voorbeeldmodus en klik of tik op de knop om deze gegevensbron als een verzameling te maken:To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Kwadraten, [ "1", "4", "9" ] )ClearCollect( Squares, [ "1", "4", "9" ] )
FormuleFormula BeschrijvingDescription ResultaatResult
ForAll( Kwadraten, Sqrt( Waarde ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Kwadraten )Sqrt( Squares )
Berekent voor alle records van de invoertabel de vierkantswortel van de kolom Waarde.For all the records of the input table, calculates the square root of the Value column. De functie Sqrt kan ook worden gebruikt voor een tabel met één kolom, waardoor het mogelijk is om dit voorbeeld uit te voeren zonder ForAll te gebruiken.The Sqrt function can also be used with a single-column table, making it possible perform this example without using ForAll.
ForAll( Kwadraten, Power( Waarde, 3 ) )ForAll( Squares, Power( Value, 3 ) ) Verhoogt de kolom Waarde voor alle records van de invoertabel tot de derde macht.For all the records of the input table, raises the Value column to the third power. De functie Power ondersteunt geen tabellen met één kolom.The Power function does not support single-column tables. Daarom moet in dit geval ForAll worden gebruikt.Therefore, ForAll must be used in this case.

Een verbinding gebruikenUsing a connection

De volgende voorbeelden gebruiken de gegevensbron Uitdrukkingen:The following examples use the Expressions data source:

Stel de eigenschap OnSelect van een Knop-besturingselement in op de volgende formule, open de voorbeeldmodus en klik of tik op de knop om deze gegevensbron als een verzameling te maken:To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Uitdrukkingen, [ "Hallo", "Goedemorgen", "Bedankt", "Tot ziens" ] )ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

Dit voorbeeld gebruikt ook een verbinding met Microsoft Translator.This example also uses a Microsoft Translator connection. Raadpleeg het onderwerp over verbindingen beheren om deze verbinding aan uw app toe te voegen.To add this connection to your app, see the topic about how to manage connections.

FormuleFormula BeschrijvingDescription ResultaatResult
ForAll( Uitdrukkingen, MicrosoftTranslator.Translate( Waarde, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Vertaal de inhoud van de kolom Waarde voor alle records in de tabel Uitdrukkingen in het Spaans (afgekort tot "es").For all the records in the Expressions table, translate the contents of the Value column into Spanish (abbreviated "es").
ForAll( Uitdrukkingen, MicrosoftTranslator.Translate( Waarde, "fr" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Vertaal de inhoud van de kolom Waarde voor alle records in de tabel Uitdrukkingen in het Frans (afgekort tot "fr").For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Een tabel kopiërenCopying a table

Soms moet u gegevens filteren, vormen, sorteren en manipuleren.Sometimes you need to filter, shape, sort, and manipulate data. PowerApps biedt een aantal functies om dit te doen, zoals Filter, AddColumns en Sorteren.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps behandelt elke tabel als een waarde, waardoor deze door formules kan stromen en gemakkelijk kan worden verbruikt.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

Soms wilt u een kopie van dit resultaat maken voor later gebruik.And sometime you will want to make a copy of this result for later use. Of u wilt informatie van de ene gegevensbron naar de andere verplaatsen.Or you will want to move information from one data source to another. PowerApps biedt de functie Verzamelen om gegevens te kopiëren.PowerApps provides the Collect function to copy data.

Denk voordat u een kopie maakt echter zorgvuldig na of hij echt nodig is.But before you make that copy, think carefully if it is really needed. Veel situaties kunnen worden aangepakt door de onderliggende gegevensbron op verzoek te filteren en vorm te geven met een formule.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. Een aantal nadelen van het maken van een kopie:Some of the downsides to making a copy include:

  • Twee kopieën van dezelfde informatie betekent dat een ervan mogelijk niet langer wordt gesynchroniseerd.Two copies of the same information means that one of them can fall out of sync.
  • Het maken van een kopie kan veel computergeheugen, netwerkbandbreedte en/of tijd kosten.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • Voor de meeste gegevensbronnen kan het kopiëren niet worden gedelegeerd, wat beperkingen inhoudt voor de hoeveelheid gegevens die kan worden verplaatst.For most data sources, copying cannot be delegated, limiting how much data can be moved.

De volgende voorbeelden gebruiken de gegevensbron Producten:The following examples use the Products data source:

Stel de eigenschap OnSelect van een Knop-besturingselement in op de volgende formule, open de voorbeeldmodus en klik of tik op de knop om deze gegevensbron als een verzameling te maken:To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Producten, Table( { Product: "Widget", 'Gevraagde hoeveelheid': 6, 'Beschikbare hoeveelheid': 3 }, { Product: "Gadget", 'Gevraagde hoeveelheid': 10, 'Beschikbare hoeveelheid': 20 }, { Product: "Gizmo", 'Gevraagde hoeveelheid': 4, 'Beschikbare hoeveelheid': 11 }, { Product: "Apparaat", 'Gevraagde hoeveelheid': 7, 'Beschikbare hoeveelheid': 6 } ) )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:Our goal is to work with a derivative table that includes only the items where more has been requested than is available, and for which we need to place an order:

We kunnen deze taak uitvoeren op een aantal verschillende manieren die allemaal hetzelfde resultaat met diverse voordelen en nadelen opleveren.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Tabel vormgeven op aanvraagTable shaping on demand

Maak geen kopie!Don't make that copy! We kunnen de volgende formule gebruiken waar we hem maar nodig hebben:We can use the following formula anywhere we need:

  • ShowColumns( AddColumns( Filter( Producten, 'Gevraagde hoeveelheid' > 'Beschikbare hoeveelheid' ), "Te bestellen hoeveelheid", 'Gevraagde hoeveelheid' - 'Beschikbare hoeveelheid' ), "Product", "Te bestellen hoeveelheid" )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.A record scope is created by the Filter and AddColumns functions to perform the comparison and subtraction operations, respectively, with the 'Quantity Requested' and 'Quantity Available' fields of each record.

In dit voorbeeld kan de functie Filter worden gedelegeerd.In this example, the Filter function can be delegated. 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.This is important, as it can find all the products that meet the criteria, even if that is only a few records out of a table of millions. Op dit moment kunnen ShowColumns en AddColumns niet worden gedelegeerd. Daarom zal het daadwerkelijke aantal producten dat moet worden besteld beperkt zijn.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Deze benadering werkt prima als u weet dat de omvang van dit resultaat altijd relatief klein is.If you know the size of this result will always be relatively small, this approach is fine.

Omdat we geen kopie hebben gemaakt, is er ook geen extra kopie van de informatie die moet worden beheerd of die kan verouderen.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

ForAll op aanvraagForAll on demand

Een andere benadering is het gebruik van de functie ForAll om de functies voor het vormgeven van de tabel te vervangen:Another approach is to use the ForAll function to replace the table-shaping functions:

  • ForAll( Producten, If( 'Gevraagde hoeveelheid' > 'Beschikbare hoeveelheid', { Product: Product, 'Te bestellen hoeveelheid': 'Gevraagde hoeveelheid' - 'Beschikbare hoeveelheid' } ) )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.This formula may be simpler for some people to read and write.

Geen deel van ForAll kan worden gedelegeerd.No part of the ForAll is delegable. Alleen het eerste deel van de tabel Producten zal worden geëvalueerd. Dat kan een probleem zijn als deze tabel erg groot is.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Omdat Filter in het vorige voorbeeld kan worden gedelegeerd, kan deze mogelijk beter werken met grote gegevenssets.Because Filter could be delegated in the previous example, it could work better with large data sets.

Het resultaat verzamelenCollect the result

In sommige gevallen is mogelijk een kopie van gegevens vereist.In some situations, a copy of data may be required. U moet mogelijk informatie van de ene gegevensbron naar de andere verplaatsen.You may need to move information from one data source to another. In dit voorbeeld worden bestellingen geplaatst via een tabel NieuweBestelling in het systeem van de leverancier.In this example, orders are placed through a NewOrder table on a vendor's system. U wilt voor snelle gebruikersinteracties mogelijk een lokale kopie van een tabel in het cachegeheugen opslaan, zodat er geen sprake is van serverlatentie.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

We gebruiken dezelfde tabelvormgeving als in de vorige twee voorbeelden, maar we leggen het resultaat vast in een verzameling:We use the same table shaping as the previous two examples, but we capture the result into a collection:

  • ClearCollect( NieuweBestelling, ShowColumns( AddColumns( Filter( Producten, 'Gevraagde hoeveelheid' > 'Beschikbare hoeveelheid' ), "Te bestellen hoeveelheid", 'Gevraagde hoeveelheid' - 'Beschikbare hoeveelheid' ), "Product", "Te bestellen hoeveelheid" ) )ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )
  • ClearCollect( NieuweBestelling, ForAll( Producten, If( 'Gevraagde hoeveelheid' > 'Beschikbare hoeveelheid', { Product: Product, 'Te bestellen hoeveelheid': 'Gevraagde hoeveelheid' - 'Beschikbare hoeveelheid' } ) ) )ClearCollect( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

ClearCollect en Verzamelen kunnen niet worden overgedragen.ClearCollect and Collect can't be delegated. Als gevolg daarvan is de hoeveelheid gegevens die op deze manier kan worden verplaatst beperkt.As a result the amount of data that can be moved in this manner is limited.

Verzamelen binnen ForAllCollect within ForAll

Ten slotte kunnen we Verzamelen rechtstreeks binnen ForAll uitvoeren:Finally, we can perform the Collect directly within the ForAll:

  • ClearCollect( TeBestellenProducten); ForAll( Producten, If( 'Gevraagde hoeveelheid' > 'Beschikbare hoeveelheid', Collect( NieuweBestelling, { Product: Product, 'Te bestellen hoeveelheid': 'Gevraagde hoeveelheid' - 'Beschikbare hoeveelheid' } ) ) )Clear( ProductsToOrder ); 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.Again, the ForAll function can't be delegated at this time. 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.If our Products table is large, ForAll will look at the first set of records only and we may miss some products that need to be ordered. Deze benadering werkt echter prima voor tabellen waarvan we weten dat ze klein blijven.But for tables that we know will remain small, this approach is fine.

Houd er rekening mee dat we het resultaat van ForAll niet vastleggen.Note that we are not capturing the result of the ForAll. De aanroepen van de functie Verzamelen die van daaruit worden gemaakt, zullen de gegevensbron NieuweBestelling voor alle records retourneren, wat een grote hoeveelheid gegevens kan opleveren als we die zouden vastleggen.The Collect function calls made from within it will return the NewOrder data source for all the records, which could add up to a lot of data if we were capturing it.