OVH Cloud OVH Cloud

Sauvegarde, restauration et Archivage

12 réponses
Avatar
jero
Bonjour à tous,
Je repose (en partie) ma question du 28/11 laissée sans réponse...
Access 2007 Format base 2000
J'ai une appli. avec tables dans une base attachée Access.
Par Ex : Application dans C:\Appli\Appli.mdb, Tables dans
D:\Tables\Tables.mdb, les sauvegardes dans
D:\Sauvegardes\Tables2009-12-01.mdb (nom de la base avec la date de
sauvegarde), les archives dans D:\Archives\Tables2008.mdb (nom de la base
avec l'année de l'exercice)
En VBA :
J'ai mis en place les fonctionnalités "Sauvegarde/Restauration/Archivage des
tables"
Pas de pb. en sauvegarde (je copie la base D:\Tables\Tables.mdb dans le
dossier D:\Sauvegardes\), ni pour lire une archive, ni pour revenir à la
base courante (en modifiant les attaches)
En revanche, en restauration (je copie D:\Sauvegardes\Tables2009-12-01.mdb
par ex. dans D:\Tables\ et je la renomme Tables.mdb), j'ai qques pb.
(Evidemment, je fais ça "à la volée" et ça engendre qques
dysfonctionnements... ) :
soit Access ne "voit pas" les nouvelles tables (je ne retrouve pas les
enregistrements tels qu'ils étaient),
soit j'ai une erreur du genre "format de base de données inconnu ou
signet inexistant (?)"
J'ai bien essayer de rafraîchir les attaches, rien n'y fait.
Le pb. vient-il du fichier de lock ? (Tables.ldb)
Je suis obligé de fermer/réouvrir l'appli. pour que les modifs. soient
prises en compte.
Si qq1 a une idée, d'avance merci.
jpg

2 réponses

1 2
Avatar
3stone
Salut,

Tu ne peux/dois pas, entre autres, utiliser CurrentDb comme tu le
fais, car à chaque utilisation, tu crées une nouvelle référence.

Dim Db as dao.database : Set Db = CurrentDb

est mieux, voir obligatoire...

Pour ce qui est de mises en oeuvre... je ne veux pas être
tributaire d'une quelconque "nouveauté" et donc, les sauvegardes
et autres des tables d'une dorsale ou non sont faites avec un peu
de code passe partout ;-)


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)



jero wrote:
Salut 3Stone
1-Merci de la réponse
2-> il te faut te déconnecter totalement de la base dorsale (pas de
formulaire ou autre y ayant sa source)
Oui, c'est ce que j'avais fait (il y 2 formulaires à fermer)
3-Par contre, regarde les 3 procédures ci-dessous et dis-moi pourquoi
les 2 premières posent problème et pas la dernière...

Public Function ModifierAttacheTables_Bug1(Chemin As String) As
Boolean Dim NbTables As Integer, I As Integer, Msg As String, Tbl As
DAO.TableDef ModifierAttacheTables_Bug1 = True
On Error GoTo Err_AttacherTables
NbTables = CurrentDb().TableDefs().Count
For I = 0 To NbTables - 1
Set Tbl = CurrentDb().TableDefs(I)
If Tbl.Connect <> "" Then '<=Erreur n° 3420 : L'objet est
incorrect ou n'est plus défini.
Tbl.Connect = ";DATABASE=" & Chemin
Tbl.RefreshLink
End If
Next I
CurrentDb().TableDefs().Refresh
Exit_AttacherTables:
Set Tbl = Nothing
Exit Function
Err_AttacherTables:
ModifierAttacheTables_Bug1 = False
Msg = "Erreur n° " & Err.Number & " : " & Err.DESCRIPTION
MsgBox Msg, vbOKOnly, ""
On Error GoTo 0
Resume Exit_AttacherTables
End Function

Public Function ModifierAttacheTables_Bug2(Chemin As String) As
Boolean Dim NbTables As Integer, I As Integer, Msg As String
ModifierAttacheTables_Bug2 = True
On Error GoTo Err_AttacherTables
NbTables = CurrentDb().TableDefs().Count
For I = 0 To NbTables - 1
If CurrentDb().TableDefs(I).Connect <> "" Then
CurrentDb().TableDefs(I).Connect = ";DATABASE=" & Chemin '<=Ne
modifie pas la connexion
CurrentDb().TableDefs(I).RefreshLink
End If
Next I
CurrentDb().TableDefs().Refresh
Exit_AttacherTables:
Exit Function
Err_AttacherTables:
ModifierAttacheTables_Bug2 = False
Msg = "Erreur n° " & Err.Number & " : " & Err.DESCRIPTION
MsgBox Msg, vbOKOnly, ""
On Error GoTo 0
Resume Exit_AttacherTables
End Function

