Créer un journal d'activité des utilisateurs d'une base Access

Objectif : réaliser un système permettant d'enregistrer l'activité des utilisateurs d'une base Access installée en réseau.

Niveau requis : débutant.

Commentez cet article : Commentez Donner une note  l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

La base de données est utilisée en mode multiutilisateursmultiutilisateurs, 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

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 :

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 :

 
Sélectionnez
Application.TempVars.Add "NomUtilisateur", "Dupont"

Pour obtenir la valeur contenue dans cette variable, il suffit de faire :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
? 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 :

 
Sélectionnez
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 :

 
Sélectionnez
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.

Formulaire Client
Formulaire Client

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 :

Image non disponible
Événements du formulaire

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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

Journal des événements
Journal des événements

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 :

 
Sélectionnez
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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2020 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.