OVH Cloud OVH Cloud

migration automatisée

3 réponses
Avatar
fth
Bonjour,

faisant suite à divers POST, le code ci-dessous fut réalisé.
chouette, fonctionne bien ...
mais on me demande maintenant des modifs (jamais content!)

en fait, il faudrait maintenant travailler dans l'ordre suivant:
1. modifier le nom de fichier d'origine (NAME+old.mdb)
2. migrer le fichier et lui rendre le nom d'origine (NAME) histoire de
simplifier la tache des users
3. je n'arrive toujorus pas à déterminer quand le fichier est bien migré et
à passer le champs (MigOk à true ou yes)

Bonus: serait il possible de récupérer la taille des fichiers par la mm
occasion?

Si Eric est toujours dans les environs ...

d'avance merci et bonne reprise à tous!

Frédéric

Private Sub copyFile_Click()

On Error GoTo Traitement_Erreur


Dim boolErr As Boolean
Dim MyAcc As Access.Application
Set MyAcc = New Access.Application
'Dim rst As DAO.Recordset
Dim rst As Recordset
Dim strSQL As String

'strSQL = "SELECT AppliPath, AppliName From NetworkSearchAppli "
'strSQL = strSQL & "WHERE peridicity between '1' AND '3';"

'Set rst = CurrentDb.OpenRecordset(strSQL)


boolErr = True


Set rst = Me.Recordset

If rst.BOF And rst.EOF Then
Set rst = Nothing

End If

' remplir un recordset sur la table appli
' boucler sur le recordset pour créer les rep et convertir les bds

'Tester si rst ne contient pas d'enregistrements (Bof & Eof) et
'sortir le cas échéant
While Not rst.EOF ' sinon
NewMigPath = "c:\MigAppli\" & Mid(rst!AppliPath, 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&
'FileCopy rst!AppliPath & "\" & rst!AppliName, _
NewMigPath & "\" & rst!AppliName
MyAcc.ConvertAccessProject AppliPath & "\" &
rst!AppliName, _
NewMigPath & "\" & Left(rst!AppliName,
Len(rst!AppliName) - 4) _
& ".mdb", _
acFileFormatAccess2002
If boolErr Then
Me!MigOk = True
Else
Me!MigNotOk = True
End If

rst.MoveNext

Wend
MyAcc.Quit
Set MyAcc = Nothing
Set rst = Nothing
Exit Sub

Traitement_Erreur:
'MsgBox Err.Number & " " & Err.Description
boolErr = False
Me!MigNotOk = True
Me!MigOk = False
Resume Next

End Sub

3 réponses

Avatar
Eric
Bonjour Frédéric,

Pour le 1 :
On renomme les fichiers avec Name. A faire après la migration
MyAcc.ConvertAccessProject ...

Name rst!AppliPath & "" & rst!AppliName AS rst!AppliPath _
& "" & left(rst!AppliName,Len(rst!AppliName) - 4) & "OLD.mdb"

Pour le 2: Suffit de modifier ainsi:
MyAcc.ConvertAccessProject AppliPath & "" &
rst!AppliName, _
NewMigPath & "" & rst!AppliName, _
acFileFormatAccess2002

Pour le 3 : Il faut que tu déplaces le boolErr = True et
le mettes sous le While not rst.EOF
Le traitement d'erreur ne doit contenir que :
Traitement_Erreur:
boolErr = False
Resume Next

Pour le bonus, avec les Apis par exemple.
Dans la partie des déclarations du module, ajouter sous Option Compare
Database:

Const GENERIC_READ = &H80000000
Const FILE_SHARE_READ = &H1
Const OPEN_EXISTING = 3
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, lpSecurityAttributes As Any, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long
Private Declare Function GetFileSizeEx Lib "kernel32" _
(ByVal hFile As Long, lpFileSize As Currency) As Boolean
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Dans les déclarations de la procédure FileCopy
Dim hFile As Long, nSize As Currency, CheminFichier As String

Donc dans l'ordre :

Private Sub copyFile_Click()
On Error GoTo Traitement_Erreur
Dim boolErr as Boolean
Dim hFile As Long, nSize As Currency, CheminFichier As String
...
While Not rst.EOF
boolErr = True
NewMigPath = "c:MigAppli" & Mid(rst!AppliPath, 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&
' on convertit le fichier au nouveau format
en conservant son nom
MyAcc.ConvertAccessProject AppliPath & "" &
rst!AppliName, _
NewMigPath & "" & rst!AppliName, _
acFileFormatAccess2002

' Traitement pour récuperer la taille du fichier converti
CheminFichier =NewMigPath & "" & rst!AppliName
'ouvre le fichier
hFile = CreateFile(CheminFichier, GENERIC_READ, _
FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
'récupère la taille du fichier
GetFileSizeEx hFile, nSize
'ferme le fichier
CloseHandle hFile
' affiche la taille
MsgBox "Taille de " & CheminFichier & " : " & _
str$(nSize * 10000) + " bytes"

If boolErr Then
Me!MigOk = True
' On renomme le fichier d'origine (celui ayant été migré)
Name rst!AppliPath & "" & rst!AppliName AS rst!AppliPath _
& "" & left(rst!AppliName,Len(rst!AppliName) - 4) & "OLD.mdb"
Else
Me!MigNotOk = True
End If
Wend
...
Set MyAcc = Nothing
Set rst = Nothing
Exit Sub
Traitement_Erreur:
boolErr = False
Resume Next
End Sub

J'espère qu'il n' y a pas trop d'erreurs car je fais ça à l'aveugle, ne
pouvant tester.


Bonjour,

faisant suite à divers POST, le code ci-dessous fut réalisé.
chouette, fonctionne bien ...
mais on me demande maintenant des modifs (jamais content!)

en fait, il faudrait maintenant travailler dans l'ordre suivant:
1. modifier le nom de fichier d'origine (NAME+old.mdb)
2. migrer le fichier et lui rendre le nom d'origine (NAME) histoire de
simplifier la tache des users
3. je n'arrive toujorus pas à déterminer quand le fichier est bien migré et
à passer le champs (MigOk à true ou yes)

Bonus: serait il possible de récupérer la taille des fichiers par la mm
occasion?

Si Eric est toujours dans les environs ...

d'avance merci et bonne reprise à tous!

Frédéric

--

A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
re,

Houla, :-( y a bien plus simple pour connaitre la taille d'un fichier.

La fonction FileLen() renvoie l'info.

Donc, supprimes les lignes dans la partie General-Déclarations
de Const GENERIC_READ = &H80000000 jusqu'à
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Remplaces dans la proc la ligne de déclaration :
Dim hFile As Long, nSize As Currency, CheminFichier As String
par
Dim CheminFichier As String

puis dans le While Wend, supprimes les lignes
'ouvre le fichier
hFile = CreateFile(CheminFichier, GENERIC_READ, _
FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
'récupère la taille du fichier
GetFileSizeEx hFile, nSize
'ferme le fichier
CloseHandle hFile
' affiche la taille
MsgBox "Taille de " & CheminFichier & " : " & _
str$(nSize * 10000) + " bytes"



et remplaces par :
MsgBox "Taille de " & CheminFichier & " : " & _
FileLen(CheminFichier) & " bytes"



--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
fth
Salut Eric!
Dis donc, tu te défonce toi quand tu t'y mets!
Merci pour les pistes. Une précision:
contrairement à la première fois, ici, pas question de créer un nv
repertoire. le fichier migré DOIT rester dans le rep d'origine snas changer
de nom (prob de db liées entre autre) donc je dois d'abord changer le nom du
fichier97 en lui ajoutant Old (par ex), migrer celui ci et nommer le nv
fichier avec le nom d'origine sans "old".
Tout ça parce que je ne peux pas avoir deux fichiers de mm nom et mm
extensions dans le mm rep..

Allez, je test tes suggestions

A+ et merci

Frédéric



"Eric" wrote in message
news:
Bonjour Frédéric,

Pour le 1 :
On renomme les fichiers avec Name. A faire après la migration
MyAcc.ConvertAccessProject ...

Name rst!AppliPath & "" & rst!AppliName AS rst!AppliPath _
& "" & left(rst!AppliName,Len(rst!AppliName) - 4) & "OLD.mdb"

Pour le 2: Suffit de modifier ainsi:
MyAcc.ConvertAccessProject AppliPath & "" &
rst!AppliName, _
NewMigPath & "" & rst!AppliName, _
acFileFormatAccess2002

Pour le 3 : Il faut que tu déplaces le boolErr = True et
le mettes sous le While not rst.EOF
Le traitement d'erreur ne doit contenir que :
Traitement_Erreur:
boolErr = False
Resume Next

Pour le bonus, avec les Apis par exemple.
Dans la partie des déclarations du module, ajouter sous Option Compare
Database:

Const GENERIC_READ = &H80000000
Const FILE_SHARE_READ = &H1
Const OPEN_EXISTING = 3
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, lpSecurityAttributes As Any, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long
Private Declare Function GetFileSizeEx Lib "kernel32" _
(ByVal hFile As Long, lpFileSize As Currency) As Boolean
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Dans les déclarations de la procédure FileCopy
Dim hFile As Long, nSize As Currency, CheminFichier As String

Donc dans l'ordre :

Private Sub copyFile_Click()
On Error GoTo Traitement_Erreur
Dim boolErr as Boolean
Dim hFile As Long, nSize As Currency, CheminFichier As String
...
While Not rst.EOF
boolErr = True
NewMigPath = "c:MigAppli" & Mid(rst!AppliPath, 4)
SHCreateDirectoryEx Me.hwnd, NewMigPath, ByVal 0&
' on convertit le fichier au nouveau format
en conservant son nom
MyAcc.ConvertAccessProject AppliPath & "" &
rst!AppliName, _
NewMigPath & "" & rst!AppliName, _
acFileFormatAccess2002

' Traitement pour récuperer la taille du fichier converti
CheminFichier =NewMigPath & "" & rst!AppliName
'ouvre le fichier
hFile = CreateFile(CheminFichier, GENERIC_READ, _
FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
'récupère la taille du fichier
GetFileSizeEx hFile, nSize
'ferme le fichier
CloseHandle hFile
' affiche la taille
MsgBox "Taille de " & CheminFichier & " : " & _
str$(nSize * 10000) + " bytes"

If boolErr Then
Me!MigOk = True
' On renomme le fichier d'origine (celui ayant été migré)
Name rst!AppliPath & "" & rst!AppliName AS rst!AppliPath _
& "" & left(rst!AppliName,Len(rst!AppliName) - 4) & "OLD.mdb"
Else
Me!MigNotOk = True
End If
Wend
...
Set MyAcc = Nothing
Set rst = Nothing
Exit Sub
Traitement_Erreur:
boolErr = False
Resume Next
End Sub

J'espère qu'il n' y a pas trop d'erreurs car je fais ça à l'aveugle, ne
pouvant tester.


Bonjour,

faisant suite à divers POST, le code ci-dessous fut réalisé.
chouette, fonctionne bien ...
mais on me demande maintenant des modifs (jamais content!)

en fait, il faudrait maintenant travailler dans l'ordre suivant:
1. modifier le nom de fichier d'origine (NAME+old.mdb)
2. migrer le fichier et lui rendre le nom d'origine (NAME) histoire de
simplifier la tache des users
3. je n'arrive toujorus pas à déterminer quand le fichier est bien migré
et à passer le champs (MigOk à true ou yes)

Bonus: serait il possible de récupérer la taille des fichiers par la mm
occasion?

Si Eric est toujours dans les environs ...

d'avance merci et bonne reprise à tous!

Frédéric

--

A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr