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 :
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 temporaireMéthode de la variable temporaire ;
- méthode de la variable environnementMé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 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é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.
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 :
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 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.