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 :

Recherche rapide dans un TDBGrid


Sujet :

C++Builder

  1. #1
    Membre averti Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 390
    Points : 395
    Points
    395
    Par défaut Recherche rapide dans un TDBGrid
    J'ai reformulé le titre de mon message sur la demande des modérateurs... j'espère que maintenant tout est réunis pour pouvoir être reçu correctement sur ce forum...

    Je dispose d'un TDBGrid associé à un datasource lui même associé à un dataset.
    Ce truc n'est pas optimal mais je ne peux pas le changer pour des raisons de continuité que je ne peux expliquer ici ...

    Bref, c'est une appli de gestion de CD qui fonctionne parfaitement bien mais j'aimerais ajouter une fonctionnalité :
    Quand un utilistateur appuie sur une touche du clavier, je voudrais que le premier enregistrement correspondant à cette touche ait le focus dans la grille.
    Par exemple, si il appuie sur R, je voudrais que le dataset se positionne tout seul sur les enregistrements commençants pas "R". Attention, je ne veux pas changer la requete SQL, je veux juste repositionner le dataSet.

    j'ai essayé ceci mais je suis bloqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ( (Key >= 65 && Key <=90) || (Key >= 97 && Key <= 122)) 
          { 
            AnsiString Ch = GetCharByAscii(Key); 
            TDataSet *pDS = GrilleConsultation->DataSource->DataSet; 
            AnsiString fieldName = Ch + "*"; 
            TBookmark tB = *pDS->FieldByName(fieldName); 
            pDS->GotoBookmark((void *) fieldName.c_str()); 
          }

    Evidement, il plante en me disant qu'il ne connait aucun champ commençans par Ch* (f* par exemple).

    Comment faire ? je voudrais que ce ne soit pas trop lent non plus donc je voudrais éviter de reparcourir toutes la table car il peut y avoir à long terme plus de 500 enregistrements..

    merci beaucoup
    Un problème sans solution est un problème mal posé. (Albert Einstein)

    Placez votre main sur un poêle une minute et ça vous semble durer une heure. Asseyez vous auprès d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativité (Albert Einstein)

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,
    Pourquoi ne pas utiliser la propriété Filter de DataSet.Car si j'ai bien compris tu utilises un DBGrid, relié a un Query (ou similaire) et donc on doit pouvoir travailler sur DBGrid->DataSource->DataSet->Filter.
    Par ex dans le OnKeyDown du DBGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char C = Key;
    DBGrid->DataSource->DataSet->Filtered = false;
    DBGrid->DataSource->DataSet->Filter = AnsiString("Nom = '") + C + ("*'");
    DBGrid->DataSource->DataSet->Filtered = true;
    J'ai testé sur une de mes requetes, cela fonctionne. Mais cela 'extrait' un groupe d'enregistrement, j'espère que cela ressemble a ce que tu recherches...
    En esperant t'etre utile...
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Membre averti Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 390
    Points : 395
    Points
    395
    Par défaut
    ça fonctionne effectivement bien mais ce n'est pas le résiultat escompté ...
    En effet, comme tu le fais remarquer, cette opération modifie ma requete et je ne le voudrais pas.

    J'aimerai seulement utiliser le GotoBookmark pour en quelques sortes "simuler" le click sur la grille.

    J'avais obtenu le même résultat que toi mais en 10 fois plus de lignes donc dans tous les cas, tu m'as bien aidé !!!
    Merci beaucoup .
    Un problème sans solution est un problème mal posé. (Albert Einstein)

    Placez votre main sur un poêle une minute et ça vous semble durer une heure. Asseyez vous auprès d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativité (Albert Einstein)

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    (re)Bonsoir,
    Je crois que c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DBGrid->DataSource->DataSet->Locate();
    qu'il faudrait utiliser. Je suis en train de regarder les parametres attendus par Locate car je ne l'ai jamais utilisée (hou , la honte).
    Le premier qui trouve averti l'autre...
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Membre averti Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 390
    Points : 395
    Points
    395
    Par défaut
    J'ai trouvé ceci qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TLocateOptions Opts;
    Variant locvalues="mon_titre";
    Opts.Clear();
    Opts << loPartialKey;
    FrmConsultation->GrilleConsultation->DataSource->DataSet->Locate("Titre",locvalues,Opts);
    Problème : ça ne fonctionne que si "mon_titre" est le titre EXACT du cd ... je voudrais pouvoir mettre "C*" par exemple mais ça marche pas. J'ai testé "C%" mais même résultat.
    Un problème sans solution est un problème mal posé. (Albert Einstein)

    Placez votre main sur un poêle une minute et ça vous semble durer une heure. Asseyez vous auprès d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativité (Albert Einstein)

  6. #6
    Membre averti Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 390
    Points : 395
    Points
    395
    Par défaut
    C bon en Fait, ça fonctionne. Il faut pas mettre "A*" pour chercher les titre commençant pas A...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TLocateOptions Opts;
    Variant locvalues=ChU;
    Opts.Clear();
    Opts << loPartialKey;
    FrmConsultation->GrilleConsultation->DataSource->DataSet->Locate("Titre",locvalues,Opts);
    C'est le "loPartialKey;" qui fait tout le boulot. Il suffit de mettre A et il se charge du reste

    Merci beaucoup
    Tu m'as vraiment bien aidé !!
    Un problème sans solution est un problème mal posé. (Albert Einstein)

    Placez votre main sur un poêle une minute et ça vous semble durer une heure. Asseyez vous auprès d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativité (Albert Einstein)

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

Discussions similaires

  1. recherche rapide dans un datagrid
    Par Etudiante_Ines dans le forum Silverlight
    Réponses: 1
    Dernier message: 02/06/2011, 23h45
  2. Recherche rapide dans une liste
    Par jblecanard dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/09/2008, 23h53
  3. la Recherche la Plus Rapide dans un tableau
    Par linuxeur dans le forum C
    Réponses: 10
    Dernier message: 23/05/2008, 00h07
  4. Recherche rapide dans un gros fichier excel
    Par cyberboy00 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 16/04/2008, 14h56
  5. Réponses: 7
    Dernier message: 15/02/2006, 11h52

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