Apprendre à générer des événements récurrents

Apprendre à générer des événements récurrents.

Niveau requis : confirmé.

Commentez cet article : 2 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

L'objectif de cet article est de décrire, à l'aide d'un exemple, une méthode consistant à programmer des interventions sur des machines suivant une période définie en nombre de jours.

II. Contexte

Dans une usine les machines réparties dans différents secteurs, doivent être contrôlées par les techniciens de maintenance tous les x jours.

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

Image non disponible
Machines-outils dans l'industrie

Dans l'industrie, les machines nécessitent d'être contrôlées régulièrement.

III. Description du principe

L'objectif est d'afficher dans un formulaire de planning les différentes interventions récurrentes, réparties sur différents onglets correspondant aux différents jours de la semaine.

Pour ce faire, on enregistre dans une table, au moyen d'une procédure VBA, les différentes interventions de même nature, espacées d'une certaine période définie en nombre de jours.

Résumé des différentes étapes

  • Saisie des interventions de base sur les différents onglets du planning correspondant aux jours de la semaine.
  • Ajout dans la table T_Intervention des interventions de même nature à intervalle régulier.
  • Actualisation des différents sous-formulaires correspondant aux jours de la semaine.

IV. Rendu final du formulaire affichant les interventions hebdomadaires

Voici le rendu du formulaire qui présente, pour une semaine précise, les différentes interventions regroupées par jour.

Image non disponible
Aperçu du formulaire de planning

On constate que le programme permet de visualiser, pour la semaine choisie, les interventions effectuées sur les machines.

Voici les objets nécessaires pour aboutir à ce résultat.

V. Les tables

V-A. Les tables du départ

V-A-1. T_Machine

Cette table sauvegarde les informations relatives aux machines.

Nom du champ

Type de données

Description

IDMachine

Entier long

Identifiant de la machine

NomMachine

Texte

Nom de la machine

Secteur

Entier long

Identifiant du secteur

V-A-2. T_Secteur

Cette table sauvegarde les données relatives aux secteurs.

Nom du champ

Type de données

Description

IDSecteur

Entier long

Identifiant du secteur

NomSecteur

Texte

Nom du secteur

V-B. La table servant à enregistrer les données relatives aux interventions

V-B-1. T_Intervention

Elle enregistre les interventions à intervalle régulier.

Nom du champ

Type de données

Description

IDIntervention

Entier long

Numéro d'ordre de l'intervention

DateIntervention

Date

Date de l'intervention

Machine

Entier long

Identifiant de la machine

Secteur

Entier long

Identifiant du secteur

Etat

Entier long

Identifiant de l'état de la machine: Prête ; En attente de pièces ; En cours ; Terminée

Recurrence

Entier long

Période de la récurrence: 2, 4, 5 ... jours

Report

vrai/faux

Indique si l'intervention est reportée

VI. La requête utilisée pour créer les récurrences

Afin de pouvoir programmer les interventions de même nature à intervalle régulier, on a besoin de réaliser une requête.

VI-A. R_Intervention

Cette requête est basée sur la table T_Intervention et classe les enregistrements par type d'intervention et par jour :

Code SQL de la requête
Sélectionnez

SELECT IntituleIntervention, Machine, DateIntervention, Etat, Secteur, Report, Recurrence
FROM T_Intervention
ORDER BY IntituleIntervention, Machine, DateIntervention;

VII. Les requêtes affichant les interventions pour chaque jour de la semaine

Afin de pouvoir afficher les interventions pour chacun des jours de la semaine, on a besoin de réaliser des requêtes paramétrées.

VII-A. R_InterventionsLundi

Cette requête paramétrée, basée sur la table T_Intervention, affiche les interventions du lundi

Code SQL de la requête
Sélectionnez

PARAMETERS [Forms]![F_Planning]![DateD] DateTime;
SELECT IDIntervention, IntituleIntervention, DateIntervention, Etat, Secteur, Machine, Recurrence, Report
FROM T_Intervention
WHERE (DateIntervention=[Forms]![F_Planning]![DateD]);
  • Forms!F_Planning!DateD: zone de texte au format date indiquant le début de la semaine.

Le champ DateIntervention doit être égal au paramètre Forms!F_Planning!DateD

VII-B. R_InterventionsMardi

Cette requête paramétrée, basée sur la table T_Intervention, affiche les interventions du mardi

Code SQL de la requête
Sélectionnez

PARAMETERS [Forms]![F_Planning]![DateD] DateTime;
SELECT IDIntervention, IntituleIntervention, DateIntervention, Etat, Secteur, Machine, Recurrence, Report
FROM T_Intervention
WHERE (DateIntervention=[Forms]![F_Planning]![DateD] + 1);
  • Forms!F_Planning!DateD: zone de texte au format date indiquant le début de la semaine.

Le champ DateIntervention doit être égal au paramètre Forms!F_Planning!DateD + 1.

Même principe pour les autres jours de la semaine.

VIII. Le formulaire de planning

Nous allons décrire le formulaire qui affiche les réservations de la semaine sur les différents onglets.

Image non disponible
Aperçu du formulaire de planning

On constate que le programme permet de visualiser, sur chaque onglet, les réservations du jour de la semaine.

VIII-A. Les sous-formulaires de planning

Sur les différents onglets du formulaire de planning se trouvent les sous-formulaires basés sur les requêtes paramétrées.

Ils contiennent les contrôles reliés aux champs de chacune des requêtes paramétrées.

VIII-A-1. Code sur l'événement après maj du sous-formulaire

Ce code lance la procédure de génération des interventions :

 
Sélectionnez

Private Sub Form_AfterUpdate()
GenererInterventions 

End Sub

VIII-A-2. Code sur l'événement après maj de la case à cocher Report

Ce code lance la procédure de report des interventions :

 
Sélectionnez

Private Sub Report_AfterUpdate()
Dim id As Long

   If (Me.Report = True) Then ' Si la case Report est cochée.
      If MsgBox("Souhaitez-vous reporter cette intervention ?", vbYesNo) = vbNo Then ' Si on répond non, on sort du code.
         Me.Undo
         Exit Sub
      End If
      ' Sinon on poursuit le code.
   Else
      Exit Sub
   End If

id = Nz(Me.IDIntervention, 0) ' On passe l'identifiant de la réservation en cours dans une variable.
Me.Requery ' Rafraîchit le sous-formulaire.

Me.Parent.CmdActualiser.SetFocus ' Passe le focus au formulaire principal F_Planning, bouton actualiser.

ReporterInterventions id ' Exécution de la procédure de report des interventions basées sur l'intervention en cours.

MajPlanning ' Met à jour le planning.

End Sub

IX. Les modules contenant les procédures de création des interventions

IX-A. La procédure de génération des interventions récurrentes

Pour créer les interventions périodiques, on a besoin d'écrire une procédure qui ajoute dans la table T_Intervention les bonnes dates pour chaque type d'intervention :

Code pour enregistrer les interventions périodiques
Sélectionnez

Public Sub GenererInterventions()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim n As Long, r As Long, dt As Date, IT As String
Dim s As Long, m As Long, e As Long

Set db = CurrentDb

' Ouverture du jeu d'enregistrements contenant la liste des interventions classées par nature et par date.
Set rs1 = db.OpenRecordset("R_Interventions")

' Ouverture de la table T_Intervention en vue d'ajouter de nouveaux enregistrements.
Set rs2 = db.OpenRecordset("T_Intervention", dbOpenDynaset)

Do Until rs1.EOF

' On enregistre les références de la 1re intervention dans des variables.
IT = rs1!IntituleIntervention
r = rs1!Recurrence ' période de la récurrence.
n = 10 ' nombre de récurrences.
m = rs1!Machine
s = rs1!Secteur
dt = rs1!DateIntervention
     
rs1.MoveNext
   
   If Not rs1.EOF Then
   
      Do While (IT = rs1!IntituleIntervention) And (m = rs1!Machine) ' on boucle sur les interventions ayant même intitulé et réalisées sur la même machine.
         
         dt = rs1!DateIntervention
         
            If Not(rs1!Etat = 4) Then ' si pas terminé
               n = n - 1 'on enlève une récurrence au total.
            End If
         
         rs1.MoveNext
         
            If (rs1.EOF) Or (n = 0) Then ' sortie.
               Exit Do
            End If
         
      Loop
      
   End If
   
   dt = dt + r
   
   Do While (n > 0) ' On boucle sur les récurrences restantes à ajouter dans la table.
   
      If (Not EstFerie(dt)) And Not(Weekday(dt) = 1) Then
   
         n = n - 1
         
         ' Ajout de l'intervention de même nature à cette date.
         rs2.AddNew
         rs2!IntituleIntervention = IT
         rs2!DateIntervention = dt
         rs2!Recurrence = r
         rs2!Etat = 1
         rs2!Machine = m
         rs2!Secteur = s
         rs2.Update
      
         dt = dt + r ' date de la prochaine récurrence.
      
      Else
      
         dt = dt + 1 ' jour suivant.
      
      End If
   
Loop

Loop

rs1.Close
Set rs1 = Nothing

rs2.Close
Set rs2 = Nothing

End Sub

IX-B. La procédure de report des interventions

Pour décaler les interventions, on a besoin d'écrire une procédure qui met à jour le champ DateIntervention dans la table T_Intervention :

Gros plan sur la procédure de report des interventions.

Code pour reporter des interventions
Sélectionnez

Public Sub ReporterInterventions(id As Long)
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim leSQL As String
Dim n As Long, r As Long, dt As Date, it As String, m As Long

Set db = CurrentDb

' Ouverture du jeu d'enregistrements contenant la 1re intervention faisant l'objet d'un report.
Set rs1 = db.OpenRecordset("select * from T_intervention where IDIntervention=" + ID)

   If Not rs1.EOF Then
      ' Sauvegarde des paramètres de l'intervention dans des variables.
      it = rs1!IntituleIntervention 
      dt = rs1!DateIntervention
      r = rs1!Recurrence
      m = rs1!Machine
            
      leSQL = "select * from T_Intervention " + _
              "where IntituleIntervention like '" + it + "' and Machine=" + CStr(m) + " and DateIntervention>#" + Format(dt, "mm/dd/yyyy") + "# " + _
              "order by DateIntervention asc;"
      
      ' Ouverture du jeu d'enregistrements contenant la liste des interventions de même nature classées par date.
      ' Ces interventions doivent être reportées.
      Set rs2 = db.OpenRecordset(leSQL, dbOpenDynaset) 
   
      dt = dt + 1
   
      Do Until (Not EstFerie(dt)) And Not (Weekday(dt) = 1) ' On incrémente la date jusqu'à trouver un jour ouvré.
         dt = dt + 1
      Loop
         
      rs1.Edit
      rs1!DateIntervention = dt ' mise à jour de la date d'intervention en fonction du décalage.
      rs1.Update
         
      dt = dt + r ' prochaine date.
         
      Do Until rs2.EOF
   
         If (Not EstFerie(dt)) And not (Weekday(dt) = 1) Then
      
            rs2.Edit
            rs2!DateIntervention = dt ' mise à jour de la date d'intervention en fonction du décalage.
            rs2!Report = True
            rs2.Update
            
            rs2.MoveNext
            dt = dt + r
            
         Else
         
            dt = dt + 1
            
         End If
      
      
      Loop
      
      rs2.Close
      Set rs2 = Nothing
      
   End If

rs1.Close
Set rs1 = Nothing

End Sub

X. Téléchargement

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

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

La base exemplegenerer_interventions.zip est au format Access 2000.

Un autre exemple basé sur le même principe.

Gestion de préventivesgenerer_preventives.zip

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

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

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. Droits de diffusion permanents accordés à Developpez LLC.