Blog
Tutoriel
Power Apps

Les Incontournables de Power Apps : La fonction Patch()

Maîtrisez la fonction Patch() dans Power Apps pour créer, modifier et fusionner des données tout en optimisant vos applications et performances.

17/12/2024
Les Incontournables de Power Apps : La fonction Patch()

Power Apps est idéal pour faire des applications personnalisées et sur mesure, encore plus pour interagir avec vos données. Encore faut-il savoir comment faire ! S’il est facile de créer un formulaire et d’utiliser SubmitForm() pour mettre à jour des données, le résultat est souvent visuellement décevant.

Pour un meilleur design, il est préférable de créer manuellement les entrées de données, et la fonction Patch devient donc essentielle.

Vers quelle source de données utiliser la fonction Patch

Tout d’abord, quelles sources de données sont compatibles avec cette fonction ? Pour faire simple : toutes.

Que ce soient les listes SharePoint, les collections, les tables Dataverse… même une table SQL server ! Tant que la source est présente dans l’onglet « données » de l’application, on peut utiliser Patch(). Certaines sources (comme SQL) sont cependant plus exigeantes sur les types de données, il faut donc rester attentif.

En dehors de ces questions de typage de la données, la source ne change rien à la syntaxe ni au fonctionnement de la fonction Patch().

Dans quels cas utiliser la fonction Patch ?

La fonction Patch() est utile dans 3 types de situation. Le premier est de créer une nouvelle ligne dans une source de données. Le deuxième usage est de mettre à jour les infos d’une ligne. Le troisième, moins répandu, permet de fusionner deux enregistrements en un seul. 

Pour la suite, nous allons utiliser une application de gestion de personnel, qui nous permettra d’illustrer tous les cas d’usage.

Figure 1 : Application de gestion de personnel

On a ici une galerie qui prend une collection comme source, qu’on peut agrémenter avec un bouton « ajouter », ou modifier via les icônes de crayon.

Cas 1 : Créer une ligne

Pour le premier cas, le fonctionnement est extrêmement simple et assez intuitif. L’ajout de ligne a la syntaxe suivante :Patch(‘Source’, Defaults(‘Source’), {champ1 : valeur1, champ2 : valeur2, …})

Figure 2 : Fonction Patch d’ajout de ligne dans l’application

Il n’y a pas trop de subtilité si ce n’est la fonction Defaults(), qui permet d’éviter les erreurs liées aux champs obligatoires qui n’auraient pas été renseignés. Avec cette fonction, ces champs obligatoires sont remplis a minima avec des valeurs par défaut (s’ils ne sont pas déjà renseignés dans le patch !).

Cas 2 : Mettre à jour une ligne

Le deuxième cas concerne l’édition de ligne. Toujours dans notre petite application, un clic sur l’icone de crayon passe la ligne en mode édition, ce qui nous permet d’effectuer nos modifications. Une fois effectuées, il ne reste qu’à cliquer sur l’icone de sauvegarde pour enregistrer les changements. Je change ici mon rôle pour CEO (c’est mon article, je fais ce que je veux).

Figure 3 : Modification d’une ligne

Là aussi, la subtilité se situe sur le deuxième argument. Dans presque toutes les situations, ce deuxième argument est la clé pour définir ce qu’on veut patch et comment. La syntaxe reste globalement la même :

Patch(‘Source’, Enregistrement, {champ1 : NouvelleValeur1, champ2 : NouvelleValeur2, …})

Figure 4 : Formule Patch de modification sans LookUp

Ici, j’ai pris l’option simple de juste renseigner « ThisItem » dans le deuxième argument. Ça fonctionne très bien dans les collections, mais pour plus de sécurité on peut passer par un LookUp, pour s’assurer de bien cibler la bonne ligne.

On aura alors :

Figure 5 : Formule patch de modification avec LookUp

On se base alors sur l’id, qui est ici le seul champ que je ne peux pas modifier, et qui assure l’unicité de mes lignes. La syntaxe du LookUp revient à dire « récupère dans cette table l’enregistrement qui correspond à ce critère ».

Note importante : Si votre critère ne permet pas de cibler un seul enregistrement, la fonction LookUp ne renvoi que le premier cas qui correspondant au dit critère, selon l’ordre de tri par défaut dans votre source de données.

Cas 3 : Fusionner deux enregistrements

C’est un cas qui est moins fréquent, et avec lequel il faut être prudent. Le principe, c’est d’enrichir les données d’un enregistrement A avec celles d’un enregistrement B, sans que les 2 aient forcément les mêmes champs. Ça peut être très pratique dans des cas assez spécifiques où on cherche à fusionner les infos provenant de 2 tables, mais ça peut engendrer des chimères si ce n’est pas bien exécuté.

Assez parlé, voici comment ça fonctionne :

Patch({Enregistrement A},{Enregistrement B})

Plus besoin de préciser une source ou une méthode de Patch, car on cherche uniquement à fusionner deux enregistrements. Plus exactement, on cherche à ajouter des infos de l’enregistrement B dans l’enregistrement A. Dans notre application exemple, imaginons que je veux rassembler des infos d’un employé avec les infos de son équipe.

Figure 6 : Sélection d’une ligne Employé et d’une ligne Equipe, et fusion via le bouton en bas de page.

Je crée une variable _varselectemployee pour l’employé que je choisis (Totora, notre fidèle Chief Happiness Officer), une variable _varselectteam pour l’équipe correspondante, et je fusionne les deux dans une troisième variable avec la fonction Set(_varMerged,Patch(_varselectemployee,_varselectteam))

