You are on page 1of 34

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 d'installationOffice\Samples
II. Principe des bases frontales/dorsales

aller

chercher

dans

le

rpertoire

C'est le principe du Client / Serveur, d'un ct les donnes et de l'autre l'interface utilisateurs ou IHM. Base Dorsale : Base ne contenant que les tables. Gnralement la base Dorsale est place sur un Serveur connect un rseau. Base Frontale : Base contenant tous les Formulaires, les Requtes, les Etats et les Macros. Cette base est place sur les postes utilisateurs, elle aussi connecte au mme rseau.
III. Scinder une base

Access possde un outil trs ludique permettant de scinder une base. Pour utiliser l'assistant il faut slectionner Fractionner une base de donnesdu menu outils

Access 2003

Access 2007 Une fentre s'ouvre vous expliquant ce que va faire Access, c'est dire dplacer les tables vers une base principale et les lier vers la base Frontale qui sera votre base actuelle. Slectionnez Fractionner la base de donnes.

Une fentre d'exploration s'ouvre vous demandant de renseigner le chemin o sera cre la base principale.

Aprs avoir cliqu sur Fractionner, l'assistant effectue la cration de la base principale et lie les tables, un message vous signale la bonne ralisation du travail de l'assistant.

Dans la fentre de base de donnes nous pouvons voir ceci maintenant :

La liaison au niveau des tables est reprsente par une flche situe devant la table, ceci veut dire que cette table est lie une autre base de donne. La base dorsale ne contient que les tables partages. Les tables temporaires doivent tre situes sur la base frontale pour viter tout conflit et garantir la version des donnes enregistres temporairement.
IV. Lier les tables manuellement

Nous venons de scinder une base Access sur le principe de frontale/dorsale, ceci prsente un gros dfaut : sa portabilit. Si pour une raison quelconque vous avez besoin de dplacer une ou les bases, toutes les liaisons ne seront plus conformes. Access possde une fonction permettant de redfinir les liaisons manuellement. Le gestionnaire de tables lies (ou gestionnaire d'attaches) permet de changer le chemin de la liaison entre la Frontale et la Dorsale.

Gestionnaire de tables lies (ou Gestionnaire d'attaches) - Access 2003

Gestionnaire de tables lies (ou Gestionnaire d'attaches) - Access 2007

Fentre du gestionnaire d'attaches Le gestionnaire est relativement simple d'utilisation, il suffit de slectionner les tables

mettre jour puis de cliquer sur le bouton Ok.

Fentre 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 dplace, une fentre d'exploration permettant de renseigner le nouveau chemin s'ouvre. Elle permet de slectionner 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 fentre d'exploration pour renseigner le chemin de la base Dorsale.

Slection 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 recrer. En faisant cela nous venons juste d'effacer la liaison entre les deux bases. Pour recrer cette liaison nous allons ouvrir lafentre d'attaches des tables. Slectionnez Lier les tables du menu Fichier

Access 2003

Access 2007 Pour Access 2007, la fonction d'import ou de liaison de tables se trouvent sous le mme bouton, pour les liaisons slectionnez l'option "Lier la source de donnes en crant une table attache"

Access 2007 Une fentre d'exploration s'ouvre vous demandant de slectionner la base o se situe la table lier

Aprs avoir slectionn la base o se situe la table et cliqu sur Attacher, la fentre d'attache s'ouvre il nous reste plus qu' slectionner la tableMessagers et cliquer sur OK

VI. Tables non lies de la frontale

Il se peut que vous ayez besoin de crer une table temporaire, comme expliqu plus haut ces tables ne doivent pas tre lies mais intgre la base Frontale. Nous allons maintenant crer une table. Cette table permettra de stocker toutes les tables lies de la base frontale. Nous utiliserons cette table dans le prochain chapitre. Crer une nouvelle table que l'on appellera tblTablesAttachees, celle-ci ne comportera qu'un champ :

Nom

Type

TableAttachees
VII. Lier les Tables en VBA VII-A. Fonction permettant de mettre jour les liaisons

Texte

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 Dfinition et manipulation de donnes avec DAO crit par Tofalu. Pour ce code il est ncessaire de cocher la rfrence Microsoft DAO 3.x Object Library. Dans un premier temps nous allons crer un code permettant de connatre les tables qui sont lies, nous allons ensuite ajouter chaque table lie 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. Dclarations des variables :
Slectionnez

'Dclaration 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 tabletblTablesAttachees dans un Recordset :
Slectionnez

'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 :


Slectionnez

'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 lies :
Slectionnez

'Vide la Tables contenant la liste des tables attaches 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 lies dans tblTablesAttachees. Pour cela nous testons l'attribut de la table qui permet de dire si celle-ci est lie ou non =>dbAttachedTable. Pourquoi cette table ? C'est trs simple, au lieu de lier toutes les tables, nous ne lierons que celles qui l'taient.
Slectionnez

'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 lie 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 :
Slectionnez

'Mise jour du Recordset aprs ajout des tables rst.Requery 'Teste la position du pointeur si il ne se situe pas en dbut de table If Not rst.BOF Then rst.MoveFirst 'dplacement du pointeur sur le premier enregistrement End If

Maintenant mettons jour les liaisons des tables contenues dans la tablestblTablesAttachees, pour cela on ralise une boucle qui tourne tant que nous sommes pas arriv au dernier enregistrement. Nous dfinissons l'objet TableDefs en fonction de la table stocke dans tblTablesAttachees. En utilisant la proprits Connect nous redfinissons le nouveau chemin de la liaison. La proprit RefreshLink permet de mettre jour la liaison. On efface l'enregistrement en cours dans la table tblTablesAttachees ceci pour avoir une traabilit, prenons le cas o la procdure rencontre un problme l'administrateur de la base pourra connatre les tables qui n'ont pas t lies.
Slectionnez

'Boucle parcours de la table tant que l'on arrive pas sur le dernier. While Not rst.EOF 'Dfinition de l'objet TableDefs avec table stockes dans TablesAttachees

With dbBase.TableDefs(rst!TablesAttachees.Value) 'Redfini la proprit 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 librons les variables. On ractive les messages d'alertes. On affiche un message comme quoi tout c'est bien droul et on renvoi la fonction avec True.
Slectionnez

'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 termine") 'Renvoi la fonction true LierTables = True

Voici la fonction complte ayant comme paramtre le chemin de la nouvelle base principale et qui renvoie une valeur de type Boolean.
Slectionnez

Function LierTables(strChmFichier As String) As Boolean '-------------------------------------------------------------------------------------' Procdure : Function ==> LierTables ' Auteur : Dolphy http://dolphy35.developpez.com/ ' Commentaires : Permet de remettre les liaisons en fonction du chemin slectionn ' Lien vers Faq : nant '-------------------------------------------------------------------------------------' 'Dclaration 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 attaches 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 lie 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 aprs ajout des tables rst.Requery 'Test la position du pointeur si il ne se situe pas en dbut de table If Not rst.BOF Then rst.MoveFirst 'dplacement 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 'Dfinition de l'objet TableDefs avec table stockes dans TablesAttachees With dbBase.TableDefs(rst!TablesAttachees.Value) 'Redfini la proprit 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 termine") 'Renvoi la fonction true LierTables = True End Function
VIII. Ouverture de la base Frontale avec test des liaisons

Pour ce paragraphe il nous faut crer 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 dmarrage de la base Comptoir : Dmarrage qui est sur le principe du Splash-Screen, pour plus d'info je renvoie vers le tutoriel de loufabLe SplashScreen 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 cration, pointez en dehors de la zone dtail et effectuez un clic droit puis slectionnez Proprits.

Dans l'onglet Evnements, effacez les appels des lignes Sur ouverture et Sur fermeture.

Cliquez sur les trois points situs au bout du champ l'ouverture du Formulaire.

pour mettre le code qui sera excut

Nous allons maintenant supprimer le bouton ok et la case cocher.

Maintenant parlons code : Nous initialiserons le Timer l'ouverture du Formulaire :


Slectionnez

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 tabletblAdmin, si le test s'est bien droul nous fermerons le formulaire ouvert et ouvrirons le formMenu gnral, dans le cas inverse Access lve une erreur que nous intercepterons :
Slectionnez

On Error GoTo saut 'Dclaration variable Dim strTemp As String Dim strChemin As String 'arrt d timer

Me.TimerInterval = 0 If DLookup("VerrouAdmin", "tblAdmin") = False Then DoCmd.Close DoCmd.OpenForm ("Menu gnral") Exit Sub End If

Sur erreur le code se dirigera vers l'tiquette Err_Form_timer, nous utilisons l'instructionSelect Case sur l'objet Err, ceci nous permettra d'intercepter l'erreur et d'crire le code pour mettre jour les tables.
NErreur Description

3024 3044 3043 3049 3078

Access n'a pas trouv la base principale Le chemin n'est pas valide Access n'arrive pas se connecter au rseau La base principale est corrompue Table non trouve dans la base principale

Nous nous servirons du code la Faq => Afficher la bote de dialogue ouvrir afin de rcuprer le nom et le chemin du fichier slectionn, pour afficher la fentre d'exploration permettant de selectionner la base principale et d'en rcuprer 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 rpond Oui on demandera de slectionner le chemin de la base principale. Ce qui nous donne ce code complet mettre dans l'vnement Sur minuterie du FormulaireDmarrage.
Slectionnez

Private Sub Form_Timer() '-------------------------------------------------------------------------------------' Procdure : Sub ==> Form_Timer ' Auteur : Dolphy http://dolphy35.developpez.com/ ' Commentaires : Permet de contrler et de proposer les mise jour des tables ' Lien vers Faq : nant '-------------------------------------------------------------------------------------' On Error GoTo Err_Form_timer 'Dclaration variable

Dim strTemp As String Dim strChemin As String 'arrt d timer Me.TimerInterval = 0 If DLookup("VerrouAdmin", "tblAdmin") = False Then DoCmd.Close DoCmd.OpenForm ("Menu gnral") Exit Sub End If Err_Form_timer: Select Case Err.Number Case 3024, 3044 'Erreur lve si Access ne trouve pas la base Principale ou le chemin n'est pas valide If MsgBox("La connexion la base principale choue, " & vbCrLf & _ "voulez-vous redfinir les liaisons ?", vbYesNo + vbExclamation, "") = vbYes Then annul: 'Ouverture de la fentre Windows et stockage du chemin dans la variable strChemin = OuvrirUnFichier(Me.hWnd, "Parcourir", 1, "Fichiers Access", "mdb") 'Test si prsence de caractres dans la variable au cas o l'utilisateur annule If Len(strChemin) <> 0 Then 'Appel Fonction de Liaison table avce le chemin en paramtre et test retour de la fonction If LierTables(strChemin) = True Then DoCmd.Close 'Code si la fonction c'est ralise sans encombre DoCmd.OpenForm ("Menu gnral") Else 'Message si la fonction n'a pas renvoyer le True MsgBox "Mise jour des Tables non ffectues, " & 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 slection 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 dbut procdure d'appel des fonctions GoTo annul End If End If Else 'Fermeture de l'application DoCmd.Quit End If Case 3043 rseau MsgBox "Il est impossible de se connecter au rseau," & vbCrLf & _ "veuillez contacter votre administrateur rseau.", vbCritical, "Erreur rseau" Case 3049, 3428 'Base Principale corrompue 'Erreur leve si Access n'arrive ps se connecter au

MsgBox "La base principale est endommage," & vbCrLf & _ "veuillez contacter l'administrateur de cette base.", vbCritical, "Base Principale endommage" 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 dfinir si la table peut tre visible ou non dans la fentre Access. Pour cela effectuer un clic droit sur la table tblAdmin, puis slectionnez Proprits, dans la fentre cocher la case Attributs : Masqu :

Vous pouvez remarquer que la table n'apparat plus dans la fentre de la base de donnes, ceci ne veux pas dire qu'elle a disparue elle juste devenue masque. Ralisez cette manipulation pour les tables tblAdmin et tblTablesAttachees.
IX-A-1. Comment enlever l'attribut Masqu d'une table ?

Trs simple, il suffit de slectionner dans le menu Outils -> Options -> ongletAffichage -> cochez Objets masqus.

Access 2003 Pour Access 2007, il vous faut aller dans le menu Office puis Options Access -> Onglet : Base de donnes active. Cliquez sur le bouton Options de navigation...

Access 2007

Access 2007 Cette fentre est galement disponible en ralisant un clic droit sur le haut du volet de navigation.

Access 2007 La table masque rapparat sous un icne lgrement masqu afin de vous signaler que c'est une table masque.
IX-B. Mode Maintenance de la base

Nous avons cr prcdemment la table tblAdmin, nous allons nous en servir pour bloquer ou non une nouvelle connexion. Ceci peut-tre intressant 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 avecDLookup :
Slectionnez

If DLookup("VerrouAdmin", "tblAdmin") = False Then DoCmd.Close DoCmd.OpenForm ("Menu gnral") Exit Sub Else MsgBox "La base de Donnes est actuellement en mode Maintenance.", vbInformation, "Maintenance de la base" DoCmd.Quit End If
IX-C. Cration d'une base pour Administrer les bases Frontales/Dorsales

Crez une base de donne Access que nous appelerons Administrateur.mdb. Cette base permettera de connatre les personnes connectes la base principale et de leur envoyer un message pour se dconnecter. Nous vrrouillerons les connexions avec la tabletblAdmin. Dans la nouvelle base crer une nouvelle table que l'on nommera tblConnectes, ayant pour contenu un seul champ connectes :
Nom Type

connectes

Texte

Crez ensuite un nouveau formulaire que l'on nommera frmConnectes, ce formulaire contient :
Type de Contrle Nom du Contrle

Zone de texte Zone de liste Case cocher Bouton de commande Bouton de commande

txtChemin lstConnectes chScan cmdMAJConnectes cmdMessage

La zone de liste lstConnectes a pour contenu tblConnectes.


IX-C-1. Lister les personnes connectes la base principale

A partir de la version 97, Access cre en mme temps que l'ouverture de la base un fichier ldb, ce fichier regroupe les utilisateurs connects la base. Nous allons utiliser le code de la Faq Afficher la liste des connects une BDD de Morsi que nous modifirons lgrement. Dfinition du type :
Slectionnez

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 dclarations des variables :


Slectionnez

On Error GoTo Err_Pc_Connect 'Dclarations 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 donnes de la table
Slectionnez

'Inhibe les messages d'erreurs DoCmd.SetWarnings False 'Vide la Tables contenant la liste des pc connects DoCmd.RunSQL "DELETE * FROM tblConnectes"

Dans un premier temps nous changeons l'extension dans le chemin renseign de mdbon passe ldb, ensuite Freefile permet d'attribuer un numro de fichier. On ouvre le fichier ldb.
Slectionnez

'Change l'extension du chemin par ldb au lieu de mdb strChemin = Left(strBdd, InStr(1, strBdd, ".")) + "LDB" 'Designe le numro 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 connects dans la tabletblConnectes

Slectionnez

'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 insre 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 'Contrle si chane suprieur 0 caractres 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.
Slectionnez

'Fermeture du fichier ldb Close intLDB Exit Function Err_Pc_Connect: MsgBox Err.Number & vbCrLf & Err.Description, vbInformation, "Erreur" Close intLDB

Voici le module mdlConnects :


Slectionnez

'-------------------------------------------------------------------------------------' Projet : Administrateur ' Procedure : Module ==> mdlConnects ' Date : 30/01/2007 ' Auteur : Dolphy http://dolphy35.developpez.com/ ' Commentaires : Permet de lire le fichier ldb pour rcuprer les pc connects '-------------------------------------------------------------------------------------' Option Compare Database

Private Type Un_Connecte ' --nom PC PC(1 To 32) As Byte End Type Public Function Pc_Connect(strBdd As String) '-------------------------------------------------------------------------------------' Procdure : 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 'Dclarations 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 connects 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 numro 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 insre 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 'Contrle si chane suprieur 0 caractres 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 connectes

Nous avons cr plus haut dans ce chapitre le formulaire frmConnectes, ensuite dans la partie prcdente nous avons cr un code permettant d'alimenter la table avec les personnes connectes la base slectionne. Le but tant de rafraichir la zone de liste ayant pour source la table tblConnectes. Pour cela il faut dans un premier temps slectionner la base surveiller, nous allons utiliser le mme code que le chapitre 8 pour ouvrir la fentre d'exploration permettant de slectionner une base. Code disponible dans la Faq => Afficher la bote de dialogue ouvrir afin de rcuprer le nom et le chemin du fichier slectionn. Il nous suffira de slectionner si on veut surveiller les personnes connectes toutes les secondes ou juste une lecture seul du fichier ldb. Ouverture de la fentre d'exploration sur le bouton cmdParcourir sur l'venement sur clic :
Slectionnez

'-------------------------------------------------------------------------------------' Procdure : Sub ==> cmdParcourir_Click ' Auteur : Dolphy http://dolphy35.developpez.com/ ' Commentaires : Permet d'ouvrir la fentre d'exploration windows ' Lien vers Faq : http://access.developpez.com/faq/?page=CheminsRep#AffBoitDialog '-------------------------------------------------------------------------------------' Me.txtChemin = OuvrirUnFichier(Me.Hwnd, "Slectionner la base Access", 1, "Bdd Access", "mdb")

Lancement de la lecture du fichier ldb : Contrle dans un premier temps si prsence 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 fentre d'exploration s'ouvre.

Slectionnez

'-------------------------------------------------------------------------------------' Procdure : 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 prsence d'un fichier dans la zone de texte If Dir(Me.txtChemin, vbHidden) <> "" Then 'Test la case cocher si cohe 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, "Slectionner base" End If Exit Sub Err_cmdMAJConnectes: Select Case Err Case 13 MsgBox "Veuillez saisir un chemin dans la fentre" 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 coche, dans le code prcedent nous avons lanc le timer, maintenant il faut lancer la lecture du fichierldb sur l'vnement sur Timer : Nous contrlons la case tant qu'elle est coche nous excutons le code toutes les secondes, si la case n'est plus coche on arrte le timer et de ce fait la lecture du fichier ldb.
Slectionnez

'-------------------------------------------------------------------------------------' Procdure : Sub ==> Form_Timer ' Auteur : Dolphy http://dolphy35.developpez.com/ ' Commentaires : Appel fonction sur le timer (1s) ' Lien vers Faq : ******* '--------------------------------------------------------------------------------------

' 'Contrle si la case est toujours coche If Me.chScan = True Then 'Lance la fonction de lecture ldb Call Pc_Connect(Me.txtChemin) 'Rafraichis la liste Me.lstConnectes.Requery Else 'Arrt du timer Me.TimerInterval = 0 End If
IX-C-3. Envoi d'un message aux personnes connectes

Nous allons maintenant envoyer un message par la fonction NetSend. Pour cela nous allons utiliser le code de cafeine disponible sur le Forum Access. Crez un nouveau module et coller le code suivant l'interieur.
Slectionnez

'-------------------------------------------------------------------------------------' 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 contrlons si vous avez slectionn un Pc dans la liste, ensuite nous demandons quel message afficher et nous appelons la fonctionNetSendMessage.

Slectionnez

'-------------------------------------------------------------------------------------' Procdure : Sub ==> cmdMessage_Click ' Auteur : Dolphy http://dolphy35.developpez.com/ ' Commentaires : Contrle et envoi un message par NetSend ' Lien vers Faq : ****** '-------------------------------------------------------------------------------------' 'Dclaration variables Dim strReponse As String 'Test si slection 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") 'Contrle 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 chane est vide MsgBox "Soit la chane est vide, " & vbCrLf & " soit l'opration a t annule par l'utilisateur.", _ vbInformation, "Annulation" End If Else 'affiche un message si aucune slection dans la liste MsgBox "Veuillez selectionner un Pc dans la liste.", vbExclamation, "Slection" End If
X. Conclusion

Vous disposez maintenant d'exemples concret pour mettre une base muti-utilisateurs en rseau, vous d'adapter votre besoin et d'y ajouter d'autres outils.
Bases exemple du tutoriel

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 hbergement.