formateur informatique

Extraire selon un ou plusieurs critères recoupés

Accueil  >  Bureautique  >  Access  >  Access Avancé  >  Extraire selon un ou plusieurs critères recoupés
Livres à télécharger


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

Abonnez-vous gratuitement à la chaîne Youtube Rossetti Stéphane .
Sujets et formations similaires :


Extractions de recherches sur Formulaire

Dans l'exercice Access précédent, nous avons abouti le formulaire pour facturer les clients. Et pour ce faire, nous avons fait interagir de nombreux objets comme les requêtes, les tables, macros et formulaires.

Nous attaquons ici le dernier formulaire imbriqué dans cette navigation à onglets. Il est destiné à cibler des clients pour des opérations commerciales. Deux listes déroulantes reliées entre elles doivent permettre de déterminer un département et une ville. Mais l'extraction des clients doit pouvoir se faire sur la première sélection, comme sur les deux choix recoupés. Et ce type de résultat est particulièrement recherché. Il offre beaucoup de souplesse pour exploiter les informations résultantes.



Sources et présentation de la problématique
Il est bien entendu nécessaire de réceptionner l'application conçue au fil des exercices, au dernier indice de développement. La décompression livre le fichier de la base de données. Il est accompagné d'un fichier texte dans lequel est archivée une expression de correspondance pour les requêtes dynamiques. En effet, notre formulaire de recherche est encapsulé dans un formulaire de navigation à onglets.
  • Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
  • Dans la boîte de dialogue qui se propose, saisir le mot de passe que nous avions défini : abc,
  • Le valider et cliquer sur le bouton Activer le contenu du bandeau de sécurité,
  • Taper de nouveau le mot de passe : abc, du fait de la régénération opérée par la sécurité,
Le formulaire de navigation principal se propose par défaut. Il offre d'atteindre tous les outils de gestion par des onglets respectifs.
  • Cliquer sur l'onglet Chercher client pour atteindre son formulaire,
Formulaire Access de recherche des clients par des listes déroulantes dépendantes sur le département et la ville

Deux listes déroulantes se proposent. La première doit permettre de définir un département et non un code postal. Cette précision est importante. Ce sont en effet des codes postaux qui sont archivés dans la table Communes. Ils sont donc codés sur 5 caractères. Nous devons envisager un traitement permettant de regrouper les données sur les deux premiers chiffres communs.

La deuxième liste déroulante doit offrir de choisir une ville. Mais cette ville doit appartenir au département précédemment sélectionné. Ces deux listes déroulantes doivent donc être reliées entre elles. De plus, cette énumération doit être restreinte seulement aux communes habitées par les clients. L'extraction doit donc être réalisée à partir de la table Clients et non de la table Communes.

Extraire les départements uniques
Nous proposons de bâtir une requête capable d'isoler les départements uniques à partir des codes postaux de la table Communes. Nous l'avions appris à l'occasion de la découverte du langage SQL, c'est la clause DISTINCT qui permet d'éliminer les doublons d'un champ à préciser. De plus, SQL offre une fonction capable de prélever seulement les deux premiers caractères d'un champ. Cette fonction se nomme Left, comme en VBA.
  • Cliquer sur l'onglet Créer en haut de la fenêtre Access 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 suit, cliquer sur le bouton Fermer pour n'ajouter aucune table,
  • En haut à gauche du ruban Créer, cliquer sur le bouton SQL,
  • Dans l'éditeur SQL, remplacer le fragment de syntaxe par l'expression suivante :
SELECT DISTINCT LEFT(Commune_dep,2) FROM Communes;

Nous sélectionnons (SELECT) les informations du champ Commune_dep depuis (FROM) la table Communes. Mais nous prenons soin de ne prélever que les deux premiers caractères pour chaque enregistrement, grâce à la fonction SQL LEFT. Celle-ci requiert deux arguments : Le nom du champ et le nombre de caractères à prélever en partant du début de la chaîne. Et puis, grâce à la clause DISTINCT en préfixe, nous ne conservons que les valeurs uniques. Les redondances sont donc exclues.
  • Enregistrer la requête (CTRL + S) sous le nom : R_Dep_Uniques,
  • Puis, la fermer en cliquant sur la croix de son onglet,
  • Dans le volet de navigation, cliquer droit sur le formulaire F_chercher_client,
  • Dans le menu contextuel, choisir Mode création,
  • Dans la vue en conception, sélectionner la première liste déroulante,
  • Activer l'onglet Données de sa feuille de propriétés,
  • Régler l'attribut Origine source sur Table/Requête,
  • Dans sa propriété Contenu, choisir la requête R_Dep_Uniques,
Charger le contenu de la liste déroulante par une requête dynamique depuis le formulaire Access en conception

C'est ainsi que nous sommes censés remplir dynamiquement la liste déroulante des départements uniques, extraits de la table Communes.
  • Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
  • Puis, déployer la première liste déroulante,
Liste déroulante de formulaire chargée des départements sans doublons grâce à une requête Access

La première mission est donc accomplie. La liste déroulante permet de sélectionner un département explicitement, pour commencer à définir les critères d'extraction.



Extraire les villes du département choisi
Désormais, nous devons construire une requête au critère dynamique. Ce dernier doit être posé sur le champ du code postal pour correspondre au choix émis par l'utilisateur, à l'aide de la première liste déroulante. Il doit en résulter l'extraction des villes correspondantes.
  • Fermer le formulaire F_chercher_client,
  • 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 suit, sélectionner la table Clients,
  • Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
  • Ajouter les champs Client_ville et Client_dep sur la grille de requête,
Dans la démonstration précédente, nous avons directement exécuté le formulaire F_chercher_client. Aucune expression de correspondance n'était nécessaire pour que la requête puise des informations sur le formulaire. Mais ici, le problème est tout autre. La condition sur le champ Client_dep dépend précisément du choix de l'utilisateur. Et ce formulaire ne sera jamais exploité indépendamment. Il est encapsulé dans le système de navigation par onglets. Donc, comme nous l'avons démontré dans les exercices précédents, nous avons besoin d'une syntaxe de correspondance précise pour atteindre le contrôle de la liste déroulante.
  • A la racine du dossier de décompression, double cliquer sur le fichier texte pour l'ouvrir,
  • Sélectionner l'intégralité de la syntaxe avec le raccourci clavier CTRL + A par exemple,
  • La copier (CTRL + C) et revenir dans l'éditeur de requête Access,
  • Cliquer droit dans la zone Critères du champ Client_dep,
  • Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
  • Taper l'opérateur Comme suivi d'un espace,
Il s'agit de l'équivalent Sql LIKE. Il permet de considérer tous les enregistrements pour lesquels une équivalence non stricte est trouvée.
  • A la suite, coller (CTRL + V) la syntaxe précédemment copiée,
  • Compléter la syntaxe avec le nom de la liste déroulante entre crochets, soit : [Departement],
Il s'agit effectivement du nom d'objet que nous lui avions attribué. L'expression n'est pas terminée. Il s'agit d'extraire les villes des départements commençant par ces deux chiffres désignés. Nous devons donc la concaténer au symbole de l'étoile.
  • A la suite de l'expression taper un espace suivi du caractère de concaténation (&) suivi d'un nouvel espace,
  • Puis, taper le symbole de l'étoile entre guillemets : '*',
Critère de requête Access pour remplir la liste dépendante des villes associées au département choisi dans la première liste déroulante du formulaire

La syntaxe de correspondance est désormais terminée :

Comme Formulaires![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![Departement] & '*'
  • Cliquer sur le bouton Ok du générateur pour valider l'expression,
  • De retour dans l'éditeur de requête, double cliquer dans la zone Tri du champ Client_ville,
Ainsi, nous organisons les villes extraites dans l'ordre croissant. Plusieurs clients peuvent habiter dans la même ville. Des redondances peuvent donc apparaître. Pourtant, nous souhaitons bien énumérer des villes explicitement différentes.
  • En haut à gauche du ruban Créer, cliquer sur la flèche du bouton Affichage,
  • Dans la liste, choisir Mode SQL,
Nous sommes de retour dans l'éditeur Sql. La syntaxe transcrite semble complexe. Cela tient essentiellement au fait qu'Access répète le nom de la table en préfixe de chaque champ. Au passage, vous remarquez que l'opérateur Comme a été traduit en langage Sql par l'opérateur LIKE.
  • Juste après le mot clé SELECT, ajouter la clause DISTINCT,
Nous demandons donc l'extraction des villes uniques selon le département répondant au critère dynamique, issu du formulaire. La syntaxe complète est la suivante :

SELECT DISTINCT Clients.Client_ville, Clients.Client_dep FROM Clients WHERE(((Clients.Client_dep) Like [Formulaires]![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![Departement] & '*')) ORDER BY Clients.Client_ville;
  • Enregistrer la requête sous le nom : R_Villes_Dep,
  • Puis, cliquer sur la croix de son onglet pour la fermer,
  • Afficher ensuite le formulaire F_chercher_client en mode création,
  • Sélectionner alors la deuxième liste déroulante,
  • Activer l'onglet Données de sa feuille de propriétés,
  • Régler son attribut Origine source sur Table/Requête,
  • Puis, régler sa propriété Contenu sur la requête R_Villes_Dep,
Comme vous le savez, le mécanisme n'est pas encore totalement bouclé. Pour qu'une liste déroulante charge son contenu en fonction du choix émis dans une autre liste, les enregistrements doivent être actualisés. Une fois n'est pas coutume, nous choisissons d'enclencher cette action par le code VBA. Le principe est finalement encore plus simple qu'avec une action de macro.
  • Sélectionner la première liste déroulante,
  • Activer ensuite l'onglet Evènement de sa feuille de propriétés,
  • Cliquer sur le petit bouton à l'extrémité de son évènement Sur changement,
  • Dans la boîte de dialogue qui apparaît, choisir : Générateur de code et valider par Ok,
Nous basculons ainsi dans l'éditeur de code VBA Access et plus précisément entre les bornes de la procédure évènementielle : Departement_Change. Son code VBA doit se déclencher à chaque changement opéré dans la liste déroulante.
  • Entre les bornes de la procédure, saisir la ligne suivante : DoCmd.Requery,
Private Sub Departement_Change()
DoCmd.Requery
End Sub


DoCmd est un objet de programmation. Il s'agit de la contraction de l'expression DoCommand. Il propose de nombreuses propriétés et méthodes. Sa méthode Requery permet d'actualiser globalement les enregistrements.
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire,
  • Sélectionner la seconde liste déroulante,
  • Cliquer sur le bouton de son évènement Sur changement dans sa feuille de propriétés,
  • Dans la boîte de dialogue qui suit, choisir Générateur de code et valider par Ok,
  • Entre les bornes de sa procédure, saisir la même ligne de code :
Private Sub Ville_Change()
DoCmd.Requery
End Sub


Par anticipation donc, nous choisissons aussi de rafraîchir les enregistrements au changement de valeur dans la seconde liste déroulante. En effet à l'issue, il s'agira bien de livrer les résultats de l'extraction dans le sous-formulaire.
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire,
  • L'enregistrer à son tour en cliquant sur la disquette dans la barre d'accès rapide,
  • Fermer le formulaire en cliquant sur la croix de son onglet,
  • Puis, double cliquer sur le formulaire _F_navig_principal pour l'exécuter,
  • Activer son onglet Chercher un client pour atteindre son formulaire,
  • Choisir un département dans la première liste déroulante,
  • Puis, déployer la seconde liste déroulante,
Listes déroulantes dépendantes reliées en cascade sur un formulaire Access

Comme vous pouvez le voir, toutes les villes du département sont effectivement proposées dans l'ordre croissant. Au changement de département, la mémoire de l'ancienne ville est cependant conservée dans la seconde liste déroulante. Nous avions appris à corriger ce défaut de listes liées grâce au code VBA.



Extraire selon un ou plusieurs critères recoupés
Nous devons désormais produire l'extraction des clients dans le sous-formulaire. Mais cette restitution doit être intelligente. Si seul le département est choisi par le biais de la première liste déroulante, tous les clients y habitant doivent être affichés. Si la ville est définie en complément à l'aide de la seconde liste déroulante, l'extraction doit s'affiner en recoupant ces deux critères.
  • Fermer le formulaire de navigation principal,
  • 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 suit, choisir la table Clients,
  • Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
  • Glisser tous les champs de la table sur la grille de requête sauf le champ Client_id,
  • Cliquer droit dans la zone Critères du champ Client_dep,
  • Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
  • Débuter la syntaxe par l'opérateur Comme suivi d'un espace,
  • Coller ensuite l'expression de correspondance issue du fichier texte,
  • Ajouter le nom de la première liste déroulante entre crochets, soit : [Departement],
  • Puis, concaténer le symbole de l'étoile comme nous l'avons fait précédemment : & '*',
  • Valider ensuite l'expression en cliquant sur le bouton Ok du générateur,
La syntaxe complète que nous avons bâtie pour ce premier critère est la suivante :

Comme Formulaires![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![Departement] & '*'

Elle indique explicitement de produire l'extraction des clients pour lesquels le code postal commence nécessairement comme le département choisi dans la liste déroulante.
  • Cliquer droit dans la zone Critères du champ Client_ville,
  • Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
  • Débuter l'expression comme suit : Comme '*' & ,
Nous indiquons ainsi d'émettre une condition sur la ville, quel que soit le début du critère et en considérant ce qui suit. Et précisément, si ce qui suit n'est pas défini par le biais de la seconde liste déroulante, le symbole de l'étoile permet de considérer toutes les villes. Dans le cas contraire, le recoupement est effectué. Voilà donc l'astuce qui permet de produire une extraction sur une ou plusieurs conditions. Néanmoins, la syntaxe de notre second critère n'est pas terminée.
  • A la suite, coller l'expression de correspondance issue du fichier texte,
  • Puis, ajouter le nom de la seconde liste déroulante entre crochets : [Ville],
  • Valider l'expression en cliquant sur le bouton Ok du générateur,
Critères dynamiques de requête Access pour réaliser des extractions sur le formulaire en fonction des choix recoupés par les listes déroulantes

La syntaxe que nous avons construite pour ce second critère est donc la suivante :

Comme '*' & Formulaires![_F_navig_principal]![SousFormulaireNavigation].[Formulaire]![Ville]
  • Enregistrer la requête sous le nom R_Clients_Dep_Villes,
  • Puis, la fermer en cliquant sur la croix de son onglet,
  • Afficher ensuite le formulaire F_chercher_client en mode création,
  • Cliquer sur le sous-formulaire pour le sélectionner,
  • Dès lors, activer l'onglet Données de sa feuille de propriétés,
  • Pour son attribut Objet source, choisir la requête R_Clients_Dep_Villes,
  • Enregistrer le formulaire en cliquant sur la disquette dans la barre d'accès rapide,
  • Le fermer en cliquant sur la croix de son onglet,
  • Puis, double cliquer sur le formulaire _F_navig_principal pour l'exécuter,
  • Activer son onglet Chercher un client pour accéder à son formulaire,
Comme vous le constatez, la liste de tous les clients est affichée par défaut. Grâce au symbole de l'étoile, en l'absence d'une condition sur le département et la ville, tous les enregistrements concordent et sont extraits.

Si vous sélectionnez un département, la liste se restreint instantanément pour répondre au critère.

Extraire les clients dans un sous-formulaire selon un département choisi dans la liste déroulante du formulaire

Si vous sélectionnez une ville, l'extraction s'adapte automatiquement pour répondre aux deux conditions recoupées.

Extraction sur critères recoupés par listes déroulantes en cascade dans sous-formulaire Access

Voilà donc comment il est techniquement possible de produire des résultats en fonction d'une ou de plusieurs conditions sur un même formulaire, et sans faire intervenir le code VBA.

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



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