Bonjour,
Je débute sur Power Automate (et encore plus sur la version Desktop), j'aimerais bien un (gros) coup de main sur une automatisation qui pourrait nous faire gagner du temps.
Je précise que je peux me permettre d'attendre quelques jours avant d'avoir une réponse, la deadline est pour le premier semestre 2025 (donc je ne vais pas faire le casse-pieds et relancer pour qu'on me mâche le boulot toutes les 3 heures).
Je précise le cadre technique en premier, j'exposerai ce que j'ai pu faire et ce qui me gêne par la suite
Donc je passe par l'application Power Automate Desktop car l'ERP génère des fichiers "en local" (dans le sens pas dans le cloud Microsoft), et je n'ai pas de machine tournant 24/7 avec des ressources suffisantes pour faire tourner la passerelle pour Power Automate version cloud.
Je contournerai ça en lançant le flux via le planificateur de tâches OU au pire en donnant le flux à la personne qui en aura besoin (avec la bonne licence, ça lui permettra d'envoyer des mails sans devoir les faire).
Donc ces fichiers générés par l'ERP sont des fichiers XML, comme dit dans le titre, et pour certains de ces fichiers je voudrais les traiter pour (éventuellement) envoyer un mail.
Première étape (réussie) : l'action Obtenir les fichiers dans le dossier.
J'ai mis dans le filtre que je ne veux que les fichiers qui correspondent à "BL*" pour ne pas récupérer les 50k+ fichiers du dossier.
Pour la curiosité technique, j'aimerais bien une confirmation que ça sera plus rapide (puisque ma liste sera divisée par un peu plus de 3) que de récupérer TOUS (les 50k+ donc) les fichiers pour ensuite rentrer dans un for each sur les fichiers récupérés de la liste pour y faire un (premier) If et vérifier que le nom contient "BL" (d'autant plus que la méthode du If serait moins précise, puisque le If cherche dans tout le nom du fichier au lieu de chercher le début du nom). Bref, ce point est un détail, pas besoin de perdre des heures à faire des tests là-dessus.
Deuxième étape (réussie) : une boucle For each qui va me permettre de vérifier chaque fichier individuellement (on descend à 17k fichiers).
Pour la précision, j'ai déjà fait du tri dans le dossier... et pour des raisons fiscales, nous devons garder un peu d'antériorité dans le dossier, donc le prochain tri sera en janvier 2025 (ce qui me permettra potentiellement de supprimer 6k fichiers du dossier).
Troisième étape (réussie) : une condition If dans laquelle je souhaite vérifier la date de dernière modification du fichier.
Avant de rentrer dans mon For each (je ne pense pas que l'exécution du script durerait 1h, on n'envoie quand même pas 80 colis par jour), j'ai lancé Obtenir la date et l'heure actuelles (qui me donne CurrentDateTime), puis Ajouter à la valeur DateHeure en ajoutant -24 heures (pour revenir une journée en arrière) à CurrentDateTime, ce qui me donne ResultedDate.
Puis, dans le for each, j'ai créé ce If qui va contrôler les 17k fichiers concernés pour vérifier si %CurrentItem.LastModified% est supérieure ou égale à ResultedDate.
Pour me rassurer un peu, je pense que je testerai d'afficher la date de dernière modification dans une pop-up pendant ma phase de tests.
Quatrième étape (clarification) : récupérer une valeur contenue dans une balise XML.
Dans le If de la 3eme étape donc (ce qui va donc me permettre de travailler sur 29 fichiers datant des 24 dernières heures, pour réduire le scope), j'ai placé l'action Lire le format XML depuis le fichier CurrentItem, ce qui va me rendre le résultat dans XmlDocument.
A priori, en utilisant l'action Obtenir la valeur de l'élément XML, il semblerait que j'arrive à récupérer mes valeurs, c'est bien ce que je cherche.
Mais je me suis basé sur une documentation de chez Microsoft, et j'aimerais bien une clarification quand même.
Je trouve que la distinction entre obtenir l'attribut et obtenir la valeur est assez floue, si quelqu'un a la patience de m'expliquer en mots simples?
De même, est-ce que le XPath sert à quelque chose SI on ne va pas chercher des infos dans une balise qui peut avoir des doublons (par exemple dans mon cas je peux avoir plusieurs palettes pour une livraison, mais je ne vais pas prendre d'infos dedans).
Cinquième étape : pour la confiance, j'ajouterai un If supplémentaire pour vérifier que la date de chargement que j'ai récupérée est bien supérieure ou égale à ResultedDate.
Je peux comprendre que certains trouveront ça superflu, mais on n'est pas à l'abri qu'un fichier soit régénéré (et donc sa date de dernière modification totalement décalée de la date de chargement), donc je préfère éviter qu'un client reçoive un mail "doublon" des semaines après ou que ça crée un risque de confusion avec une autre commande.
Sixième étape (échec critique) : envoyer un mail.
Je suis à l'état "échec critique" pour le moment car j'ai voulu mettre l'instruction Lancer Outlook AVANT la boucle for each (ce qui me paraît logique, je ne vais pas lancer une instance Outlook pour chaque mail envoyé), et en testant j'ai eu un gros message d'erreur du genre "impossible de lancer Outlook".
Je suppose que c'est parce que j'ai une instance Outlook déjà lancée sur mon PC? J'hésite à utiliser l'action Envoyer l'email dans la catégorie adresse e-mail, mais je ne vois pas à l'heure actuelle comment j'y indique l'utilisateur et le mot de passe du compte mail à utiliser (pourtant ça m'arrangerait d'utiliser un compte Ne pas répondre existant)
Est-ce que vous avez déjà fait ce genre de connexion depuis l'application Desktop?
Merci d'avance pour votre aide (et merci aussi juste pour la présence du forum, j'ai plus avancé en 2 heures en écrivant juste mes soucis que sur toute la matinée).
Partager