Créer un formulaire d'agenda avec Access

Denis Hulo

Objectif : créer un formulaire d'agenda avec Access.

Niveau requis : intermédiaire.

Commentez cet article : Commentez ♪

- Titre : Créer un formulaire d'agenda avec Access

- Auteur : Denis Hulo

- Parution : 28 avril 2009

- 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. Aperçu du formulaire de planning

- III. Tables nécessaires

- III-A. Table T_RendezVous

- III-B. Table T_Client

- III-C. Table T_CouleurTypeRdv

- III-D. Table T_Parametres

- IV. Requêtes

- IV-A. Requête R_Clients

- IV-B. Requête R_RendezVous

- V. Formulaires

- V-A. Sous-formulaire SF_Planning

- V-A-1. Étiquettes « lblCol1..7 »

- V-A-2. Étiquettes « lblTrancheHeure.._. »

- V-B. Formulaire principal F_Planning

- V-B-1. Zone de texte txtDateDebut

- V-B-1-a. Procédure sur Changement

- V-B-2. Liste déroulante cmbEmploye

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

- V-B-3. Boutons de déplacement CmdPrecedent et CmdSuivant

- V-B-3-a. Procédure sur clic du bouton CmdPrecedent

- V-B-3-b. Procédure sur clic du bouton CmdSuivant

- V-B-4. Procédure sur ouverture du formulaire

- V-C. Formulaire F_RendezVous

- V-C-1. Liste déroulante CmbClient

- V-C-2. Sous-formulaire SF_Client

- V-C-3. Bouton de commande CmdValider

- V-C-3-a. Procédure sur clic

- VI. Module M_Planning de l'application

- VI-A. Description de quelques routines

- VI-B. Procédure InitPlanning

- VI-C. Procédure MajPlanning

- VI-D. Fonction OuvrirFormRendezVous

- VII. Création dynamique du planning

- VIII. Application à télécharger

- IX. Remerciements

I - Introduction

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

Notre objectif est d'expliquer comment créer un formulaire d'agenda permettant de gérer les rendez-vous de clients.

Pour ce faire, après avoir donné un aperçu du formulaire souhaité, 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 ;

- module M_Planning.

Pour terminer, on détaillera le fonctionnement du formulaire de paramétrage du planning.

II - Aperçu du formulaire de planning

Dans cet agenda hebdomadaire, nous aurons donc en en-têtes de lignes les heures, et en en-têtes de colonnes les jours de la semaine. La plage horaire journalière et la durée des tranches d'heure étant paramétrables :

Planning hebdomadaire des rendez-vous

La saisie d'un rendez-vous se fait naturellement par un double-clic sur une case du planning correspondant à une heure et un jour précis :

Formulaire de saisie des rendez-vous.

III - Tables nécessaires

Nous allons tout d'abord décrire la structure des tables permettant d'enregistrer les données.

L'application réduite au maximum comporte quatre tables.

III-A - Table T_RendezVous

Elle sert à enregistrer les rendez-vous des clients.

Nom du champ

Type de données

Description

IdRendezVous

Numéro auto

Identifiant du rendez-vous

IdClient

Entier long

Identifiant du client ayant le rendez-vous

DateHeureDebut

Date/Heure

Date et heure de début du rendez-vous

DateHeureFin

Date/Heure

Date et heure de fin du rendez-vous

Memo

Mémo

Commentaire sur le rendez-vous

On enregistre donc la date et l'heure de début du rendez-vous dans un seul champ, même chose pour la date et l'heure de fin du RDV.

III-B - Table T_Client

Elle contient les informations sur les clients.

Nom du champ

Type de données

Description

IdClient

Numéro Auto

Identifiant du client

NomClient

Texte

Nom du client

PrénomClient

Texte

Prénom du client

TelDomicile

Texte

Numéro de téléphone au domicile

TelPortable

Texte

Numéro de téléphone du portable

Email

Texte

E-mail du client

Note

Texte

Note sur le client

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

III-C - Table T_CouleurTypeRdv

Elle permet d'enregistrer les couleurs selon le type de rendez-vous.

Nom du champ

Type de données

Description

IdCouleur

Numéro Auto

Identifiant de la couleur

DescriptionTypeRdv

Texte

Description du type de rendez-vous associé à la couleur

CodeCouleur

Entier long

Code numérique de la couleur

Le but étant de la mettre en relation avec la table T_RendezVous sur le champ IdCouleur.

III-D - Table T_Parametres

Elle contient les paramètres du planning.

Nom du champ

Type de données

Description

IdParametres

Numéro Auto

Identifiant

HauteurLabelsDetail

Long

Hauteur des labels et donc hauteur des lignes du planning en twips

HeureDebut

Texte

Heure à laquelle commencent les prises de rendez-vous dans la journée

TrancheHeure

Entier long

Durée des tranches d'heure sur le planning

NbreLignes

Entier long

Nombre total de lignes du planning

…

…

…

Valeurs de paramètres par défaut :

Nom du champ

Valeur

IdParametres

1

HauteurLabelsDetail

400

HeureDebut

08:00

TrancheHeure

15

NbreLignes

48

Ces paramètres enregistrés dans la table sont lus à l'ouverture du formulaire de planning. Ils vont permettre de dimensionner les tranches horaires correspondant aux rendez-vous au moment de rafraîchir l'agenda.

IV - Requêtes

Détaillons maintenant les requêtes.

IV-A - Requête R_Clients

Elle affiche la liste des noms complets des clients avec leur identifiant.

Code SQL de la requête

SELECT T_Client.IdClient, [NomClient] & " " & [PrenomClient] AS Client
FROM T_Client
ORDER BY [NomClient] & " " & [PrenomClient];

Le champ calculé Client concatène le nom et le prénom :

Client: [NomClient] & " " & [PrenomClient]

IV-B - Requête R_RendezVous

Elle relie les tables T_RendezVous et T_CouleurTypeRdv sur le champ IdCouleur.

R_RendezVous en mode création

La procédure de rafraîchissement du planning se base sur cette requête pour parcourir les rendez-vous de la semaine choisie.

V - Formulaires

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

V-A - Sous-formulaire SF_Planning

Il contient dans son en-tête les étiquettes lblCol1..7 pour afficher les dates des jours de la semaine, et dans son détail, le tableau des labels lblTrancheHeure.._. permettant d'afficher les tranches horaires.

Formulaire SF_Planning en mode création

Les étiquettes sont créées dynamiquement dans le formulaire à l'aide du formulaire F_Parametres disponible dans la base exemple.

V-A-1 - Étiquettes « lblCol1..7 »

Ces contrôles situés dans l'en-tête du formulaire permettent d'afficher les dates des jours compris dans la période choisie.

V-A-2 - Étiquettes « lblTrancheHeure.._. »

Ces contrôles placés dans le détail du formulaire permettent d'afficher les tranches horaires pour chaque rendez-vous compris dans la semaine choisie.

V-B - Formulaire principal F_Planning

Il contient :

- la zone de texte txtDateDebut pour choisir la semaine ;

- la liste déroulante cmbEmploye pour choisir un employé ;

- les boutons de commande pour avancer ou reculer d'une semaine ;

- le sous-formulaire SF_Planning pour afficher le planning.

Formulaire F_Planning en mode création

V-B-1 - Zone de texte txtDateDebut

Il permet à l'utilisateur de choisir un jour, et ainsi d'afficher le planning de la semaine correspondante.

V-B-1-a - Procédure sur Changement

Cette procédure s'exécute quand on choisit un jour, donc une semaine, dans le calendrier. Elle permet d'afficher le planning de la semaine choisie.

Private Sub txtDateDebut_Change()
dateDebut = DebutSemaine(CDate(Me.txtDateDebut.Text)) ' copie dans la variable le 1er jour de la semaine choisie
MajPlanning ' rafraîchit le planning
End Sub

V-B-2 - Liste déroulante cmbEmploye

Elle permet à l'utilisateur de choisir un employé, et ainsi d'afficher son planning.

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

Cette procédure s'exécute quand on choisit un employé sur le planning. Elle permet d'afficher le planning de l'employé choisi.

Private Sub cmbEmploye_AfterUpdate()
MajPlanning ' on rafraîchit le planning
End Sub

V-B-3 - Boutons de déplacement CmdPrecedent et CmdSuivant

Ces boutons de commande situés en haut du formulaire permettent d'avancer ou de reculer d'une semaine sur le planning.

