Créer une application Access pour gérer des interventions récurrentes

Denis Hulo

Objectif : créer une application Access permettant de gérer les interventions récurrentes effectuées par les techniciens.

Niveau requis : confirmé.

Commentez cet article : Commentez

- Titre : Créer une application Access pour gérer des interventions récurrentes

- Auteur : Denis Hulo

- Parution : 11 mai 2016

- Mise à jour : 4 novembre 2019

- Licence : Copyright ® 2016 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. Contexte de la maintenance industrielle

- III. Rendu final du formulaire principal

- IV. Procédure de génération des interventions

- V. Tables

- V-A. Tables relatives aux interventions

- V-A-1. T_Intervention

- V-A-2. T_Periodicite

- V-A-3. T_TypeIntervention

- V-A-4. T_StatutIntervention

- V-B. Tables supplémentaires

- V-B-1. T_Client

- V-B-2. T_Technicien

- VI. Requêtes

- VI-A. R_ListeInterventions

- VI-B. R_Intervention

- VII. Formulaires

- VII-A. Sous-formulaire SF_ListeInterventions

- VII-A-1. Procédure sur double-clic des zones de texte

- VII-B. Formulaire F_ListeInterventions

- VII-B-1. Procédure RefreshListeInterventions

- VII-B-2. liste déroulante cmbClient

- VII-B-3. liste déroulante cmbTechnicien

- VII-B-4. zone de liste lstTypeIntervention

- VII-B-5. zone de texte txtDateDebut

- VII-B-6. zone de texte txtDateFin

- VII-B-7. bouton de commande cmdAjouterIntervention

- VII-B-8. Procédure sur ouverture

- VII-C. Formulaire F_Intervention

- VII-C-1. Bouton de commande cmdValider

- VII-C-2. Bouton de commande cmdAnnuler

- VII-C-3. Bouton de commande cmdSupprimer

- VII-C-4. Bouton de commande cmdSupprimerPeriodicite

- VIII. Module M_GenererInterventions

- VIII-A. Description de quelques routines

- VIII-B. Procédure de génération des interventions récurrentes

- IX. Téléchargement

- X. Remerciements

I - Introduction

L'objectif de cet article est d'expliquer, à l'aide d'une base exemple, comment créer une application Access destinée à gérer des interventions récurrentes.

Pour ce faire, après avoir donné un aperçu du résultat souhaité et avoir décrit la procédure de génération des interventions récurrentes, on détaillera la structure des différents objets de l'application exemple, dans l'ordre de leur création :

- tables nécessaires ;

- requêtes ;

- formulaires ;

- module M_GenererInterventions.

II - Contexte de la maintenance industrielle

Dans l'industrie, le matériel nécessite d'être contrôlé régulièrement. À ce titre, les techniciens réalisent différents types d'intervention chez les clients :

- de la maintenance préventive ;

- de la maintenance corrective ;

- des interventions urgentes ;

- des dépannages ponctuels.

Ces opérations peuvent donc être périodiques ou ponctuelles.

Maintenance industrielle

On supposera que ces interventions ne peuvent avoir lieu les dimanches et jours fériés.

III - Rendu final du formulaire principal

Il présente les interventions classées par ordre croissant des dates.

Aperçu du formulaire principal

Les interventions peuvent être filtrées par période, client, technicien ou type d'intervention.

Nous décrivons par la suite la procédure de génération des interventions, et les objets nécessaires pour aboutir à ce résultat.

IV - Procédure de génération des interventions

On saisit une intervention en précisant si besoin sa périodicité (en jours, semaines, mois ou années). Puis, on valide la saisie, ce qui crée, suivant la périodicité, la liste des interventions espacées d'une certaine durée.

Résumé des différentes étapes

- ouverture du formulaire de saisie ;

- saisie de l'intervention et de sa périodicité ;

- validation de la saisie et création de la liste des interventions suivant la périodicité.

V - Tables

V-A - Tables relatives aux interventions

V-A-1 - T_Intervention

Elle sert à enregistrer les données concernant les interventions.

Nom du champ

Type de données

Description

IDIntervention

Entier long

Identifiant de l'intervention

DateIntervention

Date/Heure

Date de l'intervention

HeureIntervention

Texte

Heure de l'intervention ou du rendez-vous

IDClient

Entier long

Identifiant du client chez qui a lieu l'intervention

IDTechnicien

Entier long

Identifiant du technicien qui réalise l'intervention

IDTypeIntervention

Entier long

Identifiant du type d'intervention

IDStatutIntervention

Entier long

Identifiant du statut de l'intervention

DetailIntervention

Texte

Détail de l'intervention

EstPeriodique

Booléen

Indique si l'intervention est périodique ou ponctuelle

IdPeriodicite

Entier long

Identifiant de la périodicité

V-A-2 - T_Periodicite

Cette table permet d'enregistrer les valeurs concernant la périodicité de l'intervention.

Nom du champ

Type de données

Description

IDPeriodicite

Entier long

Identifiant de la périodicité

Periodicite

Numérique

Récurrence pour l'intervention, en jours, semaines, mois ou années

UniteTemps

Texte

Unité de temps : jour, semaine, mois ou année

DateDebutPeriodicite

Date/heure

Date de début de la périodicité

DateFinPeriodicite

Date/heure

Date de fin de la périodicité

Les tables T_Periodicite et T_Intervention sont reliées entre elles suivant une relation 1 à plusieurs, avec suppression en cascade.

V-A-3 - T_TypeIntervention

Elle permet de sauvegarder les types d'intervention.

Nom du champ

Type de données

Description

IDTypeIntervention

Entier long

Identifiant du type d'intervention

TypeIntervention

Texte

Type de l'intervention

Exemples de types d'intervention

- maintenance préventive ;

- maintenance corrective ;

- intervention urgente ;

- dépannage.

V-A-4 - T_StatutIntervention

Elle permet de sauvegarder les statuts des interventions.

Nom du champ

Type de données

Description

IDStatutIntervention

Entier long

Identifiant du statut de l'intervention

StatutIntervention

Texte

Statut de l'intervention

Exemples de statuts

- en attente ;

- en cours ;

- terminée ;

- annulée.

V-B - Tables supplémentaires

V-B-1 - T_Client

Cette table permet de sauvegarder les informations relatives aux clients.

Nom du champ

Type de données

Description

IDClient

Entier long

Identifiant du client

NomClient

Texte

Nom du client

Adresse

Texte

Adresse du client

ComplementAdresse

Texte

Complément de l'adresse du client

TelClient

Texte

Numéro de téléphone du client

…

…

…

On conserve uniquement les champs importants pour notre exemple.

V-B-2 - T_Technicien

Elle sert à enregistrer les données relatives aux techniciens.

Nom du champ

Type de données

Description

IDTechnicien

Entier long

Identifiant du technicien

NomTechnicien

Texte

Nom du technicien

PrenomTechnicien

Texte

Prénom du technicien

…

…

…

Là encore, on ne garde que les champs indispensables pour notre exemple.

VI - Requêtes

Afin de pouvoir afficher les interventions avec les informations sur les clients, les techniciens, et les périodicités, on a besoin de réaliser des requêtes.

VI-A - R_ListeInterventions

Elle relie les tables T_Intervention, T_TypeIntervention, T_Client et T_Technicien, et permet d'afficher la liste des interventions classées par date et par heure :

Requête R_ListeInterventions en mode création

Ces liaisons permettent d'afficher les informations relatives au client, au technicien et à la périodicité de l'intervention dans le sous-formulaire.

VI-B - R_Intervention

Elle relie les tables T_Intervention, T_Client et T_Periodicite, et constitue la source du formulaire de saisie d'une intervention.

Requête R_Interventions en mode création

Ces liaisons permettent d'afficher les informations relatives au client et à la périodicité de l'intervention sur le formulaire de saisie.

VII - Formulaires

Nous allons décrire les formulaires permettant d'afficher et de saisir les interventions.

VII-A - Sous-formulaire SF_ListeInterventions

Il s'affiche en mode feuille de données et contient les zones de texte reliées aux champs de la requête R_ListeInterventions.

Formulaire SF_ListeInterventions en mode création

VII-A-1 - Procédure sur double-clic des zones de texte

Elle permet d'ouvrir le formulaire F_Intervention sur l'intervention identifiée par la valeur contenue dans le champ IDIntervention :

Procédure sur double-clic

Private Sub IDIntervention_DblClick(Cancel As Integer)
DoCmd.OpenForm "F_Intervention", , , "IDIntervention=" & Nz(Me.IDIntervention, 0)
End Sub

VII-B - Formulaire F_ListeInterventions

Il contient, en plus du sous-formulaire, des contrôles pour filtrer la liste des interventions selon certains critères.

Formulaire F_ListeInterventions en mode création

VII-B-1 - Procédure RefreshListeInterventions

Elle permet de filtrer la liste des interventions en fonction des choix effectués sur le formulaire.

Déroulé de la procédure

- On constitue la chaîne SQL en fonction des choix.

- On affecte la chaîne SQL à la propriété RecordSource du sous-formulaire.

procédure RefreshListeInterventions

Public Sub RefreshListeInterventions()
Dim sSQL As String ' variable contenant le code SQL pour filtrer la liste des interventions selon certains critères
Dim sWhere As String ' variable contenant le critère pour filtrer la liste des interventions selon certains critères

' Constitution du critère SQL initial
sWhere = " DateIntervention between #" & Format(Nz(Me!txtDateDebut, #1/1/1000#), "mm/dd/yyyy") & "# and #" & Format(Nz(Me!txtDateFin, #1/1/4000#), "mm/dd/yyyy") & "#"

' si on a choisi de filtrer selon un type d'intervention
If (Nz(Me.lstTypeIntervention) <> "") And (Me.lstTypeIntervention <> "[Tous]") Then
' ajout de la condition dans le where
sWhere = sWhere & " and ([TypeIntervention] like """ & Me.lstTypeIntervention & """)"
Else
Me.lstTypeIntervention = "[Tous]"
End If

' si on a choisi de filtrer selon un client
If (Nz(Me.cmbClient) <> "") And (Me.cmbClient <> "[Tous]") Then
' ajout de la condition dans le where
sWhere = sWhere & " and ([nomClient] like """ & Me.cmbClient & """)"
Else
Me.cmbClient = "[Tous]"
End If

' si on a choisi de filtrer selon un technicien
If (Nz(Me.cmbTechnicien) <> "") And (Me.cmbTechnicien <> "[Tous]") Then
' ajout de la condition dans le where
sWhere = sWhere & " and ([Technicien] like """ & Me.cmbTechnicien & """)"
Else
Me.cmbTechnicien = "[Tous]"
End If
' consitution du code SQL complet avec les clauses select et where
sSQL = "Select * From R_ListeInterventions where" & sWhere & " order by [DateIntervention] asc, HeureIntervention Asc, IDIntervention Asc;"
' affectation du code SQL à la propriété RecordSource du sous-formulaire SF_ListeInterventions
Me.SF_ListeInterventions.Form.RecordSource = sSQL
End Sub

VII-B-2 - liste déroulante cmbClient

Elle permet de choisir un client pour filtrer la liste des interventions en fonction du nom du client.

procédure sur après MAJ

Private Sub cmbClient_AfterUpdate()
RefreshListeInterventions ' rafraîchit la liste des interventions
End Sub

VII-B-3 - liste déroulante cmbTechnicien

Elle permet de choisir un technicien pour filtrer la liste des interventions en fonction du nom du technicien.

procédure sur après MAJ

Private Sub cmbTechnicien_AfterUpdate()
RefreshListeInterventions ' rafraîchit la liste des interventions
End Sub

VII-B-4 - zone de liste lstTypeIntervention

Elle permet de choisir un type d'intervention pour filtrer la liste des interventions.

procédure sur après MAJ

Private Sub lstTypeIntervention_AfterUpdate()
RefreshListeInterventions ' rafraîchit la liste des interventions
End Sub

VII-B-5 - zone de texte txtDateDebut

Elle permet de choisir une date de début pour filtrer la liste des interventions sur leur date.

procédure sur après MAJ

Private Sub txtDateDebut_AfterUpdate()
If Me.cmbParamDate.Value = "Jour" Then ' si on choisit de filtrer sur un jour
If Not IsNull(Me.txtDateDebut) Then
Me.txtDateFin.Value = CDate(Me.txtDateDebut.Value) ' on copie la date de début dans la zone de texte txtDateFin
Else ' sinon
Me.txtDateFin.Value = Null ' on vide la zone de texte txtDateFin
End If
End If
RefreshListeInterventions ' rafraîchit la liste des interventions
End Sub

VII-B-6 - zone de texte txtDateFin

Elle permet de choisir une date de fin pour filtrer la liste des interventions sur leur date.

procédure sur après MAJ

Private Sub txtDateFin_AfterUpdate()
RefreshListeInterventions ' rafraîchit la liste des interventions
End Sub

VII-B-7 - bouton de commande cmdAjouterIntervention

Elle permet d'ouvrir le formulaire F_Intervention en mode ajout, pour créer une intervention.

procédure sur clic

Private Sub CmdAjouterIntervention_Click()
' Ouvre le formulaire F_Intervention en mode ajout
DoCmd.OpenForm "F_Intervention", , , , acFormAdd
' Copie dans le formulaire F_Intervention la date affichée dans la zone de texte txtDateDebut comme date d'intervention
Forms!F_Intervention!DateIntervention = CDate(Me.txtDateDebut)
End Sub

VII-B-8 - Procédure sur ouverture

Elle permet d'afficher la liste des interventions du jour à l'ouverture du formulaire.

procédure sur ouverture

Private Sub Form_Open(Cancel As Integer)
Me.txtDateDebut = Date ' copie la date du jour dans la zone de texte txtDateDebut
Me.txtDateFin = Date ' copie la date du jour dans la zone de texte txtDateFin
RefreshListeInterventions ' rafraîchit la liste des interventions en fonction des choix
End Sub

VII-C - Formulaire F_Intervention

Il permet de consulter ou de modifier une intervention après avoir double-cliqué sur une ligne dans la liste. Il est basé sur la requête R_Intervention, et ses contrôles sont liés aux champs de cette requête.

Formulaire F_Intervention en mode création

Décrivons les boutons de commande permettant de valider l'intervention, d'annuler les modifications apportées au formulaire, ou de supprimer une intervention.

VII-C-1 - Bouton de commande cmdValider

Il permet de valider la saisie, de mettre à jour la liste des interventions, et de fermer le formulaire.

Procédure sur clic

Private Sub CmdValider_Click()
' Valide la saisie

If Nz(Me.IDClient) = "" Then ' si pas de client de choisi
MsgBox ("Saisir un client !") ' on affiche une alerte !
Exit Sub ' on sort de la procédure
End If

If Nz(Me.IDTechnicien) = "" Then ' si pas de technicien de choisi
MsgBox ("Saisir un employé !") ' on affiche une alerte !
Exit Sub ' on sort de la procédure
End If

Me.Refresh ' on enregistre les modifications apportées au formulaire
If (Me.optEstPeriodique.Value = True) Then ' si l'intervention est périodique
GenererInterventions (Me.IDIntervention) ' on génère les interventions suivant la périodicité
End If
' on actualise le sous-formulaire affichant la liste des interventions
Forms!F_ListeInterventions.SF_ListeInterventions.Requery
' on ferme le formulaire
DoCmd.Close acForm, "F_Intervention"
End Sub

VII-C-2 - Bouton de commande cmdAnnuler

Il permet d'annuler la saisie, et de fermer le formulaire.

Procédure sur clic

Private Sub CmdAnnuler_Click()
Me.Undo ' on annule la saisie
DoCmd.Close acForm, "F_Intervention" ' on ferme le formulaire
End Sub

VII-C-3 - Bouton de commande cmdSupprimer

Il permet de supprimer l'intervention active, et de fermer le formulaire.

Procédure sur clic

Private Sub CmdSupprimer_Click()
' Supprime l'enregistrement en cours

If (MsgBox("Souhaitez-vous supprimer l'enregistrement ?", vbYesNo + vbQuestion) = vbYes) Then ' si on confirme la suppression

If Not (Me.Recordset.EOF) Then ' si on est sur un enregistrement
Me.Recordset.Delete ' on supprime l'enregistrement
End If
' on actualise le sous-formulaire affichant la liste des interventions
Forms!F_ListeInterventions.SF_ListeInterventions.Requery
' on ferme le formulaire
DoCmd.Close acForm, "F_Intervention"
End If
End Sub

VII-C-4 - Bouton de commande cmdSupprimerPeriodicite

Il permet de supprimer toutes les interventions de la périodicité, et de fermer le formulaire.

Procédure sur clic

Private Sub CmdSupprimerPeriodicite_Click()
If MsgBox("Souhaitez-vous supprimer tous les enregistrements de la périodicité ?", vbYesNo + vbQuestion) = vbYes Then ' si on confirme la suppression
' on exécute la requête pour supprimer la périodicité et ses interventions
CurrentDb.Execute "delete from T_Periodicite where (IdPeriodicite=" & Nz(Me.IdPeriodicite, 0) & ");", dbFailOnError
' on actualise le sous-formulaire affichant la liste des interventions
Forms!F_ListeInterventions.SF_ListeInterventions.Requery
' on ferme le formulaire
DoCmd.Close acForm, "F_Intervention"
End If
End Sub

VIII - Module M_GenererInterventions

VIII-A - Description de quelques routines

Elles utilisent les fonctions Date et Heure :

Extrait du module

Option Compare Database
Option Explicit
' Module de l'application pour gérer les interventions.

'...
Public Function FormatDateUS(laDate As Date) As String
' Formate la date passée en argument en date US
FormatDateUS = Chr(35) & Format(laDate, "mm-dd-yyyy hh:nn:ss") & Chr(35)  ' Date au format US
End Function
Private Function EstWeekEnd(laDate As Date)
EstWeekEnd = ((Weekday(laDate) = 1) Or (Weekday(laDate) = 7)) ' est sur un week-end
End Function
...

Le module contient aussi la fonction EstFerie permettant de savoir si une date est un jour férié ou pas. Elle est disponible dans la faq.

VIII-B - Procédure de génération des interventions récurrentes

Pour créer les interventions suivant la périodicité définie dans le formulaire de saisie, on a besoin d'écrire une procédure VBA.

Déroulé de la routine

- Ouverture du recordset sur l'intervention affichée dans le formulaire de saisie.

- Parcours des dates suivant la périodicité.

- Pour chaque date, vérification si une intervention a déjà été créée pour cette périodicité.

- Si ce n'est pas le cas, ajout de l'intervention dans la table.

Code pour générer les interventions périodiques

Public Sub GenererInterventions(ByVal IDIntervention As Long)
' génère les interventions périodiques à partir de l'intervention dont l'identifiant est passé en argument
Dim db As DAO.Database ' référence à la base en cours
Dim rsInterv1 As DAO.Recordset ' variable recordset liée à la table T_Intervention
Dim rsInterv2 As DAO.Recordset ' variable recordset liée à la table T_Intervention
Dim IDClient As Long, IDEmploye As Long ' identifiants du client et de l'employé
Dim IdPeriodicite As Long
Dim dtDebut As Date, dtFin As Date ' dates de début et de fin de la périodicité
Dim dt As Date

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

' Ouverture des recordset liés à la table T_Intervention
Set rsInterv1 = db.OpenRecordset("select * from R_Intervention where IDIntervention=" & IDIntervention)
Set rsInterv2 = db.OpenRecordset("T_Intervention", dbOpenDynaset)

If Not (rsInterv1.EOF) Then ' si une intervention est trouvée pour cet IDIntervention

dt = rsInterv1!DateDebutPeriodicite ' on copie dans la variable la date de début de la périodicité
dtFin = rsInterv1!DateFinPeriodicite ' on copie dans la variable la date de fin de la périodicité

Do While dt <= dtFin

' on détermine la prochaine date d'intervention en fonction de l'unité de temps
Select Case rsInterv1!UniteTemps

Case "Jour"
dt = dt + rsInterv1!Periodicite

Case "Semaine"
dt = dt + 7 * rsInterv1!Periodicite

Case "Mois"
dt = DateAdd("m", rsInterv1!Periodicite, dt)

Case "Année"
dt = DateAdd("yyyy", rsInterv1!Periodicite, dt)

End Select

If (Not EstFerie(dt)) And (Weekday(dt) <> 1) Then ' si pas un jour férié ou un dimanche

' recherche d'une intervention pour cette périodicité et à cette date
rsInterv2.FindFirst "(IdPeriodicite=" & rsInterv1!IdPeriodicite & ") and (DateIntervention=" & FormatDateUS(dt) & ")"

If rsInterv2.NoMatch Then ' si pas d'intervention d'enregistrée à cette date
' création de l'intervention à cette date
rsInterv2.AddNew
rsInterv2!IdPeriodicite = rsInterv1!IdPeriodicite
rsInterv2!DateIntervention = dt ' copie de la date courante
rsInterv2!HeureIntervention = rsInterv1!HeureIntervention
rsInterv2!IdTypeIntervention = rsInterv1!IdTypeIntervention ' copie de l'identifiant du type d'intervention
rsInterv2!IDStatutIntervention = 1 ' statut "en attente"
rsInterv2!IDClient = rsInterv1!IDClient ' copie de l'identifiant du client
rsInterv2!IDTechnicien = rsInterv1!IDTechnicien ' copie de l'identifiant du technicien
rsInterv2.Update
End If

End If

Loop

End If

'Fermeture et libération des variables objet

rsInterv1.Close
Set rsInterv1 = Nothing
rsInterv2.Close
Set rsInterv2 = Nothing
Set db = Nothing
End Sub

La procédure publique peut-être appelée depuis n'importe quel module standard ou de formulaire.

IX - Téléchargement

La base exemple a été réalisée en collaboration avec geofrey.

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).

X - Remerciements

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

Pour m'avoir fourni l'idée de départ :
. geofrey

Pour ses remarques et sa relecture :
. claudeleloup