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

C++Builder Discussion :

Fonction pour rechercher dans une table [Langage/Algorithme]


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut Fonction pour rechercher dans une table
    Rebonjour,

    Je souhaite faire une recherche dans une table et que la recherche se fasse dans tout les champs de la table. Or, ici la recherche ne se fait que dans "Client". ( Edit1 est le "Edit" dans lequel le user rentre le mot qu'il souhaite rechercher )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
       if (!Edit1->Text.IsEmpty())  // test pour voir si le Edit est vide
           {
            TLocateOptions Option;  // Creer un objet option
            Option << loCaseInsensitive;  // Rajout de l'option "ne fait pas attention à la casse"
            Table1->Locate("Client",Edit1->Text,Option); // Recherche l'enregistrement suivant les critères
           }
    }
    1. Comment faire pour que la recherche se fasse dans tout les champs de la table?
      Est-ce qu'automatiquement ça m'affichera plusieurs résultats ( s'il y en a plusieurs )?


    thx

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Bonjour,
    après un petit coup d’œil sur l'aide de BCB pour la méthode Locate, voici ce qu'on y trouve :

    Recherche un enregistrement particulier dans l'ensemble de données et le choisit comme enregistrement en cours.

    virtual bool __fastcall Locate(const AnsiString KeyFields, const System::Variant &KeyValues, Db::TLocateOptions Options);

    Description

    Appelez Locate pour rechercher un enregistrement particulier dans un ensemble de données et positionner le curseur dessus.

    KeyFields est une chaîne contenant une liste délimitée par des points-virgules des noms de champs à utiliser pour la recherche.

    ...
    Tu peut donc mettre à la place de ton "Client", la liste de tout les champs dans lequel tu souhaite que la recherche se fasse séparé par des ;

    Bonne journée

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Autant pour moi le pire c'est que j'avais consulté l'aide et j'avais pas vu cette ligne...
    Toujours est-il que j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Table1->Locate('Client;Produit', Edit1->Text,Option);
    J'ai pourtant fait comme expliqué dans l'aide:

    Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);

    Voici les erreurs:

    [C++ Avertissement] Unit1.cpp(38): W8098 Constante caractère multi-caractère
    [C++ Erreur] Unit1.cpp(38): E2129 Constante caractère trop longue (ou vide)

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    C'est parce que tu as mis des simples quote ' au lieu de doubles quote "

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    En fait j'avais essayé les doubles quotes, mais j'avais cette erreur ( que j'ai toujours ):

    LE projet Project1.exe a provoqué une classe d'exception EVariantInvalidError avec le message 'Argument incorrect'. Processus stoppé utilisez le pas à pas ect
    La compilation est OK, mais ça s'affiche au moment ou je lance la recherche...

  6. #6
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Le deuxième paramètre est un Variant, il faut donc transformer ton AnsiString en Variant, ceci devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Table1->Locate("Client;Produit", Variant(Edit1->Text),Option);

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Malheureusement j'ai toujours le même problème arf

  8. #8
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Que contient ton Edit1 ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par pottiez Voir le message
    Que contient ton Edit1 ?

    C'est un simple Edit, il contient ce que l'utilisateur voudra rechercher...
    ça marchait très bien en fait avec un seul champ, c'est depuis que j'essaye de mettre la recherche sur plusieurs champs que ça plante.

  10. #10
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Apparemment, toujours d'après l'aide de BCB, si tu met plusieurs champs, tu doit mettre autant de valeur que de champs, il faut donc que tu créé un tableau de variant comme dans l'aide, il suffit que tu mette à chaque fois la valeur de ton Edit1

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Héhé, à vrai dire, je ne sais même pas ce que variant veut dire, mais bon je vais voir comment créer un tableau de "variant" donc ...
    Si tu as le temps de me donner un exemple, je suis preneur sinon je vais chercher

  12. #12
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Variant est un type, au même titre que l'AnsiString par exemple.

    Essaye ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Variant locvalues[2]; //Déclaration d'un tableau de Varaiant contenant 2 variable
    locvalues[0] = Variant(Edit1->Text);  //Variable 1 d'index 0, on met ce que l'ont cherche pour le premier champs, ici le champ Client
    locvalues[1] = Variant(Edit1->Text);  //Variable 2 d'index 1, on met ce que l'ont cherche pour le deuxième champs, ici le champ Produit
    Table1->Locate("Client;Produit", VarArrayOf(locvalues, 1),Option);

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    ah ok tout simplement en effet...
    Bon ben ça compile, pas d'erreur quand je clique sur chercher, mais il ne se passe rien... ( il ne va pas à la ligne qu'il a trouvé comme il faisait avant avec un seul champ j'entends ).

    C'est super casse couille ce truc....

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Salut

    Ben une simple requete sql avec une clause where

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Nan parce que la recherche doit se faire par l'utilisateur en cliquant sur un bouton. Faut pas de requête SQL...

    Au final j'ai ça donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    Variant locvalues[2]; //Déclaration d'un tableau de Varaiant contenant 2 variable
    locvalues[0] = Variant(Edit1->Text);  //Variable 1 d'index 0, on met ce que l'ont cherche pour le premier champs, ici le champ Client
    locvalues[1] = Variant(Edit1->Text);  //Variable 2 d'index 1, on met ce que l'ont cherche pour le deuxième champs, ici le champ Produit
     
       if (!Edit1->Text.IsEmpty())  // test pour voir si le Edit est vide
           {
            TLocateOptions Option;  // Creer un objet option
            Option << loCaseInsensitive;  // Rajout de l'option "ne fait pas attention à la casse"
             Table1->Locate("Client;Produit", VarArrayOf(locvalues, 1),Option); // Recherche l'enregistrement suivant les critères
           }
    }

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    En quoi cliquer sur un bouton empeche t il de faire une requete sql ?

    Et si tu me dis que chaque utilisateur recoit des données specifiques , je te reponds que tu as juste à correctement formater ta requete

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Je ne vois pas trop comment mettre une requête SQL dans du C++, j'ai jamais fait ça. Je préfererais trouver pourquoi cette méthode Locate marche pas

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Ton table , tu le remplis comment ?

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Points : 108
    Points
    108
    Par défaut
    Cela se fait dans une fonction qui sert à ajouter une ligne dans la table:

    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
    void __fastcall TForm2::Button1Click(TObject *Sender)    // on clique sur "OK" pour un ajout
    {
    int ii;
    strList->Add(Edit1->Text);         //enregistre ce que l'utilisateur insere dans "client"
    if( ComboBox1->ItemIndex != -1 ){strList->Add(ComboBox1->Text);} // records what is inside ComboBox1
    strList->Add(Edit2->Text);          //enregistre ce que l'utilisateur insere dans "Produit"
    strList->Add(Edit3->Text);         //enregistre ce que l'utilisateur insere dans "Date d'expiration"
     
     
    Form1->Table1->Append();
    Form1->Table1->Edit();
    Form1->Table1->FieldByName("Client")->Value=Edit1->Text;
    Form1->Table1->FieldByName("Produit")->Value=ComboBox1->Text;
    Form1->Table1->FieldByName("Expiration")->Value=Edit3->Text;
    Form1->Table1->FieldByName("Clef")->Value=Edit2->Text;
    Form1->Table1->Post();
    Close();
    }
    C'est stocké dans un tableau de strings pour ce que le user met dans les "Edit".

    Après au niveau d'un composant j'ai donc un DBGrid, une table et un Datasource.
    Ce que je veux faire c'est une recherche sur plusieurs champs et que le résultat de la recherche me renvoie toutes les lignes qui correspondent et pas juste la première dans la liste qui correspond à la recherche...

    Je ferais en sorte d'afficher le résultat après dans une autre fiche pour eviter que ça soit le bordel dans mon DBGrid, mais là pour le moment c'est la recherche sur plusieurs champs qui pose problème même si Pottiez m'a beaucoup aidé... et ensuite faire en sorte que ça me sorte pas que la première ligne qui correspond mais toutes celles qui correspondent ... mais bon chaque chose en son temps...

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Ce que je voulais dire , c est : où sont stockées tes données ?

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

Discussions similaires

  1. (VBA) Fonction de recherche dans une table
    Par cdurep dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/04/2013, 19h02
  2. [XL-2010] Formule : recherche dans une table pour un calendrier
    Par gandalf20000000 dans le forum Conception
    Réponses: 3
    Dernier message: 27/12/2011, 11h42
  3. [MySQL] Recherche dans une table - petit bug affichage multiple pour certaine recherche
    Par runcafre91 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/01/2010, 09h44
  4. Recherche dans une table
    Par Fredo67 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 17h21
  5. recherche dans une table Access en ASP
    Par D-D dans le forum ASP
    Réponses: 3
    Dernier message: 09/06/2004, 10h12

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