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 :

Suggestion dans une recherche avec Adoquery


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut Suggestion dans une recherche avec Adoquery
    Bonjour,
    j'ai une table employe dont je veux afficher le contenu dans des DBEdit en recherchant le Nom et Prenom à partir d'un edit de recherche en reliant sa valeur avec un ADOqury. Je veux que dans la recherche me suggère des noms déjà existants dans la BD selon les lettres déjà écrites (comme la recherche dans google). Là, je je coince dans la requête : comment associer le nom et le prénom puisque ce sont des champs différents ?
    Pouvez vous m’éclairer parce que je suis bloqué sur ce point.
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je ne suis pas fan de ADOQuery, en revanche la requête SQL est relativement simple , bien que cela dépende un peu du SGBD au niveau de la concaténation de chaine.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM,PRENOM FROM EMPLOYE WHERE NOM||PRENOM STARTING WITH :E
    où le paramètre E sera égal à editderecherche.text. Cette requête a tout intérêt à être préparée à la première utilisation, ce qui améliorera ensuite la vitesse d'exécution pour les recherces suivantes

    plus poussé, il y a aussi, avec certains SGBD, le SOUNDEX qui permet de faire une recherche plus "phonétique"
    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 expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Pour l'autocompletion tu peux charger les données dans une liste et afficher un ListBox en dessous de l'Edit avec les Items correspondant à la recherche.

  4. #4
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut
    merci c'est un debut pour ameliorer mes recherches

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    tu peux selon tes besoins utiliser deux opérateurs :

    Starting With : qui permet de rechercher une chaine par son début (déjà signalé par SergioMaster)
    LIKE : qui permet de rechercher une chaine dans une autre chaine

    attention la syntaxe de la requête peut-être différente selon le type de SGBD

  6. #6
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut
    bonjour
    me revoilà, après quelques recherches et avoir essayé toutes sortes d'algorithmes différents je suis arrivé à ce résultat dans la procédure stockée suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    alter proc rechnom @lettre varchar(25)
    as begin
     
    declare  @nbrlet int,
     
    set @nbrlet=len(@lettre)
     
    select nom_emp,prenom_emp from employer where substring(nom_emp,1,@nbrlet)=@lettre or substring(prenom_emp,1,@nbrlet)=@lettre
     
    end

    mais pour l’exécuter sur Adostoredproc sur delphi il lui faut un paramètre de sortie, et avec résultat de la requête j'ai pensé à une matrice sur sql server 2016. ma recherche m'a amené à des tables temporaires ; je me suis documenté, mais je suis perdu sur comment insérer le contenu de ma requête sur ces tables et comment les afficher sur delphi
    merci de m'aider

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Mais pourquoi une procédure et le code de celle-ci ? Au moins maintenant on sait qu'il s'agit de MS SQL.

    1°remarque : on vous a indiqué d'utiliser STARTING WITH ou LIKE '%' si, apparement STARTING WITH n'existe pas LIKE est accepté et permet d'éviter cette complexification de la clause where
    Maintenant, puisqu'il s'agit de MSQL Server vous pouvez peut-être utiliser CONTAINS ou FREETEXT n'étant pas adepte de ce SGBD, cherchez ou posez la question sur le forum adéquat pour la formulation de la requête

    pour la suite , je resterai le plus générique en utilisant LIKE

    2°remarque : pas besoin de passer par une procédure alors que le SQL suffit
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // ATTENTION IL S''AGIT DE LA REQUETE ADOQUERY 
    select nom_emp,prenom_emp from employer where nom_emp LIKE :n1 or prenom_emp LIKE :n2
    il suffit ensuite de passer les paramètres n1 et n2 tous deux égaux à edit1.txt+'%', pourquoi deux paramètres alors qu'il s'agit d'une même valeur ?
    c'est ADOQuery qui est conçu comme ça
    donc soit vous écrivez avant d'ouvrir la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Adoquery1.Parameters.ParamByName('n1').AsString:=edit1.text+'%'
    Adoquery1.Parameters.ParamByName('n2').AsString:=edit1.text+'%'
    soit vous contournez de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // via format
    AdoQuery1.SQL.Text:=Format('select nom_emp,prenom_emp from employer where nom_emp LIKE %0:s or prenom_emp LIKE %0:s',[QuotedStr(edit1.text+'%')]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // via StringReplace, ici j'ai mis à dessein @l comme nom de "paramètre"
    AdoQuery1.SQL.Text:=StringReplace('select nom_emp,prenom_emp from employer where nom_emp LIKE @l or prenom_emp LIKE @l','@l',QuotedStr(edit1.text+'%'),[rfReplaceAll]);

    3° remarque : je vous cite "comment associer le nom et le prénom", votre requête n'est plus sur une "association" mais sur deux colonnes différentes.
    je vous cite encore, "une recherche de type google", c'est encore un peu différent dans le sens où, lorsqu'il s'agit d'une recherche dans une liste, il ne s'agit pas le plus souvent d'une recherche d'une "valeur qui commence par" mais plutôt d'une "valeur qui contient" soit : un LIKE '%valeur%". Donc une recherche sur nom+prenom pourrait être envisagé.
    La concaténation de chaine avec MSSQL c'est le simple + donc, "une recherche google" pourrait pet être s'exprimer ainsi (comme je l'avais indiqué, la concaténation dépend du SGBD)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom_emp,prenom_emp from employer where  nom_emp+','+prenom_emp LIKE :valeur
    où valeur:=QuotedStr('%'+edit1.text+'%'); << voir remarque 2 pour le passage du paramètre, remarque 1 à propos du CONTAINS


    4°remarque : en guise de PostScriptum, le type de colonne a son importance le like peut donner des choses erronées en cas de type char (chaine de longueur fixe dont la partie droite est remplie par des espaces), dans le cas qui nous occupe (chaine débutant par cela n'a pas d'importance)

    C'est pourquoi, lorsque vous posez une question à propos d'interrogation de base de données il est bon d'indiquer non seulement la version de Delphi et les composants utilisés pour se connecter à celle-ci, mais aussi le SGBD et la description des tables et colonnes impliquées.

    N.B. pour ce qui est d'une procédure renvoyant des paramètres, ce n'est ni un problème Delphi ni ADO, posez donc la question sur le bon forum (Langage SQ ou mieux SQL Server)
    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

  8. #8
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut
    me revoila a nouveau
    j'ai utiliser la requette suivante :

    et ca marche,mais au niveau du delphi ca se declanche a la premiere frape mais apres ca ne donne aucun resultat et la recherche reste la meme ,et quand j'efface tous et je reecrit ca nedonne aucun resultat voici la requette:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom_emp,prenom_emp from employer where  nom_emp+','+prenom_emp LIKE  '%' + :rec + '%'
    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
    procedure TForm2.Edit7Change(Sender: TObject);
    begin
    if edit7.Text='' then
                 begin
                 DBListBox1.Items.Clear;
                 DBListBox1.Visible:=false;
                 end
    else
        begin
     DBListBox1.Visible:=true;
    ADOQuery1.Active:=false;
    ADOQuery1.Active:=true;
    Adoquery1.Parameters.ParamByName('rec').Value:=quotedstr('%'+edit7.text+'%') ;
    self.ADOQuery1.Refresh;
    self.ADOQuery1.ExecSQL;
    with self.ADOQuery1 do
         begin
           open;
           first;
           while not eof do
               begin
                 DBListBox1.Items.Add(self.ADOQuery1.FieldByName('nom_emp').AsString + ' '+ self.ADOQuery1.FieldByName('prenom_emp').AsString);
     
                 next;
               end;
               first;
         end;
         end;
    merci encore

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Encore beaucoup de travail sur le code

    première correction rapide en gardant la "logique"

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // les % sont en trop au vu du "calcul" du paramètre : quotedstr('%'+edit7.text+'%')  
    select nom_emp,prenom_emp from employer where  nom_emp+','+prenom_emp LIKE :rec
    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
    procedure TForm2.Edit7Change(Sender: TObject);
    begin
    if edit7.Text='' then
                 begin
                 DBListBox1.Items.Clear;
                 DBListBox1.Visible:=false;
                 end
    else
        begin
     DBListBox1.Visible:=true;
    ADOQuery1.Active:=false;
    ADOQuery1.Active:=true;
    Adoquery1.Parameters.ParamByName('rec').Value:=quotedstr('%'+edit7.text+'%') ; 
    self.ADOQuery1.Refresh;
    ADOQuery1.Open; // ou Adoquery1.Active:=true;
    with self.ADOQuery1 do
         begin
           open;
           first;
           while not eof do
               begin
                 DBListBox1.Items.Add(self.ADOQuery1.FieldByName('nom_emp').AsString + ' '+ self.ADOQuery1.FieldByName('prenom_emp').AsString);
     
                 next;
               end;
               first;
         end;
         end;
    Ensuite, hum ! on n'a pas d'indication de la version de Delphi donc je ne proposerai pas de livebinding , et reste sur une version Delphi 7, puisque DBListBox est utilisé, je reste sur ce choix de composant

    a) puisque DBListBox il y a, celle-ci peut être liée à un datasource conclusion la boucle while not eof do .... end est : inutile
    b) si l'on doit afficher une concaténation de la colonne nom_emp et prenom_emp, pourquoi ne pas faire celle-ci directement dans la requête ?

    ce qui nous donne un code beaucoup plus simple :

    sur la forme (ou dans un datamodule) un AdoQuery, un Datasource lié à l'ADOQuery, le DBListBox lié au DataSource et à la colonne concaténée (NOMPRENOM)

    SQL à améliorer si l'on a besoin d'autres colonnes
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom_emp+','+prenom_emp as NOMPRENOM from employer where  nom_emp+','+prenom_emp LIKE   :rec

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm2.Edit7Change(Sender: TObject);
    begin
    with ADOQuery1 do
     begin
       DisableControls;
       Active:=False;
       Parameters.ParamByName('rec').Value:=quotedstr(edit7.text) ;
       Active:=Length(Edit7.Text)>0;
       if Active then First; // à ma souvenance c'est inutile mais avec ADO :?:
       EnableControls;
     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

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

Discussions similaires

  1. [WD17] recherche dans une combo avec des suggestions
    Par ecoinfo dans le forum WinDev
    Réponses: 6
    Dernier message: 02/04/2013, 14h08
  2. Faire la recherche d'un élement dans une colonne avec la fonction match
    Par ckrikri dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/11/2008, 11h54
  3. Réponses: 2
    Dernier message: 19/05/2008, 21h48
  4. Réponses: 2
    Dernier message: 19/11/2007, 16h53
  5. Problème de requête dans une boucle avec ADOQuery
    Par Ekik dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/05/2007, 16h07

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