formateur informatique

Enrichir un formulaire avec plusieurs listes déroulantes

Accueil  >  Bureautique  >  Access  >  Access Avancé  >  Enrichir un formulaire avec plusieurs listes déroulantes
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Enrichir un formulaire par listes déroulantes

Nous avons déjà appris à renseigner les champs d'un formulaire au choix d'une valeur dans une liste déroulante. Cependant, le cas que nous proposons de résoudre ici, est plus complexe. Dans le cas de la facturation d'un client, une première liste doit proposer de désigner ce dernier. Une seconde doit permettre de sélectionner les références articles à ajouter à la commande. Les listes déroulantes doivent donc se nourrir d'informations issues de différentes tables. Et dans ce contexte, la liaison des données, sans intervention du code VBA, n'est pas aussi naturelle.

Formulaire Access avec plusieurs listes déroulantes pour adapter les contenus



Mais nous allons le voir, une solution relativement simple existe.

Source et présentation de la problématique
Avant de débuter, nous proposons de réceptionner la petite base Access hébergeant les données à manipuler. Comme l'indique le volet des objets Access sur la gauche de l'écran, cette base de données est constituée de trois tables : Clients, Produits et Remises. Seules les tables Clients et Produits nous intéressent dans ce cas pratique.

Si vous les affichez en mode feuille de données, vous constatez qu'elles offrent l'une et l'autre, un certain niveau de détail. Chaque client est reconnu par le numéro du champ de la clé primaire, nommé Client_num. De même, chaque article est identifié par une référence unique, inscrite dans le champ produit_ref de la clé primaire.

Ce sont les informations de ces champs qui doivent être respectivement proposées dans les listes déroulantes du formulaire. Et à ce titre, vous constatez que ce formulaire existe déjà. Il est nommé Cli_Com.
  • Dans le volet de gauche, double cliquer sur le formulaire Cli_Com pour l'exécuter,
Un choix de numéro client dans la première liste déroulante doit restituer le nom et prénom correspondants, dans les zones de texte dédiées. Ces informations sont donc issues de la table Clients. Un choix de référence produit dans la seconde liste déroulante doit extraire la désignation et le prix dans les zones de saisie associées. Ces données sont donc issues de la table Produits.

Formulaire Access avec deux listes déroulantes pour extraire informations de deux tables

A ce stade bien sûr, les listes déroulantes sont vides et aucune interaction n'existe encore.

Contenu des listes déroulantes
Pour définir le contenu d'une liste déroulante, il suffit de régler sa source de contrôle. Cette source de contrôle peut être une table ou une requête. Dans le cas d'une table comme ici, il est nécessaire de déterminer le champ lié.

Pour simplifier l'implémentation des premiers contrôles, nous proposons tout d'abord de régler la source du formulaire sur la table Clients. La liaison avec les zones de saisie pourra ainsi se matérialiser naturellement.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
Nous affichons ainsi le formulaire en mode conception. Et c'est ce contrôle parent qui doit être sélectionné par défaut.

Formulaire Access en mode création pour régler ses propriétés dont la source de données

A l'intersection des règles, en haut à gauche du formulaire, vous devez noter la présence du petit carré noir (Cf. capture ci-dessus). C'est lui qui indique que le formulaire est bien désigné. Si ce n'est pas le cas, vous devez cliquer à cette intersection. De même, la feuille de propriétés doit être disponible. Si elle n'est pas visible dans votre environnement, vous devez cliquer sur le bouton Feuille de propriétés dans le ruban Création. Cette feuille de propriétés est généralement placée sur la droite de l'espace de travail. En entête, elle rappelle le nom du contrôle sélectionné, Formulaire ici. Elle est donc contextuelle. Elle permet de régler les propriétés des contrôles désignés.
  • Cliquer sur son onglet Données,
  • Dans la propriété Source, choisir la table Clients avec la liste déroulante,
Définir une table Access comme source de données du formulaire

Le formulaire est désormais lié naturellement à la table Clients. Ce paramétrage va simplifier la correspondance avec les contrôles associés pour le nom et le prénom. Mais comme nous le disions, ce formulaire propose une seconde liste déroulante dont les données doivent émaner d'une autre source. C'est là que le problème se corse. Et c'est tout l'enjeu de cette formation.
  • Sur le formulaire, cliquer sur la première liste déroulante pour la sélectionner,
  • Activer l'onglet Données de sa feuille de propriétés,
  • Régler sa propriété Contenu sur la table Clients,
Remplir liste déroulante de formulaire Access par liaison naturelle avec la table source

Nous venons de définir les réglages permettant de remplir dynamiquement le contenu de la liste déroulante. Tous les identifiants des clients doivent y être proposés.

Nous n'avons pas réglé la propriété Source de contrôle. Ce paramètre est volontairement ignoré. En effet, une liste déroulante se nourrit par défaut des informations placées dans le premier champ de la table ou requête source. Comme vous le constatez, la propriété Colonne liée est définie à 1. En changeant cette valeur, nous afficherions toujours les références des clients mais demanderions à Access de prélever la donnée d'un champ correspondant pour le traitement.

Nous proposons de le constater, en paramétrant la seconde liste avec le même protocole.
  • Sur le formulaire, sélectionner la seconde liste déroulante,
  • Régler sa propriété Contenu sur la table Produits,
Charger dynamiquement contenu de liste déroulante sur formulaire Access par propriété Contenu

Cette liste doit désormais énumérer toutes les références des articles situés dans le champ de la clé primaire de la table Produits.

Remarque : Pour remplir une liste déroulante avec un autre champ, non placé en tête de la hiérarchie, la meilleure méthode consiste à créer une requête sélection sur ce champ. Cette requête peut alors être exploitée pour remplir le contenu de la liste déroulante.
  • Enregistrer les modifications (CTRL + S),
  • Cliquer sur un emplacement vide du formulaire pour le sélectionner,
  • Puis, enfoncer la touche F5 du clavier pour l'exécuter,
Références articles et identifiants clients chargés dans les deux listes déroulantes du formulaire Access

Si vous déployez les listes déroulantes, vous constatez qu'elles proposent respectivement les identifiants des clients et références des produits.



Extraire le choix d'une liste déroulante
Désormais, au choix d'un identifiant client, les informations attachées doivent être extraites et restituées dans les contrôles destinés. Il en va de même au choix d'une référence article. Comme nous le disions, grâce au paramétrage réalisé en amont sur le formulaire, l'extraction des informations du client peut se faire en toute simplicité.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
  • Sur le formulaire en conception, cliquer sur la première zone de texte pour la sélectionner,
Comme le renseigne sa feuille de propriétés, le nom attribué à ce contrôle est nom_cli.
  • Activer l'onglet Données de sa feuille de propriétés,
  • Puis, régler sa propriété Source contrôle sur le champ Client_nom de la table Clients,
Extraire donnée dans zone de texte au choix dans liste déroulante de formulaire Access

Les champs de la table Clients sont naturellement proposés puisque la source du formulaire est précisément définie sur cette table.
  • Sur le formulaire, sélectionner la deuxième zone de texte, placée sur sa droite,
Sa feuille de propriétés indique que ce contrôle est nommé prenom_cli.
  • Régler sa propriété Source contrôle sur le champ Client_prenom,
  • Enregistrer les modifications (CTRL + S),
  • Cliquer sur un emplacement vide du formulaire pour le désigner,
  • Puis, enfoncer la touche F5 du clavier pour l'exécuter,
Restituer dynamiquement dans Textbox de formulaire données dépendantes de table Access

Désormais, au chargement, le formulaire n'est plus vide. Les zones de texte semblent afficher le contenu correspondant à l'identifiant client sélectionné dans la première liste déroulante. En réalité il n'en n'est rien. Vous pouvez le constater en affichant la table Client en mode feuille de données. De plus, si vous sélectionnez une nouvelle valeur dans la liste déroulante, aucun changement n'est opéré dans les zones de saisie.

Requête de correspondance
Ce comportement est tout à fait naturel. Aucun paramétrage indique explicitement que le contenu du Textbox doit correspondre au choix de l'identifiant dans la liste déroulante. Par défaut, c'est la valeur du premier enregistrement qui est extraite. Nous devons donc concevoir une requête dynamique d'extraction. Sa sélection doit se faire en fonction de l'identifiant client choisi dans la première liste déroulante du formulaire. Cette requête devra alors être désignée comme source du formulaire, à la place de la table Clients. Comme les noms des champs extraits ne changent pas, tous les autres paramétrages dont la source de contrôle des zones de texte, ne seront pas à refaire.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
  • En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
  • Dans la section Requêtes du ruban, cliquer sur le bouton Création de requête,
  • Dans la boîte de dialogue qui apparaît, sélectionner la table Clients,
  • Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
  • Glisser tous les champs de la représentation schématique de la table sur la grille de requête,
  • Dans la zone Critères du champ Client_num, cliquer avec le bouton droit de la souris,
  • Dans le menu contextuel, choisir Créer,
Accéder générateur expression pour construire critère dynamique de requête liée au formulaire Access

