Calendrier pour gérer les rendez-vous

Calendrier des rendez-vous dans un formulaire Access.

Niveau requis : intermédiaire.

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

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Sur le forum Access de nombreuses questions sont relatives à la planification.

Voici donc un nouveau cas relativement simple de planification de rendez-vous mensuels des patients dans un cabinet médical, facile à adapter à vos besoins :

Nous considérons des horaires journaliers qui s'étalent de 08:00 à 18:00 avec des créneaux horaires de 15 minutes.

Ce calendrier se composera de 6x7 zones de listes (1 zone de liste par jour, sur 42 jours), chaque zone de liste contenant donc les RDV pour un jour donné. Au-dessus de chaque zone de liste, on disposera d'une liste déroulante pour choisir l'horaire du rendez-vous à ajouter.

En plus du numéro du patient, il nous faudra aussi sauvegarder dans une table la date du jour et l'horaire de début et de fin du rendez-vous. Ainsi le mieux sera de considérer l'horaire de début et l'horaire de fin du RDV comme des champs au format date générale (Date/Heure).

En outre, pour simplifier la saisie des rendez-vous, il devra être possible de choisir l'horaire et donc d'ajouter un RDV par un simple clic sur les listes déroulantes situées au-dessus des zones de listes contenant la liste des RDV des jours.

Enfin, pour faciliter son développement et assurer sa portabilité, l'application n'utilisera pas de composants externes à Access (ActiveX ou autre).

II. Rendu final de l'application

Voici le rendu du calendrier mensuel qui présente les rendez-vous des patients sur 6x7 zones de listes, soit sur 42 jours (6 semaines). Un simple clic sur un créneau horaire situé dans une des listes déroulantes ouvre le formulaire des rendez-vous pour la consultation ou la saisie.

Image non disponible
Aperçu du calendrier mensuel.

Un double-clic sur un rendez-vous dans une des zones de listes ouvre le formulaire des rendez-vous pour la consultation ou la saisie.

Image non disponible
Aperçu du formulaire F_RendezVous ouvert sur le calendrier des rendez-vous.

III. Les tables nécessaires

Nous allons tout d'abord définir les tables et les champs qui contiendront les données :

L'application réduite au maximum se contentera de 3 tables, la table T_Horaire, la table T_RendezVous et la table T_Patient.

III-A. La table "T_Horaire"

la table contient la liste des horaires journaliers.

Nom du champ Type de données Description
Horaire Texte Horaire des rendez-vous de 08 heures à 18 heures

III-B. La table "T_RendezVous"

Elle sert à enregistrer les rendez-vous des patients.

Nom du champ Type de données Description
NR Numéro auto Numéro d'ordre du rendez-vous.
NP Entier long Numéro d'ordre du patient ayant le RDV.
HoraireDebut Date/Heure Jour et horaire de début du RDV.
HoraireFin Date/Heure Jour et horaire de fin du RDV.
Memo Mémo Note ou commentaire du médecin sur le patient.

III-C. La table "T_Patient"

Elle contient les informations relatives aux patients.

Nom du champ Type de données Description
NP Numéro Auto Numéro d'ordre du patient.
Nom Texte Nom du patient.
Prénom Texte Prénom du patient.
DNaiss Date Date de naissance.
Rue Mémo Rue de la ville où réside le patient.
CP Texte Code postal de la ville où réside le patient.
Ville Texte Ville où réside le patient.
Tel Texte Téléphone du patient.
Email Texte Email.

Dans notre cas, seuls les 2 premiers champs de la table sont indispensables

IV. Les requêtes

Pour pouvoir afficher la liste des horaires et des RDV dans les listes déroulantes du calendrier, il nous faut créer une requête R_HoraireRDV3 : Pour cela on va d'abord créer les 2 sous-requêtes R_HoraireRDV1 et R_HoraireRDV2. La 3ème requête étant basée sur la 2ème requête, elle-même basée sur la 1ère.

IV-A. La requête "R_HoraireRDV1"

Cette requête sélectionne la liste des horaires de début et de fin, ainsi que les noms des patients pour les rendez-vous du jour choisi sur le formulaire F_Calendrier : Elle a donc comme paramètre la zone de texte Jour du calendrier (Forms!F_Calendrier!Jour).

Image non disponible
Aperçu de la requête R_HoraireRDV1 en mode création.

Par exemple, pour un jour donné, s'il y a un seul RDV du patient DUPONT de 10h à 10h45, elle va afficher :

HoraireD HoraireF RDV
10:00 10:45 DUPONT

IV-B. La requête "R_HoraireRDV2"

Cette requête, basée sur la table T_Horaire et la requête précédente, affiche tous les creneaux horaires, ainsi que les noms des patients pour les rendez-vous du jour choisi sur le formulaire F_Calendrier.

Image non disponible
Aperçu de la requête R_HoraireRDV2 en mode création.

Par exemple, pour un jour donné, s'il y a un seul RDV du patient DUPONT de 10h à 10h45, elle va afficher :

Horaire RDV
10:00 DUPONT
10:15 DUPONT
10:30 DUPONT

IV-C. La requête "R_HoraireRDV3"

Cette requête, basée sur la table T_Horaire et la requête précédente, affiche tous les horaires du jour choisi, accompagnés du nom du patient s'il y a un RDV : On effectue une jointure gauche entre la table T_Horaire et la requête R_HoraireRDV2 pour avoir tous les horaires du jour. Cette requête sera affectée à la propriété Contenu des listes déroulantes du calendrier.

Image non disponible
Aperçu de la requête R_HoraireRDV3 en mode création.

Par exemple, pour un seul RDV (dans la journée) du patient DUPONT de 10h à 10h45, elle va afficher :

Horaire RDV
08:00  
.. ..
10:00 DUPONT
10:15 DUPONT
10:30 DUPONT
.. ..
17:45  

V. Les formulaires

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

V-A. Le formulaire "F_Calendrier"

Il contient le tableau des zones de listes (6x7) et des listes déroulantes (6x7), plus les boutons de commande pour avancer ou reculer d'un mois et 2 listes déroulantes pour choisir le mois et l'année.

Ces contrôles sont créés manuellement dans le formulaire en mode création.

Image non disponible
Aperçu du formulaire F_Calendrier en mode création.

V-A-1. La liste déroulante "Mois"

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner un mois, et ainsi pour afficher le calendrier du mois choisi.

V-A-1-a. La procédure évènementielle sur AfterUpdate

Cette procédure s'exécute quand on choisit un mois dans la liste déroulante : Elle permet d'afficher le calendrier du mois choisi.

 
Sélectionnez

Private Sub Mois_AfterUpdate()
' Premier jour du calendrier.
DateDebut = DebutSemaine(DateSerial(Me.Année, Me.Mois.ListIndex + 1, 1))
   
' Mise à jour du calendrier.
MajCalendrier

End Sub

V-A-2. La liste déroulante "Année"

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner une année, et ainsi pour afficher le calendrier du mois et de l'année choisis.

V-A-2-a. La procédure évènementielle sur AfterUpdate

Cette procédure s'exécute quand on choisit une année dans la liste déroulante : Elle permet d'afficher le calendrier du mois et de l'année choisis.

 
Sélectionnez

Private Sub Année_AfterUpdate()
' Premier jour du calendrier.
DateDebut = DebutSemaine(DateSerial(Me.Année, Me.Mois.ListIndex + 1, 1))
   
' Mise à jour du calendrier.
MajCalendrier

End Sub

V-A-3. Les boutons de déplacement "CmdPrecedent" et "CmdSuivant"

Ces boutons de commande situés en haut à droite permettent d'avancer ou de reculer d'un mois sur le calendrier.

V-A-3-a. La procédure évènementielle sur clic du bouton "CmdPrecedent"

Ce code permet de reculer d'un mois et de mettre à jour le calendrier.

 
Sélectionnez

Private Sub CmdPrecedent_Click()
' Recule d'1 mois sur le calendrier.

   If (Me!Mois.ListIndex > 0) Then ' Si le mois est supérieur à 1 (Janvier),
      Me.Mois = Me.Mois.ItemData(Me!Mois.ListIndex - 1) ' on affiche le mois précédent.
      
   Else
      Me.Mois = Me.Mois.ItemData(11) ' Sinon on affiche le dernier mois
      Me.Année = Me.Année - 1 ' et l'année précédente.
      
   End If

' Premier jour du calendrier.
DateDebut = DebutSemaine(DateSerial(Me.Année, Me.Mois.ListIndex + 1, 1))
   
' Mise à jour du calendrier.
MajCalendrier

End Sub

V-A-3-b. La procédure évènementielle sur clic du bouton "CmdSuivant"

Ce code permet d'avancer d'un mois et de mettre à jour le calendrier.

 
Sélectionnez

Private Sub CmdSuivant_Click()
' Avance d'1 mois sur le calendrier.

   If (Me!Mois.ListIndex < 11) Then ' Si le mois est inférieur à 12 (Décembre),
      Me.Mois = Me.Mois.ItemData(Me!Mois.ListIndex + 1) ' on affiche le mois suivant.
      
   Else
      Me.Mois = Me.Mois.ItemData(0) ' Sinon on affiche le premier mois
      Me.Année = Me.Année + 1 ' et l'année suivante.
   End If

' Premier jour du calendrier.
DateDebut = DebutSemaine(DateSerial(Me.Année, Me.Mois.ListIndex + 1, 1))

' Met à jour le calendrier.   
MajCalendrier

End Sub

V-A-4. Les listes déroulantes "Jour.."

Ces 6*7 listes affichent les horaires et leur rendez-vous éventuel pour les 42 jours du calendrier. Elles permettent de choisir un horaire disponible pour la saisie d'un RDV.

V-A-4-a. La procédure "MajHorairesJour" sur l'évènement réception focus

Elle met à jour la liste déroulante qui reçoit le focus et qui affiche tous les horaires et les rendez-vous du jour choisi :

 
Sélectionnez

Public Sub MajHorairesJour(i As Byte)
Me!Jour = DateDebut + (i - 1) ' affecte à la zone de texte Jour,
                              ' le jour correspondant à la liste déroulante choisie.

Me("Jour" & i).RowSource = "R_HoraireRDV3" ' affecte la requête source de la liste déroulante.
End Sub

Ensuite, sur l'évènement réception focus d'une zone de liste déroulante, par exemple la première (Jour1), on appelle la procédure MajHorairesJour(1) :

 
Sélectionnez

Private Sub Jour1_GotFocus()
MajHorairesJour (1)
End Sub

V-A-4-b. La procédure "OuvrirFormRendezVous" sur l'évènement clic

Pour ajouter un rendez-vous, on souhaite, après avoir choisi un horaire disponible dans une liste déroulante, pouvoir ouvrir le formulaire F_RendezVous. Pour ce faire, on crée une procédure qui s'exécute sur l'évènement clic de la liste :

 
Sélectionnez

Public Sub OuvrirFormRendezVous(i As Integer)
' Ouvre le formulaire F_RendezVous sur un clic dans une liste déroulante du calendrier.
' Prend en arguments les indices de ligne et de colonne.

Dim DateC As Date ' Jour et Horaire choisis.
Dim db As DAO.Database
Dim LeSql As String
Dim rsRdV As DAO.Recordset

   If (Me("Jour" & i).Value <> "") Then ' Si la liste déroulante n'est pas vide.
   
   ' On évalue la date générale correspondant au jour et à l'horaire choisis dans la liste.
   DateC = IndicesToHoraire(i, Me("Jour" & i).ListIndex + 1) 
   
   Set db = CurrentDb
     
   ' Puis on sélectionne dans un recordset le rendez-vous correspondant au créneau choisi par
   ' un simple clic.
   
   LeSql = "SELECT T_RendezVous.* " & _
   "FROM T_RendezVous " & _
   "WHERE T_RendezVous.HoraireDebut<=" & FormatDateUS(DateC) & _ 
                                     " And T_RendezVous.HoraireFin>" & FormatDateUS(DateC)
   
    Set rsRdV = db.OpenRecordset(LeSql, dbOpenForwardOnly)
                    
    ' s'il y a un RDV, alors copier dans la variable DateC l'horaire de début du RDV.

       If Not (rsRdV.EOF) Then DateC = rsRdV!HoraireDebut
   
    ' Ouvre le formulaire F_RendezVous sur l'horaire choisi.
    DoCmd.OpenForm "F_RendezVous", , , "HoraireDebut=" & FormatDateUS(DateC)
    
    Forms!F_RendezVous!Indice = i
    
    Forms!F_RendezVous!DateRdV = DateC
    
    ' Met à jour les horaires de début et de fin sur le formulaire. 
    Forms!F_RendezVous!HoraireD = Format(DateC, "hh:nn")
   
       If Not (rsRdV.EOF) Then
          Forms!F_RendezVous!HoraireF = Format(rsRdV!HoraireFin, "hh:nn")
       Else
          Forms!F_RendezVous!HoraireF = Format(DateAdd("n", 30, DateC), "hh:nn")
       End If
         
    rsRdV.Close
    Set rsRdV = Nothing
    
    Set db = Nothing
	   
    End If
   
Me("Jour" & i).Value = Format(Me!Jour, "dd mmmm yyyy")
   
End Sub

Ensuite, sur l'évènement clic d'une liste déroulante, par exemple la première (Jour1), on appelle la procédure OuvrirFormRendezVous(1) :

 
Sélectionnez

Private Sub Jour1_Click()
OuvrirFormRendezVous (1)
End Sub

V-A-5. Les zones de liste "Agenda.."

Ces 6*7 listes affichent les rendez-vous pour chacun des 42 jours du calendrier. Elles permettent de choisir un RDV pour afficher son détail.

V-A-5-a. La procédure "OuvrirFormRendezVous2" sur l'évènement double-clic

Pour consulter un rendez-vous, on souhaite, en double-cliquant sur un horaire dans une zone de liste, pouvoir ouvrir le formulaire F_RendezVous. Pour ce faire, on crée une procédure qui s'exécute sur l'évènement double-clic de la liste :

 
Sélectionnez

Public Sub OuvrirFormRendezVous2(i As Integer)
' Ouvre le formulaire F_RendezVous sur un double-clic dans une zone de liste du calendrier.
' Prend en arguments les indices de ligne et de colonne.

Dim DateC As Date ' Jour et Horaire choisis.
Dim db As DAO.Database
Dim sql1 As String
Dim recRV As DAO.Recordset
   
   If (Me("Agenda" & i).Value <> "") Then  Si la zone de liste n'est pas vide.
     
   ' On évalue la date générale correspondant au jour et à l'horaire choisis dans la liste.
   DateC = HoraireDuJour(i, Me("Agenda" & i).Value)
   
   Set db = CurrentDb
     
   ' Puis on sélectionne dans un recordset le rendez-vous correspondant au créneau choisi par
   ' un double-clic.
   
   LeSql = "SELECT T_RendezVous.* " & _
   "FROM T_RendezVous " & _
   "WHERE T_RendezVous.HoraireDebut<=" & FormatDateUS(DateC) & _ 
                                     " And T_RendezVous.HoraireFin>" & FormatDateUS(DateC)
   
    Set rsRdV = db.OpenRecordset(LeSql, dbOpenForwardOnly)
                    
    ' S'il y a un RDV, alors copier dans la variable DateC l'horaire de début du RDV.

       If Not (rsRdV.EOF) Then DateC = rsRdV!HoraireDebut
   
    ' Ouvre le formulaire F_RendezVous sur l'horaire choisi.
    DoCmd.OpenForm "F_RendezVous", , , "HoraireDebut=" & FormatDateUS(DateC)
    
    Forms!F_RendezVous!Indice = i
    
    Forms!F_RendezVous!DateRdV = DateC
    Forms!F_RendezVous!HoraireD = Format(DateC, "hh:nn")
   
       If Not (rsRdV.EOF) Then
          Forms!F_RendezVous!HoraireF = Format(rsRdV!HoraireFin, "hh:nn")
       Else
          Forms!F_RendezVous!HoraireF = Format(DateAdd("n", 30, DateC), "hh:nn")
       End If
         
    rsRdV.Close
    Set rsRdV = Nothing
    
    Set db = Nothing
    
    End If
   
   
End Sub

Et après, sur l'évènement double-clic d'une zone de liste, par exemple la première (Agenda1), on appelle la procédure OuvrirFormRendezVous2(1) :

 
Sélectionnez

Private Sub Agenda1_DblClick(Cancel As Integer)
OuvrirFormRendezVous2 (1)
End Sub

V-B. Le formulaire "F_RendezVous"

Il permet d'ajouter, de modifier ou de supprimer un rendez-vous. Ce formulaire s'ouvre sur l'évènement clic des zones de listes du calendrier (F_Calendrier). Il a pour source de données la table T_RendesVous.

Image non disponible
Aperçu du formulaire

V-B-1. La liste déroulante "NP"

Cette liste permet de choisir un patient pour le rendez-vous. Elle est liée au champ NP de la table source T_RendezVous, relié lui-même au champ NP de la table T_Patient. Elle affiche la liste des noms de patients et leur numéro dans l'ordre croissant des noms. Pour ce faire, sa propriété Contenu contient le code SQL :

 
Sélectionnez

SELECT Nom, NP 
FROM T_Patient 
ORDER BY Nom;

Cette liste comporte donc 2 colonnes et sa colonne liée est la numéro 2 (pour le champ NP).

Image non disponible
Aperçu en mode création des propriétés de la liste NP

Si le nom du patient saisi n'est pas présent dans la liste, on doit pouvoir proposer à l'utilisateur de l'ajouter. Sur l'évènement absence dans liste on va donc mettre le code suivant inspiré de celui de la faqfaq :

 
Sélectionnez

Private Sub NP_NotInList(NewData As String, Response As Integer)
' Si le patient n'est pas dans la liste alors on propose de l'ajouter.
  
  If MsgBox("Voulez-vous ajouter " & NewData & " à la liste des patients ?", _
                       vbYesNo + vbQuestion + vbDefaultButton2, "Ajout") = vbYes Then
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO T_Patient ( Nom ) SELECT """ & NewData & """;"
        DoCmd.SetWarnings True
        Response = acDataErrAdded
    Else
        Response = acDataErrContinue
        NP.Undo
    End If

End Sub

V-B-2. Le sous-formulaire "SF_Patient"

Ce sous-formulaire, contenu dans le formulaire F_RendezVous, permet d'afficher la signalétique du patient sélectionné dans la liste NP. Sa source de données est la table T_Patient et il est synchronisé avec son formulaire principal (F_RendezVous) sur le champ NP : Les propriétés champs fils et champs pères du contrôle sous-formulaire sont égales à NP.

Image non disponible
Aperçu en mode création des propriétés du contrôle du sous-formulaire

V-B-3. Le bouton de commande "CmdValider"

Il sert à valider la saisie.

V-B-3-a. La procédure évènementielle sur clic

Une fois que les choix ont été effectués sur le formulaire, il faut les valider : Si les horaires sélectionnés chevauchent d'autres RDV, ou que les zones de texte NP ou Memo sont vides alors l'utilisateur est invité à corriger sa saisie. Sur l'évènement clic du bouton de commande CmdValider, on a donc :

 
Sélectionnez

Private Sub CmdValider_Click()
' Valide les choix effectués sur le formulaire F_RendezVous.

Dim db As DAO.Database
Dim LeSql As String, HD As Date, HF As Date, DateC As Date
Dim rsRdV As DAO.Recordset

DateC = CDate(Me!DateRdV)

' Si les zones de texte NP ou Memo ne sont pas vides.

   If ((Me!NP <> "") And Not IsNull(Me!NP)) Or _
      ((Me!Memo <> "") And Not IsNull(Me!Memo)) Then
   HD = CDate(Format(Me!DateRdV, "dd/mm/yy ") & Me!HoraireD)
   HF = CDate(Format(Me!DateRdV, "dd/mm/yy ") & Me!HoraireF)
   
   Set db = CurrentDb
      
' On recherche des RDV dont les horaires de début et de fin chevauchent les
' horaires choisis sur le formulaire.
      
   LeSql = "SELECT * " & _
   "FROM T_RendezVous " & _
   "WHERE (HoraireDebut<>" & FormatDateUS(DateC) & ") And HoraireDebut<" & FormatDateUS(HF) & _ 
                                                      " And HoraireFin>" & FormatDateUS(HD)
   
   Set rsRdV = db.OpenRecordset(LeSql, dbOpenForwardOnly)
      
      If (Format(HF, "hh:nn") <= "18:00") And (HD < HF) Then
      
' si aucun RDV n'a été trouvé, la plage horaire est donc disponible et on peut
' enregistrer le RDV.
      
         If rsRdV.EOF Then
         Me!HoraireDebut = HD
         Me!HoraireFin = HF
         Me.Requery ' Actualise le formulaire.
         
         ' Actualise les listes correspondantes sur le calendrier.
         Forms!F_Calendrier("Agenda" & Me!Indice).Requery
         Forms!F_Calendrier("Jour" & Me!Indice).Requery
    
         DoCmd.Close
      
         Else
         MsgBox ("Saisie incorrecte !")
      
         End If
             
      Else
      MsgBox ("Saisie incorrecte !")
             
      End If
   
   rsRdV.Close
   Set rsRdV = Nothing
   
   Set db = Nothing
    
   Else
   MsgBox ("Saisie incorrecte !")
   End If

End Sub

VI. Le module "M_Calendrier" de l'application

Enfin nous présentons le module de l'application.

VI-A. Description de quelques routines

Quelques routines utilisant les fonctions Date et Heurefonctions Date et Heure :

 
Sélectionnez

Option Compare Database
Option Explicit

' Dans la partie déclaration du module on définit la date du 1er jour du calendrier.

Public DateDebut As Date

' Les fonctions du module.

Public Function FormatDateUS(laDate As Date) As String
' Formate la date passée en argument en date US.

FormatDateUS = Chr(35) & Format(laDate, "m-d-yy hh:nn:ss") & Chr(35)  ' Date au format US.
End Function

Private Function EstWeek(laDate As Date)
EstWeek = ((WeekDay(laDate) > 1) And (WeekDay(laDate) < 7)) ' est un jour différent du week-end.
End Function

Function DebutSemaine(ByVal DateSemaine As Date) As Date
' Prend en argument un jour donné dans la semaine
' et renvoie la date du premier jour de cette semaine.

Dim i As Integer
i = WeekDay(DateSemaine, vbMonday)
DebutSemaine = DateAdd("d", -i + 1, DateSemaine)
End Function

Function DebutCalendrier(ByVal DateJ As Date) As Date
' Prend en argument un jour donné dans le mois
' et renvoie la date du premier jour du calendrier du mois.

DebutCalendrier = DebutSemaine(DateSerial(Year(DateJ), Month(DateJ), 1))

End Function

Public Function IndicesToHoraire(ByVal J As Integer, ByVal l As Integer) As Date
' La fonction IndicesToHoraire prend en arguments les indices de ligne (horaire) et
' de colonne (jour) sur le Calendrier et renvoie l'horaire correspondant.

Dim DateC As Date
Dim h As Integer
Dim m As Integer

DateC = DateAdd("d", (J - 1), DateDebut)

h = (8) ' prévoir 8 heures pour le premier horaire.
m = (h * 60) + 15 * (l - 1)

DateC = DateAdd("n", m, DateC)

IndicesToHoraire = DateC

End Function

Public Function HoraireDuJour(J As Integer, h As String) As Date
' La fonction HoraireDuJour prend en argument l'indice du jour sélectionné sur le Calendrier et
' l'horaire choisi dans la liste agenda et renvoie l'horaire général correspondant.

Dim DateC As Date

' Donne la date et l'heure correspondant à la ligne choisie sur la liste agenda.

DateC = DateDebut + (J - 1)
DateC = CDate(Format(DateC, "dd/mm/yyyy ") & h)

HoraireDuJour = DateC

End Function

VI-B. La procédure "MajCalendrier"

Pour mettre à jour le calendrier après avoir choisi un mois et une année sur les listes du même nom, on doit créer une procédure d'affichage des rendez-vous dans les zones de liste du calendrier, en fonction de la date de début contenue dans ce contrôle : La procédure doit sélectionner, pour chaque zone de liste Agenda, les RDV compris entre la date courante (DateC) et la date courante + 1 jour (DateC+1) et mettre à jour la liste en question. La date courante parcourt les jours du calendrier du 1er au 42ème jour.

 
Sélectionnez

Public Sub MajCalendrier()
' La procédure d'affichage des rendez-vous dans les zones de liste du calendrier 
' en fonction de la date de début:
' La procédure sélectionne, pour chaque liste agenda, les RDV compris entre la 
' date courante (DateC) et la date courante + 1 jours (DateC+1), et met à jour la liste.

Dim i As Integer
Dim DateC As Date ' Variable pour parcourir les jours du calendrier.
Dim LeSql As String
Dim m As Integer ' Variable qui indique le mois.
Dim a As Integer ' Variable qui indique l'année.

DateC = DateDebut

Forms!F_Calendrier!Titre.Caption = "CALENDRIER DU MOIS DE " & UCase(Forms!F_Calendrier!Mois) & _ 
                                   " " & Forms!F_Calendrier!Année

m = Forms!F_Calendrier!Mois.ListIndex + 1 ' Mois de la date courante.
a = Forms!F_Calendrier!Année.Value ' Année de la date courante.

For i = 1 To 42 ' 42 jours sur le Calendrier.
' Affiche les jours du Calendrier.
Forms!F_Calendrier("Jour" & i).Value = Format(DateC, "dd mmmm yyyy") 

' Prépare le sql destiné aux listes agenda.
LeSql = "SELECT Format(HoraireDebut,'hh:nn'),Format(HoraireFin,'hh:nn'), " & _
                "IIf(Not IsNull(T_RendezVous.[NP]),T_Patient.Nom,'Autre') As RDV " & _
"FROM T_RendezVous LEFT JOIN T_Patient ON T_RendezVous.NP = T_Patient.NP " & _
"WHERE T_RendezVous.HoraireDebut between " & FormatDateUS(DateC) & " And " & _ 
                                             FormatDateUS(DateC + 1) & _
" ORDER BY T_RendezVous.HoraireDebut;"

   If (m = Month(DateC)) And (a = Year(DateC)) Then
   ' Si la date courante est dans le mois en cours. 
      Forms!F_Calendrier("Jour" & i).Enabled = True ' On active les listes.
      Forms!F_Calendrier("Agenda" & i).Enabled = True
      
   Else
      Forms!F_Calendrier("Jour" & i).Enabled = False ' Sinon on désactive les listes.
      Forms!F_Calendrier("Agenda" & i).Enabled = False
         
   End If
   
Forms!F_Calendrier("Agenda" & i).RowSource = LeSql ' Affecte le code sql à la liste d'indice i.
   
DateC = DateC + 1 ' Passe au jour suivant.
Next i

End Sub

VII. Les applications à télécharger

La base exemple n°1calendrier_med v1 est au format Access 2000.

La base exemple n°2calendrier_med v2 est au format Access 2000, elle prend en compte les congés et jours fériés.

La base exemple n°3calendrier_med v3 est au format Access 2000, elle n'utilise pas DAO (Data Access Objects) et prend aussi en compte les congés et jours fériés.

VIII. Remerciements

Je tiens à remercier Arkham46, jeannot45 et toute l'équipe Office pour m'avoir guidé dans la réalisation de cette article, ainsi que jacques_jean pour sa relecture.

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

  

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