Chemin de la base dorsale
J’ai scindé ma base Access en deux pour l’installer en réseau (voir ici pour la procédure). Comment, dans la partie applicative (ou frontale) connaître le chemin de la base dorsale (les données) ?
Le problème
Le problème à bien prendre en compte est qu’une base frontale Access peut pointer vers plusieurs bases dorsales. Du coup, il n’y a pas de méthode « native » pour obtenir directement la base dorsale. Par contre, dans les faits, on a rarement 20 bases liées, mais plutôt 1 base frontale et 1 seule base dorsale. Si c’est le cas, l’astuce consiste à lire le chemin de liaison de l’une des tables de la base frontale : ce chemin est celui de la base dorsale !
CurrentProject.Path
et ses variantes (voir ici).Un peu de code
Le chemin d’une table liée est donné par la propriété Connect
de l’objet DAO.TableDef
. Si une table pointe vers un autre fichier MDB (ou ACCDB sur Access 2007), cette propriété a pour forme :
;DATABASE=C:\...Base dorsale.mdb
Il nous suffit donc d’extraire ce qui suit le signe « =
« . Voici une fonction VBA qui automatise le tout :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
' --- ' CHEMIN DE LA BASE DORSALE ' --- Function CheminDorsale(ByVal strTable As String) As String Dim strChemin As String On Error Resume Next strChemin = CurrentDb.TableDefs(strTable).Connect If UCase(Left(strChemin, 10)) = ";DATABASE=" Then strChemin = Mid(strChemin, 11) End If ' Valeur de retour CheminDorsale = strChemin End Function |
Pour que l’exemple fonctionne :
- On suppose que la base frontale n’est liée qu’à une seule base dorsale (ou en tout cas, que vous ne souhaitez obtenir le chemin que d’une base dorsale).
- On suppose que les liaisons se font entre fichiers natifs Access (MDB, MDE, ACCDB, ACCDE notamment). Si vous avez des liaisons ODBC, vous devrez aménager le code, puisque la propriété
Connect
n’est plus la même.
Pour utiliser la fonction…
- On suppose que vous avez recopié la fonction dans un module standard de votre base applicative (la base frontale, avec les liaisons de tables, pas la base dorsale qui contient les tables réelles).
- Créez par exemple un bouton de commande, sur un formulaire.
- Programmez l’événement
Sur clic
de ce bouton en y tapant :
1 2 3 |
Dim strChemin As String strChemin = CheminDorsale("tbl Clients") MsgBox "Le chemin de la base dorsale est : " & strChemin |
Remplacez bien sûr tbl Clients
par le nom d’une table significative de votre base.
Merci pour ce code!
Par contre, ça ne fonctionnait pas chez moi, puis j’ai tenté une petite correction.
Dans le code du bouton, visiblement, le bon nom de la fonction serait:
strChemin = CheminDorsale(« tbl Clients »)
Voilà 🙂
Merci pour le retour. Effectivement, il y avait une erreur dans le code de mon bouton. J’ai rectifié aussi dans l’article. 🙂
dg78 > C’est possible de rétablir les liaisons en VBA : voir la fonction
RetablirLiaisons
sur cette page du forum. La fonction devra sans doute être adaptée si on doit faire la distinction entre les 2 bases dorsales, mais le principe est là.Bonjour,
J’ai une application qui fonctionne à la fois sur un réseau et en autonome sur un Tablet PC.
J’ai coupé la base en trois : une frontale (Front.mdb) et deux dorsales (Back1.mdb et Back2.mdb).
Lors du travail sur le réseau, Front1, placé sur un poste client, fait référence à Back1 et Back2 placés sur le serveur.
En travail sur un Tablet PC, Front1, placé sur le disque C, fait référence à Back1 et Back2 placés eux aussi sur le disque C.
Mon problème vient quand je modifie Front1 (un formulaire par exemple), et que je le réinstalle à la fois sur le poste client et sur le Tablet PC. Je dois supprimer les liaisons (une par une pour chaque table car Access 2003 ne permet pas une suppression globale) puis je lie les tables (là c’est possible de prendre d’un seul coup toutes les tables d’une base).
Ma question : est-il possible de détacher puis ré-attacher les tables avec du code ? ou mieux de modifier par code le chemin des tables attachées ?
Merci par avance
Dominique