Sujets que vous pourriez aussi aimer :Sous formulaire dynamique dans un formulaire construit sur plusieurs tables
Nous abordons ici une notion intéressante, comment charger dynamiquement le contenu d'un sous formulaire en fonction de choix précédents réalisés à partir de listes déroulantes construites sur des tables différentes. Pour débuter les manipulations, nous allons partir d'une petite base de données existante :
Cette base est constituée de trois tables. La table marques recense des fabricants automobiles. La table modeles recense certains modèles de ces marques. Enfin la table fiches donne les fiches techniques des modèles de ces marques. Ces trois tables sont donc liées entre elles par des clés primaires et des clés externes. Ces tables sont volontairement simplifiées afin de faciliter les manipulations.
Vous notez aussi la présence d'un formulaire
choix_marques_modeles.
- Double cliquer dessus pour l'exécuter,
En cliquant sur la liste des marques, vous choisissez une marque de véhicule. La liste des modèles se charge alors en fonction du choix précédent pour permettre de choisir un modèle dans la marque sélectionnée. Ce formulaire est donc déjà bâti sur deux tables. Nous avons besoin d'en ajouter une troisième puisque l'objectif et de sortir la fiche technique du modèle dans un sous formulaire. Cette fiche technique se trouve dans la table
fiches.
Nous allons commencer par construire le formulaire des fiches techniques que nous afficherons ensuite comme sous formulaire du formulaire
choix_marques_modeles. Le but est d'arriver à modifier dynamiquement le contenu du sous formulaire selon les choix réalisés dans le formulaire sur la marque et le modèle.
- Fermer l'onglet du formulaire choix_marques_modeles,
- Cliquer sur le ruban Créer pour l'activer,
- Dans ce ruban, cliquer sur la flèche du bouton Plus de formulaires,
- Dans la liste choisir Assistant formulaire,
- Dans la boîte de dialogue qui apparaît, sélectionner la table fiches dans la liste déroulante,
- Basculer tous les champs de cette dernière dans la zone de droite à l'aide du bouton double flèche au centre de la boîte de dialogue,
- Cliquer directement sur le bouton Terminer afin d'ignorer les étapes restantes et de construire le formulaire sur les options par défaut.
Le formulaire s'affiche alors en exécution comme l'illustre la capture ci-dessous.
Nous allons maintenant l'intégrer en tant que sous formulaire du formulaire précédent.
- Fermer l'onglet du formulaire fiches,
- Cliquer avec le bouton droit de la souris sur le formulaire choix_marques_modeles,
- Choisir Mode création dans le menu contextuel qui apparaît,
Le formulaire s'affiche en mode conception.
- Dans l'onglet Création, cliquer sur le bouton Sous formulaire/Sous état,
- Tracer un rectangle sous les listes déroulantes pour définir sa zone d'implantation.
L'assistant sous-formulaire se déclenche.
- Cocher la case Utiliser un formulaire existant,
- Sélectionner le formulaire fiches dans la liste,
- Cliquer sur le bouton Suivant,
- Accepter le nom donné par défaut et cliquer sur Terminer.
Le sous formulaire s'affiche alors dans le formulaire en mode conception.
- Cliquer sur le bouton Affichage pour exécuter le formulaire.
Si vous choisissez une marque puis un modèle vous constatez que le sous formulaire reste désespérément figé sur le premier enregistrement alors qu'il devrait afficher la fiche technique du modèle sélectionné dans la seconde liste. En effet, nous n'avons à ce stade construit aucune interaction entre les listes et le sous-formulaire.
- Cliquer sur la flèche du bouton Affichage,
- Puis cliquer sur Mode création dans la liste,
- Sélectionner la liste des modèles (seconde liste déroulante),
- Si la feuille de propriétés n'est pas visible, cliquer avec le bouton droit de la souris sur la liste déroulante,
- Dans le menu contextuel qui s'affiche, cliquer sur Propriétés,
- Dans la feuille des propriétés sur la droite, cliquer sur l'onglet Evénement pour l'activer,
Au choix d'un modèle, nous souhaitons afficher la fiche technique correspondante. Il s'agit donc d'un événement à gérer. Lorsque le contenu de la liste change, le sous formulaire doit s'adapter.
- Dans la zone Après MAJ, cliquer sur le petit bouton à trois points,
- Dans la boîte de dialogue qui s'affiche, choisir Générateur de code,
- Puis cliquer sur Ok.
Vous basculez dans l'éditeur de code
Visual Basic,
VBA pour Access.
Après MAJ signifie Après Mise à Jour, soit dès lors que le contenu de la liste change. Cela signifie que ce que nous allons programmer maintenant se déclenchera quand la liste déroulante changera. Le curseur de saisie étant placé entre les bornes de la procédure (Entre le Private Sub et le End Sub) :
- Ajouter la ligne de code VBA suivante :
Me.fiches.Form.RecordSource ='SELECT * FROM fiches WHERE fiche_modele_num=' + Me.liste_modeles
Me désigne le formulaire actif.
fiches est le nom du sous formulaire dans Me, soit le formulaire
choix_marques_modeles.
Form.RecordSource est la propriété qui permet d'accéder à la source de chargement de ce sous formulaire. C'est ici que nous lui précisons qu'il doit afficher la fiche technique dont le numéro correspond à celui sélectionné dans la liste des modèles. La table modeles et la table fiches sont liées par la clé primaire de la première table et la clé externe
fiche_modele_num de la seconde. D'où la requête SQL pour ce RecordSource qui demande explicitement de sélectionner tous les champs de la table fiches pour lesquels le numéro d'enregistrement correspond au numéro sélectionné dans la liste des modèles.
- Avant de terminer, ajouter cette dernière ligne de code à la suite :
Me.fiches.Form.Requery
Elle permet de forcer le sous formulaire à se recalculer suite à ce changement.
- Revenir sur la fenêtre des formulaires Access,
- Double cliquer sur le formulaire choix_marques_modeles- pour l'exécuter,
- Faire des choix différents dans les listes.
Vous constatez que le contenu du sous formulaire s'adapte et affiche bien la fiche technique du modèle sélectionné dans la marque choisie.
Aperçu de la fiche technique
Dernière étape, nous souhaitons afficher l'aperçu de la fiche technique générée dynamiquement. En d'autres termes nous devons construire un état basé sur la table fiches. Cet état devra afficher seulement les informations correspondant au modèle sélectionné depuis le formulaire.
- Activer le ruban Créer,
- Cliquer sur le bouton Assistant état,
- Dans la boîte de dialogue, sélectionner tous les champs de la table fiches et cliquer sur Terminer.
L'état s'affiche en aperçu présentant tous les enregistrements de la table, soit toutes les fiches techniques. Or il nous en faudra qu'un seul.
- Fermer l'état,
- Afficher le formulaire choix_marques_modeles en mode création,
- A l'aide du ruban Création, ajouter un bouton sur ce dernier,
- Dans la boîte de dialogue qui s'affiche, cliquer sur Annuler, nous allons le paramétrer nous-mêmes,
- Changer le texte du bouton en Aperçu,
- Dans l'onglet Evénement de sa feuille de propriétés, cliquer sur le bouton à trois points,
- Choisir générateur de code et cliquer sur Ok,
- Dans la procédure, taper la ligne de code suivante :
DoCmd.OpenReport 'fiches', acViewPreview, , '[fiche_modele_num]=' (Me![liste_modeles].Value)
Cette ligne commande l'ouverture de l'état fiches (OpenReport 'fiches') en mode aperçu (acViewPreview) de manière à faire correspondre le numéro de la fiche à imprimer (fiche_modele_num) avec celui de la fiche sélectionnée sur le formulaire (Me![liste_modeles].Value).
- Exécuter le formulaire,
- Choisir une marque et un modèle,
- Cliquer sur le bouton Aperçu.
Nous obtenons bien l'aperçu de la fiche technique voulue.