Fonction ForAll

S’applique à : Applications canevas Flux de bureau Applications pilotées par modèle CLI Power Platform

Calcule les valeurs et effectue des actions pour tous les enregistrements dans 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 des actions telles que la modification de données ou l’utilisation d’une connexion. Utilisez la fonction With pour évaluer la formule pour un seul enregistrement.

Utilisez la fonction Sequence avec la fonction ForAll pour itérer en fonction d’un décompte.

Les champs de l’enregistrement en cours de traitement sont disponibles dans la formule. Utilisez l’opérateur ThisRecord ou référencez simplement les champs par leur nom comme vous le feriez pour toute autre valeur. L’opérateur As peut également être utilisé pour nommer l’enregistrement en cours de traitement, ce qui peut faciliter la compréhension de votre formule et rendre les enregistrements imbriqués accessibles. Pour plus d’informations, consultez les exemples ci-dessous et la section Utilisation de l’étendue de l’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 contient 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 figure 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 PourTous peut fonctionner en parallèle et séparer les effets secondaires de ces fonctions et l’obtention des résultats correspondants. 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.

Alternatives

Dans Power Apps, 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 sera extraite, puis la fonction sera appliquée. Il se peut que le résultat ne représente pas une vue d’ensemble complète. Un avertissement peut apparaître au moment de la création pour vous rappeler cette limitation et pour vous suggérer d’utiliser d’autres alternatives lorsque cela est possible. Pour plus d’informations, consultez la Vue d’ensemble de la délégation.

Syntaxe

ForAll( Table, Formula )

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

Exemples

Calculs

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

Exemple de carrés.

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 Aperçu, puis sélectionnez le bouton :

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

Formule Description Résultat
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Pour tous les enregistrements de la table d’entrée, cette formule calcule la racine carrée de la colonne Value. 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. Exemple de Sqrt.
ForAll( Squares, Power( Value, 3 ) ) Pour tous les enregistrements de la table d’entrée, cette formule met la colonne Value à 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. Exemple de puissance.

Utilisation d’une connexion

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

Exemple d’expressions.

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 Aperçu, puis sélectionnez le bouton :

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

Cet exemple utilise également une connexion Microsoft Translator. Pour ajouter cette connexion à votre application, consultez l’article relatif à 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 est traduit en espagnol (ou « es »). Exemple avec la valeur « es ».
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Pour tous les enregistrements de la table Expressions, le contenu de la colonne Value est traduit en français (ou « fr »). Exemple avec la valeur « fr ».

Copie d’une table

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

Et parfois, vous souhaitez faire une copie de ce résultat pour une utilisation ultérieure, ou vous voulez déplacer des informations d’un source de données à un autre. Pour la copie des données, Power Apps fournit la fonction Collect.

Toutefois, avant de procéder à cette copie, assurez-vous qu’elle est 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 la majorité de la mémoire de l’ordinateur et de bande passante réseau, 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 :

Exemple de produits 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 Aperçu, puis sélectionnez 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 :

Exemple de table dérivée.

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

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

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 Produits sera évaluée, ce qui peut poser problème si cette table est 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 déléguées. 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( NewOrder );
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.

Table de carte dans un composant

Voir Tables de carte.