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

Denis Hulo

Objectif : réaliser un système permettant d’enregistrer les sessions des utilisateurs d’une base Access installée en réseau.

Niveau requis : débutant.

Commentez cet article : Commentez

- Titre : Créer un journal des sessions des utilisateurs d'une base Access

- Auteur : Denis Hulo

- Parution : 23 juillet 2020

- Public visé :

- Licence : Copyright ® 2020 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

Sommaire

- I. Introduction

- II. Tables nécessaires

- II-A. Table T_Session

- II-B. Table T_Salarie

- III. Récupération du nom d’utilisateur

- III-A. Méthode de la variable temporaire

- III-B. Méthode de la variable environnement

- IV. Procédures de mise à jour de la table

- IV-A. Procédure d’enregistrement de l’heure de connexion

- IV-B. Procédure d’enregistrement de l’heure de fermeture de la session

- V. Appel des procédures de mise à jour des sessions

- V-A. Appel sur connexion à la base

- V-B. Appel sur fermeture de la session

- VI. Affichage du journal des sessions des utilisateurs

- VII. Annexe

- VII-A. Évaluation du total des heures

- VII-B. Purge des données

- VIII. Base de données à télécharger

- IX. Remerciements

I - Introduction

En informatique et en télécommunication, une session est une période délimitée pendant laquelle un appareil informatique est en communication et réalise des opérations au service d’un client - un usager, un logiciel ou un autre appareil.

Dans un précédent article, j’ai essayé d’expliquer comment créer un journal d’activité des utilisateurs. L’objectif est maintenant d’apprendre à créer un journal des sessions utilisateurs, dans lequel on enregistre uniquement la période d’activité de l’utilisateur de la base.

La base de données est utilisée en mode multi-utilisateur, avec sur le serveur, le fichier de données et sur les postes clients, l’interface utilisateur :

Installation en réseau

On souhaite dans cette situation enregistrer dans une table, pour chaque utilisateur, ses périodes de connexion.

Pour cela, on met à jour la table en utilisant des procédures qu’on exécute :

- au moment de la connexion à la base ;

- au moment de la fermeture de la session.

Pour identifier la personne connectée, on récupérera son nom d’utilisateur par deux méthodes au choix :

- méthode de la variable temporaire ;

- méthode de la variable environnement.

En complément du journal d’activité, la liste des sessions obtenue peut permettre ensuite :

- d’identifier les utilisateurs actuellement connectés à la base ;

- de connaître les heures d’activité des utilisateurs de la base ;

- d’évaluer le nombre d’heures effectuées dans le mois par le salarié ;

- …

Pour que chacun y trouve son compte, on devra prévoir pour chaque utilisateur la possibilité de consulter les informations sur les sessions qu’il a ouvertes.

On décrit par la suite les différentes étapes permettant de mettre en place ce système d’enregistrement des périodes d’activité de chacun.

II - Tables nécessaires

II-A - Table T_Session

Elle contient les informations relatives aux sessions des utilisateurs et doit être présente dans le fichier de données côté serveur.

Nom de la colonne

Type de données

Description

IdSession

NumeroAuto

Identifiant de la session

DateHeureDebut

Date/Heure

Date et heure de connexion à la base

DateHeureFin

Date/Heure

Date et heure de fermeture de l’application

NomUtilisateur

Texte

Nom de l’utilisateur ayant ouvert la session

L’attribut [IdSession] permet d’identifier la session de manière unique.

II-B - Table T_Salarie

Elle permet d’enregistrer les informations concernant les salariés, utilisateurs de la base.

Nom de la colonne

Type de données

Description

IdSalarie

NuméroAuto

Identifiant du salarié

NomSalarie

Texte

Nom du salarié

PrenomSalarie

Texte

Prénom du salarié

NomUtilisateur

Texte

Nom de l’utilisateur

MotDePasse

Texte

Mot de passe de l’utilisateur

L’attribut [NomUtilisateur] est indexé et permet aussi d’identifier chaque salarié.

III - Récupération du nom d’utilisateur

III-A - Méthode de la variable temporaire

On peut utiliser une variable 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édures de mise à jour de la table

IV-A - Procédure d’enregistrement de l’heure de connexion

Elle va copier dans la table des sessions les informations relatives à la connexion :

- la date et l’heure de connexion ;

- le nom de l’utilisateur actif.

La procédure ouvre un Recordset pour insérer dans la table le nom de l’utilisateur en plus de la date et de l’heure de connexion :

Public Sub EnrgDateHeureDebutSession()
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_Session
Dim idSession As Long ' variable utilisée pour l'identifiant de la session

Set db = CurrentDb ' Référence à la base courante
Set rs = db.OpenRecordset("T_Session", dbOpenDynaset) 'Ouverture du Recordset lié à la table T_Session

rs.AddNew ' ajout dans la table des informations relatives au début de la session
rs!DateHeureDebut = Now() ' copie dans la table de la date et de l'heure actuelles
'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

rs.MoveLast ' on va au dernier session d'enregistré
idSession = rs!idSession ' on copie l'identifiant de la session dans la variable
'création de la variable temporataire nommée IdSession initialisée avec l'identifiant de la dernière session
Application.TempVars.Add "idSession", idSession

'libération des variables objet
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

La création d’une variable temporaire Idsession contenant l’identifiant de la dernière session ouverte par l’utilisateur, permet d’en disposer plus tard, au moment de la mise à jour de la date et de l’heure de fin, quand le salarié quitte l’application.

La procédure doit être copiée dans un module standard pour être appelée sur n’importe quel événement.

IV-B - Procédure d’enregistrement de l’heure de fermeture de la session

Elle va copier dans la table des sessions la date et l’heure de fermeture de la session.

La procédure ouvre un Recordset, puis se déplace sur la dernière session enregistrée, pour mettre à jour la date et de l’heure de fermeture :

Public Sub EnrgDateHeureFinSession()
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_Session
Dim idSession As Long ' variable contenant l'identifiant de la session à mettre à jour

Set db = CurrentDb ' Référence à la base courante
Set rs = db.OpenRecordset("T_Session", dbOpenDynaset) 'Ouverture du Recordset lié à la table T_Session

idSession = Application.TempVars("IdSession").Value ' copie de l'identifiant de la session contenu dans la variable temporaire IdSession
rs.FindFirst "IdSession=" & idSession

If Not rs.NoMatch Then ' si l'enregistrement du session a été trouvé
rs.Edit ' ajout dans la table des informations relatives à la fin de la session
'rs!NomUtilisateur = Environ("username") ' copie du nom d'utilisateur contenu dans la variable d'environnement Username
rs!DateHeureFin = Now ' ' copie dans le champ de la date et de l'heure du départ
rs.Update
End If

'libération des variables objet
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

La procédure doit être copiée dans un module standard pour être appelée sur n’importe quel événement.

V - Appel des procédures de mise à jour des sessions

Pour enregistrer les périodes d’activité des utilisateurs, on a besoin d’appeler les procédures de mise à jour à la connexion et à la fermeture de la base.

V-A - Appel sur connexion à la base

Dans notre exemple, on choisit un formulaire de connexion tout simple.

Formulaire de connexion

Après avoir saisi som nom d’utilisateur et son mot de passe, le salarié peut alors se connecter en cliquant sur le bouton de validation des choix. On exécute alors la procédure permettant d’insérer dans la table les informations relatives à l’ouverture de la session :

Private Sub CmdValider_Click()
Dim strMotDePasse As String
Dim strNomUtilisateur As String

strNomUtilisateur = Nz(Me.cmbUtilisateur.Value, "")
strMotDePasse = Nz(DLookup("MotDePasse", "T_Salarie", "NomUtilisateur=""" + strNomUtilisateur + """"), "")

If (strMotDePasse = Me.txtMotDePasse) Then

'création de la variable temporataire nommée NomUtilisateur initialisée avec le nom d'utilisateur
Application.TempVars.Add "NomUtilisateur", strNomUtilisateur

EnrgDateHeureDebutSession ' Enregistrement dans la table des sessions de la date et l'heure de connexion de l'utilisateur
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "F_Session", , , , , acHidden ' ouverture du formulaire de session masqué
DoCmd.OpenForm "F_Journal_Sessions"
Else
MsgBox "Mot de Passe incorrecte, pour tester saisir Agon 123", vbInformation, "Entreprise"
Me.txtMotDePasse.SetFocus
End If
End Sub

V-B - Appel sur fermeture de la session

L'application doit permettre de mettre à jour l’heure de sortie lors de la fermeture de la session.

Pour cela, il faut exécuter la procédure EnrgDateHeureFinSession à la fermeture d’un formulaire ouvert et masqué durant toute la session. On est ainsi assuré que la date et l’heure de fermeture de la session seront bien enregistrées dans la table, y compris si l’utilisateur clique sur la croix en haut à droite de la fenêtre Access.

Private Sub Form_Close()
EnrgDateHeureFinSession ' enregistrement de la date et de l'heure de sortie de l'application
End Sub

VI - Affichage du journal des sessions des utilisateurs

Une fois le système d’enregistrement des heures d’activité des utilisateurs mis en place, libre à vous de construire votre propre interface pour afficher la liste des sessions ouvertes par les salariés.

On peut par exemple afficher ces sessions par type d’activité, et par nom d’utilisateur :

Journal des sessions

On offre ainsi la possibilité pour chaque utilisateur de voir ses heures d’activité sur la base.

VII - Annexe

VII-A - Évaluation du total des heures

En complément du journal d’activité des utilisateurs, les données relatives aux sessions peuvent aussi permettre d’évaluer le nombre d’heures effectuées par les salariés durant un mois.

On peut par exemple réaliser une requête de regroupement qui effectue la somme des durées des sessions par utilisateur et par mois :

SELECT T_Session.NomUtilisateur, Format([DateHeureDebut],"yyyy-mm") AS Mois, Sum(([DateHeureFin]-[DateHeureDebut])) AS TotalHeures
FROM T_Session
GROUP BY T_Session.NomUtilisateur, Format([DateHeureDebut],"yyyy-mm")
ORDER BY T_Session.NomUtilisateur, Format([DateHeureDebut],"yyyy-mm");

Le total des heures obtenu pour chaque salarié peut bien entendu être corrigé en fonction des données concernant son activité (cf. son journal d’activité).

VII-B - Purge des données

Compte tenu du nombre important de sessions journalières ouvertes par les utilisateurs, la table T_Session 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 de suppression destinée à purger les sessions antérieures à x mois :

DELETE
FROM T_Session
WHERE DateHeureDebut<=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 jointe est au format accdb.

Pour tester l’application, saisir par exemple au démarrage, comme nom d’utilisateur « Agon » et comme mot de passe « 123 ».

IX - Remerciements

Je tiens à remercier zoom61 pour m’avoir conseillé pour la réalisation de cet article, ainsi que escartefigue pour sa relecture.