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

SQL Firebird Discussion :

Requête avec plusieurs paramètres


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Requête avec plusieurs paramètres
    Bonjour à tous,

    Je commence à développer depuis peu de petites applications de base de données sous delphi 7 et et j'utilise Firebird 2 comme SGBD. Mon problème est le suivant:
    je veux créer une requête qui va prendre en paramètre des Items qui sont cochés dans deux CheckListBox (Un pour la saison et un pour les marques) mais je ne sais pas en fait combien de choix l'utilisateur peut faire donc par mesure de securité j'utilise une requête avec 10 paramètres pour chaque attribut donc 20 au total.
    Je penses que c'est pas assez efficace et je demande votre aide afin d'écrire une requête plus efficace.

    Je vous remercie d'avance pour votre aide

    Voici mon code SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select * from client ,commande,marque
    
    where ((client.codecli = commande.codecli)and(commande.idmarque = marque.idmarque))
    
     /* Les P1  à P10 sont les champs que l'utilisateur aurra coché dan le CheckLisBox de la Saison*/
    and ((commande.saison = :p1) or (commande.saison = :p2) or (commande.saison = :p3) or (commande.saison = :p4)
    or (commande.saison = :p5)or (commande.saison = :p6)or (commande.saison = :p7)or (commande.saison = :p8)
    or (commande.saison = :p9)or (commande.saison = :p10));
    
    /* Les P1  à P10 sont les champs que l'utilisateur aurra coché dan le CheckLisBox de la marque*/
    and ((commande.marque = p:1) or (commande.marque = :p2) or (commande.marque = :p3) or (commande.marque = :p4)
    or (commande.marque = :p5)or (commande.marque = :p6)or (commande.marque = :p7)or (commande.marque = :p8)
    or (commande.marque = :p9)or (commande.marque = :p10));

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 061
    Points : 41 018
    Points
    41 018
    Billets dans le blog
    62
    Par défaut
    La clause IN est la plus indiquée . Voici généralement comment je procède :

    1° je prépare les strings de sélection . par exemple pour une checklistbox contenant les représentants de l'entreprise (listeReps) qui se présente ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    01 : TOTO
    02 : TATA
    AA : ALOIS ALZHEIMER
    AE : ALBERT EINSTEIN
    ......
    dans cet exemple (réel mais simplifié )ma string de selection s'appelle SelReps

    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
     
    var i,n : Integer;
    begin
    Screen.Cursor:=crHourGlass;
    SelReps:='';
    n:=0;  // compte le nombre de représentants selectionnés
    for i:=0 to ListeReps.Items.Count-1 do
        begin
        if ListeReps.Checked[i] then
          begin
            if Length(SelReps)>0 then SelReps:=SelReps+',';
            // je récupére juste le code du representant coché
                SelReps:=SelReps+QuotedStr(Trim(Copy(ListeReps.Items[i],1,Pos(':',ListeReps.Items[i])-1)));
            inc(n);
          end;
        end;
    // si tous les representants sont cochés alors pas de sélection je les prends tous
    if n=ListeReps.Items.Count then SelReps:='';
    si les deux premiers representants sont cochés selreps resemblera à ceci
    ''01','02''

    2° je prépare le SQL de la Query ici VENTES (là je simplifie encore plus )

    Fonction retournant un boolean à true si SQL ok (on ne sait jamais, pratique pour les tests )
    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
    23
    24
     
    var w : Boolean; // me sert pour savoir si la clause Where est mise
    begin
    w:=false;
    // VENTES ----------------------------------------------------------------------
    Ventes.SQL.Add('SELECT * FROM COMMANDES');
    if length(SelReps)>0 then
     begin
       Ventes.SQL.Add('WHERE REPRESENTANT IN ('+SelReps+')');
       w:=true 
     end;
    if length(selSaisons)>0 then 
      begin
        if w then Ventes.SQL.Add('AND SAISON IN ('+SelSaisons+')')
               else Ventes.SQL.Add('WHERE SAISON IN ('+SelSaisons+')');
      end;
    try
      Ventes.Open;
      Result:=True
    except
     on E:Message do
      MessageDlg('SQL Fichiers de Tri'#13+E.message,mtError,[mbOk],0);
      Result:=False;
     end;
    @+
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse j'essaie !

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 061
    Points : 41 018
    Points
    41 018
    Billets dans le blog
    62
    Par défaut
    j'ai manqué à tous mes devoirs .

    je te souhaite la Bienvenue sur le forum

    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    j'ai manqué à tous mes devoirs .
    Lol merci !

    En fait votre proposition fonctionne nikel au niveau de la partie 1 mais ya un petit bug côté SQL. L'erreur est la suivante :
    SQK code - 104
    Que faire?
    @+

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 061
    Points : 41 018
    Points
    41 018
    Billets dans le blog
    62
    Par défaut
    Salut,
    déjà me montrer le code SQL . Je me suis de mon coté aperçu que mon copié/collé puis simplifié avait laissé quelques traces

    et bien vérifier en mode debug (ou par un showmessage(Ventes.SQL.Text); ) la "phrase SQL" générée , il manque peut-être simplement une virgule ou un quote quelque-part
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Voici mon code sql:

    L'appel mon composant IBSQL Client ici
    selection est un String qui contient les noms des clients sélectionnés
    selSaison est un String qui contient les saisons sélectionnées

    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
    Client.Active:=true;
    Client.SQL.Add('select * FROM COMMANDE, CLIENT, SAISON');
     
    if Length (selection)> 0 then
    begin
      Client.SQL.Add('WHERE commande.nom=client.nom and commande.saison=saison.codesaison and CLIENT.NOM IN ('+selection+')');
      w:=True;
    end;
     
    if Length (selSaison)>0 then
    begin
      if w then Client.SQL.Add('AND saison.CODESAISON IN ('+selSaison+')')
            else Client.SQL.Add('WHERE saison.CODESAISON IN ('+selSaison+')');
    end;
    Client.open;
    j'ai rajouté de captures d'écran pour le texte généré par le SQL et l'erreur

    Merci par avance et @ +
    Images attachées Images attachées   

  8. #8
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 906
    Points : 6 031
    Points
    6 031
    Par défaut
    Les valeurs doivent être mises entre simples quotes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where chaisplusquoi IN('MAGLOIRE','JC')
    Le mieux est d'utiliser la fonction quotedStr pour "quoter" chaque élément du IN lors de la construction
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci à tous ça marche comme je souhaite now.

    @ Bientot!

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 061
    Points : 41 018
    Points
    41 018
    Billets dans le blog
    62
    Par défaut
    petit nota : Dans ton cas tu n'avais pas l'utilité de rajouter le 'test de la clause where' en effet il te fallait de toute manière faire les jonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Client.Active:=true;
    Client.SQL.Add('select * FROM COMMANDE, CLIENT, SAISON');
    Client.SQL.Add('WHERE commande.nom=client.nom and commande.saison=saison.codesaison');
     
    if Length (selection)> 0 then
      Client.SQL.Add( and CLIENT.NOM IN ('+selection+')');
     
    if Length (selSaison)>0 then
     Client.SQL.Add('AND saison.CODESAISON IN ('+selSaison+')')
     
    Client.open;
    sauf si tu avais utilisé la clause JOIN comme ceci

    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
     
    Client.Active:=true;
    Client.SQL.Add('select * FROM COMMANDE JOIN CLIENT ON commande.nom=client.nom ');
    Client.SQL.Add('JOIN SAISON ON commande.saison=saison.codesaison') 
     
    if Length (selection)> 0 then
    begin
      Client.SQL.Add('WHERE CLIENT.NOM IN ('+selection+')');
      w:=True;
    end;
     
    if Length (selSaison)>0 then
    begin
      if w then Client.SQL.Add('AND saison.CODESAISON IN ('+selSaison+')')
            else Client.SQL.Add('WHERE saison.CODESAISON IN ('+selSaison+')');
    end;
    Client.open;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Requête avec Plusieurs paramètres
    Par ecoinfo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2010, 23h39
  2. Requête avec plusieurs paramètres d'un même champ d'une table
    Par jb.julien dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/08/2007, 09h43
  3. Réponses: 3
    Dernier message: 04/06/2007, 12h29
  4. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55
  5. [ADO/Access] Appel d’une requête avec des paramètres
    Par Taxenna dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/12/2004, 14h58

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