Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Détail des commandes du client
Cette
astuce Access explique comment obtenir le
détail d'une commande au clic sur son numéro dans le
sous formulaire encapsulé dans le
formulaire parent des clients.
Dans l'exemple illustré par la capture, nous travaillons sur un
formulaire offrant trois niveaux de détail. Le
formulaire parent des clients encapsule deux
sous-formulaires. Les informations du client en cours de consultation sont listées sur la gauche. Le premier
sous-formulaire, positionné en haut à droite, énumère toutes les commandes qu'il a passées. Au clic sur l'une d'entre elles, le détail des achats apparaît dans le second
sous formulaire positionné en bas à droite.
Source et procédure
Au fil des
astuces précédentes, nous avons ébauché la construction de ce
formulaire relativement complexe. C'est la raison pour laquelle, nous proposons de le récupérer.
- Télécharger le fichier detail-commandes-formulaire.rar en cliquant sur ce lien,
- Le décompresser dans le dossier de votre choix,
- Double cliquer sur le fichier résultant pour l'ouvrir dans Access,
- Puis, cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Dans le volet de navigation, double cliquer sur le formulaire f_Clients pour l'exécuter,
Nous découvrons un
formulaire proche de la version finalisée à atteindre. Pour l'instant, il manque le second
sous formulaire, celui du détail des commandes. Les informations du client apparaissent sur la gauche. Elles sont issues de la
table Clients. Ses commandes sont listées dans le
sous formulaire. Elles proviennent de la
table Commandes. C'est une relation établie entre une
clé primaire et une
clé externe sur ces
tables qui permet de réunir les informations attachées.
Une barre de navigation personnalisée permet de faire défiler les clients et leurs commandes associées. Tous n'ont pas encore réalisé d'achats. Si vous atteignez le quatrième client par exemple, vous constatez qu'il a déjà passé trois commandes.
Désormais, nous devons donc créer un second sous
formulaire pour restituer le détail de la commande cliquée. Ces données sont à piocher dans la
table Detail_commandes. Une relation existe fort naturellement entre cette dernière et la
table Commandes. Ce détail est lui-même prélevé à partir de la
table Produits. Chaque référence d'article établit une relation entre ces deux dernières tables. En cliquant sur le
bouton Relations dans le
ruban Outils de base de données, vous pouvez visualiser la construction et les liaisons qui entrent en jeu.
Nous découvrons ainsi les noms des champs, notamment de ceux impliqués dans les
relations de
clé primaire Ã
clé externe.
La requête de correspondance
Pour restituer le détail de la commande cliquée dans un
second sous formulaire, nous devons commencer par bâtir une
requête. Son rôle est de récupérer le numéro de la commande (com_num) ainsi désignée. De la sorte, cette
requête sera en mesure de filtrer uniquement les enregistrements de la commande choisie. De fait, elle pourra servir de source de données au second
sous formulaire à bâtir. Cette
correspondance entre les clés doit être entreprise sur le
champ Det_com de la
table Detail_commandes.
- 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 surgit, sélectionner la table Detail_commandes,
- Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
- Ajouter tous les champs de la table sur la grille de requête,
Il est opportun d'élargir la zone du
champ Det_com pour accueillir la syntaxe à construire.
- Cliquer droit dans la zone Critères du champ Det_com,
- Dans le menu contextuel, choisir la commande Créer,
Nous affichons ainsi le
générateur d'expression. Son objectif est de nous aider à pointer sur le
champ com_num du
sous formulaire des commandes, pour établir la relation.
- Dans la liste de gauche, déployer complètement l'arborescence des formulaires,
- Cliquer alors sur le formulaire f_Clients pour le sélectionner,
- Dans la liste du centre, double cliquer sur le sous formulaire sf_Commandes,
Nous obtenons ainsi le début de l'expression. En respectant la hiérarchie des objets, elle nous permet d'atteindre le
sous formulaire encapsulé. Mais nous devons descendre encore plus bas pour atteindre le
contrôle com_num, lui-même encapsulé dans le
sous formulaire.
- En haut du générateur, cliquer à la fin de la syntaxe pour y placer le point d'insertion,
Il faut veiller à supprimer l'espace qui se glisse généralement après le crochet fermant.
- Taper un point d'exclamation (!),
C'est ainsi dans la philosophie objet que nous descendons encore d'un cran pour pouvoir désigner un contrôle encapsulé dans le
sous formulaire.
- Inscrire alors le champ com_num entre crochets, soit : [com_num],
La syntaxe complète de l'
expression de correspondance avec le champ Det_com est la suivante :
Formulaires![f_Clients]![sf_Commandes]![com_num]
- Cliquer sur le bouton Ok du générateur pour valider la syntaxe de l'expression,
Désormais, elle apparaît bien dans la
zone Critères du
champ Det_com. Grâce à elle, seuls subsisteront les enregistrements pour lesquels le numéro de commande lié correspond bien à celui cliqué depuis le premier
sous formulaire.
- Enregistrer la requête (CTRL + S) sous le nom R_Detail,
- Puis, fermer la requête en cliquant sur la croix de son onglet,
Le deuxième sous-formulaire
Il est maintenant temps de bâtir le second
sous formulaire sur la base de la requête fraîchement créée.
- Dans le volet de navigation, cliquer droit sur le formulaire f_Clients,
- Dans le menu contextuel, choisir le mode Création,
- Dans la section Contrôles du ruban Création, choisir celui du Sous-formulaire / Sous état,
- Puis le tracer sous la barre de navigation personnalisée,
- Dans l'assistant qui apparaît, conserver le choix : Utiliser les tables et les requêtes,
- Puis, cliquer sur le bouton Suivant pour progresser,
- Dans la nouvelle étape, choisir la requête R_Detail avec la liste déroulante,
- Cliquer alors sur le bouton à la double flèche pour intégrer tous les champs,
- Cliquer de nouveau sur le bouton Suivant pour progresser,
Dans cette nouvelle étape, l'
assistant Access propose d'établir la relation entre les données pour charger le
sous formulaire en fonction des données présentes dans le
formulaire parent. Dans notre cas, la relation est déjà établie par l'expression de correspondance de la
requête. De plus, cette liaison concerne les deux
sous formulaires.
- Conserver le choix proposé par défaut : Les définir moi-même,
- Puis, cliquer sur le bouton Suivant en bas de la boîte de dialogue,
- Dans cette dernière étape, nommer le sous formulaire comme suit : sf_DetCom,
- Enfin, cliquer sur le bouton Terminer pour procéder à sa création,
Avant de tester le résultat, quelques réglages de mise en forme et d'ajustement sont nécessaires.
- Supprimer l'étiquette associée au sous formulaire,
- Sélectionner de nouveau le sous formulaire en cliquant sur le carré grisé en haut à gauche,
- Activer l'onglet Format de sa feuille de propriétés,
- Régler son attribut Barre de défilement sur Aucune,
- Régler son attribut Afficher sélecteur sur Non,
- Régler son attribut Boutons de déplacement sur Non,
- Ajuster ensuite la largeur de ce deuxième sous formulaire sur la largeur du premier,
Pour cela, vous pouvez exploiter le
bouton Taille / Espace du
ruban Organiser sur les deux
sous formulaires sélectionnés ensemble.
- Ajuster la hauteur du sous formulaire pour qu'il ne dépasse pas le rectangle grisé sur sa gauche,
- Lui attribuer un gris assez foncé pour sa couleur de contour,
- Puis, forcer légèrement l'épaisseur du trait,
Pour cela, vous pouvez exploiter le
bouton Contour dans le
ruban contextuel Format.
- Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
En faisant défiler les enregistrements avec la barre de navigation personnalisée, vous constatez que le second
sous formulaire restitue parfaitement le détail de la première commande pour chaque client.
Mais bien entendu à ce stade, si vous cliquez sur une autre commande dans le premier sous formulaire, le détail associé ne s'actualise pas dans le second.
Actualiser les données sur événement
Pour que le second
sous formulaire s'actualise au clic sur un enregistrement du premier, nous devons gérer un événement bien précis. Cet
événement est celui du clic sur chaque contrôle du premier
sous formulaire. L'
astuce consiste à déclencher un petit code VBA capable d'actualiser les données sur ordre.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans la liste des propositions, choisir le mode Création,
- Sélectionner le contrôle com_num du premier sous formulaire,
Deux clics sont nécessaires. Le premier sélectionne le
sous formulaire. Le second permet d'atteindre le contrôle souhaité.
- Activer alors l'onglet Evénement de sa feuille de propriétés,
- Cliquer sur le petit bouton situé à l'extrémité de son événement Au clic,
- Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur de code Visual Basic Access, plus précisément entre les bornes de la
procédure événementielle Com_num_Click. Son code se déclenchera donc au clic sur la zone
com_num. Son rôle est d'actualiser les informations du second
sous formulaire. Et pour cela, nous devons l'atteindre par son nom en parcourant la hiérarchie des objets.
- Entre les bornes de la procédure événementielle, ajouter l'instruction VBA suivante :
Forms("f_clients").Form("sf_DetCom").Requery
Grâce à l'
objet Forms, nous désignons par son nom le
formulaire parent f_clients. Grâce à lui, nous pouvons rejoindre le
formulaire enfant, reconnu par son nom
sf_DetCom, grâce à l'objet dérivé
Form. La
méthode Requery permet alors d'actualiser les données du formulaire ainsi désigné.
Lorsque l'utilisateur clique sur une ligne d'une commande, rien n'indique qu'il va cibler précisément le champ du numéro. C'est pourquoi nous devons reproduire cette instruction pour tous les contrôles du premier
sous formulaire.
- En haut de l'éditeur VBA Access, déployer la liste déroulante de gauche,
- Dans l'énumération, cliquer sur le contrôle Com_client,
- Déployer alors la liste déroulante de droite,
- Cliquer alors sur l'événement associé du clic (Click),
Nous créons ainsi la
procédure événementielle Com_client_Click.
- Coller l'instruction VBA précédente entre ses bornes,
La procédure générée au choix dans la première liste déroulante (Com_client_BeforeUpdate) peut être effacée. Le même protocole doit ensuite être observé pour créer les procédures
Com_date_Click et
Com_montant_Click.
Private Sub Com_client_Click()
Forms("f_clients").Form("sf_DetCom").Requery
End Sub
Private Sub Com_date_Click()
Forms("f_clients").Form("sf_DetCom").Requery
End Sub
Private Sub Com_montant_Click()
Forms("f_clients").Form("sf_DetCom").Requery
End Sub
Private Sub Com_num_Click()
Forms("f_clients").Form("sf_DetCom").Requery
End Sub
- Enregistrer les modifications (CTRL + S) et fermer l'éditeur VBA Access,
- De retour sur le formulaire, l'enregistrer à son tour,
- Puis, l'exécuter avec la touche F5 du clavier,
Cette fois, en cliquant sur la ligne de l'une des commandes, vous constatez que son détail est instantanément restitué dans le second
sous-formulaire. C'est la
méthode Requery qui a forcé le recalcul de la
requête utilisée comme
source de données.