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.
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, …})
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).
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, …})
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 :
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.
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é.
Mais que se passe-t-il si je fusionne 2 lignes qui n’ont rien à voir ?
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 :
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.
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 :
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.
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 !
Voici le détail des fonctions utilisées pour calculer la durée de patch()
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é !
Faites-nous part des défis de votre entreprise et nous vous aideront à dynamiser votre activité grâce à la Power Platform