Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
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.
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 .
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.
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,
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 ,
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 ,
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,
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,
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,
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 ,
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 ,
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 ,
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 ,
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),
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 ,
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 ,
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,
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')