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

Bases de données Delphi Discussion :

Requête sql avec mysql sous delphi


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut Requête sql avec mysql sous delphi
    je voudrais faire une recherche multicritere sur une table personne, un peu à la google:
    l'utilisateur saisie via des Edit et ComboBox, ces derniers sont insérés ds la requete.
    j'ai commencé par faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with dm.tbPersonne do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * from personne');
        SQL.Add('where nom LIKE ''' + eNom.Text + Opr1 + '''');
        SQL.Add('service LIKE ''' + cbService.Text + '''');
        SQL.Add('matricule LIKE ''' + eMatricule.Text + '''');
        SQL.Add('fonction LIKE ''' + cbFonction.Text + '''');
        SQL.Add('order by nom');
        Open;
      end;
    mais élas c genere une erreur de syntaxe que je n'arrive pas à détécter
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  2. #2
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    Voilà la procedure en entier pour mieux comprendre.

    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
    25
    26
    27
    28
    29
    30
    procedure TfMenu.bGoClick(Sender: TObject);
    var Opr1, Opr2, Opr3, Opr4, Opr5, Opr6, Opr7 : String;
    begin
      if eNom.Text = '' then Opr1 := 'OR'
                        else Opr1 := 'AND';
      if cbService.Text = '' then Opr2 := 'OR'
                             else Opr2 := 'AND';
      if cbFonction.Text = '' then Opr3 := 'OR'
                              else Opr3 := 'AND';
      if ecin.Text = '' then Opr4 := 'OR'
                         else Opr4 := 'AND';
      if eEtat.Text = '' then Opr5 := 'OR'
                         else Opr5 := 'AND';
      if eType.Text = '' then Opr6 := 'OR'
                         else Opr6 := 'AND';
      if eMatricule.Text = '' then Opr7 := 'OR'
                              else Opr7 := 'AND';
      with dm.tbPersonne do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * from personne');
        SQL.Add('where nom LIKE ''' + eNom.Text + Opr1 + '''');
        SQL.Add('service LIKE ''' + cbService.Text + Opr2 + '''');
        SQL.Add('matricule LIKE ''' + eMatricule.Text + Opr7 +'''');
        SQL.Add('fonction LIKE ''' + cbFonction.Text + Opr3 +'''');
        SQL.Add('order by nom');
        Open;
      end;
    end;
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 897
    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 897
    Points : 6 024
    Points
    6 024
    Par défaut
    L'opérateur ne doit pas être dans la chaine recherchée....

    En plus, la recherche par LIKE induit au moins un caractère %
    "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

  4. #4
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    je suis carrement bloque, vous avez une suggetion?
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Moi je verrai plus un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL.Add('Select * from personne');
    SQL.Add('where nom LIKE "%'+ eNom.Text+'%"');
    SQL.Add(Opr1+'service LIKE "%'+ cbService.Text+'%"');
    SQL.Add(Opr2+'matricule LIKE "%'+ eMatricule.Text+'%"');
    SQL.Add(Opr7+'fonction LIKE "%'+ cbFonction.Text+'%"');
    SQL.Add(Opr3+'order by nom');
    Et un truc me chagrine, c'était la fonction LIKE ... en effet, comme le dit qi130, il doit y avoir un % ....


    Essaie de voir avec le code que je t'ai fourni (pas testé du tout ...)
    A+

  6. #6
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    ca genere une erreur de syntaxe, au niveau du order by
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL.Add('Select * from personne');
    SQL.Add('where nom LIKE "%'+ eNom.Text+'%"');
    SQL.Add(Opr1+'service LIKE "%'+ cbService.Text+'%"');
    SQL.Add(Opr2+'matricule LIKE "%'+ eMatricule.Text+'%"');
    SQL.Add(Opr7+'fonction LIKE "%'+ cbFonction.Text+'%"');
    SQL.Add('order by nom');
    Il n'y a pas d'opérateur avant un order by ...
    A+

  8. #8
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    merci pour le coup de mains trés précieux, j'ai plus d'erreur de synthaxe, je vais tester maintenant la logique
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  9. #9
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    je ne comprends pas pourquoi est ce qu'il ne donne pas le resultat voulu, ou est ce qu'il y a une autre maniére de faire une recherche multicritere
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  10. #10
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut
    tu dois exécuter ta requête
    et ensuite parcourir tes données
    avec un while

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sql.active ou sql.execute
     
    while not sql.eof
    begin
    sql.next
    end

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Re,

    Peux-tu nous mettre un exemple de rêquete générée avec le tbPersonne et nous dire ce que tu voudrais que ça fasse ... C'est, je pense, une mauvaise interprétation de la requête SQL ... ni plus ni moins.

    Merci

  12. #12
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    la table tbPersonne gere les informations sur une personne, nom, prenom, matricule, service,fonction etc. Le but est de faire une requete multicritere sur ses champs, et afficher le resultat sue un DBGrid. J'utilise le composant TEdit et TComboBox puis je clique sur le bouton go pour lancer la recherche.
    La procedure OnClick dur le Bouton Go donne 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    procedure TfMenu.bGoClick(Sender: TObject);
    var Opr1, Opr2, Opr3, Opr4, Opr5, Opr6, Opr7 : String;
    begin
      if eNom.Text = '' then Opr1 := 'OR'
                        else Opr1 := 'AND';
      if cbService.Text = '' then Opr2 := 'OR'
                             else Opr2 := 'AND';
      if cbFonction.Text = '' then Opr3 := 'OR'
                              else Opr3 := 'AND';
      if ecin.Text = '' then Opr4 := 'OR'
                         else Opr4 := 'AND';
      if eEtat.Text = '' then Opr5 := 'OR'
                         else Opr5 := 'AND';
      if eType.Text = '' then Opr6 := 'OR'
                         else Opr6 := 'AND';
      if eMatricule.Text = '' then Opr7 := 'OR'
                              else Opr7 := 'AND';
      with dm.tbPersonne do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * from personne');
        SQL.Add('where nom LIKE "%'+ eNom.Text+'%"');
        SQL.Add(Opr1+' service LIKE "%'+ cbService.Text+'%"');
        SQL.Add(Opr2+' matricule LIKE "%'+ eMatricule.Text+'%"');
        SQL.Add(Opr7+' fonction LIKE "%'+ cbFonction.Text+'%"');
        SQL.Add(Opr3+' cin LIKE "%'+ eCin.Text+'%"');
        SQL.Add(Opr4+' etat LIKE "%'+ eEtat.Text+'%"');
        SQL.Add(Opr5+' tenue_civile LIKE "%'+ eType.Text+'%"');
        SQL.Add(' order by nom');
        Open;
      end;
    end;
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  13. #13
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut
    Tu es sûr que tu disposes de données dans ta table correspondant aux critères???
    Tu dois associer ta requête à un datasource
    et ton datasource doit être associé à ton DBGrid

    pour être sur d'obtenir des données, exécute ta requête directement sur ta base de données, en ligne de commande sql

  14. #14
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Peux tu mettre les balises de CODE (le # dans la barre d'éditions) lorsque tu posteras du code stp ... Merci

    Ensuite, je pense que le soucis viens du fait que tu interprête mal les % en ce qui concerne le like...

    Si tu veux par exemple lister toutes les personnes ayant un nom commencant par To, dans ce cas, la requête serait ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with dm.tbPersonne do
    begin
    Close;
    SQL.Clear;
    SQL.Add('Select * from personne');
    SQL.Add('where nom LIKE "To%"');
    SQL.Add(' order by nom');
    Open;
    end;
    Le % veut dire que l'on accepter autant de lettre que l'on veut, ainsi, on pourrait avoir les nom suivant :
    Toto
    Toti
    Topin
    Torade
    ... etc etc

    C'est peut-être là que survient ton soucis de compréhension

  15. #15
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    je le fais directement sur le sql command , ca marche sans probleme, mais en dynamique ca m'affiche toute la base de donnee. C comme si la requete n'a aucun effet.
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  16. #16
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    quelle balise dois je mettre alors
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  17. #17
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    personnellement je construis ce genre de requête 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
    18
    19
     
    var
     sep:string;
     sql:string;
     
     procedure AddField(const Value,FieldName:string);
     begin 
      if Value='' then exit;
      sql:=sql+sep+FieldName+' LIKE "%'+SqlEncode(Value)+'%"';
      sep:=' AND ';
     end;
     
    begin
     sql:='SELECT * FROM Table';
     sep:=' WHERE ';
     AddField(Edit1.Text,'Champ1');
     AddField(Edit2.Text,'Champ2');
     AddField(Edit3.Text,'Champ3');
    end;
    la fonction SqlEncode étant là pour échaper les quotes dans la chaine (voir mon unité MySQLClient)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  18. #18
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    C'est quoi SQLEncode?

    Ah! désolé j'avais pas vu le liens, je vais tester tout ça, merci d'avance
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  19. #19
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    comment appeler la requete sachant que String et Tstrings son incompatibles
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  20. #20
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    au choix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Lines.add(sql);
    // ou
     Lines.Text:=sql;
    maintenant il est possible aussi d'utiliser des SQL.Add() au lieu de concaténer comme je le fais dans une chaine sql...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     procedure AddField(const Value,FieldName:string);
     begin 
      if Value='' then exit;
      SQL.Add(sep+FieldName+' LIKE "%'+SqlEncode(Value)+'%"');
      sep:=' AND ';
     end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. fatal error -2147467259 lors d'une requête SQL avec Mysql
    Par Spartanjohn dans le forum ADO.NET
    Réponses: 2
    Dernier message: 18/03/2013, 18h23
  2. Requête SQL avec paramètre sous visual studio 2008
    Par Jeecer dans le forum Accès aux données
    Réponses: 3
    Dernier message: 21/08/2011, 11h18
  3. Lancer une requête sql avec sql plus sous dos
    Par feragne dans le forum Sql*Plus
    Réponses: 12
    Dernier message: 15/10/2008, 15h49
  4. [vista,VB 2005,SQL server 2005]requêtes paramétrées avec mysql
    Par olivier57b dans le forum Accès aux données
    Réponses: 4
    Dernier message: 04/09/2008, 19h58
  5. Requête SQL avec création de table sous condition
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/11/2007, 09h58

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