IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Critères conditionnels dans une requête SELECT [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Critères conditionnels dans une requête SELECT
    Bonjour,

    j'essaie de faire une recherche multicritère en fonction du critère que l'on choisit dans une liste déroulante.
    Pour simplifier, j'essaie déjà de le faire avec 2 critères seulement : dans une table offre (désigne les offres proposées au client), on a un champ "typeConteneur" (20 pieds, 40 pieds...), un champ dateoffre (la date de l'offre) et un champ prixvente (le prix proposé)
    Les critères rentrés seront le type et la date. Par exemple si l'on souhaite connaître tous les conteneurs de 20 pieds proposés le 4 mai on rentrera "20 pieds" dans la zone de liste "critereType" et "04/05/2010" dans la zone de liste "critereDate".

    Voici la requête que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TableOffre.TypeConteneur, TableOffre.DateOffre, TableOffre.PrixVente
    FROM TableOffre
    WHERE (((TableOffre.TypeConteneur) Like Formulaires!FiltrageOffres!CritereType) And ((TableOffre.DateOffre) Like Formulaires!FiltrageOffres!CritereDate));

    Ca fonctionne, malheureusement, si l'un des critères n'est pas renseigné alors il n'affiche aucune offre car affiche que les offres où le champ est vide mais aucun n'est vide.
    Comment faire pour qu'ils prenne en compte le critère que si il n'est pas vide ??

    Avec un tuto trouvé sur ce site j'ai trouvé la fonction iif qui pourrait peut être résoudre mon problème mais n'ayant jamais fait de sql, je n'arrive pas à trouver la bonne syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TableOffre.TypeConteneur, TableOffre.DateOffre, TableOffre.PrixVente
    FROM TableOffre
    WHERE Tableoffre.TypeConteneur=IIf(Formulaires!FiltrageOffres!CritereType=0,Tableoffre.TypeConteneur,Formulaires!FiltrageOffres!CritereType) And ((TableOffre.DateOffre) Like Formulaires!FiltrageOffres!CritereDate);
    Mais ça fonctionne pas


    Sinon, j'ai trouvé des posts où certains parlaient de concaténation, là aussi je me suis lancé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sql = "SELECT TableOffre.TypeConteneur, TableOffre.DateOffre, TableOffre.PrixVente
    FROM TableOffre
    WHERE "
    ifnot isnull(me.CritereType) then
    sql = sql & "(((TableOffre.TypeConteneur) Like [Formulaires]![FiltrageOffres]![CritereType]) AND ((TableOffre.DateOffre) Like [Formulaires]![FiltrageOffres]![CritereDate]));"
    else if isnull(me.modifiable2) then
    sql = sql & "((TableOffre.DateOffre) Like [Formulaires]![FiltrageOffres]![CritereDate]);"
    end if
    end if
    mais sans succès...

    Ca fait depuis vendredi que je galère la dessus, alors je me suis dit qu'il était temps d'appeler au secours

    Merci d'avance à ceux qui auront déjà pris le temps de lire

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    en utilisant nz() dans les champs de recherche attention bien encadrer le nom du champ qui doit être la valeur par défaut de [].
    regardes la base jointe si elle peut t'inspirer.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    super !! merci beaucoup pour cette formule magique

    J'ai mis du temps à la comprendre, mais maintenant ça marche. Par contre, si un champ d'un enregistrement est vide, ça n'affiche pas l'enregistrement correspondant :s

    Par exemple, avec les critères que j'ai rentré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Comme nz([Formulaires]![FiltrageOffres]![CritereType];[typeconteneur])
    Comme nz([Formulaires]![FiltrageOffres]![CritereDate];[dateoffre])
    Si je rentre "20 pieds" dans CritereType et que je laisse CritereDate vide, ça m'affiche tous les enregistrements de 20 pieds sauf ceux où la date n'a pas été renseignée

    J'ai le problème inverse en fait^^

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 338
    Points : 19 573
    Points
    19 573
    Billets dans le blog
    65
    Par défaut
    Salut,

    et comme ceci en sql:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TableOffre.TypeConteneur, TableOffre.DateOffre, TableOffre.PrixVente
    FROM TableOffre
    WHERE ((Tableoffre.TypeConteneur like [Formulaires]![FiltrageOffres]!CritereType]) or ([Formulaires]![FiltrageOffres]![CritereType] is null)) and ((TableOffre.DateOffre like [Formulaires]![FiltrageOffres]![CritereDate]) or ([Formulaires]![FiltrageOffres]![CritereDate] is null))

    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Super !! cette fois ça marche comme il faut avec les deux critères

    Par contre je comprends pas du tout la logique de la requête que tu m'as donnée. Le soucis c'est que j'ai 5 ou 6 critères comme ça et je pensais que si j'y arrivais pour 2, j'arriverais à adapter le code pour les autres. Mais c'est pas le cas

    Ca serait possible de m'expliquer la logique stp ?

    Essayons déjà de comprendre pour 3, après j'arriverais peut être à faire le reste
    J'ai encadré en rouge ce que j'ai rajouté à ta requête, c'est à dire le 3e critère. En vert c'est le CritereType, en bleu CritereDate et en jaune CritereEtat (le nouveau).
    J'ai fait en sorte que l'intersection entre la ligne et la colonne de même couleur soit vide, et le reste rempli de "Est Null"
    Qu'est ce qui va pas ?


  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 338
    Points : 19 573
    Points
    19 573
    Billets dans le blog
    65
    Par défaut
    Re,

    il vaux mieux comprendre le critère dans le SQL (Param.. désignent les paramètres sur le formulaire):

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE (([Champ1] LIKE [Param1]) OR ([Param1] IS NULL)) AND 
    (([Champ2] LIKE [Param2]) OR ([Param2] IS NULL)) AND
    (([Champ3] LIKE [Param3]) OR ([Param3] IS NULL))

    est à rapprocher du code de Le Vieux:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE [Champ1] LIKE nz([Param1],[Champ1]) AND
    [Champ2] LIKE nz([Param2],[Champ2]) AND
    [Champ3] LIKE nz([Param3],[Champ3])

    Donc pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Champ1] LIKE nz([Param1];[Champ1])
    on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (([Champ1] LIKE [Param1]) OR ([Param1] IS NULL))
    C'est à dire si [Champ1]="ABC"
    et [Param1] est null
    alors le résultat du critère est vrai et il le sélectionne quand même

    et dans le cas ou [Champ1] est vide et [Param1] est null
    [Champ1] like [Param1] peut-être faux mais comme [Param1] est null le résultat du critère reste vrai, donc il le sélectionne aussi.

    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    mmmh, je crois que j'ai compris le truc, je teste ça dès lundi et je vous tiens au courant.
    Merci beaucoup en tout cas

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Yessssss !!!!!!!!!!!!!!!!!!!!! merciiii beaucoup !!!!! ça marche à merveille !!!!!!!

    ça fait tellement longtemps que je suis dessus, je pensais que j'y arriverais jamais, j'en ai les larmes aux yeux tellement je suis content !!

    merci beaucoup User pour tes explications !! et aussi merci à Le Vieux qui nous a donné un début de réponse

    Ce forum est génial !! merci beaucoup !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/11/2016, 22h32
  2. Critère Date dans une requête
    Par Cirice dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/12/2006, 01h14
  3. Critère Date dans une requête analyse croisée
    Par Lingo dans le forum Access
    Réponses: 7
    Dernier message: 05/10/2006, 14h43
  4. fusion de 2 colonnes dans une requête select?
    Par epeichette dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/11/2005, 23h05
  5. C'est possible dans une requête SELECT ?
    Par Kokito dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/04/2005, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo