Autoriser des critères vides dans une requête paramétrée
J’ai défini des critères paramétrés dans une requête. Quand je ne renseigne pas les paramètres, la requête n’affiche rien ; je souhaiterais plutôt qu’elle affiche tous les enregistrements. Comment faire ?
Un petit exemple ?
Le formulaire ci-dessous permet de renseigner une année (liste déroulante cmbAnnee
) et un pays (liste déroulante cmbPays
). Une fois que les zones sont renseignées, le bouton Afficher les films ouvre une requête qui donne les films correspondant aux critères (ce serait mieux d’afficher un formulaire, mais c’est une autre histoire :-)).
La requête elle-même contient des critères qui font appel aux champs du formulaire (je rappelle que la requête ne peut fonctionner que si le formulaire est ouvert).
Le problème : si on ne remplit pas l’année par exemple, la requête n’affiche aucun résultat. On s’attendrait plutôt à ce qu’elle renvoie tous les films du pays sélectionné, toutes années confondues (sous-entendu : ne pas choisir d’année équivaut à ne pas filtrer sur ce critère).
Ce phénomène est normal : Access extrait tous les films dont l’année vaut Null
, en d’autres termes dont l’année est vide (soit aucun film, ici !).
La solution
Si le critère Année est vide (si elle vaut Null
), l’idée est de le remplacer dynamiquement par l’année du film (le champ Année de la table). Le critère :
1 |
Forms![frm Choix Films]![cmbAnnee] |
…devient :
1 |
Nz(Forms![frm Choix Films]![cmbAnnee]; [Année]) |
A partir de maintenant, si la liste déroulante cmbAnnee
est vide, le critère est remplacé par l’année du film.
Nz()
transforme une valeur Null
en une valeur de remplacement (donné par le second paramètre de la fonction). Vous trouverez d’autres exemples d’utilisation de Nz()
sur ce site (cliquez sur le tag nz
pour retrouver les articles en question).Un peu de SQL
Tout ça est sans doute plus facile à expliquer si vous jetez un oeil au code SQL de la requête :
1 2 3 |
SELECT * FROM [tbl Films] WHERE [Année] = Nz(Forms![frm Choix Films]![cmbAnnee], [Année]) |
Concrètement, si la liste déroulante cmbAnnee
est renseignée, le filtre est appliqué en fonction du formulaire, soit :
1 |
WHERE [Année] = Forms![frm Choix Films]![cmbAnnee] |
Si au contraire la liste est vide, le filtre devient :
1 |
WHERE [Année] = [Année] |
Vous voyez que, dans ce cas, la condition est toujours vraie, et donc l’enregistrement est toujours affiché. Tout est là !
Si ce n’est toujours pas clair, visionnez le screencast associé à cet article 🙂
Merci beaucoup à vous! simple et efficace
bonjour
mais ou est le screencast ?????????????????????
Le screencast n’a pas été réinstallé lors de la migration du site.
(il faut que je les convertisse)
bon courage
Merci ! 🙂
romeo > Est-ce que je pourrais avoir plus d’infos ?
Bonsoir,
je suis en train d’établir une base de donnée et je voudrais savoir qu’elle formule je dois utiliser pour passer un champ vide dans mon formulaire sans avoir le message d’erreur suivant : que la valeur est null le champ n’est pas de type variant. Merci pour votre livre et votre site.
Chris > S’il s’agit d’exécuter une requête Action (
INSERT
,UPDATE
,DELETE
), il faut passer parDoCmd.RunSQL
(voir sur cet article). S’il faut parcourir une table sur unSELECT
, il faut plutôt utiliser des Recordsets. Je n’ai pas encore écrit d’article spécifique là-dessus, mais il y a plusieurs billets qui font appel aux Recordsets : la liste des billets. Ouala !J’aimerai inclure une requete sql dans un code VBA. je sais que ce n’est pas un commentaire lié au sujet mais je ne sais pas ou poser la question. t’aurais pas une adresse email ? D’autre part bravo pour ton site il est super et surtout : t’es vraiment trop fort !
Linaewen > Si une boîte de dialogue s’affiche pour demander le critère, ça veut généralement dire que le nom du formulaire ou du champ est mal orthographié, ou encore que le formulaire n’est pas ouvert lors de l’exécution de la requête. Ca peut être une piste… 🙂
Bonjour,
J’ai un petit problème concernant le paramétrage de ma requête.
Je travaille actuellement avec Access 2000 et lorsque j’utilise ta technique dans ma requête, elle m’affiche une boîte de dialogue à saisir au lieu d’effectuer le filtre demandé.
Dans le critère j’ai inscrit la ligne suivante:
[Forms]![frmDébut]![cmbLot]
Et dans SQL j’obtiens le résultat suivant:
SELECT *
FROM [Site par Lot]
WHERE ((([Site par Lot].ID_LOT)=[Forms]![frmDébut]![cmbLot]));
« cmbLot » est une liste déroulante de mon formulaire « frmDébut ».
Est-ce que j’ai fait une erreur quelque part?
Bonne journée à tous,
Chris > En fait, avec des « * », le critère s’écrirait plutôt :
Comme "*" & Forms![frm Choix Films]![cmbAnnee] & "*"
. Mais j’éviterais, parce que le champ[Année]
est de type Numérique, et que les caractères génériques sont plutôt faits pour les champs Texte (et dérivés comme Mémo, Lien hypertexte). Sur des moteurs de bases de données autres qu’Access/Jet, il faudrait d’ailleurs écrire une conversion explicite des données, pour éviter une erreur du style « Type incompatible ».D’autre part, il y a une différence de détail entre ton approche et la mienne : ta méthode extrait à partir de valeurs approchées (« le champ contient telle valeur »), alors que dans mon cas j’extrais des égalités strictes, et des correspondances exactes. Dans mon cas, si on tape
95
dans la liste déroulante, on n’obtient aucun film ; dans ta variante, on obtient les films des années 1950 ou 1995, par exemple (en supposant que la conversion passe toujours).Pour l’autre partie de la question : l’article traite plutôt de l’extraction de données lorsque les critères peuvent être vides. Il ne parle pas du cas où les données (et non plus les critères) sont vides. Je pars du principe, dans l’article, qu’un film qui n’a pas d’année ne répond pas au critère d’année. Si les films sans année doivent aussi être extraits, il suffit d’aménager le critère sur l’année en écrivant :
Est Null Ou Nz([Forms]![frm Choix Films]![cmbAnnee];[Année])
On peut faire pareil pour tous les autres champs qui seraient vides dans la table.
Ouala !
Ta fonction est magnifique, et elle aurait même pu etre remplacée par : Forms![frm Choix Films]! »* »&[cmbAnnee]& »* » ca revient au même. Mais il y a un minuscule petit problème : access ne prend pas en compte les films pour lesquels il n’y a aucune date de saisie, et il ne prend pas non plus en compte les films pour lequelles il y a une date mais pas de titre de film. exemple :
Si un film x a été enregistré sans sa date, le film n’existe pas pour access !
Comment faire ?
A part ça félicitation pour ton site il est super !
Est-ce que tu as essayé ce qui est dit dans l’article, à savoir remplacer
[Recherche Donnée]
parNz([Recherche Donnée]; [Nom du champ sur lequel s'applique le critère])
?Bonjour,
Voila j’ai un petit probléme.
J’ ai crée une requete de selection pour afficher une table en fonction d’une donnée. Pour se faire j’ai écrit [Recherche donnée] dans critères. Mais si l’utilisateur ne rentre pas une « donnée » j’aimerai qu’il affiche malgrés tout le champ de la donnée complet. Car la il m’affiche en ce moment ma table vide.
Si quelqu’un pouvez m’aidé s’il vous plait merci
Bonne journée à tous