Partager via


ForAll Fonction

S’applique à : Les applications Canvas Copilot Studio Desktop circulent des applications basées sur des modèles power Platform CLI Dataverse functions Power Pages

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

Description

La ForAll fonction é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 ForAll fonction pour itérer en fonction d’un nombre.

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 résultante est une table à colonne unique. 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 , il n’existe aucun enregistrement dans la table de résultats pour cet enregistrement d’entrée. Dans ce cas, il existe moins d’enregistrements dans la table de résultats que 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 est l’objet de la ForAll fonction.

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 au sein d’une ForAll fonction, car elles peuvent facilement être utilisées pour contenir des variables susceptibles de 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. Ces valeurs de retour peuvent être volumineuses et consommer des ressources importantes si elles sont retournées pour chaque enregistrement de la ForAll table. Vous pouvez également constater que ces valeurs de retour ne sont pas ce que vous attendez, car ForAll elles peuvent fonctionner en parallèle et peuvent séparer les effets secondaires de ces fonctions de l’obtention de leur résultat. Si la valeur de retour de ForAll n’est pas 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 et il n’y a pas de problèmes de ressource ou d’ordre. Mais si vous utilisez le résultat d’une et l’une ForAll des fonctions qui retournent une source de données, réfléchissez soigneusement à la façon dont vous structurez le résultat et essayez-le d’abord sur de petits jeux de données.

Alternatives

De nombreuses fonctions dans Power Apps peuvent traiter plusieurs valeurs à la fois à l’aide d’une table à colonne unique. Par exemple, la fonction Len peut traiter une table de valeurs de texte, renvoyant une table de longueurs de la même manière que celle qui ForAll pourrait. Cela peut éliminer la nécessité d’utiliser ForAll dans de nombreux cas, peut être plus efficace et est plus facile à lire.

Une autre considération est que ForAll ce n’est pas délégable, tandis que d’autres fonctions peuvent être, telles que Filter.

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, Formule)

  • Tableau - Obligatoire. Table faisant l’objet de l’action.
  • Formule - 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( Carrés, Sqrt( Value ) )

Sqrt (carrés)
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 à colonne unique, ce qui permet d’effectuer cet exemple sans utiliser ForAll. Exemple de Sqrt.
ForAll( Carrés, Power( Valeur, 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 à colonne unique. Par conséquent, ForAll doit être utilisé 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 parcourir facilement les formules et d’être consommées facilement.

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.

Mais avant de faire cette copie, réfléchissez soigneusement si 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, la copie ne peut pas être déléguée, ce qui limite la quantité de données pouvant être déplacées.

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, ShowColumns et AddColumns ne peuvent pas être délégués. Le nombre réel de produits devant être commandés est donc limité. Si vous savez que la taille de ce résultat est toujours relativement petite, cette approche est correcte.

Et parce que nous n’avons pas fait de copie, il n’y a aucune copie supplémentaire des informations à gérer ou à tomber à jour.

ForAll à la demande

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

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.

Aucune partie de l’élément ForAll n’est délégable. Seule la première partie de la table Products est évaluée, ce qui peut être un 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 utilisateur à grande vitesse, vous pouvez mettre en cache une copie locale d’une table afin qu’il n’y ait pas de latence de 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'
            }
        )
    )
)

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

Collecter dans ForAll

Enfin, nous pouvons effectuer la collecte directement dans le 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 ne peut pas être déléguée pour l’instant ForAll . Si notre table Products est volumineuse, ForAll examine le premier ensemble d’enregistrements uniquement et nous pouvons manquer certains produits qui doivent être commandés. Mais pour les tables que nous savons restent petites, cette approche est correcte.

Notez que nous ne capturons pas le résultat du ForAll. Les appels de fonction Collect effectués à partir de celui-ci retournent la source de données NewOrder pour tous les enregistrements, ce qui peut s’ajouter à de nombreuses données si nous les capturions.

Table de carte dans un composant

Voir Tables de carte.