Calcule les valeurs et effectue des actions pour tous les enregistrements d’une table.

Description

La fonction ForAll évalue une formule pour tous les enregistrements d’une table. La formule peut calculer une valeur et/ou effectuer différentes actions, par exemple modifier des données ou utiliser une connexion.

Les champs de l’enregistrement en cours de traitement sont disponibles dans la formule. Vous y faites simplement référence par nom comme vous le feriez pour toute autre valeur. Vous pouvez également référencer les propriétés de contrôle et d’autres valeurs à partir de votre application. Pour plus d’informations, consultez les exemples ci-dessous et la section relative à l’utilisation des étendues d’enregistrement.

Valeur renvoyée

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.

Si le résultat de la formule est une valeur unique, la table ainsi créée inclura une seule colonne. 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.

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. Dans ce cas, il y aura moins d’enregistrements dans la table de résultats que dans la table source.

Actions effectuées

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. La formule peut également appeler des méthodes sur des connexions. Plusieurs actions peuvent être effectuées par enregistrement à l’aide de l’opérateur ;. Vous ne pouvez pas modifier la table qui fait l’objet de la fonction ForAll.

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. Le premier enregistrement de la table peut être traité après le dernier enregistrement. Prenez soin d’éviter le classement des dépendances. 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. Vous pouvez utiliser la fonction Collect, mais l’ordre dans lequel les enregistrements sont ajoutés n’est pas défini.

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. 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. 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. 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. 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.

Autres possibilités

Dans PowerApps, de nombreuses fonctions peuvent traiter plusieurs valeurs à la fois, grâce à l’utilisation d’une table à une seule colonne. 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. 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.

Autre aspect important : la fonction ForAll n’est pas transmissible, alors que d’autres fonctions, comme Filter peuvent l’être.

Délégation

Lorsqu’elle est utilisée avec une source de données, cette fonction ne peut pas être déléguée. Seule la première partie de la source de données est récupérée, puis la fonction est appliquée. Le résultat peut donc être incomplet. Un point bleu apparaît au moment de l’autorisation pour vous rappeler cette limitation et vous suggérer d’utiliser des fonctions équivalentes pouvant être déléguées lorsque vous le pouvez. Pour plus d’informations, consultez la vue d’ensemble des délégations.

Syntaxe

ForAll( Table, Formula )

  • Table - Requis. Table faisant l’objet de l’action.
  • Formula - Requis. Formule permettant d’évaluer l’ensemble des enregistrements de la table.

Exemples

Calculs

Les exemples suivants utilisent Squares comme source de données :

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 :

  • ClearCollect( Squares, [ "1", "4", "9" ] )
Formule Description Résultat
ForAll( Squares, Sqrt( Valeur ) )

Sqrt( Squares )
Pour tous les enregistrements de la table d’entrée, cette formule calcule la racine carrée de la colonne Value (Valeur). 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.
ForAll( Squares, Power( Valeur, 3 ) ) Pour tous les enregistrements de la table d’entrée, cette formule met la colonne Value (Valeur) à la puissance trois. La fonction Power ne prend pas en charge les tables à une seule colonne. Par conséquent, la fonction ForAll doit être utilisée dans ce cas.

Utilisation d’une connexion

Les exemples suivants utilisent Expressions en tant que source de données :

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 :

  • ClearCollect( Expressions, [ "Bonjour", "Bonne matinée", "Merci", "Au revoir" ] )

Cet exemple utilise également une connexion Microsoft Translator. Pour ajouter cette connexion à votre application, consultez la rubrique relative à la gestion des connexions.

Formule Description Résultat
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 »).
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 »).

Copie d’une table

Vous pouvez avoir besoin de filtrer, de mettre en forme, de trier ou de manipuler les données. PowerApps fournit plusieurs fonctions pour cela, telles que Filter, AddColumns et Sort. PowerApps traite chaque table comme une valeur, ce qui lui permet de la soumettre à des formules et de faciliter sa consommation.

Peut-être souhaitez-vous copier ce résultat pour pouvoir l’utiliser ultérieurement, ou déplacer des informations d’une source de données vers une autre. Pour la copie des données, PowerApps fournit la fonction Collect.

Toutefois, avant de procéder à cette copie, assurez-vous qu’elle est réellement nécessaire. 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. La copie présente quelques inconvénients :

  • La création de deux exemplaires des mêmes informations entraîne un risque de désynchronisation de l’un d’eux.
  • 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.
  • 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.

Les exemples suivants utilisent Products comme source de données :

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 :

  • 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 :

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.

Mise en forme de la table à la demande

N’effectuez pas cette copie. Nous pouvons utiliser la formule suivante n’importe où :

  • 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.

Dans cet exemple, la fonction Filter peut être transmise. 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. À ce stade, les éléments ShowColumns et AddColumns ne peuvent pas être transmis ; le nombre réel de produits à commander est donc limité. Si vous savez que la taille de ces résultats est toujours relativement faible, cette approche est adaptée.

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.

ForAll à la demande

Une autre approche consiste à utiliser la fonction ForAll pour remplacer les fonctions de mise en forme des tables :

  • 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.

Par contre, aucune partie de la fonction ForAll n’est transmissible. 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. 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.

Collecter les résultats

Dans certains cas, une copie des données peut être requise. Vous pouvez avoir besoin de déplacer des informations d’une source de données vers une autre. Dans cet exemple, les commandes sont passées via une table NewOrder, sur le système d’un fournisseur. 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.

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 :

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

Les fonctions ClearCollect et Collect ne peuvent pas être transmises. Par conséquent, la quantité de données pouvant être déplacée de cette manière est limitée.

Collect dans ForAll

Enfin, nous pouvons exécuter la fonction Collect directement depuis la fonction ForAll :

  • 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. 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. Toutefois, si nous savons que les tables ne seront jamais volumineuses, cette approche est adaptée.

Remarque : nous ne capturons pas le résultat de la fonction 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.