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

ASP Discussion :

Problème de requête


Sujet :

ASP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut Problème de requête
    Bonjour à tous,

    J'ai un problème avec la requête suivante. Dans le cadre d'une recherche combinée, je dois trouver les enregistrements qui ont une localisation précise. Sachant que j'ai d'autres critères possibles à prendre en compte, je teste si le critère existe, si d'autres critères ont déjà été traités pour voir si je dois mettre le AND ou pas et si c'est le premier passage pour la même raison. Voilà ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    premierpassage = 0
    if Session("sLocalisation") <> "" then
    sSQL2 = "select Papyrus.Pack from Papyrus where Num_localisation = '" & Session("sLocalisation") & "' order by Pack"
    Set rsLocalisation = connect.execute (sSQL2)
    if not rsLocalisation.EOF then
    sPackLoc = rsLocalisation ("Pack")
    if Session("sAuteur") <> "" or Session("sLangue") <> "" or Session("sTitre") <> "Tapez le titre ici" or Session("sGenre") <> "" or Session("sSupport") <> "" or Session("sCartonnage") <> "" or  premierpassage <> 0 then
    sSQL = sSQL + "AND Pack.Pack = '" & sPackLoc & "' "
    else
    sSQL = sSQL + "Pack.Pack = '" & sPackLoc & "' "
    premierpassage = 1
    end if
    rsLocalisation.movenext
    end if
    rsLocalisation.close
    end if
    Malheureusment avec ce code, il ne m'afffiche que le premier enregistrement. Pourtant cela fonctionne pour les autres critères même s'ils sont plus simples (pas besoin de la requête sSQL2). Voici le code d'un de ces critères qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if Session("sProvenance") <> "" then
    if Session("sAuteur") <> "" or Session("sLangue") <> "" or Session("sTitre") <> "Tapez le titre ici" or Session("sGenre") <> "" or Session("sSupport") <> "" or Session("sCartonnage") <> "" then
    sSQL = sSQL + "AND Pack.Provenance = '" & Session("sProvenance") & "' "
    else
    sSQL = sSQL + "Pack.Provenance = '" & Session("sProvenance") & "' "
    end if
    end if
    Quelqu'un a-t-il une idée parce que je mouline là

  2. #2
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    633
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 633
    Points : 721
    Points
    721
    Par défaut
    s'il te plait indentes ton code car là c'est limite illisible
    as-tu affiché sSQL pour voir ce qu'elle te renvoie ?

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not rsLocalisation.EOF then 
    sPackLoc = rsLocalisation ("Pack")
    Peut-il te renvoyer pp enregistrements?
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Désolé pour le code, le voici en mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    premierpassage = 0
    if Session("sLocalisation") <> "" then
       sSQL2 = "select Papyrus.Pack from Papyrus where Num_localisation = '" & Session("sLocalisation") & "' order by Pack"
       Set rsLocalisation = connect.execute (sSQL2)
       while not rsLocalisation.EOF
          sPackLoc = rsLocalisation ("Pack")
          if Session("sAuteur") <> "" or Session("sLangue") <> "" or Session("sTitre") <> "Tapez le titre ici" or Session("sGenre") <> "" or Session("sSupport") <> "" or Session("sCartonnage") <> "" or Session("sProvenance") <> "" or  premierpassage <> 0 then
             sSQL = sSQL + "AND Pack.Pack = '" & sPackLoc & "' "
          else
             sSQL = sSQL + "Pack.Pack = '" & sPackLoc & "' "
             premierpassage = 1
          end if
          rsLocalisation.movenext
       whend
       rsLocalisation.close
    end if
    J'ai changé, je me suis rendu compte que le if ne faisait pas la boucle (oh le con) je l'ai remplacé par un while mais maintenant il se plante quand j'ai breaucoup d'enregistrement et il ne m'affiche pas de résultats quand j'en ai peu, pourtant le response.write de sSQL m'affiche bien ce qu'il faut, c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select Pack.Pack, Pack.Pack_Impression from Pack where Pack.Pack = '0348.080' AND Pack.Pack = '2930.000' order by Pack
    Le message d'erreur si trop de résultats :

    Microsoft OLE DB Provider for ODBC Drivers (0x80040E21)
    Ce pilote ODBC ne prend pas en charge les propriétés demandées.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Rectification :

    Quand il n'y en a qu'un, il me l'affiche, de 2 à x il m'affiche pas de résultats et de x à infini, il se plante...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Je me suis rendu compte d'une erreur : la première fois qu'il entre dans la boucle, ça doit être and, les fois suivantes, ça doit être OR.

    J'ai rectifié ça donne ça pour la boucle :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    while not rsLocalisation.EOF
    sPackLoc = rsLocalisation ("Pack")
    if Session("sAuteur") <> "" or Session("sLangue") <> "" or Session("sTitre") <> "Tapez le titre ici" or Session("sGenre") <> "" or Session("sSupport") <> "" or Session("sCartonnage") <> "" or Session("sProvenance") <> "" then
    	if premierpassage = 0 then
    	sSQL = sSQL + "AND Pack.Pack = '" & sPackLoc & "' "
    	premierpassage = 1
    	else
    	sSQL = sSQL + "OR Pack.Pack = '" & sPackLoc & "' "
    	end if
    else
    	if premierpassage = 0 then
    	sSQL = sSQL + "Pack.Pack = '" & sPackLoc & "' "
    	premierpassage = 1
    	else
    	sSQL = sSQL + "OR Pack.Pack = '" & sPackLoc & "' "
    	end if
    end if
    rsLocalisation.movenext
    wend
    Il m'affiche les résultats sauf quand il y en a beaucoup il se plante. Il y a un nombre limite de conditions where dans une requête ?

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    633
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 633
    Points : 721
    Points
    721
    Par défaut
    pas que je sache...au max tu peux en avoir combien ?

  8. #8
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Que donne le response.write("sSQL") qd tu as "trop" d'enregistrements?
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E21)
    Ce pilote ODBC ne prend pas en charge les propriétés demandées.
    Plutôt que tu peux mettre avec chacune des valeurs séparée par une virgule. C'est plus léger.
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    633
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 633
    Points : 721
    Points
    721
    Par défaut
    pour info j'ai une chaine de requete qui fait plus de 1000 caractères et ça passe donc y a de la marge...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Merci beaucoup, ça fonctionne avec
    Pack.Pack IN ()
    Il peut y avoir plus de 2000 résultats ce qui donne des requêtes qui peuvent atteindre des dizaines de milliers de caractères avec ma méthode. Celle d'Immobilis est donc bien meilleure !

    Merci encore

  11. #11
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Peut-être que pour optimiser tout cela tu devrais déplacer ton IF. En effet, il repose sur des conditions qui ne changent pas dans la boucle. Malgré cela tu l'évalues à chaque tour. Ne pourrais-tu pas faire un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    IF Session("sAuteur") <> "" or Session("sLangue") <> "" or Session("sTitre") <> "Tapez le titre ici" or Session("sGenre") <> "" or Session("sSupport") <> "" or Session("sCartonnage") <> "" or Session("sProvenance") <> "" THEN
              WHILE NOT rsLocalisation.EOF
                        if premierpassage = 0 then 
                        sSQL = sSQL + "AND Pack.Pack = '" & sPackLoc & "' " 
                        premierpassage = 1 
                        else 
                        sSQL = sSQL + "OR Pack.Pack = '" & sPackLoc & "' " 
                        end if
                        rslocalisation.movenext
              WEND
    ELSE
              WHILE NOT rsLocalisation.EOF
                        if premierpassage = 0 then 
                        sSQL = sSQL + "Pack.Pack = '" & sPackLoc & "' " 
                        premierpassage = 1 
                        else 
                        sSQL = sSQL + "OR Pack.Pack = '" & sPackLoc & "' " 
                        end if 
                        rslocalisation.movenext
              WEND
    END IF
    Encore mieux, si tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rs.open "SELECT Pack.Pack FROM Pack WHERE TA CONDITION GROUP BY Pack.Pack", strprovider,1,1
    maliste = rs.getrow("pack")
    rs.close
    sSQL = "SELECT (...) IN (" & maliste &")"
    Cela te renvoie directement le tableau des valeurs que tu recherches.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/08/2003, 15h32
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 16h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 14h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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