Nous affichons ainsi le générateur d'expression. C'est grâce à lui que nous pouvons établir la correspondance avec la liste déroulante des clients sur le formulaire. Ainsi, la requête isolera l'enregistrement de l'identifiant choisi.
  • Dans la liste des éléments d'expression sur la gauche, déployer l'arborescence des formulaires jusqu'à sélectionner le formulaire Cli_com,
  • Dans la liste centrale, double cliquer sur le contrôle ref_cli,
Correspondance entre critère de requête et liste déroulante de formulaire par générateur expression Access

Nous générons ainsi la syntaxe de la liaison qui s'inscrit dans la partie supérieure du générateur d'expression : [Formulaires]![Cli_Com]![ref_cli]. Comme ce critère est posé sur le champ Client_num, l'extraction de l'enregistrement doit se faire en fonction du numéro choisi depuis le formulaire.
  • Cliquer sur le bouton Ok pour valider l'expression,
De retour sur la grille de requête, vous remarquez l'apparition de la syntaxe de l'expression dans la zone Critères pour le champ Client_num.
  • Enregistrer cette requête (CTRL + S) sous le nom Sel_Client,
  • Puis, cliquer sur la croix de son onglet pour la fermer,
  • De retour sur le formulaire en conception, cliquer à l'intersection en haut à gauche pour le désigner,
  • Activer alors l'onglet Données de sa feuille de propriétés,
  • Modifier sa propriété Source en choisissant la requête Sel_Client,
Régler source du formulaire Access sur requête dynamique dépendant du choix dans liste déroulante

Comme les noms des champs extraits sont ceux de la table Clients, la propriété Source contrôle des TextBox n'est pas à modifier. Certes, si nous avions commencé par bâtir cette requête sélection dynamique, la correspondance des informations du formulaire avec la liste déroulante serait déjà établie. Mais il était important de démontrer le mécanisme pour bien le comprendre à l'avenir.

Nous l'avions évoqué, les informations des zones de texte ne se réactualisent pas naturellement au choix d'une valeur dans la liste déroulante. Nous devons gérer un évènement associé déclenchant une action de macro. Cette action doit avoir pour effet de réactualiser la source de données, soit le résultat de l'extraction de la requête dynamique.
  • Sur le formulaire en conception, sélectionner la liste déroulante des clients,
  • Puis, activer l'onglet Evènement de sa feuille de propriétés,
  • Cliquer sur le petit bouton à l'extrémité de son évènement Après MAJ,
Après MAJ signifie littéralement : Après mise à jour. Cet évènement se déclenche donc à chaque changement de valeur dans la liste déroulante.
  • Dans la boîte de dialogue qui apparaît, choisir Générateur de macro et valider par Ok,
Nous basculons ainsi dans l'éditeur de macro.
  • Dans la liste déroulante, choisir l'action AfficherTousEnreg,
Action de macro Access pour actualiser données du formulaire au changement de valeur dans liste déroulante

Nous l'avons déjà exploitée à maintes reprises dans nos formations. Cette action a pour effet d'actualiser les liaisons et les sources de données.
  • Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
  • De retour sur le formulaire, l'enregistrer à son tour (CTRL + S),
  • Puis, l'exécuter (F5),
Extraction dynamique sur formulaire Access des données liées au choix dans liste déroulante

Cette fois, à chaque modification de client dans la liste déroulante, les informations dérivées sur le nom et le prénom s'adaptent. La correspondance dynamique est donc parfaitement fonctionnelle. Souvenez-vous du principe. Une requête doit être bâtie. Son critère est dynamique. Il doit dépendre de la valeur choisie dans la liste déroulante du formulaire. Cette requête doit être utilisée comme source du formulaire. Les sources de contrôle des zones de texte doivent être réglées sur les noms des champs correspondants. Enfin, une macro doit actualiser les résultats à chaque changement dans la liste.



Restituer les données d'une autre source
Pour extraire le détail des produits, le problème se corse. La source du formulaire est déjà définie sur les informations des clients. Nous allons donc devoir trouver une autre solution pour établir la correspondance des articles sur le même formulaire.

Pour commencer, nous proposons de construire une requête similaire à la précédente. Elle doit isoler l'enregistrement correspondant à la référence désignée dans la seconde liste déroulante.
  • Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode création,
  • En haut de la fenêtre Access, cliquer sur l'onglet Créer pour activer son ruban,
  • Dans la section Requêtes, cliquer sur le bouton Création de requête,
  • Dans la boîte de dialogue qui suit, sélectionner la table Produits,
  • Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
  • Glisser tous les champs de la représentation schématique de la table sur la grille de requête,
  • Réaliser un clic droit dans la zone Critères du champ produit_ref,
  • Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
  • Dans la liste de gauche des éléments d'expression, déployer l'arborescence des formulaires jusqu'à sélectionner le formulaire Cli_Com,
  • Dans la liste centrale, double cliquer sur le contrôle ref_prod,
