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

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 : 8 commentaires Donner une note  l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 utilisateursjournal 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-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

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 :

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

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

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

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

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

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

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

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.