Pré-remplissage de sous-formulaires

Pré-remplissage des données répétitives dans des sous-formulaires.

Niveau requis : intermédiaire.

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

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Assez souvent on est amené à répéter la saisie de données dans des sous-formulaires.

Voici donc un exemple simple qui décrit une technique de pré-remplissage des noms des élèves d'une classe dans des sous-formulaires dans le but de gérer leur présence journalière.

Plutôt que d'avoir à saisir pour chaque jour de l'année scolaire la liste de tous les élèves, les sous-formulaires sont automatiquement remplis avec les noms de tous les élèves de la classe.

Ces sous-formulaires, un pour le matin et un pour l'après-midi, présentent donc, pour un jour donné, la liste des élèves accompagnée de leur présence et d'informations complémentaires.

II. Description de la méthode

Nous créerons tout d'abord les deux requêtes qui sélectionnent les présences des élèves pour le matin et l'après-midi. Puis, dans deux autres requêtes, nous ferons une jointure gauche entre la table des élèves et les deux premières requêtes, de façon à afficher, pour chaque demi-journée, tous les élèves accompagnés de leur présence. Enfin, nous baserons les deux sous-formulaires sur ces deux dernières requêtes. Ces deux sous-formulaires comporteront également des procédures évènementielles sur BeforeUpDate pour faire le lien entre le jour sélectionné dans le formulaire principal et les données des sous-formulaires.

III. Rendu final des sous-formulaires pré-remplis

Voici le rendu des sous-formulaires qui présente les présences des différents élèves pour un jour donné.

On constate que les noms des élèves sont déjà remplis automatiquement et il ne reste plus qu'à saisir les données dans les colonnes Présence, Raison et Dispense.

Image non disponible
Aperçu des sous-formulaires.

IV. Les tables nécessaires

Nous allons tout d'abord définir les tables et les champs qui contiendront les données : pour réaliser cet exemple on aura besoin de trois tables : les tables T_Eleve, T_Jour et T_Presence.

III-A. La table T_Eleve

La table contient la liste des noms et prénoms des élèves accompagnés de leur numéro d'ordre.

Nom du champ Type de données Description
NEleve Numéro auto Numéro d'ordre de l'élève.
Nom Texte Nom de l'élève.
Prenom Texte Prénom de l'élève.

III-B. La table T_Jour

La table contient les numéros et dates des jours de présence accompagnés des post-its du matin et de l'après-midi.

Nom du champ Type de données Description
NJour Entier long Numéro d'ordre du jour de présence.
DateJ Date Date du jour de présence.
PostIt1 Mémo Note du matin.
PostIt2 Mémo Note de l'après-midi.

III-C. La table T_Presence

Elle sert à enregistrer les présences des élèves de la classe.

Nom du champ Type de données Description
NEleve Entier long Numéro de l'élève.
NJour Entier long Numéro d'ordre du jour des présences.
PeriodeJ Texte Période de la journée : matin ou après-midi.
Presence Texte Champ pour la présence de l'élève : "Oui", "Non", "".
Raison Texte Raison de l'absence de l'élève.
Dispense Booléen Champ vrai/faux pour savoir si l'élève est dispensé ou pas.

V. Les requêtes

Pour pouvoir afficher, pour chaque jour, les tableaux des présences du matin et de l'après-midi, avec en 1ère colonne les noms des élèves :

V-A. La requête R_PresenceMatin

Cette requête, basée sur la table T_Presence, affiche la liste des présences du matin pour le jour choisi, accompagnées de l'ensemble des informations de la table concernée : elle a donc comme paramètre la zone de texte NJour du formulaire F_Presence (Forms!F_Presence!NJour).

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

Exemple d'affichage de la requête pour le jour n° 1 :

Image non disponible
Affichage de la requête R_PresenceMatin.

V-B. La requête R_PresenceApresMidi

Cette requête, basée sur la table T_Presence, affiche la liste des présences de l'après-midi pour le jour choisi, accompagnées de l'ensemble des informations de la table concernée : elle a également comme paramètre la zone de texte NJour du formulaire F_Presence (Forms!F_Presence!NJour).

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

Exemple d'affichage de la requête pour le jour n° 1 :

Image non disponible
Affichage de la requête R_PresenceApresMidi.

V-C. La requête R_PresMatin

Cette requête, basée sur la table T_Eleve et la requête R_PresenceMatin, affiche tous les noms des élèves de la classe, accompagnés de leur présence pour le matin. Elle est la source du sous-formulaire SF_PresenceMatin et permet de le pré-remplir automatiquement avec les noms des élèves.

On effectue une jointure gauche entre la table et la requête pour pouvoir afficher tous les élèves.

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

Exemple d'affichage de la requête pour le jour n° 1 :

Image non disponible
Affichage de la requête R_PresMatin.

V-D. La requête R_PresApresMidi

Cette requête, basée sur la table T_Eleve et la requête R_PresenceApresMidi, affiche tous les noms des élèves de la classe, accompagnés de leur présence pour l'après-midi. Elle constitue la source du sous-formulaire SF_PresenceApresMidi et permet de le pré-remplir automatiquement avec les noms des élèves.

On effectue une jointure gauche entre la table et la requête pour pouvoir afficher tous les élèves.

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

Exemple d'affichage de la requête pour le jour n° 1 :

Image non disponible
Affichage de la requête R_PresApresMidi.

VI. Les formulaires

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

VI-A. Le sous-formulaire SF_PresenceMatin

Ce formulaire, en mode feuille de données, est relié à la requête R_PresenceMatin. Il contient les zones de texte Eleve, NEleve, NJour , PeriodeJ et Raison, et les cases à cocher Presence et Dispense.

VI-A-1. La procédure évènementielle sur BeforeUpdate du sous-formulaire

Cette procédure permet de mettre à jour les champs NJour et PeriodeJ de la table T_Presence et donc de relier une présence de l'élève le matin à un jour du calendrier.

 
Sélectionnez
Private Sub Form_BeforeUpdate(Cancel As Integer)
   
   If Not IsNull(Forms!F_Presence!NJour) Then ' Si le jour de présence a été saisi, on met à jour les champs de liaison.
      Me!NJour = Forms!F_Presence!NJour
      Me!PeriodeJ = "M"
   Else ' Sinon on invite à choisir un jour.
      MsgBox ("Chosir une date pour la feuille de présence !")
      Cancel = True
      Me.Undo
   End If

End Sub

VI-B. Le sous-formulaire SF_PresenceApresMidi

Ce formulaire, en mode feuille de données, est relié à la requête R_PresenceApresMidi. Il contient les zones de texte Eleve, NEleve, NJour , PeriodeJ et Raison, et les cases à cocher Presence et Dispense.

VI-B-1. La procédure évènementielle sur BeforeUpdate du sous-formulaire

Cette procédure permet de mettre à jour les champs NJour et PeriodeJ de la table T_Presence et donc de relier une présence de l'élève l'après-midi à un jour du calendrier.

 
Sélectionnez
Private Sub Form_BeforeUpdate(Cancel As Integer)
   
   If Not IsNull(Forms!F_Presence!NJour) Then ' Si le jour de présence a été saisi, on met à jour les champs de liaison.
      Me!NJour = Forms!F_Presence!NJour
      Me!PeriodeJ = "A"
   Else ' Sinon on invite à choisir un jour.
      MsgBox ("Chosir une date pour la feuille de présence !")
      Cancel = True
      Me.Undo
   End If

End Sub

VI-C. Le formulaire F_Presence

Il contient les zones de texte NJour, DateJ et DateJ2, les boutons de commande CmdPrecedent et CmdSuivant, et les sous-formulaires SF_PresenceMatin et SF_PresenceApresMidi. Ce formulaire est basé sur la table T_Jour.

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

VI-C-1. Le bouton de commande CmdDetail

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner un jour dans le calendrier de Thierry Gasperment et de rafraichir les deux sous-formulaires.

VI-C-1-a. La procédure évènementielle sur Clic

Cette procédure s'exécute quand on choisit un jour dans le calendrier d'Arkham46 :

 
Sélectionnez

Private Sub CmdDetail_Click()
 Dim lDate As String
 Dim rs As DAO.Recordset
    
    If Me.CmdDetail Is Screen.ActiveControl Then ' Si CmdDetail est le contrôle actif
       lDate = DisplayCalendar(Me.DateJ, "Choisir une date", _
                                     IIf(IsDate(Me.DateJ), Me.DateJ, Now), _
                                     "Comic sans MS", 8, True, vbBlack, _
                                     vbYellow, "arial", 10)
    else ' Sinon
       lDate = Me.DateJ.Value   
    end if	
	
	If Not lDate = "" Then
       
	   ' Affecte la source du formulaire à la variable de type recordset.       
       Set rs = Me.RecordsetClone
       
	   ' Recherche, dans la source du formulaire, l'enregistrement dont le champ DateJ
	   ' est égal à la date choisie dans le calendrier.       
       rs.FindFirst "[DateJ]=#" & Format(lDate, "mm/dd/yyyy") & "#"
              
          If Not (rs.NoMatch) Then ' Si la date est déja présente dans la source
             Me.Bookmark = rs.Bookmark ' Se déplace sur l'enregistrement en question.
             Me.DateJ.Value = lDate ' Met à jour la zone de texte DateJ avec la date choisie.
          Else ' Sinon
             ' Si l'utilisateur souhaite créer un nouveau formulaire de présence.
             If MsgBox("Souhaitez-vous créer un formulaire de présence sur le nouveau jour choisi ?", vbYesNo) = vbYes Then
                DoCmd.GoToRecord acForm, Me.Name, acNewRec ' Ajout d'un nouvel enregistrement.
                Me.DateJ.Value = lDate ' Met à jour la zone de texte DateJ avec la date choisie.
                Me.DateJ2.Value = lDate ' Met à jour la zone de texte DateJ2 liée au champ DateJ de la table source,			 
			 	                        ' avec la date choisie.
			 	                        
			 Else
                Me.DateJ.Value = Me.DateJ2.Value
             End If	                        
			 	                                        
          End If
       ' On rafraîchit le formulaire principal et les 2 sous-formulaires.   
       Me.Refresh
       
       rs.Close
       Set rs = Nothing
       
    End If

End Sub

VI-C-2. Le bouton de commande CmdPrecedent

Ce bouton est utilisé pour permettre à l'utilisateur de reculer d'un jour et d'actualiser les deux sous-formulaires.

VI-C-2-a. La procédure évènementielle sur Clic

 
Sélectionnez

Private Sub CmdPrecedent_Click()
Me.DateJ.Value = CDate(Me.DateJ.Value) - 1 ' Décrémente la zone de texte DateJ.
CmdDetail_Click ' Exécute la procédure associée à l'évènement clic du bouton CmdDetail.

End Sub

VI-C-3. Le bouton de commande CmdSuivant

Ce bouton est utilisé pour permettre à l'utilisateur d'avancer d'un jour et d'actualiser les deux sous-formulaires.

VI-C-3-a. La procédure évènementielle sur Clic

 
Sélectionnez

Private Sub CmdSuivant_Click()
Me.DateJ.Value = CDate(Me.DateJ.Value) + 1 ' Incrémente la zone de texte DateJ.
CmdDetail_Click ' Exécute la procédure associée à l'évènement clic du bouton CmdDetail.

End Sub

VII. Téléchargement

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

La base exemplebdpresences est au format Access 2000.

VIII. Remerciements

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

Pour leurs remarques et conseils avisés :
. Tofalu
. Arkham46

Pour leur relecture :
. jacques_jean
. ram-0000

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.