Si on regarde nos variables, on a bien fusionné comme il faut : les infos de l’équipe de direction se sont correctement ajoutées dans l’enregistrement de l’employé.

Figure 7 : contenu de nos 2 variables source et de la variable de sortie

Mais que se passe-t-il si je fusionne 2 lignes qui n’ont rien à voir ?

Figure 8 : Fusion de 2 records qui ont une propriété en commun, « equipe », mais sans que les valeurs ne correspondent.

On voit avec les données en bas que la fusion marche, mais la donnée finale est fausse vis-à-vis de l’employé.

Autre cas encore, si nos données ne correspondent pas entre les 2 enregistrements : Jusqu’ici j’ai pris des cas où il y avait au moins un champ en commun entre les deux variables. Mais si cette correspondance n’existe pas, le résultat peut devenir chaotique.

Changeons le nom de la propriété « equipe » pour l’appeler « Equipe », mais uniquement coté répertoire des équipes. La différence est subtile, mais si on refusionne les lignes Totora et sales, on obtient ceci :

Figure 9 : contenu de notre variable de sortie quand les 2 variables d’entrée n’ont pas de valeur commune

Encore une fois, pas de message d’erreur, le patch fonctionne. Mais notre donnée en sortie n’est plus cohérente ! On se retrouve avec un enregistrement qui a deux infos contradictoires, pour une simple majuscule. Prudence, donc.

Patch() avec plusieurs lignes ?

Maintenant qu’on a vu les cas d’usage simple, passons aux choses sérieuses : Comment faire quand on a plusieurs lignes, voir plusieurs centaines de lignes à modifier ou créer ?

Imaginons que notre application est utilisée majoritairement hors ligne, et qu’on a besoin de synchroniser quand on retrouve la connexion.

Figure 10 : On sélectionne nos lignes, on les édite, et on utilise le bouton de synchro tout en haut à droite pour effectuer le patch multiligne

Une solution instinctive est d’utiliser la fonction ForAll, pour itérer sur une collection et patcher chaque ligne. Le mécanisme est alors le même que dans nos patchs unitaires.

On a donc :

Figure 11 : Syntaxe de la méthode classique avec un patch dans un ForAll

Cette solution peut toutefois s’avérer peu efficiente, dans le cas de très nombreuses lignes et/ou de très nombreuses colonnes. On en a déjà parlé ici, et la meilleure pratique serait de transmettre la tâche à un flux Power Automate.

Il y a une autre solution, moins intuitive car elle change un peu de syntaxe, mais beaucoup plus efficace : on peut patch une source de données avec une collection directement.

Figure 12 : syntaxe de la méthode du Patch() seul

Vous serez d’accord pour dire que c’est plus simple, non ? Et en plus, c’est extrêmement plus rapide car on fait ici de la mise à jour en bloc (bulk update) : tout est pris en compte d’un coup.

Là où le ForAll(Patch()) peut prendre plusieurs secondes, cette syntaxe de patch unique durera 2 fois moins longtemps !

Figure 13 : 3320 ms pour 20 lignes, soit environ 6 lignes par seconde

Figure 14 : 1535 ms pour 20 lignes, soit environ 13 lignes par seconde

Voici le détail des fonctions utilisées pour calculer la durée de patch()

Figure 15 : Calcul de la durée des 2 méthodes

On pourrait même encore optimiser en ne prenant que les champs modifiés, ce qui creuserait encore l’écart. Et surtout, dans ce test il n’y a que 20 lignes. Imaginez avec des centaines d’enregistrements à synchroniser.

Attention toutefois ! Cette syntaxe de patch avec une collection directement ne marche que dans des cas bien précis ! Déjà, elle n’est compatible qu’avec SharePoint, Dataverse n’accepte pas ce type de patch.

Ensuite, il faut que votre colonne ID soit présente, et que les noms des champs modifiés de votre collection soient strictement les mêmes que ceux de votre liste source.

Et pour finir, cette méthode ne fonctionne que dans le cas des mises à jour de lignes. Pour le cas des créations, il faudra quand même passer par la méthode du ForAll(Patch()), ou par un flux Power Automate.

En tout cas, vous voici maintenant expert du Patch ! Vous pouvez ranger vos Forms, et libérer votre imagination de leurs design limité !

Un projet sur la suite Power Platform ?

Faites-nous part des défis de votre entreprise et nous vous aideront à dynamiser votre activité grâce à la Power Platform

Contacter l'agence

D'autres articles à ce sujet

Tous nos contenus
Les Incontournables de Power Apps : La fonction Patch()
Power Apps
Les Incontournables de Power Apps : La fonction Patch()

Maîtrisez la fonction Patch() dans Power Apps pour créer, modifier et fusionner des données tout en optimisant vos applications et performances.

Quentin MAILLY
Quentin MAILLY
December 17, 2024
Tutoriel
Vidéo
Cas d’usage : Application de suivi de sa tournée infirmière avec Power Apps
Power Apps
Cas d’usage : Application de suivi de sa tournée infirmière avec Power Apps

Créez une application de suivi des tournées infirmières avec Power Apps, optimisez UI/UX et simplifiez gestion des patients et tâches administratives.

Manon CHAIX
Manon CHAIX
December 3, 2024
Article
Vidéo
Intégration d’Outlook dans PowerApps
Outlook
Power Apps
Intégration d’Outlook dans PowerApps

Découvrez comment intégrer Outlook à PowerApps pour centraliser vos emails, automatiser les flux et optimiser vos processus métiers.

Louis-Etienne RICHIER
Louis-Etienne RICHIER
November 26, 2024
Tutoriel
Vidéo