Créer un formulaire de saisie des pointages des salariés avec Access

Denis Hulo

Objectif : créer un formulaire de saisie des pointages des salariés avec pré-remplissage de leur nom et prénom.

Niveau requis : intermédiaire.

Commentez cet article : Commentez ♪

- Titre : Créer un formulaire de saisie des pointages des salariés avec Access

- Auteur : Denis Hulo

- Parution : 18 février 2011

- Licence : Copyright ® 2009 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. Rendu final du formulaire de pointage

- III. Procédure de pré-remplissage

- IV. Tables nécessaires

- IV-A. Table T_Pointage

- IV-B. Table T_DetailPointage

- IV-C. Table T_PeriodeJour

- IV-D. Table T_Employe

- V. Requêtes

- V-A. Requête R_DetailPointages

- VI. Formulaires

- VI-A. Sous-formulaire SF_DetailPointages

- VI-B. Formulaire F_Pointages

- VI-B-1. Procédure RefreshPointages

- VI-B-2. Zone de texte txtDatePointage

- VI-B-2-a. Procédure sur Après MAJ

- VI-B-3. Zone de texte cmbPeriodeJour

- VI-B-3-a. Procédure sur Après MAJ

- VI-B-4. Bouton de commande CmdPrecedent

- VI-B-4-a. Procédure sur Clic

- VI-B-5. Bouton de commande CmdSuivant

- VI-B-5-a. Procédure sur Clic

- VI-B-6. Procédure sur Ouverture du formulaire

- VII. Téléchargement

- VIII. Remerciements

I - Introduction

On souhaite créer un formulaire permettant la saisie des pointages des employés pour chaque jour du calendrier.

Pour ce faire, après avoir donné un aperçu du formulaire souhaité et avoir détaillé la procédure de pré-remplissage, on décrira la structure des différents objets de l'application exemple, dans l'ordre de leur création :

- tables nécessaires ;

- requêtes ;

- formulaires.

II - Rendu final du formulaire de pointage

Il affiche la date et la période du jour de pointage, et contient un sous-formulaire pré-rempli, avec pour chaque employé ses heures ou son motif d'absence à renseigner.

Aperçu du formulaire des pointages

On constate que les noms des salariés sont déjà remplis avant la saisie des heures et des motifs d'absences.

III - Procédure de pré-remplissage

Quand on choisit une date sur le formulaire principal, on teste, si un pointage a déjà été créé pour ce jour. Si ce n'est pas le cas, on le crée, puis on ajoute un enregistrement par période et par employé dans la table contenant le détail des pointages, ce qui permet ensuite de générer le tableau de saisie des heures dans le sous-formulaire.

IV - Tables nécessaires

Nous allons tout d'abord décrire les tables principales permettant d'enregistrer les données.

IV-A - Table T_Pointage

Elle contient les informations sur les pointages, comme leur date accompagnée d'une note éventuelle.

Nom du champ

Type de données

Description

IdPointage

Numéro-auto

Identifiant du pointage

DatePointage

Date/heure

Date du pointage

PeriodeJour

Texte

Période de la journée du pointage

Note

Texte long

Note sur le pointage

IV-B - Table T_DetailPointage

Elle contient le détail des pointages des employés pour une journée donnée.

Nom du champ

Type de données

Description

IdDetailPointage

Numéro-auto

Identifiant du détail des pointages

IdPointage

Entier long

Identifiant du pointage

IdEmploye

Entier long

Identifiant de l'employé

HeureArrivee

Date/heure

Heure d'arrivée de l'employé

HeureDepart

Date/heure

Heure de départ de l'employé

IdMotifAbsence

Texte

Code du motif de l'absence

Note

Texte

Note sur le pointage

Si aucune heure n'est saisie, il faut bien sûr choisir un motif d'absence.

IV-C - Table T_PeriodeJour

Elle sert à enregistrer les périodes de la journée.

Nom du champ

Type de données

Description

PeriodeJour

Texte

Période de la journée : Matin, Après-midi

NumOrdre

Entier long

Numéro d'ordre de la période de la journée

Vous pouvez enregistrer vos propres périodes.

IV-D - Table T_Employe

Elle contient les informations sur les employés.

Nom du champ

Type de données

Description

IdEmploye

Numéro-auto

Identifiant de l'employé

NomEmploye

Texte

Nom de l'employé

PrenomEmploye

Texte

Prénom de l'employé

…

…

…

Seuls les trois premiers champs de la table sont indispensables.

V - Requêtes

Pour pouvoir afficher, pour chaque jour et chaque période, le détail des pointages des employés, il nous faut tout d'abord créer une requête.

V-A - Requête R_DetailPointages

Elle relie les tables T_DetailPointage et T_Employe sur le champ IdEmploye et affiche le détail des pointages de chaque employé.

Requête R_DetailPointages en mode création.

Le nombre d'heures effectuées est égal au nombre de minutes entre l'heure d'arrivée et l'heure de départ, divisé par 60 :

NbHeures: NbHeures: DiffDate("n";[HeureArrivee];[HeureDepart])/60

Les données seront ensuite filtrées sur le champ IdPointage en fonction de l'identifiant du pointage affiché sur le formulaire principal.

VI - Formulaires

La troisième étape consiste à créer les formulaires.

VI-A - Sous-formulaire SF_DetailPointages

Il s'affiche en mode feuille de données, et est relié à la requête R_DetailPointages.

Il contient :

- les zones de texte txtEmploye, txtHeureArrivees, txtHeureDepart, txtNbHeures et txtNote ;

- la liste déroulante cmbIdMotifAbsence.

Aperçu du formulaire SF_DetailPointage en mode création

VI-B - Formulaire F_Pointages

Il est lié à la table T_Pointage et permet l'affichage du tableau des pointages en fonction de la date et de la période choisies.

Il contient :

- les zones de texte txtDateJour, cmbPeriodeJour et txtIdPointage ;

- les boutons de commande CmdPrecedent et CmdSuivant ;

- le sous-formulaire SF_DetailPointages.

Aperçu du formulaire F_Pointage en mode création

VI-B-1 - Procédure RefreshPointages

Elle est contenue dans le module du formulaire et permet de mettre à jour le tableau des pointages en fonction de la date choisie sur le formulaire.

Déroulé de la procédure :

- recherche s'il existe un pointage à la date saisie ;

- s'il existe, se déplace sur son enregistrement ;

- sinon, propose de le créer et de mettre à jour le tableau des pointages.

Procédure RefreshPointages

Private Sub RefreshPointages()
' se déplace sur le bon pointage s'il existe, sinon crée le pointage et met à jour le tableau
Dim dtCur  As Date
Dim stPrd As String
Dim rsPtg As DAO.Recordset
Dim stSQL As String
Dim db As DAO.Database

If (Me.txtDatePointage.Value <> "") Then ' si une date de pointage a été saisie dans la zone de texte

dtCur = CDate(Me.txtDatePointage) ' copie dans la variable de la date de pointage affichée dans la zone de texte
stPrd = Me.cmbPeriodeJour ' copie dans la variable de la période de la journée affichée dans la liste déroulante

Set rsPtg = Me.RecordsetClone ' référence au jeu d'enregistrements source du formulaire
' on recherche un pointage pour cette date et cette période de la journée
rsPtg.FindFirst "[DatePointage]=#" & Format(dtCur, "mm-dd-yyyy") & "# and [PeriodeJour]=""" & stPrd & """"

If Not (rsPtg.NoMatch) Then ' si on a trouvé un pointage
Me.Bookmark = rsPtg.Bookmark ' alors, on se déplace sur son enregistrement
Else   ' sinon
If MsgBox("Souhaitez-vous créer un formulaire de pointages pour ce jour ?", vbYesNo) = vbYes Then

' ajout de l'enregistrement avec la date et la période choisies sur le formulaire
rsPtg.AddNew
rsPtg![DatePointage] = dtCur
rsPtg![PeriodeJour] = stPrd
rsPtg.Update

rsPtg.MoveLast ' déplacement vers le dernier enregistrement qui vient d'être créé
Me.Bookmark = rsPtg.Bookmark

Set db = CurrentDb ' référence à la base courante

stSQL = "insert into T_DetailPointage (IdEmploye, IdPointage) " & _
"select IdEmploye, " & Nz(Me.IdPointage, 0) & " as IdPointage from T_Employe;"

db.Execute stSQL, dbFailOnError ' insertion des enregistrements pour les pointages. Un pointage par employé

Else ' si on refuse la mise à jour
Me.txtDatePointage = [DatePointage] ' on revient alors à la date précédente
Me.cmbPeriodeJour = [PeriodeJour] ' on revient alors à la période précédente
End If

End If

' on rafraîchit le sous-formulaire en fonction de l'identifiant du pointage courant
Me.SF_DetailPointages.Form.RecordSource = "select * from R_DetailPointages where IdPointage=" & Nz(Me.txtIdPointage, 0)

' on ferme et libère les variables objet
rsPtg.Close
Set rsPtg = Nothing

Set db = Nothing

End If
End Sub

VI-B-2 - Zone de texte txtDatePointage

Elle permet de choisir une date de pointage.

VI-B-2-a - Procédure sur Après MAJ

Elle permet de mettre à jour le tableau des pointages en fonction de la date et de la période choisies.

Private Sub txtDatePointage_AfterUpdate()
RefreshPointages ' on rafraîchit le tableau des pointages après le choix de la date
End Sub

VI-B-3 - Zone de texte cmbPeriodeJour

Elle permet de choisir une période de la journée pour le pointage.

VI-B-3-a - Procédure sur Après MAJ

Elle permet de mettre à jour le tableau des pointages en fonction de la date et de la période choisies.

Private Sub cmbPeriodeJour_AfterUpdate()
RefreshPointages ' on rafraîchit le tableau des pointages après le choix de la période
End Sub

VI-B-4 - Bouton de commande CmdPrecedent

Ce bouton est utilisé pour permettre à l'utilisateur de reculer d'un jour et de rafraîchir le sous-formulaire.

VI-B-4-a - Procédure sur Clic

Private Sub CmdPrecedent_Click()
Me.txtDatePointage.Value = CDate(Me.txtDatePointage.Value) - 1 ' recule d'une journée dans le temps
Me.cmbPeriodeJour.Value = Me.cmbPeriodeJour.ItemData(0) ' on sélectionne la 1re période de la journée (matin)
RefreshPointages ' on rafraîchit le tableau des pointages
End Sub

VI-B-5 - Bouton de commande CmdSuivant

Ce bouton est utilisé pour permettre à l'utilisateur d'avancer d'un jour et de rafraîchir le sous-formulaire.

VI-B-5-a - Procédure sur Clic

Private Sub CmdSuivant_Click()
Me.txtDatePointage.Value = CDate(Me.txtDatePointage.Value) + 1 ' avance d'une journée dans le temps
Me.cmbPeriodeJour.Value = Me.cmbPeriodeJour.ItemData(0) ' on sélectionne la 1re période de la journée (matin)
RefreshPointages ' on rafraîchit le tableau des pointages
End Sub

VI-B-6 - Procédure sur Ouverture du formulaire

On ouvre le formulaire sur la date du jour, puis on actualise le tableau des pointages :

Procédure Form_Open

Private Sub Form_Open(Cancel As Integer)
Me.txtDatePointage = Date ' on copie la date du jour à l'ouverture du formulaire
Me.cmbPeriodeJour.Value = Me.cmbPeriodeJour.ItemData(0) ' on sélectionne la 1re période de la journée (matin)
RefreshPointages ' on rafraîchit le tableau des pointages
End Sub

VII - Téléchargement

La base exemple est au format accdb.

Pour faciliter les tests et assurer sa portabilité, la base exemple n'utilisera pas de composants externes à Access (ActiveX ou autres).

VIII - Remerciements

Un grand Merci à toute l'équipe de Dvp et plus particulièrement à :

Pour leurs remarques et conseils avisés :
. Tofalu
. Arkham46

Pour leur relecture :
. jacques_jean
. ram-0000