AT_BackDB.bas 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. Option Compare Database
  2. ' ** Access Toolbox Module **
  3. ' on 2017-02-28,
  4. ' @author: Olivier Massot
  5. ' V 1.0
  6. ' Manage external databases
  7. Public Function EtatModeConnexion() As String
  8. On Error GoTo err
  9. 'renvoie le mode de connexion actuel, ou une chaine vide si celui-ci ne peut être determiné
  10. Dim table As DAO.TableDef
  11. Dim modeConnexion, dirConnexionTable, modeConnexionTable As String
  12. Dim compte, compteErr As Integer
  13. 'à noter: dans la table des bases dorsales, mode de connexion = '*' pour que cette base soit ignorée lors des tests
  14. modeConnexion = ""
  15. If Not tableExiste("ztblBasesDorsales") Then GoTo errZtbl
  16. For Each table In CurrentDb.TableDefs
  17. If Len(table.Connect) > 0 Then
  18. dirConnexionTable = replace(table.Connect, ";DATABASE=", "")
  19. modeConnexionTable = Nz(DFirst("Mode", "ztblBasesDorsales", "[NomBase]='" & extraitNomFichier(dirConnexionTable) & "' AND [rep]='" & repFichier(dirConnexionTable) & "'"), "")
  20. If modeConnexionTable = "*" Then
  21. 'on passe à la suite
  22. ElseIf Len(modeConnexionTable) > 0 Then
  23. 'c'est une table liée
  24. If Len(modeConnexion) = 0 Then
  25. modeConnexion = modeConnexionTable
  26. Else
  27. If modeConnexion <> modeConnexionTable Then GoTo errConnexionsIncoherentes
  28. End If
  29. Else
  30. GoTo errBaseIntrouvable
  31. End If
  32. End If
  33. Next table
  34. EtatModeConnexion = modeConnexion
  35. fin:
  36. Exit Function
  37. err:
  38. MsgBox "Erreur lors de la détermination du mode de connexion:" & vbNewLine & err.Description
  39. GoTo fin
  40. errZtbl:
  41. MsgBox "Erreur lors de la détermination du mode de connexion:" & vbNewLine & "La table ztblBasesDorsales est manquante"
  42. GoTo fin
  43. errBaseIntrouvable:
  44. MsgBox "Erreur lors de la détermination du mode de connexion:" & vbNewLine & "La base d'une table est introuvable dans ztblBasesDorsales"
  45. GoTo fin
  46. errConnexionsIncoherentes:
  47. MsgBox "Erreur lors de la détermination du mode de connexion:" & vbNewLine & "Connexions incohérentes détectées"
  48. GoTo fin
  49. End Function
  50. Public Sub choisirModeConnexion()
  51. On Error GoTo err
  52. If Not tableExiste("ztblBasesDorsales") Then GoTo errZtbl
  53. If Not formExiste("zfrmBasesDorsales") Then GoTo errZfrm
  54. DoCmd.OpenForm "zfrmBasesDorsales"
  55. fin:
  56. Exit Sub
  57. err:
  58. MsgBox "Erreur en cours de procédure:" & err.Description
  59. GoTo fin
  60. errZtbl:
  61. MsgBox "Erreur: la table ztblBasesDorsales est nécessaire (cf. FonctionsCommunes.accdb)"
  62. GoTo fin
  63. errZfrm:
  64. MsgBox "Erreur: le formulaire zfrmBasesDorsales est nécessaire (cf. FonctionsCommunes.accdb)"
  65. GoTo fin
  66. End Sub
  67. Public Function majConnectionsAppli(ByVal mode As String) As Boolean
  68. 'met à jour les connections de toutes les tables
  69. Dim table As DAO.TableDef
  70. Dim compte, compteOK As Integer
  71. compte = 0
  72. compteOK = 0
  73. majConnectionsAppli = False
  74. If Not tableExiste("ztblBasesDorsales") Then GoTo errZtbl
  75. If Not formExiste("zfrmBasesDorsales") Then GoTo errZfrm
  76. Application.Echo False
  77. DoCmd.Hourglass True
  78. If modeValide(mode) = False Then GoTo errModeNonValide
  79. For Each table In CurrentDb.TableDefs
  80. If Len(table.Connect) > 0 Then
  81. 'c'est une table liée
  82. compte = compte + 1
  83. If ConnectMdb(table.name, mode, True) = True Then compteOK = compteOK + 1
  84. End If
  85. Next table
  86. If compteOK <> compte Then GoTo errErreursDetectees
  87. majConnectionsAppli = True
  88. Application.Echo True
  89. MsgBox "Opération terminée"
  90. fin:
  91. Application.Echo True
  92. DoCmd.Hourglass False
  93. Exit Function
  94. err:
  95. MsgBox "Erreur en cours de procédure:" & err.Description
  96. GoTo fin
  97. errZtbl:
  98. MsgBox "Erreur: la table ztblBasesDorsales est nécessaire (cf. FonctionsCommunes.accdb)"
  99. GoTo fin
  100. errZfrm:
  101. MsgBox "Erreur: le formulaire zfrmBasesDorsales est nécessaire (cf. FonctionsCommunes.accdb)"
  102. GoTo fin
  103. errErreursDetectees:
  104. MsgBox "Erreur: certaines attaches ne sembles pas avoir été mises à jour correctement"
  105. GoTo fin
  106. errModeNonValide:
  107. MsgBox "Erreur: ce mode n'est pas reconnu"
  108. GoTo fin
  109. End Function
  110. Private Function ConnectMdb(ByVal tbl As String, ByVal mode As String, Optional silencieuse As Boolean = False) As Boolean
  111. 'met à jour la connexion de la table selon le mode de branchement demandé
  112. On Error GoTo err
  113. Dim bdd As DAO.Database
  114. Dim td As DAO.TableDef
  115. Dim connexion, nouveauRep, fichier As String
  116. ConnectMdb = False
  117. If Not tableExiste(tbl) Then GoTo errTableManq
  118. Set bdd = CurrentDb
  119. Set td = bdd.TableDefs(tbl)
  120. connexion = Nz(td.Connect, "") 'etat de la connexion actuelle
  121. If Len(connexion) = 0 Then GoTo errMajLien
  122. fichier = extraitNomFichier(connexion)
  123. If Nz(DFirst("Mode", "ztblBasesDorsales", "[NomBase]='" & fichier & "'"), "") = "*" Then GoTo reussite
  124. nouveauRep = Nz(DFirst("Rep", "ztblBasesDorsales", "[Mode]='" & mode & "' and [NomBase]='" & fichier & "'"), "")
  125. If Len(nouveauRep) = 0 Or Dir(nouveauRep, vbDirectory) = "" Then GoTo errRep
  126. If Right(nouveauRep, 1) <> "\" Then nouveauRep = nouveauRep & "\"
  127. ' Modifie la propriété Connect avec la nouvelle chaîne de connexion
  128. td.Connect = ";DATABASE=" & nouveauRep & fichier
  129. 'Met à jour la liaison
  130. td.RefreshLink
  131. reussite:
  132. ConnectMdb = True
  133. fin:
  134. If Len(msgErr) > 0 Then
  135. If silencieuse = True Then
  136. Debug.Print msgErr
  137. Else
  138. MsgBox msgErr
  139. End If
  140. End If
  141. Set td = Nothing
  142. Set db = Nothing
  143. Exit Function
  144. errTableManq:
  145. msgErr = "Impossible de mettre à jour la connexion de " & tbl & ": table introuvable"
  146. GoTo fin
  147. err:
  148. msgErr = "Impossible de mettre à jour la connexion de " & tbl & ": " & err.Description
  149. GoTo fin
  150. errMajLien:
  151. msgErr = "Impossible de mettre à jour la connexion de " & tbl & ": impossible de déterminer l'état actuel de la connexion de la table, ce n'est peut-être pas une table liée"
  152. GoTo fin
  153. errRep:
  154. msgErr = "Impossible de mettre à jour la connexion de " & tbl & ": répertoire cible invalide"
  155. GoTo fin
  156. End Function
  157. Private Function modeValide(ByVal mode As String) As Boolean
  158. On Error GoTo fin
  159. modeValide = False
  160. modeValide = (DCount("Mode", "ztblBasesDorsales", "[Mode]='" & mode & "'") > 0)
  161. fin:
  162. End Function
  163. Public Function modeConnexionParDefaut()
  164. On Error GoTo fin
  165. modeConnexionParDefaut = ""
  166. modeConnexionParDefaut = Nz(DFirst("ModeDefaut", "ztblUtilisateurs", "[login]='" & CurrentUser & "'"), "")
  167. fin:
  168. End Function