Vous pouvez créer une application qui accède aux informations dans Microsoft Excel, SharePoint, SQL Server et plusieurs autres sources qui stockent des données dans des tableaux et des enregistrements. Pour travailler plus efficacement avec ce type de données, passez en revue les concepts qui sont à la base de ces structures.

  • Un enregistrement contient une ou plusieurs catégories d’informations sur une personne, un lieu ou une chose. Par exemple, un enregistrement peut contenir le nom, l’adresse e-mail et le numéro de téléphone d’un client donné. D’autres outils font référence à un enregistrement en tant que « ligne » ou « élément ».
  • Un tableau contient un ou plusieurs enregistrements qui contiennent les mêmes catégories d’informations. Par exemple, un tableau peut contenir le nom, l’adresse e-mail et le numéro de téléphone de 50 clients.

Dans votre application, vous allez utiliser des formules pour créer, mettre à jour et manipuler les tableaux et les enregistrements. Vous allez probablement lire et écrire des données dans une source de données externe, qui est un tableau étendu. En outre, vous pouvez créer un ou plusieurs tableaux internes appelés collections.

Vous pouvez créer diverses formules qui prennent le nom d’un tableau en tant qu’argument. Il peut s’agir par exemple d’une formule dans Excel qui prend une ou plusieurs références de cellule en tant qu’arguments. Certaines formules dans PowerApps retournent un tableau qui reflète les autres arguments que vous spécifiez. Par exemple, vous pouvez créer une formule pour les raisons suivantes :

  • Mettre à jour un enregistrement dans un tableau en spécifiant ce tableau comme étant un des arguments de la fonction Patch
  • Ajouter, supprimer et renommer les colonnes d’un tableau en spécifiant ce tableau en tant qu’argument de la fonction AddColumns, DropColumns ou RenameColumns. Aucune de ces fonctions ne modifie le tableau d’origine. Au lieu de cela, la fonction retourne un autre tableau basé sur les autres arguments que vous spécifiez.

Éléments d’un tableau

Enregistrements

Chaque enregistrement contient une ou plusieurs catégories d’informations sur une personne, un lieu ou une chose. L’exemple ci-dessus montre un enregistrement pour chaque produit (Chocolate, Bread et Water) et une colonne pour chaque catégorie d’informations (Price, Quantity on Hand et Quantity on Order).

Dans une formule, vous pouvez référencer un enregistrement par lui-même, en dehors du contexte d’un tableau, en utilisant des accolades. Par exemple, l’enregistrement { Name: "Strawberries", Price: 7.99 } n’est associé à aucun tableau.

Champs

Un champ est une information dans un enregistrement. Vous pouvez visualiser ce type de champ en tant que valeur dans la colonne d’un enregistrement particulier.

Tout comme avec un contrôle, vous faites référence à un champ d’un enregistrement à l’aide de l’opérateur . sur l’enregistrement. Par exemple, First(Products).Name retourne le champ Name pour le premier enregistrement du tableau Products.

Un champ peut contenir un autre enregistrement ou une autre table (voir l’exemple de la fonction GroupBy). Vous pouvez imbriquer autant de niveaux d’enregistrements et de tableaux que vous le souhaitez.

Colonnes

Une colonne fait référence au même champ correspondant à un ou plusieurs enregistrements d’un tableau. Dans l’exemple ci-dessus, chaque produit possède un champ Price et ce prix est indiqué dans la même colonne pour tous les produits. Le tableau ci-dessus comporte quatre colonnes, affichées horizontalement en haut :

  • Name
  • Price
  • Quantity on Hand
  • Quantity on Order

Le nom de la colonne reflète les champs de cette colonne.

Toutes les valeurs d’une colonne ont le même type de données. Dans l’exemple ci-dessus, la colonne « Quantity on Hand » contient toujours un nombre et ne peut pas contenir de chaîne, telle que « 12 unités », pour un même enregistrement. La valeur d’un champ peut également être vide.

Dans d’autres outils, il se peut que les colonnes soient dénommées « champs ».

Remarque : pour des sources de données Excel ou SharePoint contenant des noms de colonne avec des espaces, PowerApps remplace les espaces par « _x0020_ ». Par exemple, le libellé « Nom de colonne » dans SharePoint ou Excel apparaît sous la forme « Nom_x0020_de_x0020_colonne » dans PowerApps quand il s’affiche dans la mise en page des données ou est utilisé dans une formule.

Tableau

Un tableau comprend un ou plusieurs enregistrements, chacun disposant de plusieurs champs qui ont des noms cohérents entre les enregistrements.

Un tableau stocké dans une source de données ou une collection a un nom, que vous utilisez pour faire référence au tableau et le transmettre à des fonctions qui utilisent des tableaux en tant qu’arguments. Les tableaux peuvent également être le résultat d’une fonction ou d’une formule.

Comme dans l’exemple suivant, vous pouvez faire référence à un tableau dans une formule à l’aide de la fonction Table avec un jeu d’enregistrements, que vous insérez entre des accolades :

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Vous pouvez également définir un tableau à une seule colonne avec des crochets. Méthode équivalente pour écrire la formule ci-dessus :

[ "Strawberry", "Vanilla" ]

Formules de tableau

Dans Excel et PowerApps, vous utilisez des formules pour manipuler des nombres et des chaînes de texte de la même manière :

  • Dans Excel, tapez une valeur, telle que 42, dans la cellule A1, puis tapez une formule, telle que A1+2, dans une autre cellule, pour afficher la valeur 44.
  • Dans PowerApps, définissez la propriété Default de Slider1 sur 42 et définissez la propriété Text d’une étiquette sur Slider1.Value + 2 pour afficher la valeur 44.

Dans les deux cas, la valeur calculée change automatiquement si vous modifiez les valeurs des arguments (par exemple, le nombre indiqué dans la cellule A1 ou la valeur de Slider1).

De même, vous pouvez utiliser des formules pour atteindre et manipuler des données dans des tableaux et des enregistrements. Vous pouvez utiliser des noms de tableaux en tant qu’arguments dans des formules, comme Min(Catalog, Price) pour afficher la valeur la plus petite dans la colonne Price du tableau Catalog. D’autres formules fournissent des tableaux entiers comme valeurs de retour, tels que RenameColumns(Catalog, "Price", "Cost"), qui retourne tous les enregistrements du tableau Catalog, mais remplace le nom de la colonne Price par Cost.

Tout comme avec des nombres, les formules qui impliquent des tableaux et des enregistrements sont recalculées automatiquement à mesure que le tableau ou l’enregistrement sous-jacent change. Si la valeur de coût d’un produit du tableau Catalog passe en dessous du minimum précédent, la valeur de retour de la formule Min change automatiquement.

Examinons quelques exemples simples.

  1. Ajoutez un contrôle Galerie de texte et définissez sa propriété Items sur le nom d’un tableau.

    Par défaut, la galerie affiche l’espace réservé au format texte d’un tableau nommé TextualGallerySample. La propriétéItems de la galerie est automatiquement définie sur ce tableau.

    Remarque : certains contrôles ont été réorganisés et agrandis aux fins d’illustration.

  2. Au lieu de définir la propriété Items sur le nom d’un tableau, définissez-la sur une formule qui inclut le nom du tableau en tant qu’argument, comme dans l’exemple ci-dessous :
    Sort(TextualGallerySample, Heading, Descending)

    Cette formule intègre la fonction Sort, qui prend le nom d’un tableau en tant que premier argument et le nom d’une colonne de ce tableau en tant que deuxième argument. La fonction prend également en charge un troisième argument facultatif qui stipule que vous souhaitez trier les données dans l’ordre décroissant.

  3. Définissez la propriété Items sur une formule qui utilise la formule de l’étape précédente en tant qu’argument et retourne un tableau, comme dans cet exemple :
    FirstN(Sort(TextualGallerySample, Heading, Descending), 2)

    Dans cette formule, vous utilisez la fonction FirstN pour afficher un certain nombre d’enregistrements dans un tableau. Vous utilisez la fonction Sort en tant que premier argument de FirstN et un nombre (dans ce cas, 2) en tant que deuxième argument, qui spécifie le nombre d’enregistrements à afficher.

    L’intégralité de la formule retourne un tableau qui contient les deux premiers enregistrements du tableau TextualGallerySample, triés par la colonne Heading dans l’ordre décroissant.

Fonctions de tableau et propriétés de contrôle

De nombreuses fonctions dans PowerApps prennent le nom d’un tableau en tant qu’argument, créent une seconde table qui contient les mêmes données, manipulent le nouveau tableau en fonction des autres arguments, puis retournent le résultat. Ces fonctions ne modifient pas le tableau d’origine, même s’il s’agit d’une source de données.

  • Sort, Filter - Trie et filtre les enregistrements.
  • FirstN, LastN - Retourne les N premiers ou derniers enregistrements du tableau.
  • Abs, Sqrt, Round, RoundUp, RoundDown - Opérations arithmétiques sur chaque enregistrement d’un tableau à une seule colonne, qui génèrent un tableau de résultats constitué d’une seule colonne.
  • Left, Mid, Right, Replace, Substitute, Trim, Lower, Upper, Proper - Manipulations de chaîne sur chaque enregistrement d’un tableau à une seule colonne, qui génèrent un tableau de chaînes constitué d’une seule colonne.
  • Len - Pour une colonne de chaînes, retourne un tableau à une seule colonne qui contient la longueur de chaque chaîne.
  • Concatenate - Concatène plusieurs colonnes de chaînes et retourne un tableau de chaînes à une seule colonne.
  • AddColumns, DropColumns, RenameColumns, ShowColumns - Manipulation de colonne du tableau, ce qui entraîne un nouveau tableau avec différentes colonnes.
  • Distinct - Supprime les doublons d’enregistrements.
  • Shuffle - Mélange les enregistrements dans un ordre aléatoire.
  • HashTags - Recherche des hashtags dans une chaîne.
  • Errors - Fournit des informations sur les erreurs lorsque vous utilisez une source de données.

Vous pouvez exécuter une fonction sur un tableau qui contient plusieurs colonnes, même si la fonction requiert une seule colonne en tant qu’argument. Pour extraire une seule colonne d’un tableau à plusieurs colonnes, utilisez la fonction ShowColumns en tant qu’argument pour la fonction que vous souhaitez utiliser, comme dans cet exemple :
Lower( ShowColumns( Products, "Name" ) )

Cette formule crée un tableau à une seule colonne qui contient toutes les données de la colonne Name du tableau Products, mais convertit les lettres majuscules en minuscules. Si vous spécifiez ce tableau en tant qu’argument de la fonction AddColumns, RenameColumns ou DropColumns, vous pouvez entièrement recréer le tableau à votre convenance.

Si vous spécifiez une source de données en tant qu’argument pour l’une de ces fonctions, cette dernière modifie les enregistrements de la source de données et, en règle générale, retourne la nouvelle valeur de la source de données sous forme de tableau.

  • Collect, Clear, ClearCollect - Crée, efface et ajoute à une collection.
  • Update, UpdateIf - Met à jour les enregistrements qui correspondent à un ou plusieurs critères que vous spécifiez.
  • Remove, RemoveIf - Supprime les enregistrements qui correspondent à un ou plusieurs critères que vous spécifiez.

Les contrôles suivants ont des propriétés qui sont des tableaux :

  • Items - S’applique aux galeries et zones de liste. Tableau à afficher dans la galerie.
  • SelectedItems - S’applique à des zones de liste. Tableau d’éléments que l’utilisateur a sélectionnés.

Formules d’enregistrement

Vous pouvez également créer une formule qui calcule les données d’un enregistrement spécifique, prend un enregistrement donné en tant qu’argument et fournit un enregistrement individuel comme valeur de retour. Revenons à l’exemple de la galerie ci-dessus et utilisons la propriété Gallery1.Selected pour afficher des informations à partir d’un enregistrement que l’utilisateur sélectionne dans cette galerie.

  1. Ajoutez un bouton, puis définissez sa propriété OnSelect sur la formule suivante :
    Collect( SelectedRecord, Gallery1.Selected )
  2. Si le bouton n’est pas sélectionné, cliquez dessus pour le sélectionner, puis cliquez à nouveau dessus pour exécuter la formule.
  3. Dans le menu Fichier, sélectionnez Collections.

Cette formule retourne un enregistrement qui inclut non seulement les données de l’enregistrement actuellement sélectionné dans la galerie, mais également chaque contrôle dans cette galerie. Par exemple, l’enregistrement contient à la fois une colonne Body, qui correspond à la colonne Body de la table d’origine et une colonne Body1, qui représente l’étiquette qui affiche les données de cette colonne. Sélectionnez l’icône de tableau dans la colonne Body1 pour accéder aux données détaillées.

Maintenant que vous avez sélectionné l’enregistrement, vous pouvez extraire des champs individuels à partir de celui-ci avec l’opérateur . .

  1. Appuyez sur Échap pour revenir à l’espace de travail par défaut, puis ajoutez une étiquette en dessous de la galerie.

  2. Définissez la propriété Text de l’étiquette sur la formule suivante :
    Gallery.Selected.Heading

Vous avez pris la propriété Selected, qui est un enregistrement, puis extrait la propriété Heading à partir de celle-ci.

Vous pouvez également utiliser un enregistrement en tant que conteneur à usage général pour les valeurs nommées associées.

  • Si vous créez une formule autour des fonctions UpdateContext et Navigate, utilisez un enregistrement pour rassembler les variables de contexte que vous souhaitez mettre à jour.
  • Utilisez la propriété Updates sur un contrôle Modifier le formulaire pour rassembler les modifications qui ont été apportées par l’utilisateur dans un formulaire.
  • Utilisez la fonction Patch pour mettre à jour une source de données ou fusionner des enregistrements.

Dans ce cas, l’enregistrement n’a jamais fait partie d’un tableau.

Fonctions d’enregistrement et propriétés de contrôle

Fonctions qui retournent des enregistrements :

  • FirstN, LastN - Retourne le ou les premiers ou derniers enregistrements du tableau.
  • Lookup - Retourne le premier enregistrement du tableau qui correspond à un ou plusieurs critères.
  • Patch - Met à jour une source de données ou fusionne des enregistrements.
  • Defaults - Retourne les valeurs par défaut pour une source de données.

Propriétés qui retournent des enregistrements :

  • Selected - S’applique aux galeries et zones de liste. Retourne l’enregistrement actuellement sélectionné.
  • Updates - S’applique aux galeries. Rassemble toutes les modifications qu’un utilisateur effectue dans un formulaire de saisie de données.
  • Update - S’applique aux contrôles d’entrée tels que des curseurs et contrôles de saisie de texte. Définit les propriétés individuelles de la galerie à rassembler.

Étendue de l’enregistrement

Certaines fonctions opèrent en évaluant une formule dans tous les enregistrements d’un tableau de façon individuelle. Le résultat de la formule est utilisé de différentes manières :

  • Filter, Lookup - La formule détermine si l’enregistrement doit être inclus dans la sortie.
  • Sort - La formule fournit la valeur sur laquelle trier les enregistrements.
  • Concat - La formule détermine les chaînes à concaténer.
  • ForAll - La formule peut retourner une valeur, éventuellement avec un effet secondaire.
  • Distinct - La formule retourne une valeur, utilisée pour identifier les enregistrements en double.
  • AddColumns - La formule fournit la valeur du champ ajouté.
  • Average, Max, Min, Sum, StdevP, VarP - La formule fournit les valeurs à agréger.

À l’intérieur de ces formules, vous pouvez référencer les champs de l’enregistrement qui est en cours de traitement. Chacune de ces fonctions crée une « étendue d’enregistrement » dans laquelle la formule est évaluée et où les champs de l’enregistrement sont disponibles en tant qu’identificateurs de niveau supérieur. Vous pouvez également référencer les propriétés de contrôle et d’autres valeurs à partir de votre application.

Par exemple, prenez un tableau de produits :

Pour déterminer si le nombre de produits demandés est supérieur au nombre de produits disponibles :

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Le premier argument à filtrer (Filter) est le tableau d’enregistrements à utiliser et le deuxième argument est une formule. Le filtre crée une étendue d’enregistrement pour l’évaluation de cette formule où les champs de chaque enregistrement sont disponibles, dans ce cas Product, Quantity Requested et Quantity Available. Le résultat de la comparaison détermine si chaque enregistrement doit être inclus dans le résultat de la fonction :

Continuez avec cet exemple et calculez la quantité de chaque produit à commander :

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

Ici, ajoutez une colonne calculée au résultat. AddColumns a sa propre étendue d’enregistrement qu’elle utilise pour calculer la différence entre ce qui a été demandé et ce qui est disponible.

Enfin, vous pouvez réduire le tableau de résultats aux colonnes dont vous avez besoin :

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

Notez que dans l’exemple ci-dessus, nous avons utilisé des guillemets doubles (") dans certains endroits et des guillemets simples (') ailleurs. Les guillemets simples sont requis lorsque vous référencez la valeur d’un objet, comme un champ ou un tableau, où le nom de l’objet contient un espace. Des guillemets doubles sont utilisés non pas pour faire référence à la valeur d’un objet, mais plutôt pour en parler, en particulier dans les situations où l’objet n’existe pas encore, comme dans le cas de AddColumns.

Lever les ambiguïtés

Les noms de champs ajoutés avec l’étendue d’enregistrement remplacent ces mêmes noms ailleurs dans l’application. Dans ce cas, vous pouvez toujours accéder aux valeurs en dehors de l’étendue d’enregistrement avec l’opérateur @ disambiguation (levée d’ambiguïtés) :

  • Pour accéder aux valeurs des étendues d’enregistrements imbriquées, utilisez l’opérateur @ avec le nom du tableau qui est utilisé actuellement à l’aide du modèle Table[@FieldName].
  • Pour accéder à des valeurs globales, telles que les sources de données, les collections et les variables de contexte, utilisez le modèle [@ObjectName] (sans désignation du tableau).

Si le tableau actuellement utilisé est une expression, comme Filtrer( table,...), l’opérateur de levée d’ambiguïté ne peut pas être utilisé. Seule l’étendue d’enregistrement la plus profonde permet d’accéder aux champs de cette expression de tableau, sans utiliser l’opérateur de levée d’ambiguïté (disambiguation).

Par exemple, imaginez que vous avez une collection X :

Vous pouvez créer cette collection avec ClearCollect( X, [1, 2] ).

Et une autre collection Y :

Vous pouvez créer cette collection avec ClearCollect( Y, ["A", "B"] ).

En outre, définissez une variable de contexte nommée Value avec cette formule : UpdateContext( {Value: "!"} )

Résumons. Dans ce contexte, la formule suivante :

  • Ungroup( ForAll( X, ForAll( Y, Y[@Value] & Text( X[@Value] ) & [@Value] ) ), "Value" )

génère ce tableau :

Que se passe-t-il ici ? La fonction ForAll la plus extérieure définit une étendue d’enregistrement pour X, en permettant d’accéder au champ Value de chaque enregistrement à mesure qu’il est traité. Celui-ci est accessible en utilisant simplement le mot Value ou à l’aide de X[@Value].

La fonction ForAll la plus intérieure définit une autre étendue d’enregistrement pour Y. Étant donné que ce tableau possède également un champ Value défini, utiliser Value ici fait référence au champ de l’enregistrement de Y et non à celui provenant de X. Ici, pour accéder au champ Value de X, vous devez utiliser la version la plus longue avec l’opérateur de levée d’ambiguïté.

Étant donné que Y est l’étendue d’enregistrement la plus intérieure, l’accès aux champs de ce tableau ne nécessite pas de levée d’ambiguïté, ce qui vous permet d’utiliser la formule suivante avec le même résultat :

  • Ungroup( ForAll( X, ForAll( Y, Value & Text( X[@Value] ) & [@Value] ) ), "Value" )

Toutes les étendues d’enregistrement ForAll remplacent l’étendue globale. La variable contextuelle Value que vous avez définie n’est pas disponible par son nom sans l’opérateur de levée d’ambiguïté. Pour accéder à cette valeur, vous devez utiliser [@Value].

Ungroup aplatit le résultat, étant donné que les fonctions ForAll imbriquées entraînent un tableau de résultats imbriqué.

Syntaxe inline

Enregistrements

Vous faites référence à des enregistrements en utilisant des accolades qui contiennent des valeurs de champ nommées. Par exemple, vous pouvez faire référence au premier enregistrement du tableau présenté au début de cette rubrique à l’aide de la formule suivante :

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Vous pouvez également incorporer des formules dans d’autres formules, comme le montre cet exemple :

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Vous pouvez imbriquer des enregistrements en imbriquant des accolades, comme le montre cet exemple :

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Placez chaque nom de colonne qui contient un caractère spécial, un espace ou un signe deux-points entre des guillemets simples. Pour utiliser un seul guillemet dans un nom de colonne, double-cliquez dessus.

Notez que la valeur de la colonne Price n’inclut pas de symbole monétaire, comme le signe dollar. Cette mise en forme est appliquée lorsque la valeur est affichée.

Tableaux

Vous pouvez créer un tableau à l’aide de la fonction Table et d’un jeu d’enregistrements. Vous pouvez exprimer le tableau présenté au début de cette rubrique à l’aide de la formule suivante :

Table( { Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
            { Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
            { Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } )

Vous pouvez également imbriquer des tableaux :

Table( { Name: "Chocolate",
            'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
                        { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) } )

Tableaux de valeurs

Vous pouvez créer des tableaux à une seule colonne en spécifiant des valeurs entre crochets. Le tableau qui en résulte a une seule colonne nommée Value.

Par exemple, [ 1, 2, 3, 4 ] est l’équivalent de Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) et retourne le tableau suivant :