[ExoA] Approbation séquentielle depuis Power Apps
Présentation du lab
Scénario
Votre service organise des événements internes. Chaque demande d'événement doit être validée successivement par plusieurs approbateurs, choisis par le demandeur au moment de la saisie. L'ordre de saisie des approbateurs fixe l'ordre de validation.
- Le demandeur saisit l'événement dans une application Power Apps et choisit ses approbateurs.
- Un flux Power Automate envoie la demande au premier approbateur, puis au suivant après chaque approbation.
- Un seul refus arrête le circuit et passe la demande au statut « Rejeté ».
- L'application affiche en temps réel l'étape en cours, la couleur de chaque étape et l'historique des décisions avec les commentaires.
Capture d'écran à insérer : Vue d'ensemble du résultat final : écran de demande d'approbation avec le formulaire à gauche et le panneau latéral des approbateurs (pastilles verte, orange et grise) à droite
Objectifs pédagogiques
À la fin de l'exercice, vous saurez :
- préparer une liste SharePoint adaptée à un circuit d'approbation (colonnes Choix, Personne à sélection multiple, Nombre, Texte multiligne) ;
- utiliser le modèle d'écran moderne « Demande d'approbation » de Power Apps et le relier à une source de données ;
- contourner une limite des contrôles modernes en réutilisant un contrôle classique ;
- construire un flux d'approbation qui se relance lui-même, étape par étape, en maîtrisant la boucle par une condition de déclenchement ;
- écrire des expressions Power Automate (
if,equals,length,add, accès indexé à un tableau) ; - appeler l'API REST de SharePoint pour vider une colonne Personne ;
- afficher l'avancement d'un processus dans une galerie avec des badges colorés.
Prérequis
- Un compte Microsoft 365 avec Power Apps et Power Automate (licence incluse dans Microsoft 365 : tous les connecteurs utilisés sont standard).
- Un site SharePoint sur lequel vous pouvez créer une liste.
- Deux ou trois collègues (ou comptes de test) pour jouer le rôle d'approbateurs, avec accès à leur messagerie Outlook.
- Avoir activé les contrôles et thèmes modernes dans les paramètres de l'application (Paramètres > Mises à jour > Nouveau).
Exercices du lab
| Exercice | Contenu | Durée estimée |
| 1 | Créer la liste SharePoint et ses colonnes | 20 min |
| 2 | Construire l'écran d'accueil et l'écran de demande | 30 min |
| 3 | Gérer les approbateurs et la colonne « Assigné à » | 30 min |
| 4 | Construire le flux d'approbation séquentielle | 50 min |
| 5 | Afficher l'avancement et l'historique dans l'application | 30 min |
| 6 | Tester le circuit complet | 20 min |
Conventions de nommage utilisées dans cet exercice
Liste SharePoint :Evenements(sans accent ni espace, pour simplifier les appels à l'API).
Colonnes :Statut,Approbateurs,AssigneA,HistoriqueApprobation,NbDecisions(sans accent : le nom interne d'une colonne est fixé à sa création).
Écrans :scrAccueil,scrDemande| contrôles :tblEvenements,frmApprobation,cmbApprobateurs.
Variable :varItem(l'événement sélectionné).
Bon à savoir
La vidéo source est en anglais et dure 27 minutes ; l'exercice reprend fidèlement son déroulé, avec des noms en français et des étapes de vérification ajoutées.
Prévoyez les comptes approbateurs ou travaillez en binômes : sans approbateurs réels, l'exercice 6 est impossible.
L'exercice 4 est le plus dense (expressions) : un point d'étape collectif est conseillé après lui.
Exercice 1 : créer la liste SharePoint
Durée estimée : 20 minutes
Dans cet exercice, vous allez créer la liste qui stocke les événements. La liste stocke les événements et tout l'état du circuit d'approbation : qui doit approuver, qui a la main, combien de décisions ont été prises et ce qu'elles disent.
Tâche 1 : créer la liste et ses colonnes
- Créez une liste vide nommée
Evenementssur votre site SharePoint. Gardez la colonne Titre pour le nom de l'événement ; ajoutez si vous le souhaitez une colonne Date et une colonne Lieu. - Ajoutez une colonne Choix nommée
Statutavec trois valeurs :En attente,Approuvé,Rejeté. Valeur par défaut :En attente. - Ajoutez une colonne Personne nommée
Approbateurs. Dans « Plus d'options », activez Autoriser plusieurs sélections. - Ajoutez une colonne Personne nommée
AssigneA(sélection simple). Elle contiendra l'approbateur qui a la main. - Ajoutez une colonne Plusieurs lignes de texte nommée
HistoriqueApprobation. - Ajoutez une colonne Nombre nommée
NbDecisions, 0 décimale, valeur par défaut0.
Capture d'écran à insérer : Paramètres de la liste Evenements : la liste des colonnes avec leur type (Statut en Choix, Approbateurs et AssigneA en Personne, HistoriqueApprobation en Plusieurs lignes de texte, NbDecisions en Nombre)
Tâche 2 : vérifier les valeurs par défaut
- Créez un élément de test directement dans SharePoint :
Statutvaut « En attente » etNbDecisionsvaut 0 sans rien saisir. - Supprimez ensuite cet élément : le flux de l'exercice 4 ne doit pas le traiter.
Solution | rôle de chaque colonne
Statut: sert de « verrou » au flux. Tant qu'il vaut « En attente », le flux se relance ; dès qu'il vaut « Approuvé » ou « Rejeté », il s'arrête.Approbateurs: la liste ordonnée des approbateurs. Son nombre d'éléments indique combien de décisions sont attendues.AssigneA: l'approbateur courant. Le flux lit cette colonne pour savoir à qui envoyer la demande.NbDecisions: compteur des décisions déjà prises. Il sert aussi d'index pour trouver l'approbateur suivant.HistoriqueApprobation: texte cumulatif « Approuvé par ... | Commentaire : ... ».
Bon à savoir
Erreur fréquente : des accents ou espaces dans les noms de colonnes. Le nom interne devient alorsAssign_x00e9__x00e0_et les expressions des exercices 4 et 5 ne fonctionnent plus telles quelles.
Si vous renommez une colonne après coup, seul le nom affiché change : vérifiez le nom interne dans l'URL.
Exercice 2 : construire l'écran d'accueil et l'écran de demande
Durée estimée : 30 minutes
Dans cet exercice, vous allez créer l'application canevas, ses deux écrans et la navigation entre eux.
Tâche 1 : créer l'écran d'accueil
- Créez une application canevas vide (format tablette), renommez le premier écran
scrAccueilet ajoutez la source de données SharePointEvenements. - Insérez un contrôle moderne Table nommé
tblEvenementsqui affiche la liste (une galerie convient aussi). Affichez au moins les colonnes Titre, Statut et AssigneA. - Ajoutez un bouton Ajouter un événement.
- Dans Médias, importez une image de flèche « retour » (par exemple
retour.png) : elle servira de logo dans l'en-tête de l'écran de demande.
Tâche 2 : ajouter l'écran de demande et la navigation
- Dans la barre de commandes, cliquez sur Nouvel écran et choisissez le modèle moderne Demande d'approbation (Approval request). Renommez l'écran
scrDemande. - Dans l'arborescence, sélectionnez le formulaire du modèle, renommez-le
frmApprobationet, dans le volet des propriétés, choisissez la source de donnéesEvenements. - Revenez sur
scrAccueil. Propriété OnSelect du bouton Ajouter un événement : réinitialiser le formulaire, le passer en mode Nouveau, puis naviguer versscrDemande. - Propriété OnSelect de
tblEvenements: mémoriser la ligne sélectionnée dans la variablevarItem, passer le formulaire en mode Affichage, puis naviguer versscrDemande. - Revenez sur
scrDemandeet réglez la propriété Item du formulaire survarItem(sans elle, le formulaire s'ouvre vide quand on clique sur une ligne). - Sélectionnez le contrôle d'en-tête de
scrDemande. Propriété Logo : choisissez l'imageretourimportée. Propriété OnSelectLogo : revenir à l'écran précédent. - Le bouton Envoyer la demande du modèle soumet déjà le formulaire. Programmez la propriété OnSuccess du formulaire pour revenir à
scrAccueilaprès l'enregistrement. - Le bouton Envoyer la demande ne doit être visible qu'en mode Nouveau.
Capture d'écran à insérer : Arborescence de l'écran scrDemande issu du modèle Demande d'approbation : conteneur d'en-tête, conteneur principal avec frmApprobation et bouton d'envoi, conteneur latéral SidebarContainer avec la galerie des approbateurs
Solution | formules de l'exercice 2
Bouton « Ajouter un événement » | OnSelect
ResetForm(frmApprobation);
NewForm(frmApprobation);
Navigate(scrDemande)tblEvenements | OnSelect
Set(varItem, Self.Selected);
ViewForm(frmApprobation);
Navigate(scrDemande)frmApprobation | Item
varItemEn-tête | OnSelectLogo
Back()frmApprobation | OnSuccess
Navigate(scrAccueil)Bouton « Envoyer la demande » | Visible
frmApprobation.Mode = FormMode.NewTâche 3 : tester la navigation
- Un clic sur Ajouter un événement ouvre un formulaire vide ; un clic sur une ligne de la table ouvre le formulaire en lecture seule avec les données de la ligne.
- La flèche de l'en-tête ramène à l'accueil.
Source (Microsoft Learn, écrans modernes) | Source (Microsoft Learn, fonctions de formulaire) | Source (Microsoft Learn, Navigate et Back)
Bon à savoir
Dans la vidéo, le bouton d'ajout ne fait queResetForm: sansNewForm, le formulaire reste dans le mode précédent (Affichage) après la consultation d'un élément. AjouterNewFormévite ce piège.
Si le formulaire s'affiche vide au clic sur une ligne, c'est que Item n'a pas été réglé survarItem(oubli montré dans la vidéo).
Exercice 3 : gérer les approbateurs et la colonne « Assigné à »
Durée estimée : 30 minutes
Dans cet exercice, vous allez adapter le formulaire. La liste déroulante moderne fonctionne mal avec une colonne Personne à sélection multiple. Vous allez la remplacer par la liste déroulante classique, puis calculer automatiquement le premier approbateur.
Tâche 1 : remplacer la liste déroulante des approbateurs
- Ajoutez temporairement un écran Vide (Nouvel écran > Vide).
- Insérez-y un formulaire de modification classique (Insérer > Classique > Formulaire de modification) et connectez-le à
Evenements. - Dans l'arborescence de ce formulaire, dépliez la carte Approbateurs, faites un clic droit sur la zone de liste déroulante classique et choisissez Copier.
- Revenez sur
scrDemande, sélectionnez la carte Approbateurs defrmApprobation. Dans le volet des propriétés, onglet Avancé, cliquez sur Déverrouiller pour modifier les propriétés. - Sélectionnez la liste déroulante moderne de la carte et supprimez-la.
- Faites un clic droit sur la carte Approbateurs et choisissez Coller : la liste classique apparaît dans la carte. Renommez-la
cmbApprobateurs. - La carte affiche deux erreurs (propriétés qui référencent encore l'ancien contrôle, dont Update). Dans chacune, remplacez l'ancien nom par
cmbApprobateurs. Faites de même pour les autres propriétés qui le citent. - Sélectionnez
cmbApprobateurs, puis dans Propriétés > Champs : Texte principal =DisplayName, Champ de recherche =DisplayName. - Passez en aperçu et vérifiez que la saisie de quelques lettres propose bien des utilisateurs de l'annuaire.
- Sélectionnez la carte Approbateurs et réglez sa propriété Required sur
truepour la rendre obligatoire. - Supprimez l'écran temporaire.
Tâche 2 : calculer « Assigné à » et le statut initial
- Sélectionnez la carte AssigneA, onglet Avancé > Déverrouiller pour modifier les propriétés.
- Propriété Default de la carte : le premier approbateur choisi dans
cmbApprobateurslorsque le formulaire est en mode Nouveau, sinon la valeur enregistrée. - Sélectionnez la liste déroulante moderne de cette carte, puis Propriétés > Champs > Ajouter un champ : cochez DisplayName pour afficher le nom.
- En aperçu, sélectionnez deux approbateurs puis retirez le premier : la carte suit automatiquement.
- Propriété DisplayMode de la carte AssigneA :
DisplayMode.Disabled, pour que l'utilisateur ne la modifie pas. - Déverrouillez la carte Statut et réglez sa propriété Default pour proposer « En attente » en mode Nouveau.
- Sélectionnez SidebarContainer dans l'arborescence. Sa propriété Visible contient déjà une formule du modèle : complétez-la pour que le panneau soit masqué en mode Nouveau.
Capture d'écran à insérer : Formulaire frmApprobation en aperçu, mode Nouveau : la liste Approbateurs avec deux personnes sélectionnées et la carte AssigneA grisée qui affiche automatiquement le premier approbateur
Solution | formules de l'exercice 3
- La carte Approbateurs garde ses propriétés
UpdateetDefaultSelectedItems: seul le nom du contrôle change.
Carte Approbateurs | Update
cmbApprobateurs.SelectedItemsCarte Approbateurs | Required
trueCarte AssigneA | Default
If(
frmApprobation.Mode = FormMode.New,
First(cmbApprobateurs.SelectedItems),
ThisItem.AssigneA
)Carte AssigneA | DisplayMode
DisplayMode.DisabledCarte Statut | Default
If(
frmApprobation.Mode = FormMode.New,
{Value: "En attente"},
ThisItem.Statut
)SidebarContainer | Visible (formule du modèle conservée)
<formule existante du modèle> && frmApprobation.Mode <> FormMode.NewTâche 3 : tester le formulaire
- En aperçu, sélectionnez deux approbateurs :
AssigneAaffiche le premier. Retirez-le :AssigneAaffiche le nouveau premier. - Le panneau latéral est masqué en mode Nouveau.
Source (Microsoft Learn, liste déroulante classique) | Source (Microsoft Learn, fonctions de formulaire)
Bon à savoir
Une carte désactivée transmet tout de même sa valeur àSubmitForm: c'est ce qui permet d'enregistrer le premier approbateur sans que l'utilisateur y touche.
Le texte de la valeur par défaut du statut doit correspondre exactement au choix SharePoint, accents compris.
Exercice 4 : construire le flux d'approbation séquentielle
Durée estimée : 50 minutes
Dans cet exercice, vous allez créer le flux Power Automate. Le principe : le flux traite une seule décision à chaque exécution. Après une approbation, il met à jour l'élément avec l'approbateur suivant ; cette modification relance le flux, qui envoie alors la demande au suivant. La condition de déclenchement arrête la boucle dès que le statut n'est plus « En attente ».
Capture d'écran à insérer : Vue d'ensemble du flux dans le concepteur Power Automate : déclencheur, Approbation, NbDecisions, Condition avec la branche Vrai (Mettre à jour l'élément, Condition Dernier approbateur, Envoyer une requête HTTP à SharePoint) et la branche Faux
Tâche 1 : créer le déclencheur et la demande d'approbation
- Sur make.powerautomate.com, Créer > Flux de cloud automatisé. Nommez le flux
Flux approbation événementset choisissez le déclencheur SharePoint Lorsqu'un élément est créé ou modifié, puis Créer. - Dans le déclencheur, choisissez l'adresse du site puis le nom de la liste
Evenements. - Ajoutez une action : connecteur Approbations > Démarrer et attendre une approbation. Renommez l'action
Approbationavant d'écrire la moindre expression. - Type d'approbation : Approuver/Refuser | Premier à répondre.
- Titre : saisissez « Approbation de l'événement : » puis insérez le contenu dynamique Titre.
- Attribué à : insérez le contenu dynamique AssigneA Email (premier approbateur).
- Ajoutez une action Composer et renommez-la
NbDecisions(menu ... > Renommer). Elle calcule le nombre de décisions prises + 1. - Cliquez dans le champ Entrées, puis sur l'icône fx (insérer une expression) pour ouvrir l'éditeur d'expressions.
- Onglet Fonction : saisissez
add(pour commencer l'addition. - Onglet Contenu dynamique : recherchez « decision » et sélectionnez NbDecisions sous « Lorsqu'un élément est créé ou modifié ». L'éditeur insère la référence à la colonne.
- Complétez l'expression avec
, 1)puis cliquez sur Ajouter.
Capture d'écran à insérer : Action Composer NbDecisions : éditeur d'expressions ouvert sur l'onglet Contenu dynamique, recherche « decision », colonne NbDecisions du déclencheur et expression add(...) en cours de saisie
Solution | déclencheur et approbation
- Action
Approbation| Type : Approuver/Refuser | Premier à répondre | Attribué à : contenu dynamique AssigneA Email.
Composer « NbDecisions » | Entrées
add(triggerBody()?['NbDecisions'], 1)Tâche 2 : traiter la branche « Approuvé »
- Ajoutez une action Contrôle > Condition. Valeur de gauche : contenu dynamique Résultat (Outcome) de
Approbation; opérateur est égal à ; valeur de droite :Approve(en anglais, respectez la casse). - Dans la branche Vrai, ajoutez l'action SharePoint Mettre à jour l'élément : même site, liste
Evenements, ID = contenu dynamique ID du déclencheur, Titre = contenu dynamique Titre. - Dans Paramètres avancés, cliquez sur Afficher tout pour faire apparaître toutes les colonnes.
- Statut Value : ouvrez la liste, choisissez Entrer une valeur personnalisée, puis cliquez sur fx et écrivez l'expression :
Approuvési le nombre d'approbateurs est égal à la sortie deNbDecisions(dernier approbateur), sinonEn attente. Les textes doivent être identiques aux choix SharePoint. - AssigneA Claims : Entrer une valeur personnalisée puis fx. Si c'est le dernier approbateur, gardez AssigneA Claims du déclencheur (il sera vidé à la tâche 4) ; sinon, prenez la valeur Claims de l'approbateur situé à l'index
NbDecisionsde la colonneApprobateurs. - NbDecisions : contenu dynamique Sorties de l'action
NbDecisions. - HistoriqueApprobation : insérez le contenu dynamique HistoriqueApprobation du déclencheur, passez à la ligne, saisissez « Approuvé par », insérez par fx l'expression du nom de l'approbateur, saisissez « | Commentaire : » puis insérez par fx l'expression du commentaire.
Solution | branche Vrai | condition et Mettre à jour l'élément
- ID : contenu dynamique ID du déclencheur. Titre : contenu dynamique Titre (champ obligatoire).
Condition 1 | valeur de gauche, opérateur « est égal à », valeur de droite
body('Approbation')?['outcome'] est égal à ApproveStatut Value | valeur personnalisée
if(
equals(length(triggerBody()?['Approbateurs']), outputs('NbDecisions')),
'Approuvé',
'En attente'
)AssigneA Claims | valeur personnalisée
if(
equals(length(triggerBody()?['Approbateurs']), outputs('NbDecisions')),
triggerBody()?['AssigneA']?['Claims'],
triggerBody()?['Approbateurs']?[outputs('NbDecisions')]?['Claims']
)NbDecisions
outputs('NbDecisions')HistoriqueApprobation (contenu dynamique + texte + expressions)
[HistoriqueApprobation du déclencheur]
Approuvé par @{body('Approbation')?['responses']?[0]?['responder']?['displayName']} | Commentaire : @{body('Approbation')?['responses']?[0]?['comments']}Tâche 3 : ajouter la condition de déclenchement
- Sélectionnez le déclencheur, onglet Paramètres. Sous Conditions de déclenchement, cliquez sur + Ajouter.
- Saisissez l'expression (elle commence par
@) : le flux ne s'exécute que si la valeur deStatutest « En attente ».
Capture d'écran à insérer : Paramètres du déclencheur Lorsqu'un élément est créé ou modifié : la zone Conditions de déclenchement avec l'expression qui teste la valeur En attente
Solution | condition de déclenchement
Condition de déclenchement (Paramètres du déclencheur)
@equals(triggerBody()?['Statut']?['Value'], 'En attente')Tâche 4 : vider « Assigné à » en fin de circuit
- L'action Mettre à jour l'élément ne sait pas vider une colonne Personne. Juste après elle, toujours dans la branche Vrai, ajoutez une Condition.
- Valeur de gauche (par fx) : l'expression qui compare le nombre d'approbateurs à la sortie de
NbDecisions. Opérateur est égal à. Valeur de droite (par fx) :true, pour obtenir le booléen et non le texte « true ». - Dans le Vrai de cette condition, ajoutez l'action SharePoint Envoyer une requête HTTP à SharePoint et choisissez votre site.
- Méthode :
POST. URI :_api/web/lists/GetByTitle('Evenements')/items(+ contenu dynamique ID du déclencheur +). Le nom de la liste s'écrit exactement comme dans SharePoint, entre apostrophes. - Paramètres avancés > Afficher tout : renseignez les quatre en-têtes
Content-Type,Accept,IF-MATCHetX-HTTP-Method(valeurMERGE). - Corps : un objet JSON qui indique le type de l'élément (
SP.Data.EvenementsListItem; un espace dans le nom de la liste deviendraitx0020) et metAssigneAId(nom interne de la colonne +Id) à-1.
Capture d'écran à insérer : Action Envoyer une requête HTTP à SharePoint dépliée : site, méthode POST, URI, en-têtes et corps JSON
Solution | branche Vrai | vider AssigneA en fin de circuit
Condition 2 | valeur de gauche (expression) est égal à valeur de droite (expression)
equals(length(triggerBody()?['Approbateurs']), outputs('NbDecisions')) est égal à trueEnvoyer une requête HTTP à SharePoint | Méthode et URI
POST
_api/web/lists/GetByTitle('Evenements')/items(@{triggerBody()?['ID']})En-têtes
Content-Type application/json;odata=verbose
Accept application/json;odata=verbose
IF-MATCH *
X-HTTP-Method MERGECorps
{
"__metadata": { "type": "SP.Data.EvenementsListItem" },
"AssigneAId": -1
}Tâche 5 : traiter la branche « Rejeté »
- Sur l'action Mettre à jour l'élément de la branche Vrai, menu ... > Copier l'action. Dans la branche Faux de la première condition, cliquez sur + > Coller une action.
- Dans la copie, Statut Value : choisissez directement
Rejetédans la liste. HistoriqueApprobation : remplacez « Approuvé par » par « Rejeté par ». - AssigneA Claims : supprimez la valeur (croix) ; inutile de désigner un approbateur suivant.
- Copiez de la même façon l'action Envoyer une requête HTTP à SharePoint et collez-la à la suite, sans condition : après un refus,
AssigneAest toujours vidé. - Enregistrez. L'avertissement « boucle de déclenchement infinie » est attendu : expliquez pourquoi il ne pose pas de problème ici.
Solution | branche Faux | rejet
- Copie de Mettre à jour l'élément : Statut =
Rejeté(choisi dans la liste), NbDecisions =outputs('NbDecisions'), AssigneA Claims vidé (croix). - HistoriqueApprobation : même formule que ci-dessus en remplaçant « Approuvé par » par « Rejeté par ».
- Copie de l'action Envoyer une requête HTTP à SharePoint, sans condition : après un refus, le circuit est toujours terminé.
Tâche 6 : enregistrer et contrôler le flux
- Le flux s'enregistre sans erreur (seul l'avertissement de boucle apparaît).
- Expliquez avec vos mots pourquoi le flux ne boucle pas à l'infini.
Source (Microsoft Learn, approbations) | Source (Microsoft Learn, conditions de déclenchement) | Source (Microsoft Learn, boucles infinies) | Source (Microsoft Learn, fonctions d'expression) | Source (Microsoft Learn, requête HTTP à SharePoint)
Bon à savoir
Notation :triggerBody()?['NbDecisions'](celle de la vidéo et de l'éditeur d'expressions) équivaut àtriggerOutputs()?['body/NbDecisions']. Les deux fonctionnent ; ce lab utilise la première partout.
Point clé : chaque mise à jour relance le flux. C'est voulu tant que le statut est « En attente » (approbateur suivant), et bloqué par la condition de déclenchement dès que le statut devient « Approuvé » ou « Rejeté ». L'appel HTTP final modifie l'élément, mais le statut n'est déjà plus « En attente ».
Valeurs « Approve » et « Reject » : elles restent en anglais même avec une interface en français, et sont sensibles à la casse.
Index :NbDecisionsvaut 1 après la première décision, etApprobateurs[1]est bien le deuxième approbateur (tableau indexé à partir de 0). C'est l'astuce centrale de l'exercice.
Type d'entité :SP.Data.<NomDeLaListe>ListItem. Si le nom contient des espaces, ils deviennentx0020. En cas de doute, consulterapi/web/lists/GetByTitle('Evenements')?$select=ListItemEntityTypeFullName.
Si l'action d'approbation n'a pas été renommée, l'expression devientbody('Démarreret_attendre_une_approbation'): d'où l'intérêt de renommer avant d'écrire les expressions.
Erreur fréquente : oublier la condition de déclenchement. Le flux renvoie alors une demande au dernier approbateur après chaque fin de circuit. Désactivez alors le flux puis annulez les approbations en trop dans le centre d'approbations.
Exercice 5 : afficher l'avancement et l'historique
Durée estimée : 30 minutes
Dans cet exercice, vous allez exploiter le panneau latéral du modèle pour suivre le circuit dans l'application.
Tâche 1 : configurer la galerie des approbateurs et l'historique
- Sélectionnez la galerie du panneau latéral (ReviewersGallery) et réglez sa propriété Items pour lister les approbateurs de
varItem, chacun avec un numéro d'étape (1, 2, 3...). - Des erreurs apparaissent dans le modèle de la galerie, car les champs du modèle d'origine n'existent plus. Premier texte : FontWeight =
FontWeight.Regular, Text = nom de l'approbateur. Deuxième texte : FontWeight =FontWeight.Regular, Text = son service. - Badge : Appearance = remplie (Filled), Content = vide (
""), BasePaletteColor = couleur selon l'état de l'étape (orange pour l'approbateur qui a la main, rouge pour l'étape refusée, vert pour une étape approuvée, gris pour une étape à venir). - Rectangle du modèle de galerie : Width =
3, pour matérialiser la chaîne d'approbation. - Facultatif : sélectionnez la galerie, cliquez sur l'icône Modifier (crayon), puis Insérer > Image. Propriété Image = la photo de l'approbateur. Placez l'image sur le badge.
- Sélectionnez SidebarContainer, puis Insérer > Bouton d'informations (contrôle moderne Info button). Remontez-le en haut du panneau et réglez sa propriété Content pour afficher l'historique des approbations de
varItem.
Capture d'écran à insérer : Panneau latéral en aperçu pendant un circuit : premier approbateur en vert, deuxième en orange, troisième en gris, reliés par un trait vertical, et la bulle du bouton d'informations ouverte sur l'historique
Solution | formules de l'exercice 5
Galerie du panneau latéral | Items
ForAll(
Sequence(CountRows(varItem.Approbateurs)),
Patch(Index(varItem.Approbateurs, Value), {Etape: Value})
)Texte 1 | Text
ThisItem.DisplayNameTexte 2 | Text
ThisItem.DepartmentBadge | BasePaletteColor
If(
varItem.Statut.Value = "Rejeté" && ThisItem.Etape = varItem.NbDecisions, Color.Red,
ThisItem.Etape <= varItem.NbDecisions, Color.Green,
ThisItem.Email = varItem.AssigneA.Email, Color.Orange,
Color.LightGray
)Image | Image
ThisItem.PictureBouton d'informations | Content
varItem.HistoriqueApprobationTâche 2 : vérifier l'affichage
- En consultant un événement à trois approbateurs dont le premier a approuvé, la galerie affiche vert, orange, gris.
Source (Microsoft Learn, Sequence) | Source (Microsoft Learn, badge moderne) | Source (Microsoft Learn, bouton d'informations)
Bon à savoir
L'ordre des tests du badge compte : le refus est testé avant l'approbation, puisque l'étape refusée a aussi été comptée dansNbDecisions.varItemest une photographie de la ligne au moment du clic. Pour voir l'avancement sans quitter l'écran, ajouter un bouton Actualiser :Refresh(Evenements); Set(varItem, LookUp(Evenements, ID =varItem.ID)).
La formule de la vidéo est formulée différemment (test de l'utilisateur connecté d'abord) ; celle de ce lab donne le même affichage et se lit plus facilement.
Exercice 6 : tester le circuit complet
Durée estimée : 20 minutes
Dans cet exercice, vous allez dérouler deux scénarios réels avec vos approbateurs et analyser les exécutions du flux.
Tâche 1 : dérouler les scénarios de test
- Scénario 1 : créez un événement avec deux approbateurs. Le premier approuve depuis le courriel Outlook en ajoutant un commentaire, puis le second.
- Après chaque décision, attendez la fin de l'exécution du flux, rechargez l'application (ou fermez puis relancez l'aperçu), rouvrez l'événement depuis la table et vérifiez le statut,
AssigneA, les couleurs et l'historique. - Scénario 2 : créez un événement avec trois approbateurs. Le premier approuve, le deuxième refuse.
- Ouvrez l'historique des exécutions du flux et repérez les exécutions ignorées par la condition de déclenchement.
| Moment | Statut attendu | AssigneA attendu | NbDecisions |
| Création (2 approbateurs) | En attente | Approbateur 1 | 0 |
| Après approbation 1 | En attente | Approbateur 2 | 1 |
| Après approbation 2 | Approuvé | vide | 2 |
| Scénario 2, après refus du 2e | Rejeté | vide | 2 |
Capture d'écran à insérer : Courriel d'approbation reçu dans Outlook par le premier approbateur, avec les boutons Approuver et Refuser et la zone de commentaire
Capture d'écran à insérer : Historique des exécutions du flux sur 28 jours : exécutions réussies et vérifications de déclencheur ignorées
Récapitulatif | questions de synthèse
- Pourquoi utilise-t-on le type « Premier à répondre » alors que le circuit est séquentiel ?
- Que se passerait-il si l'on supprimait la condition de déclenchement ?
- Quelle est la limite de l'action Mettre à jour l'élément qui oblige à appeler l'API SharePoint ?
- Power Automate propose désormais un type d'approbation « Approbation séquentielle ». Dans quel cas la solution de l'exercice reste-t-elle préférable ?
Source (Microsoft Learn, approbations séquentielles) | Source (Microsoft Learn, types d'approbation)
Solution | réponses aux questions de synthèse
- Premier à répondre : chaque exécution n'envoie la demande qu'à une seule personne (
AssigneA) ; le séquencement est assuré par la relance du flux, pas par l'action d'approbation. - Sans condition de déclenchement : chaque mise à jour relancerait le flux, y compris après la fin du circuit, avec des demandes en double et une consommation inutile de requêtes.
- Limite de Mettre à jour l'élément : elle ne permet pas de remettre une colonne Personne à vide ; l'API REST le permet en écrivant
-1dans<NomInterne>Id. - Type « Approbation séquentielle » natif : il attend une liste d'étapes définie dans le flux. La solution de l'exercice reste préférable quand le nombre et l'ordre des approbateurs sont choisis par l'utilisateur dans l'application, et quand on veut suivre l'avancement étape par étape dans SharePoint et Power Apps.
Bon à savoir
Pour aller plus loin : envoyer un courriel au demandeur à la fin du circuit, ajouter un bouton « Relancer » ou transposer l'exercice sur une table Dataverse.
Après la séance, désactivez votre flux pour ne pas générer de demandes résiduelles.