[Power Query] Tester l'existence d'un dossier
Bonjour,
Dans le cadre de ma prestation, je suis des dossiers qui ont un numéro de procédure unique (OT), et qui concernent un contrat (Contrat) et un service particulier (IGS).
Ces différents paramètres me permettent de définir l'adresse du répertoire dans lequel je peux retrouver la version validée du dossier, obtenue comme suit :
[Répertoire différent selon le service] & "\" & [IGS] & " - " & [OT] & "\"
Cependant, la structure documentaire que j'évoque n'est en place que depuis début 2024 et, pour les dossiers plus anciens, le répertoire visé n'existe pas et je passe aux répertoires "historiques".
Or, dans ce cas, la requête plante et ne peut pas poursuivre.
Pourriez-vous me donner un moyen de tester si le répertoire concerné existe (auquel cas je scanne son contenu et repère le document validé par le service) ou m'affiche un message "Répertoire n'existant pas" dans le cas contraire.
J'ai tenté des Files.Contents, Folder.Contents, mais rien n'y fait.
D'avance, je vous remercie pour votre retour.
Le code utilisé (je sais que "Excel.Workbook" n'est pas la bonne fonction, mais c'est la dernière que j'ai tenté en désespoir de cause !) :
let
Parameters = Excel.CurrentWorkbook(){[Name="Filtre_Controle"]}[Content],
Param_Type = Table.TransformColumnTypes(Parameters,{{"Référence", type text}}),
PRM = Table.SelectRows(Param_Type, each [Nom] = "PRM"){0}[Référence],
Source = Sql.Database("BOIEUX", "INEMP",[Query= "SELECT OT,
Contrat,
IGS
FROM R5EVTS
GROUP BY OT,
Contrat,
IGS
HAVING (OT = '" & PRM &"');"]),
Add_RepPridoVal = Table.AddColumn(Source, "RepPridoValidé", each if Text.Start([Contrat],3) = "RAD" then "EER\PRM\" & "IGS" & [IGS] & " - " & [OT] & "\03 - Validation"
else if Text.Start([Contrat],3) = "MEM" then "MEM\06 - PRM\" & "IGS" & [IGS] & " - " & [OT] & "\03 - Validation"
else "EES\Suivi des dossiers de PRM EES\1-PRM\" & "IGS" & [IGS] & " - " & [OT] & "\03 - Validation"),
Lien = Table.SelectRows(Add_RepPridoVal, each true){0}[RepPridoValidé],
Test_RepPridoVal = try Excel.Workbook(File.Contents(Lien),null,true) otherwise "Veuillez corriger"
in
Test_RepPridoValBonjour à tous !
Je vous propose d'étudier la piste suivante :
- Lister les éléments du répertoire parent ("[Répertoire différent selon le service]") via Folder.Files
- Construire le chemin des fichiers par Table.AddColumn ==> [Folder Path]&[Name]
- Tester la présence du classeur recherché dans la liste des classeurs du répertoire avec un test conditionnel :
Bonjour,
Tout d'abord, merci pour votre réponse.
Toutefois, si le nom des répertoires est bien normé (mon service en assure la création), celui des fichiers que les répertoires peuvent contenir peut varier, car il n'y a pas de norme (trop nombreux acteurs, pilotés par des personnes différentes, etc.). Pour le même dossier, le fichier qui m'intéresse pourra s'appeler : PT-XXXX-IND1, ou PTF-XXXX-INDICE 1 ou PTF XXXX IND-1... enfin bref, vous voyez le schéma !
Je ne peux donc m'appuyer que sur la norme de nommage des répertoires et, quand le répertoire recherché existe (c'est là où ça bloque pour moi), scanner son contenu.
Bonjour à tous !
Je ne peux donc m'appuyer que sur la norme de nommage des répertoires et, quand le répertoire recherché existe (c'est là où ça bloque pour moi), scanner son contenu.
C'est exactement ce que je vous proposais de faire !
Je présume que :
- Vous maîtrisez parfaitement le chemin du répertoire parent
- Vous connaissez le nom du classeur dont vous cherchez la présence ou non.
Partant de ces hypothèses, coller cette requête dans votre classeur :
let
Source = Folder.Files(ChoixRépertoire),
#"Lignes filtrées" = Table.SelectRows(Source, each ([Extension] = ".xlsm" or [Extension] = ".xlsx")),
CheminClasseurs = Table.AddColumn(#"Lignes filtrées", "ListClasseurs", each [Folder Path]&[Name]),
ListClasseurs = List.Contains(CheminClasseurs[ListClasseurs],ChoixClasseur)
in
ListClasseursAvec :
ChoixRépertoire : chemin du répertoire parent
ChoixClasseur : Nom du classeur dont on veut vérifier la présence.
La requête retournera true ou false selon que le classeur recherché existe ou pas dans le répertoire parent.
Si true ---> On poursuit le traitement de la requête....
Si false --> on se dirige vers l'autre répertoire pour ouvrir le classeur.
Et non, il y a méprise.
Le classeur (le fichier Excel : xlsx, en général), ça vient après.
Pour l'instant, je bloque sur : le répertoire existe-t-il ? En effet, avant le 01/01/2024, les dossiers n'étaient pas créés selon la codification que j'ai détaillée dans mon premier message. Or, dans ce cas (répertoire inexistant), je n'arrive pas à mettre en place une gestion des erreurs et la requête plante. J'aimerai qu'elle m'affiche "Répertoire non présent", par exemple.
En revanche, si le répertoire existe, là, je peux poursuivre pour en scanner le contenu et repérer le fichier (classeur, pour reprendre vos termes). Au final, j'ai pour résultat soit "Répertoire non présent" soit l'url du fichier Excel.
Désolé si je n'ai pas été assez clair dans mes précédents messages.
Bonjour à tous de nouveau !
Ces "répertoires codifiés" ont un répertoire parent ?
Si oui, partir de ce répertoire...
Si non, partir de la racine. Ce sera simplement plus long à tester.
Bonjour à tous de nouveau !
Dans la même veine, on peut, à partir du répertoire parent (supposé contenir le répertoire codifié) ou la racine, tester la présence ou non du répertoire (via le champ Folder Path).
La suite étant identique :
si présence ---> ouverture du classeur
si absence ---> changement de répertoire.
Bonjour,
je suis désolé, je m'aperçois que je n'avais pas répondu à JFL. Je n'ai pas encore pu tester la solution car... j'ai désormais un autre problème sur un autre sujet !
Je vous tiendrai au courant de vos propositions lorsque je me repencherai sur le fichier concerné (plus une priorité pour l'instant).