Expression Access pour critère dynamique de requête selon le choix de valeur dans la liste déroulante du formulaire

Comme précédemment, nous bâtissons ainsi l'expression permettant d'établir la correspondance dynamique.
  • Cliquer sur Ok pour valider la liaison,
De retour sur la grille de requête, vous notez la présence de l'expression de correspondance dans la zone Critères du champ produit_ref.
  • Enregistrer la requête (CTRL + S) sous le nom Sel_Produit,
  • Puis, cliquer sur la croix de son onglet pour la fermer et revenir sur le formulaire,
  • Sélectionner la zone de texte pour le nom du produit,
Comme l'indique sa feuille de propriétés, ce contrôle est nommé nom_prod.
  • Activer l'onglet Données de sa feuille de propriétés,
  • Puis, dérouler la liste de sa propriété Source contrôle,
Source contrôle zone de texte du formulaire Access à partir autre table

Nous l'avions évoqué, cette liaison ne va pas pouvoir se faire aussi facilement. Fort naturellement, seuls les champs de la table servant de source au formulaire sont proposés. Or, nous souhaitons pointer sur les champs de la requête isolant les informations du produit.

Il n'est pas question d'envisager de bâtir la syntaxe d'une requête Sql de correspondance dans cette propriété Source contrôle. Cela ne fonctionnerait pas. L'astuce précieuse consiste à exploiter la fonction Access DLookup ou plutôt RechDom dans notre cas, soit sa traduction française. Cette fonction permet d'isoler un enregistrement d'une table pour en extraire la valeur d'un champ à désigner. Sa syntaxe est la suivante :

=RechDom('[Champ_à_extraire]'; 'Nom_de_la_table', 'Critère')

Le troisième argument, celui du critère, est facultatif. Et c'est tant mieux dans notre cas. En effet, la condition est posée en amont par la requête Sel_produit. Un seul enregistrement doit en résulter. Il ne reste donc plus qu'à spécifier le champ pour la valeur à extraire. Rappelons-le, une requête est bien une table, certes spécifique.

Pour la correspondance avec la première zone de saisie, le nom du champ est produit_nom. Pour la seconde, il s'agit de produit_prix. Dans les deux cas, le nom de la table est Sel_Produit, soit le nom de la requête dynamique.
  • Dans la propriété Source contrôle, taper l'expression suivante :
=RechDom('[produit_nom]'; 'Sel_Produit')

Pour plus de confort, vous pouvez atteindre le générateur d'expression par Clic droit puis Créer.
  • Sélectionner la zone de texte pour le prix,
  • Dans sa propriété Source contrôle, saisir l'expression suivante :
=RechDom('[produit_prix]'; 'Sel_Produit')

L'adaptation est triviale. Elle consiste à pointer sur le champ correspondant de la requête d'extraction dynamique. Ce n'est pas tout à fait terminé. Souvenez-vous, nous devons forcer l'actualisation des données au changement de valeur dans la liste déroulante.
  • Sélectionner la liste déroulante des produits,
  • Activer l'onglet Evènement de sa feuille de propriétés,
  • Cliquer sur le petit bouton à l'extrémité de son évènement Après MAJ,
  • Dans la boîte de dialogue, choisir Générateur de macro et valider par Ok,
  • Dans l'éditeur de macro, choisir l'action AfficherTousEnreg avec la liste déroulante,
  • Dans le ruban, cliquer sur le bouton Enregistrer puis sur le bouton Fermer,
  • De retour sur le formulaire, réaliser le raccourci CTRL + S pour l'enregistrer à son tour,
  • Puis, enfoncer la touche F5 du clavier pour l'exécuter,
  • Dans la seconde liste déroulante, choisir une référence article,
Importer données sur formulaire selon choix dans liste déroulante par fonction Access RechDom

Les informations dépendantes sont parfaitement rapatriées dans les zones de saisie bien que la source de contrôle soit différente de la précédente et donc de celle du formulaire. Bref, nous parvenons à adapter les données affichées sur un formulaire Access en fonction des choix réalisés par l'utilisateur dans plusieurs listes déroulantes.

Nous aurions même pu aller plus vite en supprimant l'étape de la requête dynamique intermédiaire. Et c'est tout l'intérêt de cette fonction RechDom pour produire des contenus adaptés. Comme nous l'avons évoqué en effet, le troisième argument de cette fonction est facultatif. Il consiste à définir l'expression du critère. Ce critère doit établir la correspondance entre le champ produit_ref de la table Produits et la valeur de la liste déroulante ref_prod:

=RechDom('[produit_nom]'; 'Produits'; '[produit_ref]=ref_prod')

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn