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 :-)).

formulaire

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).

requête

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 :

…devient :

A partir de maintenant, si la liste déroulante cmbAnnee est vide, le critère est remplacé par l’année du film.

Rappel sur Nz
La fonction 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 :

Concrètement, si la liste déroulante cmbAnnee est renseignée, le filtre est appliqué en fonction du formulaire, soit :

Si au contraire la liste est vide, le filtre devient :

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 🙂

Vous aimerez aussi...

16 réponses

  1. Badia dit :

    Merci beaucoup à vous! simple et efficace

  2. bobe48000 dit :

    bonjour
    mais ou est le screencast ?????????????????????

  3. Hervé Inisan dit :

    romeo > Est-ce que je pourrais avoir plus d’infos ?

  4. romeo dit :

    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.

  5. Hervé Inisan dit :

    Chris > S’il s’agit d’exécuter une requête Action (INSERT, UPDATE, DELETE), il faut passer par DoCmd.RunSQL (voir sur cet article). S’il faut parcourir une table sur un SELECT, 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 !

  6. chris dit :

    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 !

  7. Hervé Inisan dit :

    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… 🙂

  8. Linaewen dit :

    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,

  9. Hervé Inisan dit :

    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 !

  10. Chris dit :

    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 !

  11. Hervé Inisan dit :

    Est-ce que tu as essayé ce qui est dit dans l’article, à savoir remplacer [Recherche Donnée] par Nz([Recherche Donnée]; [Nom du champ sur lequel s'applique le critère]) ?

  12. peck dit :

    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

  1. 7 juillet 2015

    […] Autoriser des critères vides dans une requête paramétrée […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *