' --------------------------------------------------------------------------------------------------------------- '
' 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_et_duplication_releves.vbs "C:\Suite Entreprise v2\AFB\MONRELEVE.EXT"             '
'                                                                                                                 '
'    Mise � jour 10-04-2014 : fusion du script de d�coupage avec le script de copie                               '
'                             D�sormais, le fichier de d�coupage peut copier les fichiers d�coup�s                '
'                             Dans un (ou plusieurs) r�pertoire(s)                                                '
'                                                                                                                 '
' --------------------------------------------------------------------------------------------------------------- '

' ############## 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
CheminsDestinationCopie     = "D:\TEST1;D:\TEST2"									 ' Chemin o� seront copi�s les fichiers d�coup�s

' #################################################

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

dim listeFichiersDecoupes
set listeFichiersDecoupes = CreateObject("System.Collections.ArrayList")

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"
     
	 If listeFichiersDecoupes.IndexOf(NomFichierReleve, 0) = -1 Then
		listeFichiersDecoupes.Add NomFichierReleve
	 End If
	 
     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") 

If CheminsDestinationCopie <> "" Then

	ecrit_log("Copie des fichiers d�coup�s")
	For Each fichierDecoupe in listeFichiersDecoupes
		CopieFichier fichierDecoupe, CheminsDestinationCopie
	Next

End If

' --------------------------------------------------------------------------------------------------------------- '
'                                               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
          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 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(strCheminFichierSource, strCheminFichierDest)
    
	Set objOFS = CreateObject("Scripting.FileSystemObject")
	
	Source = strCheminFichierSource
    
    Destin = split(strCheminFichierDest,";")
  
    '
    ' On boucle sur les fichiers de destination
    '
    For i = 0 to UBound(Destin)

		If (objOFS.FileExists(Source)) Then
			Set objFile = objOFS.GetFile(Source)
			ecrit_log("Copie du fichier " &  objOFS.GetFileName(objFile) & " dans " & Destin(i))
			objOFS.CopyFile Source, Destin(i) & "\" & objOFS.GetFileName(objFile)
        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