Fonction ForAll dans PowerAppsForAll function in PowerApps

Calcule les valeurs et effectue des actions pour tous les enregistrements d’une table.Calculates values and performs actions for all records of a table.

DescriptionDescription

La fonction ForAll évalue une formule pour tous les enregistrements d’une table.The ForAll function evaluates a formula for all records of a table. La formule peut calculer une valeur et/ou effectuer différentes actions, par exemple modifier des données ou utiliser une connexion.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.

Valeur renvoyéeReturn value

Le résultat de chaque évaluation de formule est renvoyé sous la forme d’une table, dans le même ordre que celui de la table d’entrée.The result of each formula evaluation is returned in a table, in the same order as the input table.

Si le résultat de la formule est une valeur unique, la table ainsi créée inclura une seule colonne.If the result of the formula is a single value, the resulting table will be a single column table. Si le résultat de la formule est un enregistrement, la table ainsi créée contiendra des enregistrements présentant les mêmes colonnes que l’enregistrement du résultat.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Si le résultat de la formule est une valeur vide, alors aucun enregistrement ne figurera pour cet enregistrement d’entrée dans la table ainsi créée.If the result of the formula is a blank value, then there will be no record in the result table for that input record. Dans ce cas, il y aura moins d’enregistrements dans la table de résultats que dans la table source.In this case, there will be fewer records in the result table than the source table.

Actions effectuéesTaking action

La formule peut inclure des fonctions qui effectuent différentes actions, telles que la modification des enregistrements d’une source de données avec les fonctions Patch et Collect.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. La formule peut également appeler des méthodes sur des connexions.The formula can also call methods on connections. Plusieurs actions peuvent être effectuées par enregistrement à l’aide de l’opérateur ;.Multiple actions can be performed per record by using the ; operator. Vous ne pouvez pas modifier la table qui fait l’objet de la fonction ForAll.You can't modify the table that is the subject of the ForAll function.

Lorsque vous écrivez votre formule, n’oubliez pas que les enregistrements peuvent être traités dans n’importe quel ordre, voire en parallèle, le cas échéant.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. Le premier enregistrement de la table peut être traité après le dernier enregistrement.The first record of the table may be processed after the last record. Prenez soin d’éviter le classement des dépendances.Take care to avoid ordering dependencies. Pour cette raison, vous ne pouvez pas utiliser les fonctions UpdateContext, Clear et ClearCollect dans une fonction ForAll, car elles peuvent facilement être utilisées pour contenir les variables qui seraient sensibles à cet effet.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. Vous pouvez utiliser la fonction Collect, mais l’ordre dans lequel les enregistrements sont ajoutés n’est pas défini.You can use Collect, but the order in which records are added is undefined.

Plusieurs fonctions permettant de modifier des sources de données, notamment Collect, Remove et Update, renvoient la source de données modifiée en tant que valeur de retour.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Si elles sont renvoyées pour chaque enregistrement de la table ForAll, ces valeurs de retour peuvent être volumineuses et consommer des ressources considérables.These return values can be large and consume significant resources if returned for every record of the ForAll table. Vous pouvez également constater que ces valeurs de retour ne répondent pas à vos attentes, car ForAll peut fonctionner en parallèle et séparer les effets secondaires de ces fonctions et l’obtention des résultats correspondants.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. Heureusement, si la valeur de retour de la fonction ForAll n’est pas réellement utilisée (ce qui est souvent le cas avec les fonctions de modification de données), la valeur de retour n’est pas créée, ce qui supprime tout problème de ressources ou de classement.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. Toutefois, si vous utilisez le résultat de la fonction ForAll et l’une des fonctions qui renvoie une source de données, réfléchissez soigneusement à la structure que vous voulez donner aux résultats. Commencez par l’exécuter sur des jeux de données de petite taille.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.

Autres possibilitésAlternatives

Dans PowerApps, de nombreuses fonctions peuvent traiter plusieurs valeurs à la fois, grâce à l’utilisation d’une table à une seule colonne.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. Par exemple, la fonction Len peut traiter une table regroupant des valeurs Texte et renvoyer une table de longueurs, de la même manière que la fonction ForAll.For example, the Len function can process a table of text values, returning a table of lengths, in the same manner that ForAll could. Cette fonction peut éliminer la nécessité d’utiliser ForAll dans de nombreux cas, tout en étant plus efficace et en proposant des résultats plus faciles à lire.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Autre aspect important : la fonction ForAll n’est pas transmissible, alors que d’autres fonctions, comme Filter peuvent l’être.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

DélégationDelegation

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.

SyntaxeSyntax

ForAll( Table, Formula )ForAll( Table, Formula )

  • Table - Requis.Table - Required. Table faisant l’objet de l’action.Table to be acted upon.
  • Formula - Requis.Formula - Required. Formule permettant d’évaluer l’ensemble des enregistrements de la table.The formula to evaluate for all records of the Table.

ExemplesExamples

CalculsCalculations

Les exemples suivants utilisent Squares comme source de données :The following examples use the Squares data source:

Pour créer cette source de données en tant que collection, définissez la propriété OnSelect d’un contrôle Button sur cette formule, ouvrez le mode Preview (Aperçu), puis cliquez ou appuyez sur le bouton :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( Squares, [ "1", "4", "9" ] )ClearCollect( Squares, [ "1", "4", "9" ] )
FormuleFormula DescriptionDescription RésultatResult
ForAll( Squares, Sqrt( Valeur ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
Pour tous les enregistrements de la table d’entrée, cette formule calcule la racine carrée de la colonne Value (Valeur).For all the records of the input table, calculates the square root of the Value column. La fonction Sqrt peut également être utilisée avec une table à une seule colonne, ce qui permet d’exécuter cet exemple sans utiliser la fonction ForAll.The Sqrt function can also be used with a single-column table, making it possible perform this example without using ForAll.
ForAll( Squares, Power( Valeur, 3 ) )ForAll( Squares, Power( Value, 3 ) ) Pour tous les enregistrements de la table d’entrée, cette formule met la colonne Value (Valeur) à la puissance trois.For all the records of the input table, raises the Value column to the third power. La fonction Power ne prend pas en charge les tables à une seule colonne.The Power function does not support single-column tables. Par conséquent, la fonction ForAll doit être utilisée dans ce cas.Therefore, ForAll must be used in this case.

Utilisation d’une connexionUsing a connection

Les exemples suivants utilisent Expressions en tant que source de données :The following examples use the Expressions data source:

Pour créer cette source de données en tant que collection, définissez la propriété OnSelect d’un contrôle Button sur cette formule, ouvrez le mode Preview (Aperçu), puis cliquez ou appuyez sur le bouton :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( Expressions, [ "Bonjour", "Bonne matinée", "Merci", "Au revoir" ] )ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

Cet exemple utilise également une connexion Microsoft Translator.This example also uses a Microsoft Translator connection. Pour ajouter cette connexion à votre application, consultez la rubrique relative à la gestion des connexions.To add this connection to your app, see the topic about how to manage connections.

FormuleFormula DescriptionDescription RésultatResult
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Pour tous les enregistrements de la table Expressions, le contenu de la colonne Value (Valeur) est traduit en espagnol (ou « es »).For all the records in the Expressions table, translate the contents of the Value column into Spanish (abbreviated "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Pour tous les enregistrements de la table Expressions, le contenu de la colonne Value (Valeur) est traduit en français (ou « fr »).For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Copie d’une tableCopying a table

Vous pouvez avoir besoin de filtrer, de mettre en forme, de trier ou de manipuler les données.Sometimes you need to filter, shape, sort, and manipulate data. PowerApps fournit plusieurs fonctions pour cela, telles que Filter, AddColumns et Sort.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps traite chaque table comme une valeur, ce qui lui permet de la soumettre à des formules et de faciliter sa consommation.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

Peut-être souhaitez-vous copier ce résultat pour pouvoir l’utiliser ultérieurement,And sometime you will want to make a copy of this result for later use. ou déplacer des informations d’une source de données vers une autre.Or you will want to move information from one data source to another. Pour la copie des données, PowerApps fournit la fonction Collect.PowerApps provides the Collect function to copy data.

Toutefois, avant de procéder à cette copie, assurez-vous qu’elle est réellement nécessaire.But before you make that copy, think carefully if it is really needed. Vous pouvez gérer plusieurs situations en procédant au filtrage et à la mise en forme de la source de données sous-jacente à la demande, grâce à une formule.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. La copie présente quelques inconvénients :Some of the downsides to making a copy include:

  • La création de deux exemplaires des mêmes informations entraîne un risque de désynchronisation de l’un d’eux.Two copies of the same information means that one of them can fall out of sync.
  • La création d’une copie peut consommer une grande quantité de mémoire et de bande passante réseau de l’ordinateur, voire prendre beaucoup de temps.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • Pour la plupart des sources de données, l’opération de copie ne peut pas être transmise, ce qui limite la quantité de données pouvant être déplacée.For most data sources, copying cannot be delegated, limiting how much data can be moved.

Les exemples suivants utilisent Products comme source de données :The following examples use the Products data source:

Pour créer cette source de données en tant que collection, définissez la propriété OnSelect d’un contrôle Button sur cette formule, ouvrez le mode Preview (Aperçu), puis cliquez ou appuyez sur le bouton :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( 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 } ) )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 } ) )

Notre objectif est d’utiliser une table dérivée, qui inclue uniquement les éléments pour lesquels la quantité commandée dépasse la quantité disponible et ceux pour lesquels une commande est nécessaire :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:

Nous pouvons effectuer cette tâche de différentes manières, qui proposent toutes le même résultat et ont leurs propres atouts et inconvénients.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Mise en forme de la table à la demandeTable shaping on demand

N’effectuez pas cette copie.Don't make that copy! Nous pouvons utiliser la formule suivante n’importe où :We can use the following formula anywhere we need:

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

Les fonctions Filter et AddColumns créent une étendue d’enregistrement pour effectuer les opérations de comparaison et de soustraction (respectivement) avec les champs 'Quantity Requested' et 'Quantity Available' de chaque enregistrement.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.

Dans cet exemple, la fonction Filter peut être transmise.In this example, the Filter function can be delegated. Cet aspect est important, car elle peut trouver tous les produits qui répondent aux critères donnés, même s’ils ne correspondent qu’à quelques enregistrements d’une table qui en inclut des millions.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. À ce stade, les éléments ShowColumns et AddColumns ne peuvent pas être transmis ; le nombre réel de produits à commander est donc limité.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Si vous savez que la taille de ces résultats est toujours relativement faible, cette approche est adaptée.If you know the size of this result will always be relatively small, this approach is fine.

Comme nous ne créons aucune copie, vous n’avez pas besoin de gérer ou de mettre à un jour un autre exemplaire des informations.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

ForAll à la demandeForAll on demand

Une autre approche consiste à utiliser la fonction ForAll pour remplacer les fonctions de mise en forme des tables :Another approach is to use the ForAll function to replace the table-shaping functions:

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

Cette formule peut être plus simple à lire et à écrire pour certains.This formula may be simpler for some people to read and write.

Par contre, aucune partie de la fonction ForAll n’est transmissible.No part of the ForAll is delegable. Seule la première partie de la table Products sera évaluée, ce qui peut poser problème si cette table est très volumineuse.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Comme la fonction Filter peut être transmise dans l’exemple précédent, elle peut fonctionner plus efficacement dans le cas de jeux de données volumineux.Because Filter could be delegated in the previous example, it could work better with large data sets.

Collecter les résultatsCollect the result

Dans certains cas, une copie des données peut être requise.In some situations, a copy of data may be required. Vous pouvez avoir besoin de déplacer des informations d’une source de données vers une autre.You may need to move information from one data source to another. Dans cet exemple, les commandes sont passées via une table NewOrder, sur le système d’un fournisseur.In this example, orders are placed through a NewOrder table on a vendor's system. Pour les interactions haut débit de l’utilisateur, vous pouvez être amené à mettre en cache une copie locale d’une table afin d’éviter les latences du serveur.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Nous utilisons la même procédure de mise en forme de la table que les deux exemples précédents, mais nous capturons le résultat dans une collection :We use the same table shaping as the previous two examples, but we capture the result into a collection:

  • ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )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( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

Les fonctions ClearCollect et Collect ne peuvent pas être transmises.ClearCollect and Collect can't be delegated. Par conséquent, la quantité de données pouvant être déplacée de cette manière est limitée.As a result the amount of data that can be moved in this manner is limited.

Collect dans ForAllCollect within ForAll

Enfin, nous pouvons exécuter la fonction Collect directement depuis la fonction ForAll :Finally, we can perform the Collect directly within the ForAll:

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

Là encore, la fonction ForAll ne peut pas être transmise pour l’instant.Again, the ForAll function can't be delegated at this time. Si notre table Products (Produits) est volumineuse, la fonction ForAll consulte uniquement le premier ensemble d’enregistrements ; il se peut que certains produits devant être commandés ne soient pas pris en compte.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. Toutefois, si nous savons que les tables ne seront jamais volumineuses, cette approche est adaptée.But for tables that we know will remain small, this approach is fine.

Remarque : nous ne capturons pas le résultat de la fonction ForAll.Note that we are not capturing the result of the ForAll. Les appels de la fonction Collect effectués depuis cette dernière renvoient la source de données NewOrder pour tous les enregistrements, ce qui pourrait générer une grande quantité de données supplémentaires si nous devions les capturer.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.