Académique Documents
Professionnel Documents
Culture Documents
Tutoriels VB
Tutoriels VB
Calendrier des rendez-vous dans un formulaire Access. Niveau requis : intermdiaire. Commentez cet article :
I - Introduction..............................................................................................................................................................3 II - Rendu final de l'application....................................................................................................................................3 III - Les tables ncessaires......................................................................................................................................... 4 III-A - La table "T_Horaire".....................................................................................................................................4 III-B - La table "T_RendezVous"............................................................................................................................ 4 III-C - La table "T_Patient"..................................................................................................................................... 5 IV - Les requtes......................................................................................................................................................... 5 IV-A - La requte "R_HoraireRDV1"...................................................................................................................... 5 IV-B - La requte "R_HoraireRDV2"...................................................................................................................... 6 IV-C - La requte "R_HoraireRDV3"......................................................................................................................7 V - Les formulaires...................................................................................................................................................... 7 V-A - Le formulaire "F_Calendrier"........................................................................................................................ 7 V-A-1 - La liste droulante "Mois".................................................................................................................... 8 V-A-1-a - La procdure vnementielle sur AfterUpdate............................................................................8 V-A-2 - La liste droulante "Anne"................................................................................................................. 8 V-A-2-a - La procdure vnementielle sur AfterUpdate............................................................................8 V-A-3 - Les boutons de dplacement "CmdPrecedent" et "CmdSuivant"........................................................ 9 V-A-3-a - La procdure vnementielle sur clic du bouton "CmdPrecedent"............................................. 9 V-A-3-b - La procdure vnementielle sur clic du bouton "CmdSuivant"..................................................9 V-A-4 - Les listes droulantes "Jour.."............................................................................................................10 V-A-4-a - La procdure "MajHorairesJour" sur l'vnement rception focus............................................10 V-A-4-b - La procdure "OuvrirFormRendezVous" sur l'vnement clic...................................................10 V-A-5 - Les zones de liste "Agenda.."............................................................................................................11 V-A-5-a - La procdure "OuvrirFormRendezVous2" sur l'vnement double-clic..................................... 11 V-B - Le formulaire "F_RendezVous"...................................................................................................................12 V-B-1 - La liste droulante "NP".....................................................................................................................13 V-B-2 - Le sous-formulaire "SF_Patient"........................................................................................................ 14 V-B-3 - Le bouton de commande "CmdValider".............................................................................................14 V-B-3-a - La procdure vnementielle sur clic........................................................................................14 VI - Le module "M_Calendrier" de l'application.........................................................................................................15 VI-A - Description de quelques routines.............................................................................................................. 15 VI-B - La procdure "MajCalendrier"................................................................................................................... 16 VII - Les applications tlcharger.......................................................................................................................... 17 VIII - Remerciements................................................................................................................................................. 17
-2Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
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 mdical, facile adapter vos besoins : Nous considrons des horaires journaliers qui s'talent de 08:00 18:00 avec des crneaux 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 droulante pour choisir l'horaire du rendez-vous ajouter. En plus du numro du patient, il nous faudra aussi sauvegarder dans une table la date du jour et l'horaire de dbut et de fin du rendez-vous. Ainsi le mieux sera de considrer l'horaire de dbut et l'horaire de fin du RDV comme des champs au format date gnrale (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 droulantes situes au-dessus des zones de listes contenant la liste des RDV des jours. Enfin, pour faciliter son dveloppement et assurer sa portabilit, l'application n'utilisera pas de composants externes Access (ActiveX ou autre).
-3Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
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.
Texte
-4Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
NR NP
Nom du champ
Description Numro d'ordre du rendezvous. Numro d'ordre du patient ayant le RDV. Jour et horaire de dbut du RDV. Jour et horaire de fin du RDV. Note ou commentaire du mdecin sur le patient.
Dans notre cas, seuls les 2 premiers champs de la table sont indispensables
IV - Les requtes
Pour pouvoir afficher la liste des horaires et des RDV dans les listes droulantes du calendrier, il nous faut crer une requte R_HoraireRDV3 : Pour cela on va d'abord crer les 2 sous-requtes R_HoraireRDV1 et R_HoraireRDV2. La 3me requte tant base sur la 2me requte, elle-mme base sur la 1re.
-5Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Aperu de la requte R_HoraireRDV1 en mode cration. Par exemple, pour un jour donn, s'il y a un seul RDV du patient DUPONT de 10h 10h45, elle va afficher : HoraireDHoraireF RDV 10:00 10:45 DUPONT
Aperu de la requte R_HoraireRDV2 en mode cration. Par exemple, pour un jour donn, s'il y a un seul RDV du patient DUPONT de 10h 10h45, elle va afficher : Horaire 10:00 10:15 10:30 RDV DUPONT DUPONT DUPONT
-6Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Aperu de la requte R_HoraireRDV3 en mode cration. Par exemple, pour un seul RDV (dans la journe) du patient DUPONT de 10h 10h45, elle va afficher : Horaire 08:00 .. 10:00 10:15 10:30 .. 17:45 RDV .. DUPONT DUPONT DUPONT ..
V - Les formulaires
La troisime tape consiste crer les formulaires.
-7Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
-8Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Private Sub Anne_AfterUpdate() ' Premier jour du calendrier. DateDebut = DebutSemaine(DateSerial(Me.Anne, Me.Mois.ListIndex + 1, 1)) ' Mise jour du calendrier. MajCalendrier End Sub
-9Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Ensuite, sur l'vnement rception focus d'une zone de liste droulante, par exemple la premire (Jour1), on appelle la procdure MajHorairesJour(1) :
Private Sub Jour1_GotFocus() MajHorairesJour (1) End Sub
If (Me("Jour" & i).Value <> "") Then ' Si la liste droulante n'est pas vide. ' On value la date gnrale correspondant au jour et l'horaire choisis dans la liste. DateC = IndicesToHoraire(i, Me("Jour" & i).ListIndex + 1) Set db = CurrentDb ' Puis on slectionne dans un recordset le rendez-vous correspondant au crneau 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 dbut 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) - 10 Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Forms!F_RendezVous!Indice = i Forms!F_RendezVous!DateRdV = DateC ' Met jour les horaires de dbut 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'vnement clic d'une liste droulante, par exemple la premire (Jour1), on appelle la procdure OuvrirFormRendezVous(1) :
Private Sub Jour1_Click() OuvrirFormRendezVous (1) End Sub
' On value la date gnrale correspondant au jour et l'horaire choisis dans la liste. DateC = HoraireDuJour(i, Me("Agenda" & i).Value) Set db = CurrentDb ' Puis on slectionne dans un recordset le rendez-vous correspondant au crneau choisi par ' un double-clic. LeSql = "SELECT T_RendezVous.* " & _ "FROM T_RendezVous " & _ - 11 Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Calendrier pour grer les rendez-vous par Denis Hulo "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 dbut 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 aprs, sur l'vnement double-clic d'une zone de liste, par exemple la premire (Agenda1), on appelle la procdure OuvrirFormRendezVous2(1) :
Private Sub Agenda1_DblClick(Cancel As Integer) OuvrirFormRendezVous2 (1) End Sub
Aperu du formulaire
- 12 Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Cette liste comporte donc 2 colonnes et sa colonne lie est la numro 2 (pour le champ NP).
Aperu en mode cration des proprits de la liste NP Si le nom du patient saisi n'est pas prsent dans la liste, on doit pouvoir proposer l'utilisateur de l'ajouter. Sur l'vnement absence dans liste on va donc mettre le code suivant inspir de celui de la faq :
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
- 13 Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
' On recherche des RDV dont les horaires de dbut 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
Calendrier pour grer les rendez-vous par Denis Hulo ' Formate la date passe en argument en date US. FormatDateUS = Chr(35) & Format(laDate, "m-d-yy hh:nn:ss") & Chr(35) End Function ' Date au format US.
Private Function EstWeek(laDate As Date) EstWeek = ((WeekDay(laDate) > 1) And (WeekDay(laDate) < 7)) ' est un jour diffrent 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) ' prvoir 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 slectionn sur le Calendrier et ' l'horaire choisi dans la liste agenda et renvoie l'horaire gnral 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
- 16 Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/
Public Sub MajCalendrier() ' La procdure d'affichage des rendez-vous dans les zones de liste du calendrier ' en fonction de la date de dbut: ' La procdure slectionne, 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 Dim Dim Dim Dim i As Integer DateC As Date ' Variable pour parcourir les jours du calendrier. LeSql As String m As Integer ' Variable qui indique le mois. a As Integer ' Variable qui indique l'anne.
DateC = DateDebut Forms!F_Calendrier!Titre.Caption = "CALENDRIER DU MOIS DE " & UCase(Forms!F_Calendrier!Mois) & _ " " & Forms!F_Calendrier!Anne m = Forms!F_Calendrier!Mois.ListIndex + 1 ' Mois de la date courante. a = Forms!F_Calendrier!Anne.Value ' Anne 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") ' Prpare 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 "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 = ' Si la date courante est dans Forms!F_Calendrier("Jour" & Forms!F_Calendrier("Agenda" Year(DateC)) Then le mois en cours. i).Enabled = True ' On active les listes. & i).Enabled = True _ RDV " & _ _ _
Else Forms!F_Calendrier("Jour" & i).Enabled = False ' Sinon on dsactive 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
VIII - Remerciements
Je tiens remercier Arkham46, jeannot45 et toute l'quipe Office pour m'avoir guid dans la ralisation de cette article, ainsi que jacques_jean pour sa relecture.
- 17 Copyright 2009 Denis Hulo. Aucune reproduction, mme 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 intrts. Cette page est dpose la SACD.
http://denishulo.developpez.com/tutoriels/access/calendrier/