' --------------------------------------------------------------------------------------------------------------- ' ' Script de découpage des relevés multicomptes en plusieurs relevés monocompte 21-09-2010 Yann RAOUL ' ' ' ' UTILISATION : Indiquer le chemin complet du fichier source en paramètre de ce script entre guillemets : ' ' ' ' Exemple : script_decoupage_releves.vbs "C:\Suite Entreprise v2\AFB\MONRELEVE.EXT" ' ' ' ' --------------------------------------------------------------------------------------------------------------- ' ' ############## PARAMETRES DU SCRIPT ############## blnSuppressionFichierSource = True ' Si cette valeur est à False, on ne supprime pas le fichier source blnEcritureLog = False ' Permet d'écrire un fichier de trace de l'exécution de ce script CheminFichierLog = "C:\Suite Entreprise v2\LogDecoupageReleves.txt" ' Chemin où est positionné la log de ce script ' ################################################# ecrit_log_debut_fichier() ' 0/ Récupération du fichier source ecrit_log("Récupération du fichier source") Set oArgs=WScript.Arguments if oArgs.count = 0 then ecrit_log_fin_fichier("ERREUR : Veuillez indiquer un nom de fichier en paramètre de ce script.") WScript.Quit end if CheminFichierSource = oArgs(0) CheminFichierRacine = UCase(mid(CheminFichierSource, 1, len(CheminFichierSource)-4)) ' Le chemin qui servira de racine pour les relevés en sortie ecrit_log("Récupération OK => Chemin Fichier Source = " & CheminFichierSource) ' 1/ Contrôle de l'extension du relevé ecrit_log("Contrôle de l'extension du relevé") if UCase(mid(CheminFichierSource, len(CheminFichierSource)-3, 4)) <> ".EXT" then ecrit_log_fin_fichier("ERREUR : Problème d'extension de relevé, le relevé n'est pas un fichier .EXT") end if ecrit_log("Extension OK") ' 2/ Déclaration des variables ecrit_log("Déclaration des variables") dim ComptesTrouves ' liste des comptes trouvés dans le fichier de relevé, splitté par des ";" Dim filesys, text, readfile, LigneFichierSource Set filesys = CreateObject("Scripting.FileSystemObject") Set readfile = filesys.OpenTextFile(CheminFichierSource, 1, false) ecrit_log("Déclaration OK") ' 3/ Balayage des lignes du fichier source ecrit_log("Balayage des lignes du fichier source") intNumeroLigne = 0 intNombreFichiersCrees = 0 intNombreFichiersSupprimes = 0 Do while readfile.AtEndOfStream = False intNumeroLigne = intNumeroLigne + 1 LigneFichierSource = readfile.ReadLine ' La ligne en cours If Len(LigneFichierSource) <> 120 Then ecrit_log_fin_fichier("ERREUR : La ligne " & intNumeroLigne & " du fichier " & CheminFichierSource & " ne fait pas 120 caractères de long") End If NomFichierReleve = CheminFichierRacine + "-" + RecupCompte(LigneFichierSource) + ".EXT" select case(mid(LigneFichierSource,1, 2)) ' Selon le début de la ligne case "01": ' -------------------------------------------------------- DEBUT DU RELEVE -------------------------------------------------------- ' if IsNouveauCompte(RecupCompte(LigneFichierSource)) Then ' C'est un nouveau compte, on contrôle l'existence du fichier => Si oui, on le supprime pour éviter que des relevés se mélangent If filesys.FileExists(NomFichierReleve) Then ecrit_log("Le relevé " & NomFichierReleve & " est présent sur le poste avant découpage => Suppression du fichier") intNombreFichiersSupprimes = intNombreFichiersSupprimes + 1 filesys.DeleteFile(NomFichierReleve) end if intNombreFichiersCrees = intNombreFichiersCrees + 1 end if AjouterLigne LigneFichierSource, NomFichierReleve case "04": ' -------------------------------------------------------- CONTENU DU RELEVE -------------------------------------------------------- ' NomFichierReleve = CheminFichierRacine + "-" + RecupCompte(LigneFichierSource) + ".EXT" AjouterLigne LigneFichierSource, NomFichierReleve case "05": ' -------------------------------------------------------- CONTENU DU RELEVE COMPLEMENTAIRE -------------------------------------------------------- ' NomFichierReleve = CheminFichierRacine + "-" + RecupCompte(LigneFichierSource) + ".EXT" AjouterLigne LigneFichierSource, NomFichierReleve case "07": ' --------------------------------------------------------- FIN DU RELEVE -------------------------------------------------------- ' NomFichierReleve = CheminFichierRacine + "-" + RecupCompte(LigneFichierSource) + ".EXT" AjouterLigne LigneFichierSource, NomFichierReleve case else: ecrit_log_fin_fichier("ERREUR : la ligne " & intNumeroLigne & " du relevé " & CheminFichierSource & " ne possède pas le bon préfixe. Celui-ci doit être 01, ou 04, ou 07. Or celui-ci vaut " & mid(LigneFichierSource,1, 2)) end select loop readfile.close ecrit_log("Balayage OK => " & intNombreFichiersCrees & " fichiers créés, " & intNombreFichiersSupprimes & " supprimés") ' --------------------------------------------------------------------------------------------------------------- ' ' FIN DU SCRIPT ' --------------------------------------------------------------------------------------------------------------- ' ' On supprime le fichier d'origine après traitement de toutes les lignes de celui-ci If filesys.FileExists(CheminFichierSource) Then If blnSuppressionFichierSource = True Then ecrit_log("Suppression du fichier " & CheminFichierSource) filesys.deletefile(CheminFichierSource) End If End If ecrit_log_fin_fichier("") WScript.Quit ' --------------------------------------------------------------------------------------------------------------- ' ' FONCTIONS ' --------------------------------------------------------------------------------------------------------------- ' sub ecrit_log_debut_fichier() ecrit_log("-----------------------------------------------------------") ecrit_log("Début du script") End Sub sub ecrit_log(Contenu) If blnEcritureLog = False Then Exit Sub End If DebutLigne = Date() & " " & Time() & " => " Contenu = DebutLigne + Contenu dim FSO, f Set FSO = CreateObject("Scripting.FileSystemObject") Set f = FSO.OpenTextFile(CheminFichierLog, 8, True) f.Write( Contenu & VbCrLf ) f.Close end Sub sub ecrit_log_fin_fichier(Contenu) if Contenu <> "" Then 'msgbox(Contenu) ecrit_log(Contenu) End If ecrit_log("Script OK") ecrit_log("Fin du script") ecrit_log("-----------------------------------------------------------") WScript.Quit End Sub ' Ajoute la ligne passée en paramètre au fichier passé en paramètre Sub AjouterLigne(LigneAAjouter, CheminFichier) dim FSO, f Set FSO = CreateObject("Scripting.FileSystemObject") If filesys.FileExists(CheminFichier) Then ' Fichier déjà existant Else if CheminFichier <> CheminFichierLog Then ' Nouveau fichier, on l'inscrit en log ecrit_log("Création du fichier " & CheminFichier) End If End If Set f = FSO.OpenTextFile(CheminFichier, 8, True) f.Write( LigneFichierSource & VbCrLf ) f.Close end Sub ' Récupère le compte de la ligne en cours Function RecupCompte(ligneEnCours) RecupCompte = mid(ligneEnCours, 3, 5) + mid(ligneEnCours, 12, 5) + mid(ligneEnCours, 22, 11) end Function ' Recherche dans l'array des comptes si celui-ci a déjà été créé function IsNouveauCompte(Compte) ComptesExistants = Split(ComptesTrouves, ";") for each CompteEnCours in ComptesExistants if Compte = CompteEnCours then IsNouveauCompte = false exit function end if next IsNouveauCompte = true ' Ajout du nouveau compte dans la liste des comptes trouvés ComptesTrouves = ComptesTrouves + Compte + ";" Exit Function End Function ' ---------------------------------------------------- ' ' Sub de copie du fichier ' ' Entrées : - le (ou les) chemin(s) de fichier destination ' ' Note : si plusieurs chemin de destination sont définis, il faut les séparer par des ; ' Exemple : "C:\abc.txt;C:\bcd.txt" ' ' ---------------------------------------------------- Sub CopieFichier(strCheminFichierDest) Source = oArgs(0) Destin = split(strCheminFichierDest,";") Set objOFS = CreateObject("Scripting.FileSystemObject") ' ' On boucle sur les fichiers de destination ' For i = 0 to UBound(Destin) If (objOFS.FileExists(Source)) Then objOFS.CopyFile Source, Destin(i) End If Next Set objOFS = Nothing End Sub ' ---------------------------------------------------- ' ' Sub de déplacement du fichier ' ' Entrées : - le (ou les) chemin(s) de fichier destination ' ' Note : si plusieurs chemin de destination sont définis, il faut les séparer par des ; ' Exemple : "C:\abc.txt;C:\bcd.txt" ' ' ---------------------------------------------------- Sub DeplaceFichier(strCheminFichierDest) Source = CheminFichierSource Destin = split(strCheminFichierDest,";") Set objOFS = CreateObject("Scripting.FileSystemObject") ' ' On boucle sur les fichiers de destination ' For i = 0 to UBound(Destin) If (objOFS.FileExists(Source)) Then objOFS.CopyFile Source, Destin(i) End If Next Set Ftxt = objOFS.GetFile(CheminFichierSource) Ftxt.delete Set objOFS = Nothing End Sub ' ---------------------------------------------------- ' ' Sub de suppression du fichier ' ' Entrée : - le chemin de fichier strCheminFichier ' ' ---------------------------------------------------- Sub SupprimeFichier(strCheminFichier) Set FSO = CreateObject("Scripting.FileSystemObject") 'Suppression du fichier Set Ftxt = fso.GetFile(strCheminFichier) Ftxt.delete End Sub ' ---------------------------------------------------- ' ' Fonction de lecture du fichier ' ' Entrée : - le fichier à lire ' ' Sortie : - la string du contenu du fichier ' ' ---------------------------------------------------- Function LireFichier(strCheminFichier) ' 1/ déclaration file system object Dim fso ' 2/ instanciation Set FSO = CreateObject("Scripting.FileSystemObject") ' 3/ on instancie le fichier texte Set Ftxt = FSO.OpenTextFile(strCheminFichier) ' 4/ on parcoure chaque ligne du fichier texte Do While Not Ftxt.AtEndOfStream MaVariable = Ftxt.Readline '....... <- votre code ici pour traiter chaque ligne Loop Ftxt.Close End Function ' Fait du padding de string en input, voire exemple commenté Function Lpad (MyValue, MyPadChar, MyPaddedLength) Lpad = string(MyPaddedLength - Len(MyValue),MyPadChar) & MyValue 'msgbox(Lpad("1","0",6) & vbCrLf & Lpad("11","0",6)) End Function