formateur informatique

Extraire une donnée au clic sur un sous sous formulaire

Accueil  >  Bureautique  >  Access  >  Access Astuces  >  Extraire une donnée au clic sur un sous sous formulaire
Livres à télécharger


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


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Extraire une information au clic

Grâce aux travaux cumulés lors des astuces précédentes, nous avons monté un outil fort intéressant. Nous disposons désormais d'un formulaire parent encapsulant deux sous-formulaire. Le formulaire parent permet de consulter les informations des clients de l'entreprise. Pour chaque client ainsi passé en revue, le premier sous-formulaire restitue automatiquement toutes les commandes qu'il a passées. Et au clic sur l'une d'entre elles, le détail de la commande est délivré dans le second sous-formulaire. Mais ce détail n'offre pas tous les renseignements sur les articles achetés, comme la désignation et le prix par exemple. Il s'agit en effet d'une vraie application Access articulant quatre tables reliées entre elles pour des raisons d'optimisation de ressources.

Extraire et afficher une information précise au clic sur un enregistrement dans un sous-formulaire Access

Désormais donc, au clic sur une ligne d'un produit acheté dans le second sous-formulaire, nous souhaitons importer automatiquement l'information sur la désignation du produit. Et ce renseignement doit s'incruster dans une zone grisée située sur la gauche de l'écran de l'application.

Base de données source
Nous le disions, nous souhaitons agir à partir de cette application améliorée au fil des astuces précédentes. Il s'agit donc de récupérer cette base de données dans un premier temps.
  • Télécharger le fichier extraire-donnee-rechdom.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,
  • Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
  • Puis, dans le volet de navigation, double cliquer sur le formulaire f_Clients pour l'exécuter,
La partie gauche du formulaire renseigne sur le client en cours de consultation. Toutes ses commandes sont listées dans le premier sous-formulaire placé dans la partie supérieure droite. La barre de navigation personnalisée propose des boutons de déplacement qui permettent de faire défiler les clients. Et pour chaque client, le premier sous-formulaire s'actualise automatiquement pour énumérer ses commandes. Au clic sur l'une d'entre elles, le détail des achats est livré dans le second sous-formulaire, positionné dans la partie inférieure droite du formulaire parent. Tout cela, nous l'avons constaté au cours de la présentation de l'enjeu de cette astuce. Et donc à ce stade, si vous cliquez sur l'une des lignes d'un détail de commande, aucune information n'est extraite dans le petit rectangle grisé situé en bas à gauche du formulaire parent. Nous devons être en mesure de récolter la référence de l'enregistrement cliqué. En fonction de cette référence, nous devons pouvoir extraire la donnée sur la désignation de l'article. Nous pourrions d'ailleurs en profiter pour restituer le prix. Mais pour l'exemple, une seule information suffira.

Extraire la référence de l'article
Pour extraire une information encapsulée dans un sous-formulaire, un petit code VBA Access est nécessaire. Mais il est très simple et consiste en une instruction triviale. C'est ce code qui va nous permettre de descendre dans la hiérarchie pour atteindre le contrôle de la référence encapsulé dans le sous-formulaire, lui-même encapsulé dans le formulaire parent.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans la liste des propositions, choisir le mode création,
Nous basculons ainsi dans la vue en conception du formulaire. En le faisant défiler vers le bas, vous notez la présence de deux zones de texte, sanctionnées par l'intitulé Indépendant.

Zones de texte sur formulaire Access pour extraire les informations du sous sous formulaire au clic de la souris

Elles sont respectivement nommées Recup et Article. C'est la feuille de propriétés qui renseigne sur ces noms après les avoir sélectionnés tour à tour. La zone Recup est prévue pour l'extraction de la référence cliquée. Elle pourra être masquée à l'issue. Son rôle est de transmettre ce code à la fonction RechDom qui doit exercer dans la zone Article afin de livrer la désignation correspondant à la référence du produit cliqué.
  • Cliquer sur le second sous-formulaire pour le sélectionner,
  • Dès lors, cliquer sur son contrôle Det_num pour le désigner,
  • Activer ensuite l'onglet Evénement de la feuille de propriétés,
  • Puis, cliquer sur le petit bouton situé à l'extrémité droite de son événement Au clic,
  • Dans la boîte de dialogue qui surgit, 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 Det_num_Click. Son code se déclenchera donc au clic sur l'une des références du détail de la commande souhaitée. Il s'agit maintenant d'extraire cette référence pour la greffer dans la zone de saisie nommée Recup.
  • Entre les bornes de cette procédure, ajouter l'instruction VBA Access suivante :
Forms("f_clients").Recup.Value = Det_ref.Value

L'objet VBA Forms permet de désigner le formulaire parent f_clients par son nom. Grâce à lui, nous pouvons atteindre son contrôle Recup. Dès lors, nous exploitons sa propriété Value pour l'affecter de la valeur à récupérer. De la même façon, nous exploitons la propriété Value du contrôle Det_ref, celui du second sous-formulaire. Nous ne sommes pas contraints de le désigner en descendant dans la hiérarchie des contrôles encapsulés dans la mesure où cette procédure événementielle est explicitement attachée à l'un de ses contrôles. En revanche, lorsque l'utilisateur clique sur une ligne du détail, rien n'indique quel contrôle il a pointé la souris. C'est la raison pour laquelle, nous devons déclencher cette même instruction sur chacun d'entre eux.
  • En haut de l'éditeur VBA Access, déployer la liste déroulante de gauche,
  • Dans l'énumération, sélectionner le contrôle Det_com,
  • Déployer alors la liste déroulante de droite et choisir l'événement Click,
  • Entre les bornes de cette nouvelle procédure, coller la précédente instruction,
Nouvelles procédures événementielles VBA Access pour extractions des données au clic sur le sous formulaire