Public Function ModifierAttacheTables_SansBug(Chemin As String) As
Boolean Dim NbTables As Integer, I As Integer, Msg As String, Db As
DAO.Database, Tbl As DAO.TableDef
Set Db = CurrentDb()
ModifierAttacheTables_SansBug = True
On Error GoTo Err_AttacherTables
NbTables = Db.TableDefs().Count
For I = 0 To NbTables - 1
Set Tbl = Db.TableDefs(I)
If Tbl.Connect <> "" Then
Tbl.Connect = ";DATABASE=" & Chemin
Tbl.RefreshLink
End If
Next I
Db.TableDefs().Refresh
Exit_AttacherTables:
Set Tbl = Nothing
Set Db = Nothing
Exit Function
Err_AttacherTables:
ModifierAttacheTables_SansBug = False
Msg = "Erreur n° " & Err.Number & " : " & Err.DESCRIPTION
MsgBox Msg, vbOKOnly, ""
On Error GoTo 0
Resume Exit_AttacherTables
End Function

Est-ce uniquement parceque dans la 3ème, on utilise une variable pour
la CurrentDb() ?
Avais-tu déjà mis en oeuvre ces fonctionnalités : Sauvegarde,
Restauration, Archivage et "Consulter une archive" (je pense que oui)
; si tu as des conseils supplémentaires...
A+ et meilleurs voeux,
jpg
"3stone" a écrit dans le message de news:
upUnCL%
Salut,

jero wrote:
[...]
J'ai fouillé sur le Web (Access Restauration tables vba) ; rien ou
presque (sur la sauvegarde OUI, sur la restauration NON)
Je reste persuadé que c'est le ".ldb" qui fout la zone...




Avant toute manipulation, il te faut te déconnecter totalement
de la base dorsale (pas de formulaire ou autre y ayant sa source)

Puis, tu peux relier les tables en t'inspirant de ceci:
http://www.3stone.be/access/articles.php?lng=fr&pg(

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)




Avatar
jero
Salut 3Stone (et meilleurs voeux et merci).
Je m'en suis sorti de mon pb. de restauration avec une "bidouille" en
passant par une AutoKeys
Code (simplifié) :
Cas n°1 : Ce qui fonctionne
Private Sub btRestauration_Click()
Dim Msg As String
Msg = "Etes-vous certain de vouloir effectuer la restauration des tables
?" & vbCrLf & vbCrLf
Msg = Msg & "Note importante : après avoir cliqué sur Oui, appuyez sur
Ctrl+Maj+R pour lancer l'opération."
If MsgBox(Msg, vbInformation + vbYesNo, "") = vbYes Then
Echo False
FermerFormulaires
End If
End Sub
Note : la macro AutoKeys Ctrl+Maj+R exécute la procédure Restauration

Cas n° 2 : Ce qui ne fonctionne pas
Private Sub btRestauration_Click()
Dim Msg As String
Msg = "Etes-vous certain de vouloir effectuer la restauration des tables
?"
If MsgBox(Msg, vbInformation + vbYesNo, "") = vbYes Then
Echo False
FermerFormulaires
Restauration
End If
End Sub

Dans le cas n°2, le fichier de lock .ldb n’est pas fermé après «
FermerFormulaires » et ça plante. Il semble, qu’après cet appel, il faut
vraiment « quitter » la procédure en cours.
Voilà, voilà,
A+


"3stone" a écrit dans le message de news:
eX$
Salut,

Tu ne peux/dois pas, entre autres, utiliser CurrentDb comme tu le
fais, car à chaque utilisation, tu crées une nouvelle référence.

Dim Db as dao.database : Set Db = CurrentDb

est mieux, voir obligatoire...

Pour ce qui est de mises en oeuvre... je ne veux pas être
tributaire d'une quelconque "nouveauté" et donc, les sauvegardes
et autres des tables d'une dorsale ou non sont faites avec un peu
de code passe partout ;-)


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)



jero wrote:
Salut 3Stone
1-Merci de la réponse
2-> il te faut te déconnecter totalement de la base dorsale (pas de
formulaire ou autre y ayant sa source)
Oui, c'est ce que j'avais fait (il y 2 formulaires à fermer)
3-Par contre, regarde les 3 procédures ci-dessous et dis-moi pourquoi
les 2 premières posent problème et pas la dernière...

Public Function ModifierAttacheTables_Bug1(Chemin As String) As
Boolean Dim NbTables As Integer, I As Integer, Msg As String, Tbl As
DAO.TableDef ModifierAttacheTables_Bug1 = True
On Error GoTo Err_AttacherTables
NbTables = CurrentDb().TableDefs().Count
For I = 0 To NbTables - 1
Set Tbl = CurrentDb().TableDefs(I)
If Tbl.Connect <> "" Then '<=Erreur n° 3420 : L'objet est
incorrect ou n'est plus défini.
Tbl.Connect = ";DATABASE=" & Chemin
Tbl.RefreshLink
End If
Next I
CurrentDb().TableDefs().Refresh
Exit_AttacherTables:
Set Tbl = Nothing
Exit Function
Err_AttacherTables:
ModifierAttacheTables_Bug1 = False
Msg = "Erreur n° " & Err.Number & " : " & Err.DESCRIPTION
MsgBox Msg, vbOKOnly, ""
On Error GoTo 0
Resume Exit_AttacherTables
End Function

Public Function ModifierAttacheTables_Bug2(Chemin As String) As
Boolean Dim NbTables As Integer, I As Integer, Msg As String
ModifierAttacheTables_Bug2 = True
On Error GoTo Err_AttacherTables
NbTables = CurrentDb().TableDefs().Count
For I = 0 To NbTables - 1
If CurrentDb().TableDefs(I).Connect <> "" Then
CurrentDb().TableDefs(I).Connect = ";DATABASE=" & Chemin '<=Ne
modifie pas la connexion
CurrentDb().TableDefs(I).RefreshLink
End If
Next I
CurrentDb().TableDefs().Refresh
Exit_AttacherTables:
Exit Function
Err_AttacherTables:
ModifierAttacheTables_Bug2 = False
Msg = "Erreur n° " & Err.Number & " : " & Err.DESCRIPTION
MsgBox Msg, vbOKOnly, ""
On Error GoTo 0
Resume Exit_AttacherTables
End Function

Public Function ModifierAttacheTables_SansBug(Chemin As String) As
Boolean Dim NbTables As Integer, I As Integer, Msg As String, Db As
DAO.Database, Tbl As DAO.TableDef
Set Db = CurrentDb()
ModifierAttacheTables_SansBug = True
On Error GoTo Err_AttacherTables
NbTables = Db.TableDefs().Count
For I = 0 To NbTables - 1
Set Tbl = Db.TableDefs(I)
If Tbl.Connect <> "" Then
Tbl.Connect = ";DATABASE=" & Chemin
Tbl.RefreshLink
End If
Next I
Db.TableDefs().Refresh
Exit_AttacherTables:
Set Tbl = Nothing
Set Db = Nothing
Exit Function
Err_AttacherTables:
ModifierAttacheTables_SansBug = False
Msg = "Erreur n° " & Err.Number & " : " & Err.DESCRIPTION
MsgBox Msg, vbOKOnly, ""
On Error GoTo 0
Resume Exit_AttacherTables
End Function

Est-ce uniquement parceque dans la 3ème, on utilise une variable pour
la CurrentDb() ?
Avais-tu déjà mis en oeuvre ces fonctionnalités : Sauvegarde,
Restauration, Archivage et "Consulter une archive" (je pense que oui)
; si tu as des conseils supplémentaires...
A+ et meilleurs voeux,
jpg
"3stone" a écrit dans le message de news:
upUnCL%
Salut,

jero wrote:
[...]
J'ai fouillé sur le Web (Access Restauration tables vba) ; rien ou
presque (sur la sauvegarde OUI, sur la restauration NON)
Je reste persuadé que c'est le ".ldb" qui fout la zone...




Avant toute manipulation, il te faut te déconnecter totalement
de la base dorsale (pas de formulaire ou autre y ayant sa source)

Puis, tu peux relier les tables en t'inspirant de ceci:
http://www.3stone.be/access/articles.php?lng=fr&pg(

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)







1 2