V-B-3-a - Procédure sur clic du bouton CmdPrecedent

Ce code permet de reculer d'une semaine et de mettre à jour le planning.

Private Sub CmdPrecedent_Click()
' Sur l'évènement Clic du bouton de commande CmdPrecedent
dateDebut = dateDebut - 7 ' Recule de 7 jours dans le temps
MajPlanning ' Met à jour le planning
End Sub

V-B-3-b - Procédure sur clic du bouton CmdSuivant

Ce code permet d'avancer d'une semaine et de mettre à jour le planning.

Private Sub CmdSuivant_Click()
' Sur l'évènement Clic du bouton de commande CmdSuivant
dateDebut = dateDebut + 7 ' Avance de 7 jours dans le temps
MajPlanning ' Met à jour le planning
End Sub

V-B-4 - Procédure sur ouverture du formulaire

Elle copie dans des variables les paramètres du planning (heure de début, tranche d'heure, nombre et hauteur de lignes). Puis, évalue la date du 1er jour de la semaine, et met à jour le planning :

Extrait du code n°1

Private Sub Form_Open(Cancel As Integer)
' Sur ouverture du formulaire.
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Long, j As Long

Set db = CurrentDb ' référence à la base courante
Set rs = db.OpenRecordset("T_Parametres", dbOpenSnapshot) ' référence à la table de paramètres

HeureDebut = rs!HeureDebut ' on copie dans la variable publique l'heure de début du planning
TrancheHeure = rs!TrancheHeure ' on copie dans la variable publique la tranche d'heure du planning (10, 15, 30 min)
nblignes = rs!NbreLignes ' on copie dans la variable publique le nombre de lignes du planning
hauteurlignes = rs!HauteurLabelsDetail ' on copie dans la variable publique la hauteur des lignes du planning

dateDebut = DebutSemaine(Date) ' Renvoie le premier jour de la semaine courante

Me.cmbEmploye = Me.cmbEmploye.ItemData(0) ' sélection du 1er employé sur la liste déroulante

MajPlanning ' Met à jour le planning

'...
End Sub

Enfin, pour consulter ou modifier un rendez-vous en double-cliquant sur une tranche horaire sur le planning, elle va affecter à la propriété OnDblClick des étiquettes lblTrancheHeure.. les expressions de la fonction permettant d'ouvrir le formulaire de saisie en mode édition ou ajout :

Extrait du code n°2

With Me.SF_Planning

For j = 1 To 7 ' on parcourt les indices des 7 colonnes
' affectation à la propriété OnDblClick de l'expression permettant d'appeler la fonction OuvrirFormRendezVous
.Form("lblPostIt" & j).OnDblClick = "=OuvrirFormPostIt(" & j & ")"
Next j

For i = 1 To nblignes ' on parcourt les indices des lignes

For j = 1 To 7 ' on parcourt les indices des 7 colonnes
' affectation à la propriété OnDblClick de l'expression permettant d'appeler la fonction OuvrirFormRendezVous
.Form("lblTrancheHeure" & i & "_" & j).OnDblClick = "=OuvrirFormRendezVous(" & i & "," & j & ")"
Next j

Next i
End With

Le code complet devient :

Procédure Form_Open

Private Sub Form_Open(Cancel As Integer)
' Sur ouverture du formulaire.
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Long, j As Long

Set db = CurrentDb ' référence à la base courante
Set rs = db.OpenRecordset("T_Parametres", dbOpenSnapshot) ' référence à la table de paramètres

HeureDebut = rs!HeureDebut ' on copie dans la variable publique l'heure de début du planning
TrancheHeure = rs!TrancheHeure ' on copie dans la variable publique la tranche d'heure du planning (10, 15, 30 min)
nblignes = rs!NbreLignes ' on copie dans la variable publique le nombre de lignes du planning
hauteurlignes = rs!HauteurLabelsDetail ' on copie dans la variable publique la hauteur des lignes du planning

dateDebut = DebutSemaine(Date) ' Renvoie le premier jour de la semaine courante

Me.cmbEmploye = Me.cmbEmploye.ItemData(0) ' sélection du 1er employé sur la liste déroulante

MajPlanning ' Met à jour le planning

With Me.SF_Planning

For j = 1 To 7 ' on parcourt les indices des 7 colonnes
' affectation à la propriété OnDblClick de l'expression permettant d'appeler la fonction OuvrirFormRendezVous
.Form("lblPostIt" & j).OnDblClick = "=OuvrirFormPostIt(" & j & ")"
Next j

For i = 1 To nblignes ' on parcourt les indices des lignes

For j = 1 To 7 ' on parcourt les indices des 7 colonnes
' affectation à la propriété OnDblClick de l'expression permettant d'appeler la fonction OuvrirFormRendezVous
.Form("lblTrancheHeure" & i & "_" & j).OnDblClick = "=OuvrirFormRendezVous(" & i & "," & j & ")"
Next j

Next i

End With

rs.Close
Set rs = Nothing

Set db = Nothing
End Sub

V-C - Formulaire F_RendezVous

Il permet d'ajouter, de modifier ou de supprimer un rendez-vous. Ce formulaire s'ouvre sur l'évènement double-clic des labels du planning.

Aperçu du formulaire

Détaillons quelques contrôles de ce formulaire.

V-C-1 - Liste déroulante CmbClient

Cette liste permet de choisir un client pour le rendez-vous. Elle est liée au champ IdClient de la table source T_RendezVous, relié lui-même au champ IdClient de la table T_Client.

Elle affiche la liste des noms complets des clients classés dans l'ordre croissant. Pour ce faire, on affecte à sa propriété Contenu la requête R_Clients vue précédemment.

Cette liste comporte donc deux colonnes et sa colonne liée est la numéro 1 correspondant au champ IdClient :

Aperçu en mode création des propriétés de la liste cmbClient

V-C-2 - Sous-formulaire SF_Client

Ce sous-formulaire, contenu dans le formulaire F_RendezVous, permet d'afficher les informations sur le client sélectionné dans la liste cmbClient. Sa source de données est la table T_Client, et il est synchronisé avec son formulaire principal sur le champ IdClient : les propriétés champs fils et champs pères du contrôle Sous-formulaire indiquent le champ IdClient.

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

V-C-3 - Bouton de commande CmdValider

Il sert à valider la saisie.

V-C-3-a - Procédure 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, si les contrôles cmbClient ou txtMemo sont vides alors l'utilisateur est invité à corriger sa saisie.

Sur l'évènement Clic du bouton de commande CmdValider, on a donc :

Procédure CmdValider_Click

Private Sub CmdValider_Click()
' Valide les choix effectués sur le formulaire F_RendezVous
Dim dhDebut As Date, dhFin As Date, idRdv As Long

' Si les contrôles cmbEmploye ou "Memo" ne sont pas vides
If (Nz(Me.cmbEmploye, "") <> "") Or (Nz(Me!txtMemo, "") <> "") Then

dhDebut = CDate(Me.txtDateHeureDebut) ' copie de la date et de l'heure de début du RDV dans la variable
dhFin = CDate(Me.txtDateHeureFin) ' copie de la date et de l'heure de fin du RDV dans la variable

If (dhDebut < dhFin) Then ' si les dates et heures de début et de fin sont conformes
' On recherche des RDV dont les heures de début et de fin chevauchent les
' heures choisies sur le formulaire
idRdv = Nz(DLookup("[IdRendezVous]", "T_RendezVous", "(IdEmploye= " & Nz(Me!cmbEmploye, 0) & ") " & _
" and (IdRendezVous<>" & Nz(Me.IdRendezVous, 0) & ") And DateHeureDebut<" & FormatDateUS(dhFin) & " And DateHeureFin>" & FormatDateUS(dhDebut)), 0)

' si aucun RDV n'a été trouvé, la plage horaire est donc disponible et on peut
' enregistrer le RDV
If (idRdv = 0) Then
Me.Requery ' on actualise le formulaire
MajPlanning ' on rafraîchit le planning
DoCmd.Close ' on ferme le formulaire
Else ' si la plage horaire est indisponible
MsgBox ("Plage horaire indisponible !")
End If

Else
MsgBox ("Horaires incorrects !")
End If

Else
MsgBox ("Saisie incorrecte !")
End If
End Sub

VI - Module M_Planning de l'application

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

VI-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 le planning.

' Dans la partie déclaration du module on définit les variables contenant les valeurs des paramètres du planning.

Public dateDebut As Date ' variable indiquant la date du 1er jour du planning
Public TrancheHeure As Long ' variable indiquant la tranche des heures (10 min, 15 min, 30 min, ...)
Public HeureDebut As String ' variable indiquant heure de début (08:00, 09:00, ...)
Public nblignes As Long ' variable indiquant le nombre de lignes du planning
Public hauteurlignes As Long ' variable indiquant la hauteur des lignes du planning

'...

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

Function DebutSemaine(ByVal DateSemaine As Date) As Date
'Prend en argument un jour dans la semaine choisie et renvoie la date du premier jour de cette semaine
Dim i As Long
i = Weekday(DateSemaine, vbMonday)
DebutSemaine = DateAdd("d", -i + 1, DateSemaine)
End Function

Private Function IndiceTrancheHeure(ByVal DateHeureDebut As Date) As Long
' La fonction prend en argument la date et l'heure de début du rendez-vous et
' renvoie l'indice de la 1re tranche d'heure du RDV.
IndiceTrancheHeure = (DateDiff("n", TimeValue(HeureDebut), TimeValue(DateHeureDebut)) / TrancheHeure) + 1

End Function

Private Function IndiceColonne(ByVal dtRdv As Date) As Long
' La fonction prend en argument la date du RDV et
' renvoie l'indice de la colonne du jour correspondant sur le planning.
IndiceColonne = DateDiff("d", dateDebut, dtRdv) + 1
End Function

Private Function DateHeureTrancheHeure(ByVal indLigne As Long, ByVal indColonne As Long) As Date
'La fonction prend en argument les indices de ligne (horaire) et
'de colonne (jour) sur le planning et renvoie la date et l'heure correspondantes.
Dim dtCur As Date
Dim h As Long ' heures
Dim m As Long ' minutes

dtCur = DateAdd("d", (indColonne - 1), dateDebut) ' on évalue la date correspondant à la colonne cliquée

h = Hour(HeureDebut) ' heures de début de la journée
m = Minute(HeureDebut) ' minutes
m = m + (h * 60) + TrancheHeure * (indLigne - 1) ' on détermine le nombre de minutes à ajouter

dtCur = DateAdd("n", m, dtCur) ' on ajoute le nombre de minutes à la date correspondant à la colonne cliquée

DateHeureTrancheHeure = dtCur ' on renvoie la date et l'heure obtenues
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.

VI-B - Procédure InitPlanning

La procédure InitPlanning efface le contenu des étiquettes, redimensionne les labels à leur taille d'origine et met à jour les en-têtes de colonnes avec les jours de la semaine choisie.

Procédure InitPlanning

Private Sub InitPlanning()
' Initialise le Planning hebdomadaire avant sa mise à jour.
' Efface tous les rendez-vous, redimensionne les labels et remplit les en-têtes de colonnes avec les jours de la semaine choisie
Dim i As Integer, j As Integer ' indice de ligne et de colonne
Dim dtCur As Date ' variable qui parcourt les jours de la semaine

With Forms!F_Planning!SF_Planning

For i = 1 To nblignes ' on parcourt les indices des lignes

For j = 1 To 7 ' on parcourt les indices des colonnes

If (.Form("lblTrancheHeure" & i & "_" & j).Caption <> "") Then
.Form("lblTrancheHeure" & i & "_" & j).Caption = ""
End If

If (i Mod 2) = 1 Then ' on alterne la couleur des lignes
If .Form("lblTrancheHeure" & i & "_" & j).BackColor <> -2147483624 Then
.Form("lblTrancheHeure" & i & "_" & j).BackColor = -2147483624 ' colorie le label en jaune clair
End If
Else
If .Form("lblTrancheHeure" & i & "_" & j).BackColor <> vbWhite Then
.Form("lblTrancheHeure" & i & "_" & j).BackColor = vbWhite ' colorie le label en blanc
End If
End If

If .Form("lblTrancheHeure" & i & "_" & j).Height <> hauteurlignes Then
.Form("lblTrancheHeure" & i & "_" & j).Height = hauteurlignes ' on définit la hauteur des lignes
End If
.Form("lblTrancheHeure" & i & "_" & j).Tag = "" ' efface l'identifiant du rendez-vous si présent
Next j

Next i

For j = 1 To 7 ' on parcourt les indices des colonnes du planning

.Form("lblPostIt" & j).Caption = "" ' efface le contenu des étiquettes affichant les Post-it

' Copie la date du jour correspondant à l'indice de colonne
dtCur = DateAdd("d", (j - 1), dateDebut)
' Affiche la date du jour correspondant à l'indice de colonne
.Form("lblCol" & j).Caption = Format(dtCur, "Ddd dd mmm yyyy")

If EstFerie(dtCur) Or EstWeekEnd(dtCur) Then ' si week-end ou jour férié
'on colorie les en-têtes (rouge pour les week-ends)
.Form("lblCol" & j).BackColor = 16761087
ColorierColonne j, 16772351
Else
.Form("lblCol" & j).BackColor = 16761024
End If

Next j

End With
End Sub

VI-C - Procédure MajPlanning

Déroulé de la procédure :

- sélectionne les rendez-vous compris dans la période choisie ;

- initialise le planning en effaçant les anciens rendez-vous ;

- pour chaque rendez-vous sélectionné, redimensionne le label correspondant à la tranche d'heure du début du rendez-vous.

Procédure MajPlanning

Public Sub MajPlanning()
' La procédure de mise à jour des rendez-vous sur le planning en fonction de la date de début de la semaine.
' La procédure sélectionne dans la table T_RendezVous les RDV compris entre la date de début et la date de début + 6 jours,
' puis met à jour le planning avec ces rendez-vous :
' Pour chaque RDV l'heure de début et de fin permettent de dimensionner le label correspondant à la 1re tranche du rendez-vous.
Dim db As DAO.Database ' référence à la base
Dim rsPL As DAO.Recordset ' variable recordset
Dim idLigne As Long, idCol As Long ' indices de ligne et de colonne
Dim stSQL As String ' variable contenant la chaîne SQL
Dim nbTranches As Long
Dim idColor As Long ' indice de la couleur

' Sélectionne les RDV compris entre DateDebut et DateDebut+7
stSQL = "SELECT R_RendezVous.* " & _
"FROM R_RendezVous " & _
"WHERE (idEmploye= " & Nz(Forms!F_Planning!IdEmploye, 0) & ") and (R_RendezVous.DateHeureDebut < " & FormatDateUS(dateDebut + 7) & ") And (R_RendezVous.DateHeureFin >" & FormatDateUS(dateDebut) & ")"

Set db = CurrentDb ' référence à la base courante
Set rsPL = db.OpenRecordset(stSQL, dbOpenSnapshot) ' ouverture du recordset basé sur la requête R_RendezVous

Forms!F_Planning!txtTitre.Caption = "PLANNING DU " & UCase(Format(dateDebut, "dd mmmm yyyy")) & " AU " & UCase(Format(dateDebut + 6, "dd mmmm yyyy"))
Forms!F_Planning!txtDateDebut.Value = dateDebut

' initialise le planning
InitPlanning

MajPostIt ' mise à jour des Post-it

Do While Not (rsPL.EOF) ' on parcourt les rendez-vous

If Not IsNull(rsPL!CodeCouleur) Then ' si une couleur a été enregistrée
idColor = rsPL!CodeCouleur ' définit la couleur du label
Else ' sinon
idColor = vbWhite ' la couleur est le blanc
End If

If DateDiff("d", rsPL!DateHeureDebut, rsPL!DateHeureFin) = 0 Then ' s'il s'agit d'un rendez-vous sur une journée

idCol = IndiceColonne(rsPL!DateHeureDebut)
idLigne = IndiceTrancheHeure(rsPL!DateHeureDebut)

nbTranches = DateDiff("n", rsPL!DateHeureDebut, rsPL!DateHeureFin) \ TrancheHeure ' on détermine le nombre de lblTrancheHeurex horaires correspondants à la durée du rdv

With Forms!F_Planning!SF_Planning.Form("lblTrancheHeure" & idLigne & "_" & idCol)

.Height = hauteurlignes * nbTranches ' Hauteur du label = Hauteur de la idLigne multipliée par le nombre de tranches

If Not IsNull(rsPL!IdEmploye) Then
.Caption = CentrerTexte(rsPL!Client, nbTranches) ' Centre le texte pour le nom du client
Else
.Caption = CentrerTexte(Nz(rsPL!Memo, ""), nbTranches)
End If

' copie l'identifiant du rendez-vous dans la propriété Tag, pour le récupérer ensuite lors du double-clic
.Tag = rsPL!IdRendezVous
.BackColor = idColor ' idColorie le label
.FontBold = True ' Indique que l'étiquette affiche du texte en gras

End With

Else
' s'il s'agit d'un congé sur plusieurs jours
MajCongé rsPL!DateHeureDebut, rsPL!DateHeureFin, rsPL!Memo, idColor
End If

rsPL.MoveNext

Loop

' fermeture libération des variables
rsPL.Close
Set rsPL = Nothing

Set db = Nothing
End Sub

Elle est déclarée publique pour pouvoir l'appeler depuis n'importe quel formulaire.

VI-D - Fonction OuvrirFormRendezVous

Elle permet d'ouvrir le formulaire de saisie sur l'évènement double-clic des labels du planning :

Fonction OuvrirFormRendezVous

Public Function OuvrirFormRendezVous(ByVal i As Integer, ByVal j As Integer)
' Ouvre le formulaire F_RendezVous sur double-clic d'un label du planning.
' Prend en arguments les indices de ligne et de colonne du label.
Dim dtCur As Date ' variable pour date et de l'heure correspondant à la tranche d'indice i et j
Dim dtDebut As Date ' Jour et Horaire de début.
Dim dtFin As Date ' Jour et Horaire de fin.
Dim IdRendezVous As Long ' Identifiant du rendez-vous

dtCur = DateHeureTrancheHeure(i, j) ' copie dans la variable de la date et de l'heure correspondant à la tranche d'indice i et j
' s'il y a un RDV alors copier dans les variables dtDebut et dtFin
' les horaires de début et de fin du rdv.
If Forms!F_Planning!SF_Planning.Form("lblTrancheHeure" & CStr(i) & "_" & CStr(j)).Tag <> "" Then
IdRendezVous = Forms!F_Planning!SF_Planning.Form("lblTrancheHeure" & CStr(i) & "_" & CStr(j)).Tag
End If

' ouvre le formulaire F_RendezVous
DoCmd.OpenForm "F_RendezVous", , , "(IdRendezVous= " & IdRendezVous & ")"

If Nz(Forms!F_RendezVous!txtDateHeureDebut, "") = "" Then ' si pas de rendez-vous saisi à cette période
' copies sur le formulaire F_RendezVous
Forms!F_RendezVous!txtDateHeureDebut = dtCur ' copie la date et l'heure de début sur la zone de texte txtDateHeureDebut
Forms!F_RendezVous!txtDateHeureFin = DateAdd("n", TrancheHeure * 2, dtCur)
Forms!F_RendezVous!cmbEmploye = Forms!F_Planning!IdEmploye ' copie l'identifiant de l'employé gérant le planning
End If
End Function

La fonction est appelée sur l'évènement double-clic d'une étiquette dans le détail du planning. Par exemple, pour la première tranche d'heure identifiée par le label lblTrancheHeure1_1, on met :

lblTrancheHeure1_1.OnDblClick = "=OuvrirFormRendezVous(1, 1)"

Elle est déclarée publique pour pouvoir l'appeler depuis n'importe quel formulaire.

VII - Création dynamique du planning

Le formulaire F_Parametres, permet de créer dynamiquement les étiquettes du planning. Il suffit d'indiquer le nom du formulaire contenant le planning, le nombre de colonnes et de lignes de l'agenda, les noms génériques des étiquettes avec leurs dimensions et de valider le tout.

La procédure CreerPlanning supprime alors, en mode création, tous les contrôles du formulaire, et crée dynamiquement les labels du planning dans l'ordre inverse, du dernier au premier, pour permettre la superposition des étiquettes du haut sur celles du bas.

Formulaire F_Parametres

VIII - Application à télécharger

La base exemple est au format Access accdb.

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

IX - Remerciements

Je tiens à remercier Jean Ballat de m'avoir guidé dans la réalisation de ce premier article et ram-0000 pour sa relecture.