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 :

Effectuer une requête


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut Effectuer une requête
    Bonjour,

    J'utilise Delphi 7 avec une petite base de données Firebird.
    L'accès à la base de données fonctionne.
    Par contre je souhaiterais effectuer une requête sur ma base de données :
    ->
    Ma base de données Firebird est composé de trois champs :
    - un champs de texte : ' Nom '
    - un champs de texte : ' Nature '
    - un champs mémo : ' Description '


    Sous Delphi 7, j'ai une form qui comprend :
    - un TEdit : ' Recherche'
    - un DBlistBox : qui indique éventuellement si le nom de la plante saisis dans le TEdit est trouvé.
    - un DBMemo : qui indique lorsque l'on clique dans le DBLisBox le descriptif de la plante.

    Comment faire pour utiliser une requête me permettant d'effectuer une recherche de texte dans le DBMemo et m'afficher le résultat trouvé dans le DBlistbox..?

    Pour faire plus simple : j'essaie de reproduire la même chose que la rubrique de recherche d'aide sous delphi.

    Sinon, si quelqu'un pourrait me décrire la manière de procéder en utilisant un IBQuery et transmettre le résultat dans un DBListBox...?

    Merci d'avance..
    a+

  2. #2
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dm1.Cust001.SelectSQL.Clear;
        dm1.Cust001.SelectSQL.Add('select * from cust001');
        dm1.Cust001.SelectSQL.Add('where upper('cust001.CU001CNOM') LIKE upper(' + chr(39) + Edit1.Text + '%' + chr(39)+ ')');
        dm1.Cust001.SelectSQL.Add('Order by cust001.CU001CNOM');
        dm1.cust001.Active := false;
        dm1.cust001.Active := True;
    dm1 : datamodule ou sont les compos
    Cust001 : un Dataset (j'aurais pu utiliser un Query)
    Edit1 : le Edit ou on tape le texte de recherche.

    Ce morceau de code est dans le OnChange de Edit1.

    J'espère que ça pourras t'aider.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Merci pour ta réponse, mais je n'arrive pas à adapter ton code...
    En fait j'utilise un IBQUERY..
    La syntaxe de ma requête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     FPrincipale.IBQuery1.SQL.Add('SELECT * FROM FLORE');
     FPrincipale.IBQuery1.SQL.Add('WHERE Upper(BaseAnalys) LIKE "'+UpperCase(ENature.text)+'%"');
    BaseAnalys est un champ de type memo, où l'utilisateur peut saisir n'importe quel descriptif quand à la nature de la plante.
    Par exemple : arbuste jaune avec petites feuilles...
    Il suffit que l'utilisateur effectue une recherche par "jaune" dans la zone de saisie, pour que mon Query affiche dans un listbox les enregistrements repérés.

    Si trouve bien entendu (je ne l'ai pas rajouté pour des raisons de lisibilités..):
    FPrincipale.IBQuery1.Close;
    FPrincipale.IBQuery1.Open;

    Et lorsque je procède à l'exécution, j'ai le message d'erreur suivant :

    " Le projet Project1.exe a provoqué une classe d'exeption EIBinterBaseError avec le message 'Dynamic SQL Error'
    SQL error code = -206
    Column unknown
    L%
    at line 2, column 25.
    Processus stoppé "

    Cette erreur se produit dès que j'essaie de saisir la lettre d'un début de mot, par exemple : L

    ?

  4. #4
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Tu peux afficher le contenu du query stp ? (un showmessage ou tu l'affiche dans un memo et copie-colle).

    D'après ton code j'ai l'impression que tu as mis le UpperCase() entre "" : faut pas ca fait parti de l'SQL.

    C'est le ENature.text qui doit être entre côtes simples ou

    Attention le .NET sur PDA peut causer des chutes de cheveux

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Tu veuts dire le contenu de l' IBQUERY, dans la propriété SQL et en cliquant à droite : TString[...] SQL ?
    Si c'est le cas , je n'ai rien mis dans la chaine de propriété du SQL de IBQUERY.

    J'ai laissé à vide et la propriété active est à false.
    J'ai purement codé.

  6. #6
    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
    Essaies ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FPrincipale.IBQuery1.SQL.Add('SELECT * FROM FLORE');
     FPrincipale.IBQuery1.SQL.Add('WHERE Upper(BaseAnalys) LIKE '+QuotedStr(UpperCase(ENature.text)+'%');
    "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

  7. #7
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Ce que je veux dire c'est que pour bien voir tu affiche le contenu de IBQuery1.SQL.Text (je crois que c'est .Text, sinon regarde ce que c'est... Strings peut être )

    Attention le .NET sur PDA peut causer des chutes de cheveux

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Pour Harry :
    Je n'ai rien saisi dans le SQL Strings... Uniquement déposé le composant sur la Form, le reste étant le code mentionné.

    Pour
    qi130 :
    J'ai essayé ton code, j'ai rajouté une parenthèse manquante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPrincipale.IBQuery1.SQL.Add('WHERE Upper(BaseAnalys) LIKE '+QuotedStr(UpperCase(ENature.text)+'%'));


    J'arrive à saisir la première lettre, et ...à la seconde lettre saisi, j'ai ...le message d'erreur suivant (j'abrège, le début de message étant le même que déjà mentionné..) :

    SQL Error code = -104
    Token unknown -Line3, char 1
    Select, processus stoppé..


    Pour l'instant j'arrive à saisir un caractère...
    A tout hasard, le problème ne viendrait il pas du fait qu'il s'agit d'un champs mémo...
    Celui - ci est déclaré en varchar sous Firebird..
    Je ne voits pas où se situerais le problème dans la recherche SQL, malgré le type de champs..




  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 147
    Points : 184
    Points
    184
    Par défaut
    Bonjour à mon avis sans me prononcer sur la requete en elle meme:
    1. Mais le nom de tes objets de ta base en majuscules (table, nom des champs, domaine etc... F1.5 est très sensible sinon tu es obligè de rajouter des " " pour les noms des colonnes BaseAnalys n'est pas correcte tu es obligé de mettre des " ". Je sais bien qu'il y a la fonction upper pour noms de colonnes ....?
    2. Le code n'est pas bon
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      IBQuery1.SQL.Add('WHERE Upper(BaseAnalys) LIKE '+QuotedStr(UpperCase(ENature.text))+'%'));
    3. Suprrime le simple quote (en rouge)après LIKE sinon tu as un double quote par la fonction QuotedStr
    4. Supprime la parenthèse en rouge est inutile et met la parenthèse en bleu

    Au royaume des aveugles, les borgnes sont rois.

  10. #10
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Citation Envoyé par Telemak
    Pour Harry :
    Je n'ai rien saisi dans le SQL Strings... Uniquement déposé le composant sur la Form, le reste étant le code mentionné.

    Pour
    qi130 :
    J'ai essayé ton code, j'ai rajouté une parenthèse manquante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPrincipale.IBQuery1.SQL.Add('WHERE Upper(BaseAnalys) LIKE '+QuotedStr(UpperCase(ENature.text)+'%'));


    J'arrive à saisir la première lettre, et ...à la seconde lettre saisi, j'ai ...le message d'erreur suivant (j'abrège, le début de message étant le même que déjà mentionné..) :

    SQL Error code = -104
    Token unknown -Line3, char 1
    Select, processus stoppé..


    Pour l'instant j'arrive à saisir un caractère...
    A tout hasard, le problème ne viendrait il pas du fait qu'il s'agit d'un champs mémo...
    Celui - ci est déclaré en varchar sous Firebird..
    Je ne voits pas où se situerais le problème dans la recherche SQL, malgré le type de champs..



    Fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPrincipale.IBQuery1.SQL.Clear;
    entre chaque requete !!!

    faut pas empiler

    Attention le .NET sur PDA peut causer des chutes de cheveux

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Salut,
    merci pour vos réponses...

    Pour Mirmillon :
    Effectivement, j'avais remplacé dans un premier temps la paranthèse à la manière dont tu le mentionnes, mais dès la saisie d'un premier caractère j'avais tout de suite un message d'erreur.
    D'où mon placement de la parenthèse à la fin, dans ce cas j'arrive à saisir 2 caractères... (un léger mieux si l'on peut dire...)
    Je vais essayer de changer en majuscule le nom du champs pour voir ce que ça donne..

    Pour Harry,
    Pareil, j'ai également essayé avec un clear... même problème..


    Actuellement je suis au travail, j'essaierais ce soir de faire les deux modifs mentionnés : majuscules + mettre un clear...
    Je vous dirais ce que ça donnera

    Encore merci
    a+

  12. #12
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Telemak : dans ton message d'erreur il dit clairement qu'il bloque à la ligne 3 sur le mot 'Select'.

    Select n'a rien à faire à la ligne3, il n'y en à qu'un seul et il est à la ligne1.

    Il faudrais que tu affiche pas à pas le contenu du code SQL pour savoir ce qui se passe.
    J'ai regardé, tu peux afficher en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Showmessage(Query1.SQL.Text);
    Vu que tu as de nouveau un select en ligne 3 ca semble bien indiquer que tu empile tes lignes sans retirer ce que tu avais mis avant.

    Remet nous tout le code lors du changement dans le edit.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    ok, je regarde ce soir....
    J'ai réfléchit un peu entre - temps, mais je ne pense pas qu'il s'agit d'un problème de majuscules, car autant mes souvenirs, lors de la création de la base sous Firebird, celui - ci m'a permutté automatiquement le nom des champs qui étaient en minuscules vers majuscules.
    Maintenant, si toutefois c'est sous delphi que le problème se pose... à vérifier également ce soir...

    ok, donc à ce soir...
    merci
    a+

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Voilà avec un showmessage :

    Nom : Showmessage.JPG
Affichages : 156
Taille : 9,8 Ko

  15. #15
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Jusque là ca à l'air correct, t'as pas de message encore ?

    Assure toi d'afficher le SQL juste avant qu'il s'execute avec erreur et donne nous l'erreur et le SQL qui va avec. Et tant qu'a faire tout le code du onChange de l'edit .

    Attention le .NET sur PDA peut causer des chutes de cheveux

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Bon, je progresse un petit peu...
    Après relecture, je m'apercçoit qu'avec tous mes test, j'avais mis en commentaire : FPrincipale.IBQuery1.SQL.Clear;
    Après réactivation de cette ligne et sans changer l'ordre de paranthèse, je n'ai plus de message d'erreur.
    Par contre lorsque je change l'ordre des paranthèses, j'ai à nouveau le message d'erreur..

    Maintenant, comment je peuts exploiter le résultat de IBQuery, afin de vérifier le bon fonctionnement de celui-ci ?

    J' ai mis les lignes de codes suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if FPrincipale.IBQuery1.SQL.Text = UpperCase(ENature.Text) then
       begin
        DBLProposition.Items.Add(FPrincipale.IBTable1.FieldValues['NOM']); // ici me rajoute dans un DBlistbox une proposition de nom(s)
        DBMAffDesc.Text := FPrincipale.IBTable1.FieldValues['BASEANALYS'];
       end;  // ici un DBMemo qui m'affiche la description précise de la ligne sélectionnée dans le DBListbox

    Si je ne suis pas compréhensible dans l'affichage du résultat dans la DBListbox , ce n'est pas trop grave..
    L'important pour moi, et de pouvoir faire une comparaison entre le mot saisi dans la zone de texte et celui trouvé par le query dans le champs memo..

  17. #17
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    FPrincipale.IBQuery1.SQL.Text contient une requete ,,non????
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Ce que je souhaiterais maintenant que je n'ai plus de message d'erreur ( à priori..), c'est de comparer le résultat de la requête par rapport au texte saisis (donc si le query trouve le texte saisis dans le edit de recherche par rapport à ce qu'il trouve dans le champs memo de ma base de données).
    Et si la comparaison se fait avec succès, de me remplir le DBlistbox par rapport à la position de l'enregistrement rencontré de mon champ memo..

    Ce que je souhaite faire, c'est à l'instar de l'aide de delphi :
    tu commence à saisir par exemple un mot clef et il commence à afficher dans un listbox les occurences qu'il trouve..et quand tu cliques sur la ligne de ton listbox, en bas t'as la fenetre qui t'affine la description de la ligne que tu vients de cliquer du listbox d'aide...

  19. #19
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Euh bien tu n'as pas besin de code pour cela ! (en plus ton code )

    Tu lie un datasource à ton query puis le DataDBlookupListBox au datasource, tu indique dans le fieldname le champ à afficher et ca devrais marcher tout seul !

    Attention le .NET sur PDA peut causer des chutes de cheveux

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Mon code c'est celui que j'ai déjà mentionné , plus les fonction close et open du query ..ce qui donne dans le OnChange du Edit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    FPrincipale.IBQuery1.Close;
    FPrincipale.IBQuery1.SQL.Clear;
     
    FPrincipale.IBQuery1.SQL.Add('SELECT * FROM FLORE');
     FPrincipale.IBQuery1.SQL.Add('WHERE Upper(BaseAnalys) LIKE "'+UpperCase(ENature.text)+'%"');
     
    FPrincipale.IBQuery1.Open;
    Harry, tu cites :
    Euh bien tu n'as pas besin de code pour cela !

    Tu lie un datasource à ton query puis le DataDBlookupListBox au datasource, tu indique dans le fieldname le champ à afficher et ca devrais marcher tout seul !
    Mon IBQuerry ainsi que le reste est bien relié au datasource,etc..
    Tu veuts dire par là que je saisis le SELECT * etc.. directement dans la propriété SQL[TString] du IBQuery ?
    Si oui, quelle est la syntaxe à mettre ?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/04/2007, 16h54
  2. Comment effectuer une requête http post ?
    Par Turtle_fr dans le forum 4D
    Réponses: 10
    Dernier message: 07/09/2006, 01h25
  3. Réponses: 4
    Dernier message: 06/09/2006, 14h04

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