Nous devons ensuite reproduire exactement la même procédure pour les contrôles Det_qte, Det_ref et Det_remise :

Private Sub Det_com_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub

Private Sub Det_num_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub

Private Sub Det_qte_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub

Private Sub Det_ref_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub

Private Sub Det_remise_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub


Puis, il s'agit de supprimer les procédures événementielles vides générées automatiquement au choix d'un contrôle dans la première liste déroulante.
  • Enregistrer les modifications (CTRL + S) puis fermer l'éditeur de code VBA Access,
  • De retour sur le formulaire, l'enregistrer à son tour et l'exécuter avec la touche F5,
Récupérer la référence de la ligne cliquée dans le sous sous formulaire Access par le code VBA

Vous pouvez naviguer au travers des clients et cliquer sur l'une de ses commandes dans le premier sous-formulaire. Dès lors, au clic sur l'une des lignes du détail de la commande en question, vous constatez que la référence de l'article acheté est extirpée et restituée dans la zone de texte Recup.

Rechercher l'information associée
Désormais, le plus dur est fait. Nous devons exploiter cette référence extraite pour trouver la désignation associée dans la table liée Produits. Pour cela, la fonction Access RechDom est dédiée. Il suffit de lui indiquer le nom du champ désiré en premier paramètre. Il s'agit du champ produit_nom. Ensuite, nous devons lui indiquer le nom de la table hébergeant ce champ. Il s'agit de la table Produits. Enfin, en troisième et dernier paramètre, nous devons émettre la clause Where. C'est elle qui va permettre d'isoler précisément la donnée souhaitée en fonction de la référence cliquée. Nous devons donc poser une condition sur le champ produit_ref et vérifier que sa valeur est identique à celle de la référence cliquée. Par contre et pour éviter toute erreur, nous devons nous assurer que la zone Recup porte bien une valeur avant d'enclencher le calcul. Tant que l'utilisateur n'a pas cliqué sur le détail d'une commande, elle ne porte aucune donnée. Donc, nous devons encapsuler la fonction RechDom dans la fonction Access VraiFaux. Il s'agit de l'équivalent de la fonction Excel Si.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
  • Sur le formulaire en conception, cliquer sur la zone Article pour la sélectionner,
  • Activer l'onglet Données de sa feuille de propriétés,
  • Cliquer dans la zone vide de son attribut Source contrôle pour l'activer,
  • Taper le symbole égal (=) pour initier la syntaxe de la formule,
  • Inscrire la fonction conditionnelle suivie d'une parenthèse, soit : VraiFaux(,
  • Désigner la zone de texte à contrôler entre crochets, soit : [Recup],
  • Puis, taper l'égalité suivante : ="", pour le critère à vérifier,
  • Taper alors un point-virgule (;) pour passer dans la branche Alors de la fonction conditionnelle,
  • Inscrire deux guillemets ("") pour garder la zone vide,
De cette manière, lorsqu'aucune référence n'a encore été importée dans la zone Recup, nous n'enclenchons aucune recherche.
  • Taper un point-virgule (;) pour passer dans la branche Sinon de la fonction conditionnelle,
  • Inscrire la fonction de recherche suivie d'une parenthèse, soit : RechDom(,
  • Désigner le champ de recherche entre guillemets et entre crochets, soit : "[produit_nom]",
  • Taper un point-virgule (;) pour passer dans l'argument de la table contenant ce champ,
  • Inscrire le nom de la table entre guillemets, soit : "Produits",
  • Taper un point-virgule (;) pour passer dans l'argument de la clause Where,
  • Ouvrir les guillemets et inscrire le nom du champ à analyser, soit : "[produit_ref],
  • Taper le symbole égal (=) pour annoncer le critère à honorer,
  • Inscrire une simple côte suivie d'une double côte (guillemet), soit : '",
En effet, la valeur à comparer doit être concaténée dynamiquement. Elle est portée par le champ Recup. Il s'agit d'un texte. Tout texte doit être encadré de côtes. Mais comme les doubles sont déjà utilisées dans la syntaxe, nous les simulons par les simples côtes.
  • Taper un espace suivi du symbole de concaténation, suivi d'un espace, soit :   & ,
  • Désigner la zone de la valeur extraite entre crochets, soit : [Recup],
Comme cette information est directement située sur le formulaire et non dans une table, nous ne devons pas l'encadrer de guillemets.
  • Taper de nouveau un espace suivi du caractère de concaténation, suivi d'un nouvel espace,
  • Inscrire alors une simple côte entre guillemets, soit : "'",
  • Fermer la parenthèse de la fonction RechDom,
  • Fermer la parenthèse de la fonction VraiFaux,
  • Valider la syntaxe de la formule par la touche Entrée du clavier,
  • Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
Désormais, quel que soit le client choisi avec la barre de navigation, au clic sur l'une de ses commandes, puis au clic sur l'un des détails de cette commande, la désignation est parfaitement restituée dans la zone de texte prévue à cet effet.

La syntaxe que nous avons construite pour récupérer cette information en fonction de la référence importée au clic par le code VBA, est la suivante :

=VraiFaux([Recup]=""; ""; RechDom("[produit_nom]"; "Produits"; "[produit_ref]='" & [Recup] & "'"))

Nous aurions aussi pu récupérer le prix. Pour cela, il aurait suffi de concaténer une nouvelle recherche avec la fonction RechDom. Mais alors, elle aurait dû agir sur le champ produit_prix.

Extraire les informations au clic de la souris sur le deuxième sous formulaire Access par le code VBA

Pour parachever l'application, il convient de masquer la zone Recup. Pour cela, il suffit de régler sa propriété Visible à Non, dans l'onglet Format de sa feuille de propriétés.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn