I. Introduction▲
La base de données est utilisée en mode multi-utilisateurmultiutilisateurs, avec sur le serveur le fichier de données et sur les postes clients l'interface utilisateur :
![Installation en réseau Installation en réseau](./images/reseau.jpeg)
On souhaite dans cette situation enregistrer dans une table les différentes opérations effectuées par les utilisateurs :
- mise à jour d'un enregistrement ;
- création d'un enregistrement ;
- suppression d'un enregistrement ;
- fermeture de l'application ;
- …
Pour cela, on met à jour la table en utilisant une procédure que l'on exécute sur des événements de formulaires :
- « Après MAJ » du formulaire ;
- « Après insertion » du formulaire ;
- « Sur suppression » du formulaire ;
- « Au clic » du bouton de commande permettant de quitter l'application ;
- …
Pour identifier la personne ayant déclenchée l'événement, on récupérera son nom d'utilisateur par deux méthodes au choix :
- méthode de la variable temporaireMéthode de la variable temporaire ;
- méthode de la variable environnementMéthode de la variable environnement.
Le journal des événements obtenu peut permettre ensuite :
- d'avoir une vision globale de l'activité de chaque utilisateur ;
- de savoir quels sont les services de l'application les plus et les moins utilisés ;
- en cas d'incident, d'aider à identifier son origine et de savoir qui a fait quoi ;
- d'avoir une trace des modifications effectuées sur les données sensibles ;
- …
Pour que chacun y trouve son compte, on devra prévoir pour chaque utilisateur, un accès au suivi des opérations qu'il a effectuées.
On décrit par la suite les différentes étapes permettant de mettre en place ce système d'enregistrement de l'activité de chacun.
II. Tables nécessaires▲
II-A. Table T_Evenement▲
Elle contient les informations relatives aux événements déclenchés par les utilisateurs, et doit être présente dans le fichier de données côté serveur.
Nom du champ |
Type de données |
Description du champ |
---|---|---|
IdEvenement |
NumeroAuto |
Identifiant de l'événement |
NomObjet |
Texte |
Nom de l'objet dans lequel l'événement a eu lieu (formulaire ou état) |
TypeEvenement |
Texte |
Type d'événement : AfterUpdate, AfterInsert, etc. |
DateEvenement |
Date/Heure |
Date et heure de l'événement |
IDEnregistrement |
Entier long |
Identifiant de l'enregistrement modifié, inséré ou supprimé (clé primaire de la table T_Client) |
NomUtilisateur |
Texte |
Nom de l'utilisateur ayant déclenché l'événement |
Le champ [IDEnregistrement] peut-être du type entier long ou du type texte.
II-B. Table T_Utilisateur▲
Elle permet d'enregistrer les noms des utilisateurs de la base et leur mot de passe.
Nom du champ |
Type de données |
Description du champ |
---|---|---|
NomUtilisateur |
Texte |
Nom de l'utilisateur |
MotDePasse |
Texte |
Mot de passe de l'utilisateur |
Le champ [NomUtilisateur] est la clé primaire de la table.
III. Récupération du nom d'utilisateur▲
III-A. Méthode de la variable temporaire▲
On peut utiliser une variable temporairevariable temporaire pour copier le nom d'utilisateur et en disposer au cours de la session entière.
Par exemple, la création d'une variable NomUtilisateur contenant le nom « Dupont » est réalisée simplement en invoquant la méthode Add de la collection Application.TempVars :
Application.TempVars.Add
"NomUtilisateur"
, "Dupont"
Pour obtenir la valeur contenue dans cette variable, il suffit de faire :
strNomUtilisateur=
Application.TempVars
(
"NomUtilisateur"
).Value
La création de la variable peut se faire au moment de la connexion en exécutant par exemple le code :
strNomUtilisateur=
Me.txtNomUtilisateur
' copie du nom d'utilisateur dans une variable
Application.TempVars.Add
"NomUtilisateur"
, strNomUtilisateur ' création de la variable temporaire
La récupération du contenu de la variable temporaire se fait donc simplement par :
strNomUtilisateur=
Application.TempVars
(
"NomUtilisateur"
).Value
Cette méthode nécessite donc la création d'un formulaire de connexion pour identifier l'utilisateur au tout début, et pour copier son nom dans la variable temporaire. L'utilisation d'une variable globale à la place n'est pas recommandée, car elle peut être, sous certaines conditions, réinitialisée en cours de session.
III-B. Méthode de la variable environnement▲
Pour enregistrer le nom de l'utilisateur ayant déclenché l'événement on a recours à la fonction Environ(« UserName ») :
renvoie la valeur de type String associée à une variable d’environnement du système d’exploitation Windows ;
syntaxe
Environ ({ envstring | numéro })
Dans notre cas, si on exécute la commande suivante dans la fenêtre d'exécution :
? Environ
(
"UserName"
)
L'argument « UserName » passé à la fonction permet de renvoyer le nom de l'utilisateur actuellement connecté à la session Windows.
Pour obtenir le nom de l'utilisateur actuellement connecté, il suffit donc de faire :
strNomUtilisateur=
Environ
(
"UserName"
)
IV. Procédure d'ajout de l'événement▲
Elle va copier dans la table des événements les informations relatives à l'événement déclenché :
- la date et l'heure actuelles ;
- le nom de l'objet : formulaire ou état ;
- le type d'événement déclenché ;
- l'identifiant de l'enregistrement ;
- le nom de l'utilisateur actif.
La procédure ouvre un Recordset pour insérer dans la table, en plus de la date et du nom d'utilisateur, les données passées en arguments :
Public
Sub
AjouterEvenement
(
ByVal
TypeEvenement As
String
, ByVal
IdEnregistrement As
Long
, Optional
NomObjet As
String
=
""
)
Dim
db As
DAO.Database
' variable pour faire référence à la base courante
Dim
rs As
DAO.Recordset
' variable pour faire référence au Recordset lié à la table T_Evenement
Set
db =
CurrentDb ' Référence à la base courante
Set
rs =
db.OpenRecordset
(
"T_Evenement"
, dbOpenDynaset) 'Ouverture du Recordset lié à la table T_Evenement
If
NomObjet =
""
Then
' si pas de nom d'objet de spécifié en argument de la procédure
NomObjet =
Application.CodeContextObject.Name
' on copie le nom de l'objet dans lequel le code est en cours d'exécution
End
If
rs.AddNew
' ajout dans la table des informations relatives à l'événement
rs!DateEvenement =
Now
(
) ' copie dans la table de la date et de l'heure actuelles
rs!NomObjet =
NomObjet ' copie du nom de l'objet : formulaire, état
rs!TypeEvenement =
TypeEvenement ' copie du type d'événement : modification, ajout, suppression d'un enrg.
rs!IdEnregistrement =
IdEnregistrement ' copie de l'identifiant de l'enregistrement
'rs!NomUtilisateur = Environ("username") ' copie du nom d'utilisateur contenu dans la variable d'environnement Username
rs!NomUtilisateur =
Application.TempVars
(
"NomUtilisateur"
).Value
' copie du nom d'utilisateur contenu dans la variable temporaire NomUtilisateur
rs.Update
'libération des variables objet
rs.Close
Set
rs =
Nothing
Set
db =
Nothing
End
Sub
Si l'argument NomObjet est omis, on utilise la propriété CodeContextObject de l'objet Application pour déterminer dans quel objet le code est en cours d'exécution.
Avec cet argument optionnel, on laisse aussi la possibilité au programmeur débutant de définir un nom d'objet plus explicite, comme « Formulaire de saisie des clients ».
La procédure doit être copiée dans un module standard pour être appelée sur n'importe quel événement.
V. Appels de la procédure dans le formulaire▲
Dans notre exemple, on choisit un formulaire tout simple pour gérer les clients.
Pour enregistrer les opérations effectuées par les utilisateurs dans le formulaire, on a besoin de mettre sur différents événements, des appels à cette procédure :
V-A. Appel sur l'événement « Après MAJ » du formulaire▲
L’événement Après MAJ ou After Update se produit après que les données modifiées d’un enregistrement ont été mises à jour. On exécute alors la procédure permettant d'enregistrer dans la table les informations relatives à l'événement :
Private
Sub
Form_AfterUpdate
(
)
' Ajout des informations concernant l'événement AfterUpdate déclenché dans le formulaire F_Client
AjoutEvenement "Modification enregistrement dans formulaire"
, Me.IdClient
End
Sub
V-B. Appel sur l'événement « Après insertion » du formulaire▲
L’événement Après insertion se produit après l'ajout d'un nouvel enregistrement. On exécute alors la procédure d'ajout dans la table des informations concernant l'événement :
Private
Sub
Form_AfterInsert
(
)
' Ajout des informations concernant l'événement AfterInsert déclenché dans le formulaire F_Client
AjoutEvenement "Insertion enregistrement dans formulaire"
, Me.IdClient
End
Sub
V-C. Appel sur l'événement « Sur suppression » du formulaire▲
Quand l'utilisateur exécute une action pour supprimer un enregistrement, mais avant sa suppression effective, on enregistre alors dans la table les informations relatives à l'événement :
Private
Sub
Form_Delete
(
Cancel As
Integer
)
' Ajout des informations concernant l'événement Delete déclenché dans le formulaire F_Client
AjoutEvenement "Suppression enregistrement dans formulaire"
, Me.IdClient
End
Sub
VI. Affichage du journal d'activité▲
Une fois le système d'enregistrement de l'activité des utilisateurs mis en place, libre à vous de construire votre propre interface pour afficher le journal des événements déclenchés.
On peut par exemple afficher le journal des événements par type d'événement, par objet, et par nom d'utilisateur :
On offre ainsi la possibilité pour chaque utilisateur de voir ses opérations effectuées sur la base.
VII. Annexe▲
VII-A. Récupération des données▲
En complément, ce système peut aussi prévoir une procédure de sauvegarde régulière de la base (journalière, hebdomadaire ou mensuelle), en cas par exemple d'erreurs de saisie. Cette routine peut par exemple créer des copies de la base à une date précise, avec des noms de la forme :
« Sauvegarde 2020-06-01.accdb »
« Sauvegarde 2020-06-02.accdb »
« Sauvegarde 2020-06-03.accdb »
…
L'administrateur ayant par exemple identifié dans le journal des événements un enregistrement supprimé ou modifié par erreur à une date et une heure précise pourra alors rechercher la sauvegarde juste antérieure à cette date et cette heure pour ensuite récupérer les données.
La procédure de sauvegarde est disponible dans la base jointe, et peut par exemple s'exécuter quand on quitte l'application.
VII-B. Purge des données▲
Compte tenu du nombre important d'événements journaliers déclenchés par les utilisateurs, la table T_Evenement peut très vite grossir. C'est pourquoi il faut aussi prévoir de purger assez régulièrement les données plus anciennes, pour conserver une taille acceptable pour le bon fonctionnement de la base de données.
On peut par exemple exécuter régulièrement une requête suppression destinée à purger les événements antérieurs à x mois :
DELETE
FROM
T_Evenement
WHERE
DateEvenement<=
DateAdd(
"m"
,-
3
,Date
())
;
Bien penser aussi à compacter la base de données assez régulièrement.
VIII. Base de données à télécharger▲
La base jointejournal-activite-utilisateurs est au format accdb.
Pour tester l'application, saisir par exemple au démarrage, comme nom d'utilisateur « Martin » et comme mot de passe « 234 ».
IX. Remerciements▲
Je tiens à remercier zoom61, gaby277 et chrtophe pour m'avoir conseillé pour la réalisation de cet article, ainsi que Claude Leloup pour sa relecture.