Comment utiliser une application en mode multi-utilisateurs
Date de publication : 01/02/2007
Par
Morgan BILLY (Espace Perso de Dolphy35)
Nous allons dans ce tutoriel parler de l'utilisation des bases Access en mode multiutilisateurs, ce principe est appelé
frontale/dorsale.
I. Introduction
II. Principe des bases frontales/dorsales
III. Scinder une base
IV. Lier les tables manuellement
V. Ajout d'une table dans la base Frontale
VI. Tables non liées de la frontale
VII. Lier les Tables en VBA
VII-A. Fonction permettant de mettre à jour les liaisons
VIII. Ouverture de la base Frontale avec test des liaisons
IX. Allez plus loin - Mise en Maintenance
IX-A. Cacher une Table.
IX-A-1. Comment enlever l'attribut Masqué d'une table ?
IX-B. Mode Maintenance de la base
IX-C. Création d'une base pour Administrer les bases Frontales/Dorsales
IX-C-1. Lister les personnes connectées à la base principale
IX-C-2. Formulaire de consultation des personnes connectées
IX-C-3. Envoi d'un message aux personnes connectées
X. Conclusion
XI. Remerciements
I. Introduction
Nous allons utiliser dans ce tutoriel une base exemple disponible avec Access => Les Comptoirs.
Cette
base est disponible depuis Access dans l'arborescence de l'aide :
Egalement disponible sur ce chemin => C:\Program Files\Microsoft Office\OFFICExx\SAMPLES.
 |
Pour Access97 il faut aller chercher dans le répertoire d'installation Office\Samples
|
II. Principe des bases frontales/dorsales
C'est le principe du
Client /
Serveur, d'un côté les données et de l'autre
l'interface utilisateurs ou
IHM.
Base Dorsale : Base ne contenant que les tables. Généralement la base Dorsale est placée sur un Serveur connecté à un réseau.
Base Frontale : Base contenant tous les Formulaires, les Requêtes, les Etats et les Macros. Cette base est placée
sur les postes utilisateurs, elle aussi connectée au même réseau.
III. Scinder une base
Access possède un outil très ludique permettant de scinder une base.
 |
Pour utiliser l'assistant il faut sélectionner Fractionner une base de données du menu outils
|
 |
Une fenêtre s'ouvre vous expliquant ce que va faire Access, c'est à dire déplacer les tables vers une base
principale et les lier vers la base Frontale qui sera votre base actuelle. Sélectionnez Fractionner la base
de données.
|
 |
Une fenêtre d'exploration s'ouvre vous demandant de renseigner le chemin où sera créée la base principale.
|
 |
Après avoir cliqué sur Fractionner, l'assistant effectue la création de la base principale et lie les tables,
un message vous signale la bonne réalisation du travail de l'assistant.
|
Dans la fenêtre de base de données nous pouvons voir ceci maintenant :
La liaison au niveau des tables est représentée par une flèche située devant la table, ceci veut dire que cette
table est liée à une autre base de donnée.
 |
La base dorsale ne contient que les tables partagées. Les tables temporaires doivent être
situées sur la base frontale pour éviter tout conflit et garantir la version des données enregistrées
temporairement.
|
IV. Lier les tables manuellement
Nous venons de scinder une base Access sur le principe de frontale/dorsale, ceci présente un gros défaut :
sa portabilité. Si pour une raison quelconque vous avez besoin de déplacer une ou les bases, toutes les liaisons ne
seront plus conformes. Access possède une fonction permettant de redéfinir les liaisons manuellement.
 |
Le gestionnaire de tables liées (ou gestionnaire d'attaches) permet de changer le chemin de la liaison entre
la Frontale et la Dorsale.
|

Gestionnaire de tables liées (ou Gestionnaire d'attaches)

Fenêtre du gestionnaire d'attaches
 |
Le gestionnaire est relativement simple d'utilisation, il suffit de sélectionner les tables à mettre à jour
puis de cliquer sur le bouton Ok.
|

Fenêtre du gestionnaire d'attaches
 |
Un message confirme si la mise à jour s'est bien effectué.
|

Mise à jour des liaisons Ok
 |
Si Access ne trouve pas la base Dorsale car elle a été déplacée, une fenêtre d'exploration permettant
de renseigner le nouveau chemin s'ouvre. Elle permet de sélectionner la base Dorsale et sur validation
d'effectuer la mise à jour des liaisons entre la Dorsale et la Frontale.
|

Renseignement du nouveau chemin de la Dorsale.
 |
La case à cocher "Toujours demander un nouvel emplacement" permet lors de la validation sur "Ok"
de toujours ouvrir la fenêtre d'exploration pour renseigner le chemin de la base Dorsale.
|

Sélection nouvel emplacement.

Renseignement du nouveau chemin de la Dorsale.
V. Ajout d'une table dans la base Frontale
Nous allons maintenant ajouter une nouvelle liaison à la base frontale. Pour notre exemple nous allons effacer
la table Messagers de la base frontale et la recréer. En faisant cela nous venons juste d'effacer la liaison
entre les deux bases. Pour recréer cette liaison nous allons ouvrir la fenêtre d'attaches des tables.
 |
Sélectionnez Lier les tables du menu Fichier
|
 |
Une fenêtre d'exploration s'ouvre vous demandant de sélectionner la base où se situe la table à lier
|
 |
Après avoir sélectionné la base où se situe la table et cliqué sur Attacher, la fenêtre d'attache s'ouvre il
nous reste plus qu'à sélectionner la table Messagers et cliquer sur OK
|
VI. Tables non liées de la frontale
Il se peut que vous ayez besoin de créer une table temporaire, comme expliqué plus haut ces tables ne doivent pas
être liées mais intégrée à la base Frontale.
Nous allons maintenant créer une table. Cette table permettra de stocker toutes les tables liées de la base frontale.
Nous utiliserons cette table dans le prochain chapitre.
Créer une nouvelle table que l'on appellera tblTablesAttachees, celle-ci ne comportera qu'un champ :
| Nom |
Type |
| TableAttachees |
Texte |
VII. Lier les Tables en VBA
VII-A. Fonction permettant de mettre à jour les liaisons
 |
Pour ce code il est nécessaire de cocher la référence Microsoft DAO 3.x Object Library.
|
Dans un premier temps nous allons créer un code permettant de connaître les tables qui sont liées,
nous allons ensuite ajouter chaque table liée dans la table
tblTablesAttachees.
Pour cela nous utiliserons un attribut de l'objet
TableDefs =>
dbAttachedTable
D'autres attributs sont disponibles au paragraphe
4.3.2.1 du tutoriel DAO de Tofalu.
Déclarations des variables :
Dim dbBase As DAO.Database
Dim tbdTables As DAO.TableDef
Dim rst As DAO.Recordset
|
Instance des variables, dbBase correspond à la base en cours et rst ouvre la table tblTablesAttachees
dans un Recordset :
Set dbBase = CurrentDb
Set rst = dbBase.OpenRecordset("tblTablesAttachees", dbOpenDynaset)
|
Nous allons également inhiber les messages d'alertes :
Il faut vider la table tblTablesAttachees pour que l'on puisse la re-remplir avec les tables liées :
DoCmd.RunSQL "DELETE * FROM tblTablesAttachees"
|
Maintenant il faut écrire la boucle qui permet de parcourir toutes les tables de la base Frontale et d'ajouter
seulement les tables liées dans tblTablesAttachees. Pour cela nous testons l'attribut de la table qui permet
de dire si celle-ci est liée ou non => dbAttachedTable.
Pourquoi cette table ? C'est très simple, au lieu de lier toutes les tables, nous ne lierons que celles qui l'étaient.
For Each tbdTables In dbBase.TableDefs
If tbdTables.Attributes And dbAttachedTable Then
rst.AddNew
rst!TablesAttachees = tbdTables.Name
rst.Update
End If
Next tbdTables
|
La table étant remplie il faut mettre à jour le Recordset. Ensuite il faut effectuer un test pour placer le pointeur
d'enregistrement sur le premier enregistrement :
rst.Requery
If Not rst.BOF Then
rst.MoveFirst
End If
|
Maintenant mettons à jour les liaisons des tables contenues dans la tables tblTablesAttachees,
pour cela on réalise une boucle qui tourne tant que nous sommes pas arrivé au dernier enregistrement.
Nous définissons l'objet TableDefs en fonction de la table stockée dans tblTablesAttachees.
En utilisant la propriétés Connect nous redéfinissons le nouveau chemin de la liaison.
La propriété RefreshLink permet de mettre à jour la liaison. On efface l'enregistrement en cours
dans la table tblTablesAttachees ceci pour avoir une traçabilité, prenons le cas où la procédure
rencontre un problème l'administrateur de la base pourra connaître les tables qui n'ont pas été liées.
While Not rst.EOF
With dbBase.TableDefs(rst!TablesAttachees.Value)
.Connect = ";DATABASE=" & strChmFichier
.RefreshLink
End With
rst.Delete
rst.MoveNext
Wend
|
Ensuite nous libérons les variables. On réactive les messages d'alertes. On affiche un message comme quoi
tout c'est bien déroulé et on renvoi la fonction avec True.
dbBase.Close
Set dbBase = Nothing
Set rst = Nothing
DoCmd.SetWarnings True
MsgBox ("mise à jour terminée")
LierTables = True
|
Voici la fonction complète ayant comme paramètre le chemin de la nouvelle base principale et qui renvoie une
valeur de type Boolean.
Function LierTables(strChmFichier As String) As Boolean
Dim dbBase As DAO.Database
Dim tbdTables As DAO.TableDef
Dim rst As DAO.Recordset
LierTables = False
Set dbBase = CurrentDb
Set rst = dbBase.OpenRecordset("tblTablesAttachees", dbOpenDynaset)
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblTablesAttachees"
For Each tbdTables In dbBase.TableDefs
If tbdTables.Attributes And dbAttachedTable Then
rst.AddNew
rst!TablesAttachees = tbdTables.Name
rst.Update
End If
Next tbdTables
rst.Requery
If Not rst.BOF Then
rst.MoveFirst
End If
While Not rst.EOF
With dbBase.TableDefs(rst!TablesAttachees.Value)
.Connect = ";DATABASE=" & strChmFichier
.RefreshLink
End With
rst.Delete
rst.MoveNext
Wend
dbBase.Close
Set dbBase = Nothing
Set rst = Nothing
DoCmd.SetWarnings True
MsgBox ("mise à jour terminée")
LierTables = True
End Function
|
VIII. Ouverture de la base Frontale avec test des liaisons
Pour ce paragraphe il nous faut créer une nouvelle table que nous appellerons tblAdmin :
| Nom |
Type |
| VerrouAdmin |
OUI/NON |
Maintenant il nous faut tester les liaisons des table à l'ouverture de la base frontale, pour cela nous
utiliserons le formulaire de démarrage de la base Comptoir :
Démarrage qui est sur le principe du Splash-Screen,
pour plus d'info je renvoie vers le tutoriel de
loufab
Le Splash-Screen ou comment donner une touche professionnelle à vos applications..
Dans un premier temps nous allons enlever les appels de fonctions sur l'ouverture et fermeture
du formulaire. Pour cela ouvrez le Formulaire en mode création, pointez en dehors de la zone détail et
effectuez un clic droit puis sélectionnez Propriétés.
Dans l'onglet Evénements, effacez les appels des lignes Sur ouverture et Sur fermeture.
Cliquez sur les trois points situés au bout du champ

pour mettre le
code qui sera exécuté à l'ouverture du Formulaire.
Nous allons maintenant supprimer le bouton ok et la case à cocher.
Maintenant parlons code :
Nous initialiserons le Timer à l'ouverture du Formulaire :
Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 2000
End Sub
|
Une fois le Timer écoulé nous effectuerons un test sur le champ VerrouAdmin de la table tblAdmin,
si le test s'est bien déroulé nous fermerons le formulaire ouvert et ouvrirons le form Menu général, dans
le cas inverse Access lève une erreur que nous intercepterons :
On Error GoTo saut
Dim strTemp As String
Dim strChemin As String
Me.TimerInterval = 0
If DLookup("VerrouAdmin", "tblAdmin") = False Then
DoCmd.Close
DoCmd.OpenForm ("Menu général")
Exit Sub
End If
|
Sur erreur le code se dirigera vers l'étiquette Err_Form_timer, nous utilisons l'instruction Select Case sur
l'objet Err, ceci nous permettra d'intercepter l'erreur et d'écrire le code pour mettre à jour
les tables.
| N°Erreur |
Description |
| 3024 |
Access n'a pas trouvé la base principale |
| 3044 |
Le chemin n'est pas valide |
| 3043 |
Access n'arrive pas à se connecter au réseau |
| 3049 |
La base principale est corrompue |
| 3078 |
Table non trouvée dans la base principale |
Dans un premier temps nous allons demander à l'utilisateur si il veut mettre à jour les tables,
si il répond Oui on demandera de sélectionner le chemin de la base principale.
Ce qui nous donne ce code complet à mettre dans l'événement Sur minuterie du Formulaire
Démarrage.
Private Sub Form_Timer()
On Error GoTo Err_Form_timer
Dim strTemp As String
Dim strChemin As String
Me.TimerInterval = 0
If DLookup("VerrouAdmin", "tblAdmin") = False Then
DoCmd.Close
DoCmd.OpenForm ("Menu général")
Exit Sub
End If
Err_Form_timer:
Select Case Err.Number
Case 3024, 3044
If MsgBox("La connexion à la base principale à échouée, " & vbCrLf & _
"voulez-vous redéfinir les liaisons ?", vbYesNo + vbExclamation, "") = vbYes Then
annul:
strChemin = OuvrirUnFichier(Me.hWnd, "Parcourir", 1, "Fichiers Access", "mdb")
If Len(strChemin) <> 0 Then
If LierTables(strChemin) = True Then
DoCmd.Close
DoCmd.OpenForm ("Menu général")
Else
MsgBox "Mise à jour des Tables non éffectuées, " & vbCrLf & _
"veuillez contacter l'administrateur de la base.", vbCritical, "Liaisons des tables"
DoCmd.Quit
End If
Else
If MsgBox("Annulation par utilisateur." & vbCrLf & _
"Voulez-vous fermer l'application ?", vbYesNo + vbInformation, "Liaisons des tables") = vbYes Then
DoCmd.Quit
Else
GoTo annul
End If
End If
Else
DoCmd.Quit
End If
Case 3043
MsgBox "Il est impossible de se connecter au réseau," & vbCrLf & _
"veuillez contacter votre administrateur réseau.", vbCritical, "Erreur réseau"
Case 3049, 3428
MsgBox "La base principale est endommagée," & vbCrLf & _
"veuillez contacter l'administrateur de cette base.", vbCritical, "Base Principale endommagée"
Case Else
MsgBox "Erreur N°" & Err.Number & vbCrLf & Err.Description
End Select
End Sub
|
IX. Allez plus loin - Mise en Maintenance
IX-A. Cacher une Table.
Access permet de définir si la table peut être visible ou non dans la fenêtre Access.
Pour cela
effectuer un clic droit sur la table tblAdmin, puis sélectionnez Propriétés, dans la
fenêtre cocher la case Attributs : Masqué :
Vous pouvez remarquer que la table n'apparaît plus dans la fenêtre de la base de données, ceci ne veux
pas dire qu'elle a disparue elle juste devenue masquée.
Réalisez cette manipulation pour les tables tblAdmin et tblTablesAttachees.
IX-A-1. Comment enlever l'attribut Masqué d'une table ?
Très simple, il suffit de sélectionner dans le menu Outils -> Options -> onglet
Affichage -> cochez Objets masqués.
La table masquée réapparaît sous un icône légérement masqué afin de vous signaler que c'est une table masquée.
IX-B. Mode Maintenance de la base
Nous avons créé précédemment la table tblAdmin, nous allons nous en servir pour bloquer ou non une
nouvelle connexion. Ceci peut-être intéressant pour l'administrateur de la base pour éviter les connexions.
Nous allons juste modifier le code ci-dessus en ajoutant un Else dans le If de test avec DLookup :
If DLookup("VerrouAdmin", "tblAdmin") = False Then
DoCmd.Close
DoCmd.OpenForm ("Menu général")
Exit Sub
Else
MsgBox "La base de Données est actuellement en mode Maintenance.", vbInformation, "Maintenance de la base"
DoCmd.Quit
End If
|
IX-C. Création d'une base pour Administrer les bases Frontales/Dorsales
Créez une base de donnée Access que nous appelerons Administrateur.mdb. Cette base permettera de
connaître les personnes connectées à la base principale et de leur envoyer un message pour se déconnecter.
Nous vérrouillerons les connexions avec la table tblAdmin.
Dans la nouvelle base créer une nouvelle table que l'on nommera tblConnectes, ayant pour contenu
un seul champ connectes :
Créez ensuite un nouveau formulaire que l'on nommera frmConnectes, ce formulaire contient :
| Type de Contrôle |
Nom du Contrôle |
| Zone de texte |
txtChemin |
| Zone de liste |
lstConnectes |
| Case à cocher |
chScan |
| Bouton de commande |
cmdMAJConnectes |
| Bouton de commande |
cmdMessage |
La zone de liste lstConnectes a pour contenu tblConnectes.
IX-C-1. Lister les personnes connectées à la base principale
A partir de la version 97, Access crée en même temps que l'ouverture de la base un fichier ldb, ce
fichier regroupe les utilisateurs connectés à la base. Nous allons utiliser le code de la Faq
Afficher la liste des connectés à une BDD de
Morsi que
nous modifirons légérement.
Définition du type :
Private Type Un_Connecte
PC(1 To 32) As Byte
User(1 To 32) As Byte
End Type
|
Gestion des erreurs et déclarations des variables :
On Error GoTo Err_Pc_Connect
Dim intLDB As Integer, I As Integer
Dim strChemin As String
Dim Nom_PC As String
Dim utilisateur As Un_Connecte
Dim DB As Database
Dim strTemp As String
|
On inhibe les messages d'alertes puis on efface l'ensemble des données de la table
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblConnectes"
|
Dans un premier temps nous changeons l'extension dans le chemin renseigné de mdb on passe à ldb,
ensuite Freefile permet d'attribuer un numéro de fichier. On ouvre le fichier ldb.
strChemin = Left(strBdd, InStr(1, strBdd, ".")) + "LDB"
intLDB = FreeFile
Open strChemin For Binary Access Read Shared As intLDB
|
Parcours du fichier ldb et insertion des des utilisateurs connectés dans la table tblConnectes