Variables

Note

Microsoft Power Fx est le nouveau nom du langage de formule pour les applications canevas. Ces articles associés sont un travail en cours car nous extrayons le langage des applications de canevas, l’intégrons à d’autres produits Microsoft Power Platform, et le rendons disponible en open source. Commencez par l’Aperçu de Microsoft Power Fx pour une introduction à la langue.

Si vous avez utilisé un autre outil de programmation, tel que Visual Basic ou JavaScript, vous vous demandez peut-être : Où sont les variables ? Microsoft Power Fx est un peu différent et nécessite une approche différente. Au lieu de chercher une variable quand vous écrivez une formule, demandez-vous : Que ferais-je dans une feuille de calcul ?

Dans d’autres outils, vous auriez peut-être explicitement effectué un calcul et stocké le résultat dans une variable. Cependant, Power Fx et Excel recalculent automatiquement les formules lorsque les données saisies sont modifiées. Ainsi, vous n’avez donc généralement pas besoin de créer ni de mettre à jour des variables. En adoptant cette approche lorsque cela est possible, vous facilitez la création, la compréhension et la gestion de votre application.

Dans certains cas, vous devrez utiliser des variables dans Power Fx, qui étend le modèle d’Excel en ajoutant des formules de comportement. Ces formules sont exécutées lorsque, par exemple, un utilisateur sélectionne un bouton. Dans une formule de comportement, il est souvent utile de définir une variable à utiliser dans d’autres formules.

De manière générale, évitez d’utiliser des variables. Toutefois, dans certains cas, seule une variable vous permet d’obtenir l’expérience que vous souhaitez. Les variables sont créées et typées implicitement lorsqu’elles apparaissent dans des fonctions qui définissent leurs valeurs.

Convertir Excel dans Power Fx

Excel

Examinons le fonctionnement d’Excel. Une cellule peut contenir une valeur, comme un nombre ou une chaîne, ou une formule basée sur les valeurs d’autres cellules. Lorsque l’utilisateur entre une valeur différente dans une cellule, Excel recalcule automatiquement les formules qui dépendent de la nouvelle valeur. Vous n’avez aucune programmation à effectuer pour activer ce comportement.

Dans l’exemple suivant, la cellule A3 est définie sur la formule A1+A2. Si A1 ou A2 change, A3 recalcule automatiquement pour refléter le changement. Ce comportement ne nécessite aucun codage en dehors de la formule elle-même.

Animation de recalcul de la somme de deux nombres dans Excel.

Excel ne possède pas de variables. La valeur d’une cellule qui contient une formule change en fonction de son contenu, mais il n’existe aucun moyen de mémoriser le résultat d’une formule et de le stocker dans une cellule ou n’importe où ailleurs. Si vous modifiez la valeur d’une cellule, l’ensemble de la feuille de calcul peut être modifié et toutes les valeurs précédemment calculées sont perdues. Un utilisateur Excel peut copier et coller des cellules, mais cette opération dépend du contrôle manuel de l’utilisateur et n’est pas possible avec des formules.

Power Fx

La logique que vous créez dans Power Fx a un comportement très proche d’Excel. Au lieu de mettre à jour des cellules, vous pouvez ajouter des contrôles où vous le souhaitez sur un écran et les nommer pour les utiliser dans des formules.

Par exemple, dans Power Apps, vous pouvez répliquer le comportement d’Excel dans une application en ajoutant un contrôle Label nommé Label1, et deux contrôles Text input nommés TextInput1 et TextInput2. Si vous définissez ensuite la propriété Text de Label1 sur TextInput1.Text + TextInput2.Text, elle affichera toujours automatiquement la somme des nombres qui se trouvent dans TextInput1 et TextInput2.

Calcul de la somme de deux nombres dans Power Fx.

Notez que le contrôle Label1 est sélectionné, ce qui affiche sa formule Text dans la barre de formule en haut de l’écran. Ici, nous trouvons la formule TextInput1.Text + TextInput2.Text. Cette formule crée une dépendance entre ces contrôles, au même titre que les dépendances créées entre les cellules dans un classeur Excel. Nous allons maintenant changer la valeur de TextInput1 :

Animation de calcul de la somme de deux nombres dans Power Fx.

La formule de Label1 a été automatiquement recalculée et affiche la nouvelle valeur.

Dans Power Fx, vous pouvez utiliser des formules pour déterminer non seulement la valeur principale d’un contrôle, mais également des propriétés telles que la mise en forme. Dans l’exemple suivant, une formule pour la propriété Color de l’étiquette affiche automatiquement les valeurs négatives en rouge. La fonction If est proche de celle d’Excel :

If( Value(Label1.Text) < 0, Color.Red, Color.Black )

Animation de mise en forme conditionnelle.

Vous pouvez utiliser des formules pour un vaste éventail de scénarios :

  • En utilisant le GPS de votre appareil, un contrôle de carte peut afficher votre emplacement actuel à l’aide d’une formule qui utilise les données Location.Latitude et Location.Longitude. À mesure que vous vous déplacez, la carte géolocalisera automatiquement votre position.
  • Les autres utilisateurs peuvent mettre à jour les sources de données. Par exemple, d’autres personnes de votre équipe peuvent mettre à jour des éléments d’une liste SharePoint. Lorsque vous actualisez une source de données, toutes les formules dépendantes sont automatiquement recalculées afin de refléter les données mises à jour. En poursuivant cet exemple, vous pouvez définir la propriété Items d’une galerie sur la formule Filter( SharePointList ), qui affiche automatiquement le nouvel ensemble d’enregistrements filtré.

Bénéfices

L’utilisation de formules pour créer des applications présente de nombreux avantages :

  • Si vous connaissez Excel, vous connaissez Power Fx. Le modèle et le langage des formules sont identiques.
  • Si vous avez déjà utilisé d’autres outils de programmation, imaginez la quantité de code qui serait nécessaire pour exécuter ces exemples. Dans Visual Basic, vous devriez écrire un gestionnaire d’événements pour l’événement de modification sur chaque contrôle d’entrée de texte. Le code permettant d’effectuer le calcul dans chacune d’elles est redondant et pourrait être désynchronisé, ou vous devriez écrire une sous-routine commune. Dans Power Fx, vous avez accompli tout cela avec une formule unique sur une seule ligne.
  • Pour comprendre d’où provient le texte de Label1, vous savez exactement où chercher : la formule de la propriété Text. Il n’existe aucun autre moyen d’affecter le texte de ce contrôle. Dans un outil de programmation traditionnel, tout gestionnaire d’événements ou toute sous-routine peut modifier la valeur du libellé, à partir de n’importe où dans le programme. Cela peut rendre difficile le repérage du moment et de l’endroit auxquels la variable a été modifiée.
  • Si l’utilisateur modifie un contrôle Curseur, puis change d’avis, il peut rétablir le curseur sur sa valeur d’origine. C’est comme si rien n’avait changé : l’application affiche les mêmes valeurs de contrôle qu’auparavant. Il n’existe aucune ramification permettant de tester et de demander « que se passe-t-il si », tout comme dans Excel.

De manière générale, il est préférable d’obtenir un effet à l’aide d’une formule. Reposez-vous sur le moteur de formules de Power Fx.

Savoir quand utiliser des variables

Modifions notre additionneur simple pour qu’il se comporte comme une machine à additionner traditionnelle, avec un total cumulé. Si vous sélectionnez le bouton Add, vous ajoutez un nombre au total cumulé. Si vous sélectionnez le bouton Clear, vous réinitialisez le total cumulé sur zéro.

Écran d’affichage Description
Application avec un contrôle Saisie de texte, une Étiquette et deux boutons. Lorsque l’application démarre, le total cumulé est de 0.

Le point rouge représente le doigt de l’utilisateur dans la zone de saisie de texte, où l’utilisateur entre 77.
Le contrôle Saisie de texte contient 77, et le bouton Add est enfoncé. L’utilisateur sélectionne le bouton Add.
Le total est de 77, et 77 autres y sont ajoutés. 77 est ajouté au total cumulé.

L’utilisateur sélectionne le bouton Add à nouveau.
Le total est de 154 avant qu’il ne soit effacé. 77 est à nouveau ajouté au total cumulé, ce qui donne 154.

L’utilisateur sélectionne le bouton Clear.
Le total est effacé. Le total cumulé est réinitialisé sur 0.

Notre machine à additionner utilise un élément qui n’existe pas dans Excel : un bouton. Dans cette application, vous ne pouvez pas utiliser uniquement des formules pour calculer le total cumulé, car sa valeur dépend d’une série d’actions effectuées par l’utilisateur. Au lieu de cela, notre total cumulé doit être enregistré et mis à jour manuellement. La plupart des outils de programmation stockent ces informations dans une variable.

Vous avez parfois besoin d’une variable pour que votre application se comporte comme vous le souhaitez. Cependant, cette approche implique des mises en garde :

  • Vous devez mettre à jour manuellement le total cumulé. Le recalcul automatique ne sera pas effectué automatiquement.
  • Le total cumulé ne peut plus être calculé en fonction des valeurs d’autres contrôles. Il dépend du nombre de fois que l’utilisateur a sélectionné le bouton Ajouter et de la valeur qui était dans le contrôle de saisie de texte à chaque fois. L’utilisateur a-t-il entré 77 et sélectionné Ajouter à deux reprises, ou a-t-il spécifié 24 et 130 pour chacun des ajouts ? Vous ne pouvez pas faire la différence lorsque le total atteint 154.
  • Les modifications apportées au total peuvent provenir de différentes sources. Dans cet exemple, les boutons Add et Clear peuvent mettre à jour le total. Si l’application ne se comporte pas comme prévu, quel bouton provoque le problème ?

Utiliser une variable globale

Pour créer notre machine à additionner, nous avons besoin d’une variable qui contienne le total cumulé. Les variables les plus simples dans Power Fx sont les variables globales.

Fonctionnement des variables globales :

  • Définissez la valeur de la variable globale avec la fonction Set. Set( MyVar, 1 ) définit la variable globale MyVar sur la valeur 1.
  • Utilisez la variable globale en référençant le nom utilisé avec la fonction Set. Dans ce cas, MyVar retourne 1.
  • Les variables globales peuvent contenir n’importe quelle valeur, y compris des chaînes, des nombres, des enregistrements et des tables.

Recréez la machine à additionner à l’aide d’une variable globale :

  1. Ajoutez un contrôle Text input nommé TextInput1 et deux boutons, nommés Button1 et Button2.

  2. Définissez la propriété Text de Button1 sur « Add » et la propriété Text de Button2 sur « Clear ».

  3. Pour mettre à jour le total cumulé chaque fois qu’un utilisateur sélectionne le bouton Ajouter, définissez sa propriété OnSelect sur la formule suivante :

    Set( RunningTotal, RunningTotal + TextInput1.Text )

    La simple existence de cette formule établit RunningTotal comme une variable globale qui contient un nombre en raison de l’opérateur +. Vous pouvez référencer RunningTotal n’importe où dans l’application. Chaque fois que l’utilisateur ouvre cette application, RunningTotal a une valeur initiale de Vide.

    La première fois qu’un utilisateur sélectionne le bouton Add et que Set s’exécute, RunningTotal est défini sur la valeur RunningTotal + TextInput1.

    La propriété OnSelect du bouton Add est définie sur la fonction Set.

  4. Pour définir le total cumulé sur 0 chaque fois que l’utilisateur sélectionne le bouton Clear, définissez sa propriété OnSelect sur la formule suivante :

    Set( RunningTotal, 0 )

    La propriété OnSelect du bouton Clear est définie sur la fonction Set.

  5. Ajoutez un contrôle Label et définissez sa propriété Text sur RunningTotal.

    Cette formule est recalculée automatiquement et permet à l’utilisateur de consulter la valeur de RunningTotal à mesure qu’elle est modifiée selon les boutons sélectionnés par l’utilisateur.

    La propriété de texte de l’étiquette est définie sur le nom de la variable.

  6. Affichez un aperçu de l’application : vous obtenez la machine à additionner, telle que décrite ci-dessus. Entrez un nombre dans la zone de texte et appuyez sur le bouton Ajouter plusieurs fois. Lorsque vous êtes prêt, revenez à l’expérience de création à l’aide de la touche Échap.

    Le contrôle Text input contient une valeur et Label contient le total cumulé.

  7. Pour afficher la valeur de la variable globale, sélectionnez le menu Fichier et sélectionnez Variables dans le volet gauche.

    Option Variables dans le menu Fichier.

  8. Pour afficher tous les emplacements où la variable est définie et utilisée, sélectionnez-la.

    Liste des emplacements où la variable est utilisée.

Types de variable

Les deux types de variables de Power Fx sont :

Type de variable Portée Description Fonctions qui établissent
Variables globales Application Les plus simples à utiliser. Contiennent un nombre, une chaîne de texte, une table, une valeur booléenne, un enregistrement, etc., qui peut être référencé à partir de n’importe où dans l’application. Set
Collections App Contiennent une table qui peut être référencée à partir de n’importe où dans l’application. Permettent de modifier le contenu de la table plutôt que de le définir dans son ensemble. Peuvent être enregistrées sur l’appareil local pour une utilisation ultérieure. Collect
ClearCollect

Lors de l’utilisation dans Power Apps, il existe un troisième type de variable :

Type de variable Scope Description Fonctions qui établissent
Variables de contexte Écran Idéales pour transmettre des valeurs à un écran, comme vous transmettriez des paramètres à une procédure dans d’autres langages. Peuvent être référencées uniquement à partir d’un seul écran. UpdateContext
Navigate

Créer et supprimer des variables

Toutes les variables sont créées implicitement lorsqu’elles apparaissent dans une fonction Set, UpdateContext, Navigate, Collect ou ClearCollect. Pour déclarer une variable et son type, il vous suffit de l’inclure dans l’une de ces fonctions n’importe où dans votre application. Aucune de ces fonctions ne crée de variables ; ils remplissent uniquement les variables avec des valeurs. Vous ne déclarez jamais de variables explicitement comme vous le feriez dans un autre outil de programmation, et toute saisie est implicite à partir de l’utilisation.

Par exemple, vous pourriez avoir un contrôle button avec une formule OnSelect égale à Set( X, 1 ). Cette formule établit X comme une variable avec un type de nombre. Vous pouvez utiliser X dans les formules sous forme de nombre, et cette variable a une valeur de Vide après avoir ouvert l’application, mais avant de sélectionner le bouton. Lorsque vous sélectionnez le bouton, vous donnez à X la valeur de 1.

Si vous avez ajouté un autre bouton et défini sa propriété OnSelect sur Set( X, "Hello" ), une erreur se produirait car le type (chaîne de texte) ne correspond pas au type précédent Set (nombre). Toutes les définitions implicites de la variable doivent s’accorder sur le type. Encore une fois, tout cela est arrivé parce que vous avez mentionné X dans les formules, pas parce que l’une de ces formules avait réellement fonctionné.

Vous supprimez une variable en supprimant toutes les fonctions Set, UpdateContext, Navigate, Collect, ou ClearCollect qui implicitement établissent la variable. Sans ces fonctions, la variable n’existe pas. Vous devez également supprimer toutes les références à la variable car elles provoqueront une erreur.

Durée de vie et valeur initiale de la variable

Toutes les variables sont conservées en mémoire pendant que l’application s’exécute. Après la fermeture de l’application, les valeurs que les variables contiennent sont perdues.

Vous pouvez stocker le contenu d’une variable dans un source de données en utilisant les fonctions Patch ou Collect. Vous pouvez également stocker des valeurs dans des collections sur le périphérique local en utilisant la fonction SaveData.

Lorsque l’utilisateur ouvre l’application, toutes les variables ont une valeur initiale de Vide.

Variables de lecture

Utilisez les noms de la variable pour lire leurs valeurs. Par exemple, vous pouvez définir une variable avec cette formule :

Set( Radius, 12 )

Ensuite, vous pouvez simplement utiliser Rayon partout où vous pouvez utiliser un numéro, et il sera remplacé par 12 :

Pi() * Power( Radius, 2 )

Si vous donnez à une variable de contexte le même nom qu’une variable globale ou une collection, la variable de contexte est prioritaire. Toutefois, vous pouvez toujours référencer la variable globale ou la collection si vous utilisez l’opérateur de levée d’ambiguïté@[Radius].

Utiliser une variable de contexte (Power Apps uniquement)

Nous allons voir comment créer notre machine à additionner à l’aide d’une variable de contexte au lieu d’une variable globale.

Fonctionnement des variables de contexte :

  • Vous établissez et définissez implicitement les variables de contexte à l’aide de la fonction UpdateContext ou Navigate. Lorsque l’application démarre, la valeur initiale de toutes les variables de contexte est Vide.
  • Vous mettez à jour des variables de contexte avec des enregistrements. Dans d’autres outils de programmation, vous utilisez couramment « = » pour l’affectation, comme dans « x = 1 ». Pour les variables de contexte, utilisez { x: 1 } à la place. Lorsque vous utilisez une variable de contexte, utilisez son nom directement sans la syntaxe d’enregistrement.
  • Vous pouvez également définir une variable de contexte lorsque vous utilisez la fonction Navigate pour afficher un écran. Si vous considérez un écran comme une sorte de procédure ou de sous-routine, cette approche ressemble à la transmission de paramètres dans d’autres outils de programmation.
  • À l’exception de Navigate, les variables de contexte sont limitées au contexte d’un seul écran, d’où elles tirent leur nom. Vous ne pouvez pas les utiliser ni les définir en dehors de ce contexte.
  • Les variables de contexte peuvent contenir n’importe quelle valeur, y compris des chaînes, des nombres, des enregistrements et des tableaux.

Recréons notre machine à additionner à l’aide d’une variable de contexte :

  1. Ajoutez un contrôle Text input nommé TextInput1 et deux boutons, nommés Button1 et Button2.

  2. Définissez la propriété Text de Button1 sur « Add » et la propriété Text de Button2 sur « Clear ».

  3. Pour mettre à jour le total cumulé chaque fois qu’un utilisateur sélectionne le bouton Ajouter, définissez sa propriété OnSelect sur la formule suivante :

    UpdateContext( { RunningTotal: RunningTotal + TextInput1.Text } )

    La simple existence de cette formule établit RunningTotal comme une variable de contexte qui contient un nombre en raison de l’opérateur +. Vous pouvez référencer RunningTotal n’importe où dans cet écran. Chaque fois que l’utilisateur ouvre cette application, RunningTotal a une valeur initiale de Vide.

    La première fois que l’utilisateur sélectionne le bouton Add et que UpdateContext s’exécute, RunningTotal est défini sur la valeur RunningTotal + TextInput1.

    Propriété OnSelect du bouton Add.

  4. Pour définir le total cumulé sur 0 chaque fois que l’utilisateur sélectionne le bouton Clear, définissez sa propriété OnSelect sur la formule suivante :

    UpdateContext( { RunningTotal: 0 } )

    Là encore, UpdateContext est utilisé avec la formule UpdateContext( { RunningTotal: 0 } ).

    Propriété OnSelect du bouton Clear.

  5. Ajoutez un contrôle Label et définissez sa propriété Text sur RunningTotal.

    Cette formule est recalculée automatiquement et permet à l’utilisateur de consulter la valeur de RunningTotal à mesure qu’elle est modifiée selon les boutons sélectionnés par l’utilisateur.

    Propriété Text de l’étiquette.

  6. Affichez un aperçu de l’application et vous obtenez la machine à additionner, telle que décrite ci-dessus. Entrez un nombre dans la zone de texte et appuyez sur le bouton Ajouter plusieurs fois. Lorsque vous êtes prêt, revenez à l’expérience de création à l’aide de la touche Échap.

    Le contrôle Text input affiche une valeur et Label affiche le total cumulé.

  7. Vous pouvez définir la valeur d’une variable de contexte tout en navigant vers un écran. Cela est utile pour la transmission d’un « contexte » ou de « paramètres » d’un écran à un autre. Pour illustrer cette technique, insérez un écran, insérez un bouton et définissez sa propriété OnSelect sur cette formule :

    Navigate( Screen1, None, { RunningTotal: -1000 } )

    Propriété OnSelect d’un bouton.

    Maintenez la touche Alt enfoncée pendant que vous sélectionnez ce bouton pour afficher Screen1 et définissez la variable de contexte RunningTotal sur -1000.

    Screen1 est ouvert.

  8. Pour afficher la valeur de la variable de contexte, sélectionnez le menu Fichier, puis sélectionnez Variables dans le volet gauche.

    Option Variables sur le menu Fichier.

  9. Pour afficher l’emplacement où la variable de contexte est définie et utilisée, sélectionnez-la.

    Liste des emplacements où une variable est utilisée.

Utiliser une collection

Enfin, examinons la création de la machine à additionner avec une collection. Étant donné que la collection conserve une table qui est facile à modifier, vous allez configurer cette machine de sorte qu’elle conserve une « bande de papier » de chaque valeur entrée.

Fonctionnement des collections :

  • Créez et définissez des collections à l’aide de la fonction ClearCollect. Vous pouvez également utiliser la fonction Collect, mais elle nécessitera une autre variable au lieu de remplacer l’ancienne.
  • Une collection est une sorte de source de données et, par conséquent, une table. Pour accéder à une valeur unique dans une collection, utilisez la fonction First et extrayez un champ de l’enregistrement qui en résulte. Si vous avez utilisé une valeur unique avec ClearCollect, il s’agira du champ Valeur comme dans cet exemple :
    First(VariableName).Value

Recréons notre machine à additionner à l’aide d’une collection :

  1. Ajoutez un contrôle Text input nommé TextInput1 et deux boutons, nommés Button1 et Button2.

  2. Définissez la propriété Text de Button1 sur « Add » et la propriété Text de Button2 sur « Clear ».

  3. Pour mettre à jour le total cumulé chaque fois qu’un utilisateur sélectionne le bouton Ajouter, définissez sa propriété OnSelect sur la formule suivante :

    Collect( PaperTape, TextInput1.Text )

    La simple existence de cette formule établit Bande de papier comme une collection qui contient un tableau à une colonne de chaînes de texte. Vous pouvez référencer PaperTape n’importe où dans cette application. Chaque fois qu’un utilisateur ouvre cette application, Bande de papier est une table vide.

    Quand cette formule s’exécute, elle ajoute la nouvelle valeur à la fin de la collection. Étant donné que vous ajoutez une valeur unique, Collect la place automatiquement dans une table à colonne unique et le nom de la colonne est Value, que vous utiliserez plus tard.

    Bouton Ajouter propriété OnSelect.

  4. Pour effacer la bande lorsque l’utilisateur sélectionne le bouton Clear, définissez sa propriété OnSelect sur la formule suivante :

    Clear( PaperTape )

    Bouton Effacer propriété OnSelect.

  5. Pour afficher le total cumulé, ajoutez une étiquette et définissez sa propriété Text sur la formule suivante :

    Sum( PaperTape, Value )

    Libellé de propriété de texte.

  6. Pour exécuter la machine à additionner, appuyez sur F5 pour ouvrir l’aperçu, entrez des nombres dans le contrôle d’entrée de texte, puis sélectionnez des boutons.

    Le contrôle Text input affiche une valeur et Label affiche le total cumulé.

  7. Pour revenir à l’espace de travail par défaut, appuyez sur Échap.

  8. Pour afficher la bande de papier, insérez un contrôle Data table, puis définissez sa propriété Items sur la formule suivante :

    PaperTape

    Dans le volet de droite, sélectionnez Modifier les champs, puis sélectionnez Ajouter le champ, sélectionnez la colonne Valeur, puis sélectionnez Ajouter pour l’afficher.

    Data table qui affiche les valeurs ajoutées à la collection.

  9. Pour afficher les valeurs dans votre collection, sélectionnez Collections dans le menu Fichier.

    Aperçu de la collection PaperTape.

  10. Pour stocker et récupérer votre collection, ajoutez deux contrôles Button supplémentaires et définissez leurs propriétés Text sur Load et Save. Définissez la propriété OnSelect du bouton Load sur la formule suivante :

    Clear( PaperTape ); LoadData( PaperTape, "StoredPaperTape", true )

    Vous devez supprimer la collection en premier, car LoadData ajoute les valeurs stockées à la fin de la collection.

    Bouton Charger propriété OnSelect.

  11. Définissez la propriété OnSelect du bouton Save sur la formule suivante :

    SaveData( PaperTape, "StoredPaperTape" )

    Bouton Enregistrer propriété OnSelect.

  12. Affichez un aperçu en appuyant sur la touche F5, entrez des nombres dans le contrôle d’entrée de texte, puis sélectionnez les boutons. Cliquez sur le bouton Enregistrer. Fermez et rechargez votre application, puis sélectionnez le bouton Load pour recharger votre collection.