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 :

Tri alphabetique d'un DBGrid [Débutant]


Sujet :

C++Builder

  1. #1
    Membre éclairé
    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
    Par défaut Tri alphabetique d'un DBGrid
    Bonjour,
    J'ai cherché dans le forum mais j'ai pas trouvé de réponse qui me convienne...

    Voilà mon problème:

    J'ai besoin de trier un DBGrid simplement en cliquant sur le nom du champ ( par exemple en cliquant sur le champ "nom", tout se trie par rapport au nom, ou encore en cliquant sur le champ "prenom", tout se trie par rapport au prénom ).

    Je sais comment faire via une requête SQL mais le problème c'est qu'il me faut créer un deuxième DBGrid pour ensuite lui donner les valeurs triées et je ne dois pas utiliser deux DBGrid!

    J'avais pensé à un composant : le AdvStringGrid qui est un composant amélioré du StringGrid et qui est payant, il permet via l'inspecteur d'objet de donner la possibilité de cliquer sur le nom du champ pour que ce soit trié sans aucune ligne de code...
    Mais problème, il ne gère pas l'accès à la base de donnée ( pas de champ Datasource dans l'inspecteur d'objet ). Donc je suis un peu bloqué, personne a eu ce problème auparavant?
    Thanks

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Il suffit d'utiliser l'évènement OnTitleClick de ton DBGrid pour modifier ta requête SQL en fonction de la colonne cliquée. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TFOpenQuiz::DBGrid1TitleClick(TColumn *Column)
    {
      AnsiString newOrderBy = " ORDER BY " + Column->FieldName ;        
      Query1->Active = false ;
    //[...] réécrire ta requête SQL
      Query1->SQL->Add( newOrderBy  );
      Query1->Active = true;
    }

  3. #3
    Membre éclairé
    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
    Par défaut
    Merci pour ta réponse...

    J'ai mi ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column)
    {
                 AnsiString newOrderBy = " ORDER BY " + Column->FieldName ;
      Query1->Active = false ;
     
      Query1->SQL->Add("SELECT * FROM dockers");
      Query1->SQL->Add( newOrderBy  );
      Query1->Active = true;
     
    }
    Mais j'ai une erreur de classe d'exception ect ... quand je clique sur le champ
    "Utilisation incorrect du mot clé élément. SELECT"

  4. #4
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Il faut que tu purge ta requête (Clear) avant d'écrire la nouvelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column)
    {
                 AnsiString newOrderBy = " ORDER BY " + Column->FieldName ;
      Query1->Active = false ;
      Query1->SQL->Clear(); // <= A TOUJOURS AJOUTER AVANT D'ÉCRIRE UNE REQUÊTE
      Query1->SQL->Add("SELECT * FROM dockers");
      Query1->SQL->Add( newOrderBy  );
      Query1->Active = true;
     
    }

  5. #5
    Membre éclairé
    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
    Par défaut
    OK, bon j'ai plus le message d'erreur mais ça marche pas. Et j'ai pas contre le message d'erreur qui revient pour les deux autres colonnes (quand je clique dessus).

    Je vais réfléchir, si tu as une idée de ton coté, hésite pas...
    thanks en tout cas

  6. #6
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Est ce que ton TQuery (Query1) et ton TDBGrid (DBGrid1) son reliés l'un à l'autre via un TDataSource? Sinon c'est normal que ca ne marche pas...

  7. #7
    Membre éclairé
    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
    Par défaut
    Ah oui mais ya un petit problème dans mon truc en fait,


    Mon DBGrid est relié à ma table via un datasource donc ensuite je place un query pour la requête mais je peux pas relier le DBGrid au DataSource du Query parce que mon DBGrid est deja relié a un autre DataSource ( celui qui le connecte avec ma table ) ...
    Sois je m'embrouille sois c'est pas possible non ?

  8. #8
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Personnellement je n'utilise jamais le composant TTable, j'utilise toujours TQuery.

    Il suffit que tu supprime ton TTable et que tu n'utilise que ton TQuery. A voir si c'est possible dans ton cas

  9. #9
    Membre éclairé
    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
    Par défaut
    Ok je suppose dans ce cas qu'il faut que je créé une requête SQL dans le Query pour afficher ce qu'il y a dans la table , je purge et je fais la requête de tri...
    Je vais essayer je reviens vers toi si j'ai un prb ( surement ).

  10. #10
    Membre éclairé
    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
    Par défaut
    Bon en fait ça se complique par rapport à ce que je fais. Ce que je vais faire c'est créer un deuxième DBGrid qui contient les valeurs triées et quand je clique sur le champ du premier, le deuxième apparait et le première disparait... au moins ça me dépanne et je pense que ça va marcher ....

    Tu aurais pas un exemple simple à m'envoyer par mail de d'utiliser TQuery à la place de TTable ? ça serait super...

    bon je reviens si j'ai une question ...
    merci à toi en tout cas pour ton aide précieuse!

  11. #11
    Membre éclairé
    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
    Par défaut
    Bon en fait ça marche mais je peux pas faire ça parce que si l'utilisateur souhaite ensuite cliquer sur une ligne pour la modifier, il va cliquer sur le DBGrid2 et pas sur le 1 ...


    Bon je sais pas comment faire alors

  12. #12
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Imaginons que tu ait un TTable sur une table Ma_Table.
    Il suffit de le remplacer par un TQuery contenant:

  13. #13
    Membre éclairé
    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
    Par défaut
    Je garde ça sous la main car ça me sera utile, mais en fait on vient de me dire que je ne devais pas utiliser de base de donnée mais tout doit être stocké dans un simple fichier txt donc je recommence tout et je pense que je vais beaucoup plus galérer. Je comprends pas trop pourquoi, c'est tellement plus simple avec une BDD... pour faire des modifications/suppressions/ajouts.

    Donc là j'ai un autre problème que j'ai déjà eu mais je ne trouve pas la solution.
    Dans ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    strList = new TStringList();
    strList->Add(Edit1->Text);
    strList->Add(Edit2->Text);
    strList->Add(Edit3->Text);
     
    for (int ii=0 ; ii<strList->Count ; ii++) 
    {
    Form1->AdvStringGrid1->Cells[ii+1][1]=strList->Strings[ii];
    }
    Form2->Close();
     
    }
    j'ai cette erreur : [C++ Erreur] Unit2.cpp(28): E2451 Symbole 'Form1' non défini
    Pourtant je suis bien obligé de mettre form1 pour préciser que mon AdvStringGrid1 est dans la fiche Form1.

    Si tu as des idées ...
    Merci encore

  14. #14
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040

  15. #15
    Membre éclairé
    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
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Imaginons que tu ait un TTable sur une table Ma_Table.
    Il suffit de le remplacer par un TQuery contenant:

    Bon j'ai un peu de temps devant moi là donc j'essaye ta méthode ( d'utiliser que des Query )...

    Donc j'ai remplacé TTable par TQuery, j'ai fait les modifications qui s'imposent pour avoir le contenu de la table dans le TDBGrid, tout est ok, la requête SQL : " SELECT * from ma_table" marche mais je voulais savoir pour l'insertion d'un enregistrement que je dois maintenant faire avec Query ( comme j'ai plus de composant TTable, je peux plus utiliser append();

    j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    Form1->Query1->SQL->Clear() ;
     
    Form1->Query1->SQL->Add( "INSERT INTO client ('NOM', 'NUMERO DE GSM', 'MATRICULE) VALUES ( 'QuotedStr( "%" + Form2->Edit1->Text + "%" )','QuotedStr( "%" + Form2->Edit2->Text + "%" )','QuotedStr( "%" + Form2->Edit3->Text + "%" )')");
     
    Form1->Query1->Active = true;
    }
    mais j'ai 1 erreur

    [C++ Erreur] Unit2.cpp(22): E2087 Utilisation incorrecte de pointeur

    Si tu vois quelque chose , fais moi signe
    Merci à toi

  16. #16
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Lorsque tu effectuer un INSERT, UPDATE ou DELETE dans une table, tu ne doit pas utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->Query1->Active = true; //uniquement pour les requête SELECT
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->Query1->ExecSQL(); //pour les autres requêtes
    Ensuite, ta requête d'insertion est incorrecte.
    Un conseil, rédige là sur plusieurs ligne pour plus de clarté!
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Query1->SQL->Add( "INSERT INTO client ('NOM', 'NUMERO DE GSM', 'MATRICULE)" ) ;
      Query1->SQL->Add( "VALUES ( " );
      Query1->SQL->Add( QuotedStr( Form2->Edit1->Text ) + " , " ) ;
      Query1->SQL->Add( QuotedStr( Form2->Edit2->Text ) + " , " ) ;
      Query1->SQL->Add( QuotedStr( Form2->Edit3->Text ) + " ) " ) ;

  17. #17
    Membre éclairé
    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
    Par défaut
    Merci pour ces précisions, c'est plus clair dans ma tête. Il reste juste une simple erreur à l'execution:

    Erreur SQL générale. [MySQL][ODBC5.1DRIVER][mysqld-5.1.49-community-log]Erreur de syntaxe pr.
    Le code est le même donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    Form1->Query1->SQL->Clear() ;
      Form1->Query1->SQL->Add( "INSERT INTO client ('NOM', 'NUMERO DE GSM', 'MATRICULE')" ) ;
      Form1->Query1->SQL->Add( "VALUES ( " );
      Form1->Query1->SQL->Add( QuotedStr( Form2->Edit1->Text ) + " , " ) ;
      Form1->Query1->SQL->Add( QuotedStr( Form2->Edit2->Text ) + " , " ) ;
      Form1->Query1->SQL->Add( QuotedStr( Form2->Edit3->Text ) + " ) " ) ;
    Form1->Query1->ExecSQL();
    Form2->Close();
    }

  18. #18
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Comme l'indique l'exception, il y a une erreur de syntaxe SQL dans ta requête.
    Est ce que tu sûr que le nom de ta table et le nom de tes champs sont correct? un champ comme 'NUMERO DE GSM' contenant des espaces me semble incorrect, non?

    Vérifie ta requête juste avant l'exécution pour si elle te semble correcte, via par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //...
      ShowMessage( Form1->Query1->SQL->Text ) ; 
      Form1->Query1->ExecSQL();

  19. #19
    Membre éclairé
    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
    Par défaut
    ça marche après avoir enlevé les simple quotes pour les champs après le INTO. my mistake : )

    J'ai déjà une autre question mais je vais réfléchir un peu, c'est pour modifier une ligne d'un DBGrid, j'imagine que c'est une requête UPDATE mais comment il détecte quelle ligne est sélectionnée dans le DBGrid ( = celle à modifier ) car avant avec le composant table, j'utilisais Table1->Delete(); et il comprenait que je cherchais à supprimer celui qui était selectionné!
    t'as un exemple?
    Merci encore x100

  20. #20
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Le plus simple c'est que ta table ait une clé primaire.
    D'ailleurs, même si ce n'est pas obligatoire, je te conseille fortement de définir une clé primaire pour chacune de tes tables. Ainsi, chaque enregistrement dans ta base de donnée pourra être retrouvé de façon unique grâce à cette clé primaire. Par exemple dans ta table CLIENT, tu peux créer un champ NUMERO_CLIENT qui sera la clé primaire.

    Ensuite pour modifier d'une ligne d'un DBGrid, il suffit d'exécuter une requête UPDATE en spécifiant quelle ligne tu veux modifier (via sa clé primaire)

    Disons que ton DBGrid affiche les données d'un TQuery QSelect, et que tu as un second TQuery pour faire les update appelé QUpdate. Pour mettre à jour les champs NOM et MATRICULE de la ligne sélectionné dans le DBGRid:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Récupération de la ligne sélectionnée dans le DBGrid:
    AnsiString numClient= QSelect->FieldByName( "NUMERO_CLIENT" )->AsString ;
    QUpdate->Active = false;
    QUpdate->SQL->Clear();
    QUpdate->SQL->Add( "UPDATE CLIENTS" ) ;
    QUpdate->SQL->Add( "SET NOM = " + QuotedStr( Edi1->Text ) + " , " ) ;
    QUpdate->SQL->Add( "    MATRICULE = " + QuotedStr( Edi3->Text )  ) ;
    //Dans la clause WHERE on indique quel enregistrement on veut modifier
    //Sans clause WHERE, tous les enregistrements de ta table seront modifiés!
    QUpdate->SQL->Add( "WHERE NUMERO_CLIENT= " + numClient  ) ;
    QUpdate->ExecSQL() ;
    Pour supprimer une ligne, c'est la même chose en effectuant une requête DELETE a la place de UPDATE:
    SELECT => récupérer en lecture des données d'une ou plusieurs table
    INSERT=> Insérer un ou plusieurs enregistrement dans une table
    UPDATE => Mettre à jour un ou plusieurs enregistrement dans une table
    DELETE => Supprimer un ou plusieurs enregistrement dans une table

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

Discussions similaires

  1. [deb]Try alphabetique de string?
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 05/12/2005, 11h04
  2. [LG]Tri alphabetique avec les pointeurs
    Par zbooon dans le forum Langage
    Réponses: 4
    Dernier message: 06/03/2005, 17h04
  3. Tri alphabetique
    Par wil4linux dans le forum C++
    Réponses: 17
    Dernier message: 16/02/2005, 23h02
  4. Réponses: 2
    Dernier message: 08/04/2004, 16h30
  5. [LG]tri alphabétique
    Par Marcus2211 dans le forum Langage
    Réponses: 5
    Dernier message: 17/11/2003, 16h55

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