Le formulaire login/mot de passe permettra à un utilisateur de s'identifier et à la base de le reconnaître et en décider de lui donner
ou non la permission d'y accéder à la base. Pour ce fait, on aura besoin d'une table T_User et d'un formulaire " F_Connexion "
Table T_User (TRIGRAMME, NOM, PRENOM, GROUPE, PASWD) tous les champs sont de type texte. Un enregistrement exemple
de cette table : T_User(SED, SEBASTIEN, DULOT, Administrateur, root)
L'évènement on_click du bouton Connexion :
PrivateSub connexion_Click()
Me.Requery
Dim sql, User_id, User_groupe AsStringDim rs AsDAO.RecordsetStatic i AsByte
sql = "SELECT * FROM T_USERS WHERE TRIGRAMME = '" & Me.txt_user & "' AND PASSWD =''"& Me.txt_pass & "';"Set rs = CurrentDb.OpenRecordset(sql)
IfNot rs.EOFThenDoCmd.OpenForm"F_Autre_Formulaire", acNormal, , , , acWindowNormal
DoCmd.close acForm, "F_CONNEXION"
User_id = rs("TRIGRAMME").value
User_groupe = rs("GROUPE").value
ElseMsgBox"(Identifiant, Mot de Passe) incorrect ", vbInformation, "Connexion"
i = i + 1
EndIf
If i = 3 Then
Msgbox "Vous avez dépassé le nombre de tentatives autorisés", vbCritical
DoCmd.Quit
EndIfEndSub
Cette méthode permet d'éviter le lancement de la même base plusieurs fois en locale.
Pour lancer le test vous pouvez soit créer une macro autoexec, soit créer un formulaire de démarrage soit <F_Démarrage> et qui vérifie
si la base est déjà ouverte :
' -- Evenement sur ouverture du formulaire
PrivateSub Form_Open(Cancel AsInteger)
If TestDDELink(Application.CurrentDb.Name) ThenMsgBox"Cette base est déja ouverte sur votre poste", VbInformation
DoCmd.Quit
EndIfEndSubFunction TestDDELink(ByVal strNomApplication AsString) AsIntegerDim varCanalDDE AsLongOnErrorResumeNextApplication.SetOption "Ignore DDE Requests", True
' -- Ouvrir un canal entre instance de la base
varCanalDDE = DDEInitiate("MSAccess", strNomApplication)
' -- Si la base n'est pas ouverte, pas de canal de communication entre deux instancesIf Err Then
TestDDELink = 0
Else
TestDDELink = 1
DDETerminate varCanalDDE
DDETerminateAll
EndIfApplication.SetOption ("Ignore DDE Requests"), FalseEndFunction
Il est intéressant des fois d'inhiber l'effet de la touche MAJ (Ne pas exécuter les évènement de chargement de la base) pour
ne pas afficher le conteneur de la base à l'utilisateur. Pour cela on dispose de deux procédures, l'une qui l'inhibe SetBypassProperty,
l'autre qui l'active UnSetBypassProperty.
Function Ouvrir_Base_Exclusif()
Dim Bd AsDatabaseOnErrorResumeNextSet Bd = DbEngine (0).OpenDatabase("C:\Ma_base.mdb", True)
If Err.Number<> 0 Then
Msgbox Err.Number & " Impossible d'ouvrir la base en mode Exclusif " & vbcrlf & Err.Description, VbInformation
ElseMsgBox"La base de données est ouverte en mode exclusif.", VbInformation
EndIfEndFunction
Si on obtient le numéro d'erreur 3262, c'est que la base est ouverte en mode partagé par un autre utilisateur.
Pour savoir l'origine des tables liées, il suffit d'explorer la table MsysObjects. Vous pouvez alors créer un formulaire avec
trois zone de texte dans la section détail : Nom de la table, Nom étranger de la table, Chemin de la table. Dans la source de donnée
du formulaire, il faut mettre cette requête :
SELECT Name, ForeignName, Database
FROM MSysObjects
WHERE MSysObjects.Type=6;
N'oublier pas de renseigner la source de donnée des zones de listes.
Pour mettre une date d'expiration à la base et désactiver le run-time de votre application Access, appelez cette fonction
à l'ouverture du formulaire de démarrage
PublicFunction DateExpirationApplication()
IfDate >= DateSerial(2003, 12, 31) ThenMsgBox"La date d'expiration de l'application est dépassée", vbExclamation
DoCmd.Quit
EndIfEndFunction
L'idée est que le formulaire principale de l'application sache quand est ce qu'il faut lancer la routine de déconnexion des utilisateurs.
Pour cela, on crée une table avec un seul champs de type oui/non et un seul enregistrement : Administration(LogOff(oui/non)).
L'administrateur de la base peut ensuite cacher cette table (propriété, table caché) et lui seul peut cocher la case LogOff.
Il faut maintenant utiliser l'évènement minuterie du formulaire principale qui lance la vérification de la routine qui déconnectera
les utilisateurs (on utilise un intervalle de 5 minutes).
PrivateSub Form_Timer()
OnErrorGoTo Err_LogOff
Dim Lancer AsBooleanDim rcd AsDAO.RecordsetSet rcd = CurrentDb.OpenRecordset("Administration")
rcd.MoveFirst
Lancer = rcd.Fields(0)
rstLO.CloseCurrentDb.Close
' --Si la case est cochéeIf Lancer ThenApplication.Quit acQuitSaveAll
Exit_LogOff:
ExitSub
Err_LogOffChk:
MsgBox Err.Number & vbCrLf & Err.Description, vbInformation, "Erreur"Resume Exit_LogOff
EndSub
Pour connaître la liste des connectés à une base de données, il suffit d'explorer le fichier .ldb. Pour ce fait, on aura
besoin de définir un type :
Private Type Un_Connecté
' --nom PC
PC(1 To 32) AsByte
' --nom utilisateur
User(1 To 32) AsByteEnd Type
Cette fonction renvoie alors la chaîne des connectés:
PublicFunction WHO_IS() AsString
' -- retourne une liste séparée par des points virgules indiquant le nom de l'ordinateur ainsi que
' -- l'utilisateur connecté à la base.OnErrorGoTo Err_WHO_IS
Dim Mon_LDB AsInteger, i AsIntegerDim Mon_Chemin AsStringDim Mon_Log AsString, Ma_Connexion AsStringDim Nom_PC AsString, Nom_Utilisateur AsStringDim utilisateur As Un_Connecté
Mon_Chemin = CurrentDb.NameCurrentDb.Close
' --Aller chercher le LDB
Mon_Chemin = Left(Mon_Chemin, InStr(1, Mon_Chemin, ".")) + "LDB"
Mon_LDB = FreeFile
' --Ouvrir le LDBOpen Mon_Chemin For Binary Access Read SharedAs Mon_LDB
' -- Lire le LDBDoWhileNotEOF(Mon_LDB)
' -- Chaque enregistrement lu est placé dans la variable utilisateur pour y être traité.Get Mon_LDB, , utilisateur
With utilisateur
i = 1
Nom_PC = "" ' -- nom du PCWhile .PC(i) <> 0
Nom_PC = Nom_PC & Chr(.PC(i))
i = i + 1
Wend
i = 1
Nom_Utilisateur = "" ' -- nom de l'utilisateurWhile .User(i) <> 0
Nom_Utilisateur = Nom_Utilisateur & Chr(.User(i))
i = i + 1
WendEndWith
Mon_Log = Nom_PC & " | " & Nom_Utilisateur
If InStr(Ma_Connexion, Mon_Log) = 0 Then
Ma_Connexion = Ma_Connexion & Mon_Log & ";"EndIfLoopClose Mon_LDB
' --WHO_IS contient la liste des utilisateurs
WHO_IS = Ma_Connexion
Exit_WHO_IS:
ExitFunction
Err_WHO_IS:
MsgBox Err.Number & vbCrLf & Err.Description, vbInformation, "Erreur"Close Mon_LDB
Resume Exit_WHO_IS
EndFunction