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.
Le gestionnaire est relativement simple d'utilisation, il suffit de sélectionner les tables à mettre à jour puis de cliquer sur le bouton Ok.
Un message confirme si la mise à jour s'est bien effectué.
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.
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.
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
Pour Access 2007, la fonction d'import ou de liaison de tables se trouvent sous le même bouton, pour les liaisons sélectionnez l'option "Lier à la source de données en créant une table attachée"
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▲
Nous allons aborder dans ce chapitre la liaison des tables par VBA. Nous parlerons des objets DAO (Data Access Objects), un excellent tutoriel parle de DAO Définition et manipulation de données avec DAO écrit par Tofalu.
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 :
'Déclaration 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 :
'Instancie la base courrante
Set
dbBase =
CurrentDb
'charge la table dans le Recordset rst
Set
rst =
dbBase.OpenRecordset
(
"tblTablesAttachees"
, dbOpenDynaset)
Nous allons également inhiber les messages d'alertes :
'Inhibe les messages d'alertes
DoCmd.SetWarnings
False
Il faut vider la table tblTablesAttachees pour que l'on puisse la re-remplir avec les tables liées :
'Vide la Tables contenant la liste des tables attaché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.
'Boucle Parcourant toutes les tables de la Bdd en cours
For
Each
tbdTables In
dbBase.TableDefs
'Teste l'attribut de la table pour savoir si c'est une table liée
If
tbdTables.Attributes
And
dbAttachedTable Then
rst.AddNew
'Ajoute un enregistrements
rst!TablesAttachees =
tbdTables.Name
'Ajoute la table dans le Champs
rst.Update
'Mise à jour
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 :
'Mise à jour du Recordset après ajout des tables
rst.Requery
'Teste la position du pointeur si il ne se situe pas en début de table
If
Not
rst.BOF
Then
rst.MoveFirst
'déplacement du pointeur sur le premier enregistrement
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.
'Boucle parcours de la table tant que l'on arrive pas sur le dernier.
While
Not
rst.EOF
'Définition de l'objet TableDefs avec table stockées dans TablesAttachees
With
dbBase.TableDefs
(
rst!TablesAttachees.Value
)
'Redéfini la propriété connect de la table avec la nouvelle base
.Connect
=
";DATABASE="
&
strChmFichier
'Remet à jour la liaison de la table
.RefreshLink
End
With
'Efface l'enregistrement de la Table
rst.Delete
'Enregistrement suivant
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.
'Liberation des variables
dbBase.Close
Set
dbBase =
Nothing
Set
rst =
Nothing
'Re-active les messages d'alertes
DoCmd.SetWarnings
True
'Affiche Message
MsgBox
(
"mise à jour terminée"
)
'Renvoi la fonction à true
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
'---------------------------------------------------------------------------------------
' Procédure : Function ==> LierTables
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Permet de remettre les liaisons en fonction du chemin sélectionné
' Lien vers Faq : néant
'---------------------------------------------------------------------------------------
'
'Déclaration des variables
Dim
dbBase As
DAO.Database
Dim
tbdTables As
DAO.TableDef
Dim
rst As
DAO.Recordset
'Initialise le retour de la Fonction
LierTables =
False
'Instancie la base courrante
Set
dbBase =
CurrentDb
'charge la table dans le Recordset rst
Set
rst =
dbBase.OpenRecordset
(
"tblTablesAttachees"
, dbOpenDynaset)
'Inhibe les messages d'alertes
DoCmd.SetWarnings
False
'Vide la Tables contenant la liste des tables attachées
DoCmd.RunSQL
"DELETE * FROM tblTablesAttachees"
'Boucle Parcourant toutes les tables de la Bdd en cours
For
Each
tbdTables In
dbBase.TableDefs
'Teste l'attribut de la table pour savoir si c'est une table liée
If
tbdTables.Attributes
And
dbAttachedTable Then
rst.AddNew
'Ajoute un enregistrements
rst!TablesAttachees =
tbdTables.Name
'Ajoute la table dans le Champs
rst.Update
'Mise à jour
End
If
Next
tbdTables
'Mise à jour du Recordset après ajout des tables
rst.Requery
'Test la position du pointeur si il ne se situe pas en début de table
If
Not
rst.BOF
Then
rst.MoveFirst
'déplacement du pointeur sur le premier enregistrement
End
If
'Boucle parcours de la table tant que l'on arrive pas sur le dernier.
While
Not
rst.EOF
'Définition de l'objet TableDefs avec table stockées dans TablesAttachees
With
dbBase.TableDefs
(
rst!TablesAttachees.Value
)
'Redéfini la propriété connect de la table avec la nouvelle base
.Connect
=
";DATABASE="
&
strChmFichier
'Remet à jour la liaison de la table
.RefreshLink
End
With
'Efface l'enregistrement de la Table
rst.Delete
'Enregistrement suivant
rst.MoveNext
Wend
'Liberation des variables
dbBase.Close
Set
dbBase =
Nothing
Set
rst =
Nothing
'Re-active les messages d'alertes
DoCmd.SetWarnings
True
'Affiche Message
MsgBox
(
"mise à jour terminée"
)
'Renvoi la fonction à true
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 loufabLe 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
)
'Init du timer, base de temps en milisecondes
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
'Déclaration variable
Dim
strTemp As
String
Dim
strChemin As
String
'arrêt d timer
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 |
Nous nous servirons du code la Faq => Afficher la boîte de dialogue ouvrir afin de récupérer le nom et le chemin du fichier sélectionné, pour afficher la fenêtre d'exploration permettant de selectionner la base principale et d'en récupérer son chemin pour mettre les liaisons à jour. Pour cela ouvrez un nouveau module et copier le code la Faq dedans.
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
(
)
'---------------------------------------------------------------------------------------
' Procédure : Sub ==> Form_Timer
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Permet de contrôler et de proposer les mise à jour des tables
' Lien vers Faq : néant
'---------------------------------------------------------------------------------------
'
On
Error
GoTo
Err_Form_timer
'Déclaration variable
Dim
strTemp As
String
Dim
strChemin As
String
'arrêt d timer
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
'Erreur lévée si Access ne trouve pas la base Principale ou le chemin n'est pas valide
If
MsgBox
(
"La connexion à la base principale à échouée, "
&
vbCrLf
&
_
"voulez-vous redéfinir les liaisons ?"
, vbYesNo
+
vbExclamation
, ""
) =
vbYes
Then
annul
:
'Ouverture de la fenêtre Windows et stockage du chemin dans la variable
strChemin =
OuvrirUnFichier
(
Me.hWnd
, "Parcourir"
, 1
, "Fichiers Access"
, "mdb"
)
'Test si présence de caractères dans la variable au cas où l'utilisateur annule
If
Len
(
strChemin) <>
0
Then
'Appel Fonction de Liaison table avce le chemin en paramètre et test retour de la fonction
If
LierTables
(
strChemin) =
True
Then
DoCmd.Close
'Code si la fonction c'est réalisée sans encombre
DoCmd.OpenForm
(
"Menu général"
)
Else
'Message si la fonction n'a pas renvoyer le True
MsgBox
"Mise à jour des Tables non éffectuées, "
&
vbCrLf
&
_
"veuillez contacter l'administrateur de la base."
, vbCritical
, "Liaisons des tables"
'Fermeture de l'application
DoCmd.Quit
End
If
Else
'Message si l'utilisateur à annuler la sélection du chemin
If
MsgBox
(
"Annulation par utilisateur."
&
vbCrLf
&
_
"Voulez-vous fermer l'application ?"
, vbYesNo
+
vbInformation
, "Liaisons des tables"
) =
vbYes
Then
'Fermeture de l'application
DoCmd.Quit
Else
'retour début proécédure d'appel des fonctions
GoTo
annul
End
If
End
If
Else
'Fermeture de l'application
DoCmd.Quit
End
If
Case
3043
'Erreur levée si Access n'arrive ps à se connecter au réseau
MsgBox
"Il est impossible de se connecter au réseau,"
&
vbCrLf
&
_
"veuillez contacter votre administrateur réseau."
, vbCritical
, "Erreur réseau"
Case
3049
, 3428
'Base Principale corrompue
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.
Pour Access 2007, il vous faut aller dans le menu Office puis Options Access -> Onglet : Base de données active.
Cliquez sur le bouton Options de navigation...
Cette fenêtre est également disponible en réalisant un clic droit sur le haut du volet de navigation.
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 :
Nom | Type |
---|---|
connectes | Texte |
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
' --nom PC
PC
(
1
To
32
) As
Byte
' --nom utilisateur
User
(
1
To
32
) As
Byte
End
Type
Gestion des erreurs et déclarations des variables :
On
Error
GoTo
Err_Pc_Connect
'Déclarations des variables
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
'Inhibe les messages d'erreurs
DoCmd.SetWarnings
False
'Vide la Tables contenant la liste des pc connectés
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.
'Change l'extension du chemin par ldb au lieu de mdb
strChemin =
Left
(
strBdd, InStr
(
1
, strBdd, "."
)) +
"LDB"
'Designe le numéro pour le fichier
intLDB =
FreeFile
'Ouvre le fichier ldb
Open strChemin For
Binary Access Read Shared As
intLDB
Parcours du fichier ldb et insertion des des utilisateurs connectés dans la table tblConnectes
'Boucle permettant de lire l'ensemble du fichier ldb
Do
While
Not
EOF
(
intLDB)
'Chaque enregistrement lu est placé dans la variable utilisateur pour y être inésrée dans un table.
Get
intLDB, , utilisateur
With
utilisateur
i =
1
Nom_PC =
""
'nom du PC
While
.PC
(
i) <>
0
Nom_PC =
Nom_PC &
Chr
(
.PC
(
i))
i =
i +
1
Wend
End
With
'Contrôle si chaîne supérieur à 0 caractères et insertion valeur dans tables
If
Len
(
Nom_PC) >
0
Then
DoCmd.RunSQL
(
"INSERT INTO tblConnectes (connectes) VALUES('"
&
Nom_PC &
"');"
)
DoCmd.SetWarnings
True
End
If
Loop
Fermeture du fichier ldb et on sort de la fonction. Sur erreur nous fermons le fichier ldb.
'Fermeture du fichier ldb
Close intLDB
Exit
Function
Err_Pc_Connect
:
MsgBox
Err
.Number
&
vbCrLf
&
Err
.Description
, vbInformation
, "Erreur"
Close intLDB
Voici le module mdlConnectés :
'---------------------------------------------------------------------------------------
' Projet : Administrateur
' Procedure : Module ==> mdlConnectés
' Date : 30/01/2007
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Permet de lire le fichier ldb pour récupérer les pc connectés
'---------------------------------------------------------------------------------------
'
Option
Compare Database
Private
Type
Un_Connecte
' --nom PC
PC
(
1
To
32
) As
Byte
End
Type
Public
Function
Pc_Connect
(
strBdd As
String
)
'---------------------------------------------------------------------------------------
' Procédure : Function ==> Pc_Connect
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Lecture fichier ldb de la bdd principale
' Lien vers Faq : http://access.developpez.com/faq/?page=TAAdmin#liste
'---------------------------------------------------------------------------------------
'
On
Error
GoTo
Err_Pc_Connect
'Déclarations des variables
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
'Inhibe les messages d'erreurs
DoCmd.SetWarnings
False
'Vide la Tables contenant la liste des pc connectés
DoCmd.RunSQL
"DELETE * FROM tblConnectes"
'Change l'extension du chemin par ldb au lieu de mdb
strChemin =
Left
(
strBdd, InStr
(
1
, strBdd, "."
)) +
"LDB"
'Designe le numéro pour le fichier
intLDB =
FreeFile
'Ouvre le fichier ldb
Open strChemin For
Binary Access Read Shared As
intLDB
'Boucle permettant de lire l'ensemble du fichier ldb
Do
While
Not
EOF
(
intLDB)
'Chaque enregistrement lu est placé dans la variable utilisateur pour y être inésrée dans un table.
Get
intLDB, , utilisateur
With
utilisateur
i =
1
Nom_PC =
""
'nom du PC
While
.PC
(
i) <>
0
Nom_PC =
Nom_PC &
Chr
(
.PC
(
i))
i =
i +
1
Wend
End
With
'Contrôle si chaîne supérieur à 0 caractères et insertion valeur dans tables
If
Len
(
Nom_PC) >
0
Then
DoCmd.RunSQL
(
"INSERT INTO tblConnectes (connectes) VALUES('"
&
Nom_PC &
"');"
)
DoCmd.SetWarnings
True
End
If
Loop
'Fermeture du fichier ldb
Close intLDB
Exit
Function
Err_Pc_Connect
:
MsgBox
Err
.Number
&
vbCrLf
&
Err
.Description
, vbInformation
, "Erreur"
Close intLDB
End
Function
IX-C-2. Formulaire de consultation des personnes connectées▲
Nous avons créé plus haut dans ce chapitre le formulaire frmConnectes, ensuite dans la partie précédente nous avons créé un code permettant d'alimenter la table avec les personnes connectées à la base sélectionnée.
Le but étant de rafraichir la zone de liste ayant pour source la table tblConnectes. Pour cela il faut dans un premier temps sélectionner la base à surveiller, nous allons utiliser le même code que le chapitre 8 pour ouvrir la fenêtre d'exploration permettant de sélectionner une base. Code disponible dans la Faq => Afficher la boîte de dialogue ouvrir afin de récupérer le nom et le chemin du fichier sélectionné. Il nous suffira de sélectionner si on veut surveiller les personnes connectées toutes les secondes ou juste une lecture seul du fichier ldb.
Ouverture de la fenêtre d'exploration sur le bouton cmdParcourir sur l'évenement sur clic :
'---------------------------------------------------------------------------------------
' Procédure : Sub ==> cmdParcourir_Click
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Permet d'ouvrir la fenêtre d'exploration windows
' Lien vers Faq : http://access.developpez.com/faq/?page=CheminsRep#AffBoitDialog
'---------------------------------------------------------------------------------------
'
Me.txtChemin
=
OuvrirUnFichier
(
Me.Hwnd
, "Sélectionner la base Access"
, 1
, "Bdd Access"
, "mdb"
)
Lancement de la lecture du fichier ldb :
Contrôle dans un premier temps si présence d'un chemin dans la zone de texte, ensuite teste la
valeur de la case à cocher pour lancement ou non du timer. Appel de la fonction pour lire le ldb.
Dans la gestion de l'erreur si l'utilisateur clic sur le bouton lancement du scan sans avoir renseigné de
base, la fenêtre d'exploration s'ouvre.
'---------------------------------------------------------------------------------------
' Procédure : Sub ==> cmdMAJConnectes_Click
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Lance la lecture du fichier ldb de la base principale
' Lien vers Faq : ******
'---------------------------------------------------------------------------------------
'
On
Error
GoTo
Err_cmdMAJConnectes
'Test si présence d'un fichier dans la zone de texte
If
Dir
(
Me.txtChemin
, vbHidden) <>
""
Then
'Test la case à cocher si cohée
If
Me.chScan
=
True
Then
'Lancement du timer
Me.TimerInterval
=
1000
Else
'Lance la fonction de lecture ldb
Call
Pc_Connect
(
Me.txtChemin
)
'Rafraichit la liste
Me.lstConnectes.Requery
End
If
Else
MsgBox
"Chemin non conforme."
, vbExclamation
, "Sélectionner base"
End
If
Exit
Sub
Err_cmdMAJConnectes
:
Select
Case
Err
Case
13
MsgBox
"Veuillez saisir un chemin dans la fenêtre"
Call
cmdParcourir_Click
Exit
Sub
Case
Else
MsgBox
"N° "
&
Err
.Number
&
vbclrf &
Err
.Description
End
Select
Si la case à cocher "Scan toutes les secondes" a été cochée, dans le code précedent nous avons lancé
le timer, maintenant il faut lancer la lecture du fichier ldb sur l'événement sur Timer :
Nous contrôlons la case tant qu'elle est cochée nous exécutons le code toutes les secondes, si la case
n'est plus cochée on arrête le timer et de ce fait la lecture du fichier ldb.
'---------------------------------------------------------------------------------------
' Procédure : Sub ==> Form_Timer
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Appel fonction sur le timer (1s)
' Lien vers Faq : *******
'---------------------------------------------------------------------------------------
'
'Contrôle si la case est toujours cochée
If
Me.chScan
=
True
Then
'Lance la fonction de lecture ldb
Call
Pc_Connect
(
Me.txtChemin
)
'Rafraichis la liste
Me.lstConnectes.Requery
Else
'Arrêt du timer
Me.TimerInterval
=
0
End
If
IX-C-3. Envoi d'un message aux personnes connectées▲
Nous allons maintenant envoyer un message par la fonction NetSend.
Pour cela nous allons utiliser le code de cafeine disponible sur le Forum Access. Créez un nouveau module et coller le code suivant à l'interieur.
'---------------------------------------------------------------------------------------
' Projet : Administrateur
' Procedure : Module ==> mdlNetSend
' Date : 30/01/2007
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Issu du code de cafeine disponible sur le Forum Access de www.developpez.com
' url de Forum : http://www.developpez.net/forums/forumdisplay.php?f=45
'---------------------------------------------------------------------------------------
'
Option
Compare Database
Private
Declare
Function
NetMessageBufferSend Lib
"netapi32.dll"
_
(
ByVal
servername As
String
, ByVal
msgname As
String
, ByVal
fromname As
String
, _
ByVal
Buffer As
String
, ByVal
BufSize As
Long
) As
Long
Public
Function
NetSendMessage
(
ByVal
sSendTo As
String
, ByVal
sMessage As
String
) As
Long
'convert ANSI strings to UNICODE
sSendTo =
StrConv
(
sSendTo, vbUnicode)
sMessage =
StrConv
(
sMessage, vbUnicode)
'Send a network message to a remote computer
NetSendMessage =
NetMessageBufferSend
(
vbNullString
, sSendTo, vbNullString
, _
sMessage, Len
(
sMessage))
End
Function
Nous allons maintenant appeler cette Fonction du formulaire frmConnectes sur clic du bouton
cmdMessage :
Dans un premier temps nous contrôlons si vous avez sélectionné un Pc dans la liste, ensuite nous
demandons quel message à afficher et nous appelons la fonction NetSendMessage.
'---------------------------------------------------------------------------------------
' Procédure : Sub ==> cmdMessage_Click
' Auteur : Dolphy http://dolphy35.developpez.com/
' Commentaires : Contrôle et envoi un message par NetSend
' Lien vers Faq : ******
'---------------------------------------------------------------------------------------
'
'Déclaration variables
Dim
strReponse As
String
'Test si sélection dans la lise
If
Not
IsNull
(
Me.lstConnectes
) Then
'Affiche un inputbox pour texte du message
strReponse =
InputBox
(
"Veuillez saisir votre message, "
&
vbCrLf
&
"pour envoyer à "
&
Me.lstConnectes
, "Envoi Message"
)
'Contrôle si l'utilisateur à bien mis un message ou annulé
If
Len
(
strReponse) >
0
Then
'Appel Fonction pour envoi du message par NetSend
Call
NetSendMessage
(
Me.lstConnectes
, strReponse)
Else
'Affiche un message si la chaîne est vide
MsgBox
"Soit la chaîne est vide, "
&
vbCrLf
&
" soit l'opération a été annulée par l'utilisateur."
, _
vbInformation
, "Annulation"
End
If
Else
'affiche un message si aucune sélection dans la liste
MsgBox
"Veuillez selectionner un Pc dans la liste."
, vbExclamation
, "Sélection"
End
If
X. Conclusion▲
Vous disposez maintenant d'exemples concret pour mettre une base muti-utilisateurs en réseau, à vous d'adapter à votre besoin et d'y ajouter d'autres outils.
XI. Remerciements▲
Merci à Tofalu,
Heureux-oli,
Lou Pitchoun
et Arkham46
pour leurs temps consacré à la lecture et correction.
Nono40 pour son excellent outil.
A www.developpez.com pour leur hébergement.