Visites

   visiteurs

   visiteurs en ligne

Sujet n°84 Filtrer enregistrements d'1 form via filtres sur sous-forms
    par El_Roy le 29/05/2007 : 11:43
Bonjour, Dans Access 2003, je me heurte à un problème dans le cadre de la recherche "filtrer par formulaire" : - Je dispose d'un formulaire principal unique basé sur une table. - Dans ce formulaire j'ai inclus des sous-formulaires continus, basés sur des requêtes, qui listent les enregistrements associés à l'enregistrement affiché dans le formulaire principal. En l'occurence, le formulaire principal se base sur une table "Personnes" et le sous-formulaires affiche la liste des langues parlées par la personne affichée dans le formulaire principal. Ce sous-formulaire est basé sur une requête affichant les champs des tables "Langues" et "Jonction" (car il s'agit d'une relation plusieurs à plusieurs entre les personnes et les langues), et le lien entrele formulaire principal et le sous-formulaire est établi sur la correspondance du champ clé primaire identifiant les personnes. Table "Personnes" (1) <--> (n) Table "Jonction" (n) <--> (1) Table "Langues" Je souhaiterai pouvoir filtrer par formulaire afin de rechercher, par exemple, les personnes parlant l'anglais. En effet, lorsque je clique sur "filtrer par formulaire", j'ai bien la possibilité d'entrer les critères dans les sous-formulaires mais lorsque j'applique le filtre il ne me sélectionne pas les enregistrements correspondants dans le formulaire principal (il m'affiche tous les enregistrements des "Personnes", y compris celle n'ayant pas "Anglais", mais pas les langues autres que l'anglais parlées par les personnes). Y'aurait-il une solution ? J'ai pensé à du code VBA permettant par exemple de filtrer le jeu d'enregistrement affiché par le formuliare principal, en se basant sur l'"intersection"des résultats des filtre appliqués sur chaque sous-formulaire... Je ne sais pas si je suis clair....et les filtres en VBA je ne maîtrise pas du tout... Je vous remercie par avance pour toute aide : piste de réflexion, éléments de code, etc.

Réponse n° 1 par 3stone le 29/05/2007 : 19:27
Bonjour,

Il ne serait de toute façon pas aisé de parcourir tous ces enregistrements - puisque dans le formulaire principal, seul une personne est affichée en même temps.

La solution plus ergonomique est donc de créer un formulaire (en mode continu) qui aurait comme source la table Personnes et le champ langue de la table Langues.

Et, partant de là, il devient simple de placer un filtre sur le champ Langue.


PS: Pour la lisibilité de ce forum, ne pas coller des questions avec une mise en forme faite dans un autre programme.

Amicalement,
Pierre

Réponse n° 2 par El_Roy le 05/06/2007 : 16:58

Bonjour,

Désolé pour le copier/coller qui rend mon premier post complètement rébarbatif !

En ce qui concerne la solutionque tu proposes, celle-ci ne satisfait pas mon besoin car :

1/ en faisant un formulaire qui utilise les données issues des tables salariés et langues (donc d'une requête faisant intervenir ces 2 tables), j'obtient en sortie une liste associant à chaque Personne la liste des langues ; soit au total [nb d'enregistrements tables Personnes] * [nb d'enregistrements table langue] sorties.

Il m'est alors impossible de filtrer quoi que ce soit car aucune correspondance entre les enregsitrements.

2/ Si je fais intervenir la table de "jonction" (entre les tables Personnes et Langues) dans la requête source du formulaire, j'obtiens alors uniquement les enregistrements associant personne et langue. Autrement dit le formulaire ne m'affiche pas le personnes qui ne parlent aucune Langue...

Il faut alors que je précise quelquechose que j'avais homis dans le post précédent  eek : Cette situation se reproduit plusieurs fois dans ma base de donnée, c'est à dire que ma table "Personnes" se retrouve en relation (n)<->(n) avec plusieurs tables (et pas seulement la table Langues).

La solution que tu me propose fonctionnerait dans le cadre d'un formulaire de recherche de Personne parlant une langue, mais unqiuement pour ce cas.

Je souhaiterai avoir un mode de recherche élargi : par ex pouvoir chercher une personne qui habite Paris (champ "Ville" de la table "Personnes") ou qui parle Anglais et là je suis bloqué...

 

Je te remercie en tout cas de te pencher sur mon problème. Il me semble qu'une telle situation n'est pas spécifique à mon cas et que beaucoup de personne ont du se poser la question de rechercher des informations entre tables ayant une relation "plusieurs à plusieurs" mais je ne trouve pas de post à ce sujets dans les divers forum consultés...

A plus.

Réponse n° 3 par 3stone le 06/06/2007 : 01:08
Salut,

Rien n'interdit d'utiliser des critères tel que :

langue = "fr" ET langue = "en"
langue = "fr" OU langue = "en"
(langue = "fr" ET langue = "fr") OU Pays = "France"

Pour ce qui est de la table jonction, je voulais juste indiquer le fait suivant :
Si tu veux filtrer le formulaire principal selon des critères dans le sous-formulaire, cela revient à dire à peu près ceci...

"Afficher la/les personnes(table personnes) qui parle français(table langue)"

Donc, créer une requête avec les champs des tables utiles et ajouter les critères qui vont bien.

Pour un formulaire de sélection, tu peux regarder ceci.


Cordialement,
Pierre

Réponse n° 4 par El_Roy le 07/06/2007 : 10:18

Bonsoir,

Je te remercie pour ton aide. Effectivement, ta phrase
Dixit...

"Afficher la/les personnes (table personnes) qui parle français (table langue)"

résume bien le besoin. Sauf que celui-ci se répète plusieurs fois (pas seulement les langues mais également les compétances, les formations, etc.)

En utilisant le formulaire que tu m’as proposé en lien, je réussi à satisfaire ce besoin.

Cependant j’ai du réaliser quelques aménagement au sein de ma BdD afin de rendre possible l'affichage et la recherche sur les champs issus de toutes les tables :

Etant donné que le formulaire permet une recherche sur une requête (et une seule ! pas question dans le formulaire de cumuler des critères sur une table puis sur une autre !!!), j’ai du me débrouiller afin de construire une requête contenant tous les champs de ma base, et ne « zappant » pas des enregistrements.

Je m’explique : en faisant une requête sélection simple entre les tables Personnes et Langues (plus la table de Jonction), la requête me retourne uniquement une liste d’association Personne + Langue mais ne me renvoie pas les Personnes n’ayant aucune compétence linguistiques. Dans mon cas, si j’utilise une telle requête comme source dans le formulaire de recherche, je n’obtiendrai pas une réponse correcte à une recherche du type : "Afficher la/les personnes (table personnes) qui parle français (table langue) OU qui habite Bordeaux (table personnes)"

Car je n’aurai pas en réponse une personne qui habiterait Bordeaux mais qui ne parlerait aucune langue !

Il faut donc jouer sur les types de jointures dans la requête. En voulant faire une « jointure à gauche » sur la relation Table Personnes (1) <-> (n) Table Jonction afin d’avoir en sortie l’ensemble des personnes en plus de la liste des associations Personnes / Langues…

Malheureusement, Access ne sachant pas dans quel ordre il faut appliquer les jointures (entre le LEFT JOIN vu ci-dessus et le INNER JOIN de la relation Table Langues (1) <-> (n) Table Jonction), il renvoie une erreur 3258 (« jointure externes ambiguës »).

NOTA: La tailles des messages est limitée - heureusement, je dirais  rolleyes

[ Retour à la liste des sujets ]

Recherche



Préférences

Se reconnecter
---

Votre nom (ou pseudo) :

Votre code secret


 Nombre de membres 1 membre


Connectés :

( personne )

Haut