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 :

Probl�me avec TDBGrid


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut Probl�me avec TDBGrid
    Voila j'ai un petit probl�me avec mon TDBGrid, certes pas tr�s grave et qui n'empeche pas mon application de fonctionner mais bon c'est tout de meme pas propre.


    En fait j'enregistre un visiteur via un formulaire cr�e avec des TEdit. Ensuite je l'envoi dans ma table (connect�e � ma base de donn�e) de la mani�re suivante :

    - Code lorsque je clique sur le bouton Ajouter :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::AGGIUNGERE_VISITATOREClick(TObject *Sender)
    {
     TLocateOptions Option;
     if(TBVisit->Locate("cognome",cognome_visitatore->Text,Option)==true) return;
     TBVisit->Append();
     aggiornare_visitatori();
     ShowMessage("Visitatore aggiungere");
    }
    - puis fonction suivante pour ajouter le visiteur 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
     
    void __fastcall TForm1::aggiornare_visitatori()
    {
     TBVisit->Edit();
     TBVisit->FieldByName("Cognome")->Value = cognome_visitatore->Text;
     TBVisit->FieldByName("Documento")->Value = documento_visitatore->Text;
     TBVisit->FieldByName("Motivo")->Value = motivo_visitatore->Text;
     TBVisit->FieldByName("Entrata")->Value = entrata_visitatore->Text;
     TBVisit->FieldByName("Uscita")->Value = uscita_visitatore->Text;
     TBVisit->Post();
     TBVisit->Refresh();
    }
    Ce que je ne comprends pas, c'est que mon visiteur est bien rajout� UNE SEULE FOIS lorsque l'on verifie dans la table de la base de donn�e (type ACCESS) par contre visuellement dans mon TDBGrid mon visiteur apparait 2 fois :
    - une fois sur la premi�re ligne du tableau
    - une autre fois sur la derni�re ligne

    Si par la suite je modifie ce visiteur (� l'aide d'un bouton Modifier) le visiteur apparait cette fois ci normalement (soit une seul fois)

    Si quelqu'un connait un moyen de remerdier a cela ?

    Sinon question suppl�menentaire : Est-il possible de trier un TDBGrid en fonction de la colonne o� l'on clique. Par exemple si je clique une fois sur la colonne Nom il me trie par ordre croissant les nom, et si je reclique il le fait par ordre d�croissant et ceux pour toutes les colonnes ? Comme dans beaucoup d'applications d'ailleurs.


    Merci pour vos futurs �clairages :-)

  2. #2
    Membre �clair� Avatar de BOUBOU81
    Profil pro
    system integrator
    Inscrit en
    Juin 2004
    Messages
    358
    D�tails du profil
    Informations personnelles :
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : system integrator

    Informations forums :
    Inscription : Juin 2004
    Messages : 358
    Par d�faut
    Voila un bout de code pour le trie des colonnes, attention il se fait que en croissant mais mettre dans l'ordre decroissant n'est pas compliqu�.

    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
    void __fastcall TForm1::DBGridTitleClick(TColumn *Column)
    {
       ColonneEnCours=Column->FieldName;
       AfficheGrille();
    }
    //---------------------------------------------------------------------------
    void TForm1::AfficheGrille(void)
    {
       AnsiString Sql;
       DM->Query->Close();
       DM->Query->SQL->Clear();
       Sql="Select *from table Order by "+ColonneEnCours+" ASC";
       DM->Query->SQL->Add(Sql);
       try
       {
          DM->Query->Open();
       }
       catch (EDatabaseError& e)
       {
       }
    }
    //---------------------------------------------------------------------------

    Pour ce qui est de l'affichage dans la DBGrid l� je vois pas mais peut-etre qu'avec le code pour raffraichir ta DBGrid on pourrait te repondre.

  3. #3
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut
    pour le tri, j'irai m�me jusqu'� :
    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
     
    //---------------------------------------------------------------------------
    void __fastcall DBTools::MyOrderBy(TColumn* Column)
    {
     
      TDBGrid* cible = dynamic_cast<TDBGrid*>(Column->Grid);
      AnsiString newsql = dynamic_cast<TPSQLQuery*>(cible->DataSource->DataSet)->SQL->Text;
      AnsiString ordre;
      if (newsql.Pos("ASC") != 0 && newsql.Pos(Column->Field->DisplayName)!= 0)
        ordre = " DESC";
      else
        ordre = " ASC";
      newsql = DBTools::SQLSequenced(newsql," LIMIT");
      newsql = DBTools::SQLSequenced(newsql," ORDER BY");
     
      DBTools::execQuery(newsql + " ORDER BY " + Column->Field->DisplayName + ordre ,cible);
      cible->DataSource->DataSet->First();
     
    }
    Mon code s'applique � un composant de type Query, orient� postgresql...rest � adapter..il est pas fini, fini mais c pour que tu aies une id�e.

    Sinon, moi non plus je vois pas pour ton soucy l� comme �a.En revanche, puisque tu as un datasource, pourquoi n'utilises-tu pas des controls orient�s donn�es comme les DBEdit?

  4. #4
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut
    Merci pour le code, je vais essayer.

    Pour ce qui est de mon code pour le refresh, j'en ai pas j'ai juste une fonction afterRefresh() :

    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
     
    void __fastcall TForm1::TBVisitAfterRefresh(TDataSet *DataSet)
    {
     /* j'active ou non certains boutons */
     AGGIUNGERE_VISITATORE->Enabled = true;
     stampare_visitatore->Enabled = false;
     
     
    /* J'efface les TEdit */
     documento_visitatore->Text= "";
     cognome_visitatore->Text= "";
     motivo_visitatore->Text= "";
     entrata_visitatore->Text= "";
     uscita_visitatore->Text = "";
    }
    Y a t'il quelque chose d'autre a faire d'autre pour que mon refresh soit efficace ?
    Ce qui est bizard c'est que lorsque j'ajoute un visiteur il me fait le bug en rajoutant 2 lignes mais lorsque je le modifie, il n'y a aucun probl�me alors que j'utilise la meme fonction (pour l'ajout et pour la modification) pour mettre a jour mes champs :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::aggiornare_visitatori()
    {
     TBVisit->Edit();
     TBVisit->FieldByName("Cognome")->Value = cognome_visitatore->Text;
     TBVisit->FieldByName("Documento")->Value = documento_visitatore->Text;
     TBVisit->FieldByName("Motivo")->Value = motivo_visitatore->Text;
     TBVisit->FieldByName("Entrata")->Value = entrata_visitatore->Text;
     TBVisit->FieldByName("Uscita")->Value = uscita_visitatore->Text;
     TBVisit->Post();
     TBVisit->Refresh();
    }
    Voila, merci d'avance

  5. #5
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut
    Pour les DBEdit je ne savais pas que ca existait

    Je connais pas le logiciel depuis tr�s longtemps (3 semaines environ)

    Et ce composant DBEdit il fonctionne comme les Tedit habituels mais avec le datasource en plus ?

    Merci

  6. #6
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut
    exactement...dans l'onglet ControlDB

  7. #7
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut
    Alors,

    Pour mon tri, il prend bien en compte ma requete SQL mais le tableau ne s'ordone pas, est-ce normal.

    Mon code est le suivant :

    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
     
    void __fastcall TForm1::DBvisitatoriTitleClick(TColumn *Column)
    {
     AnsiString Colonna;
     AnsiString sql;
     
     Colonna=Column->FieldName;
     
     sql = "SELECT * FROM visitatori ORDER BY " + Colonna + " ASC";
     
     QRVisit->SQL->Clear();
     QRVisit->SQL->Add(sql);
     QRVisit->ExecSQL();
     
     TBVisit->Refresh();
    }
    J'ai pris exemple sur les codes que vous m'avait donn� et sur un code du meme genre que j'utilise deja dans mon application (une requete pour supprimer le visiteur selectionn�)

    Mais la il ne veut pas l'executer, il n'y a pas de tri de tableau apparant

    Merci

  8. #8
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut
    Citation Envoy� par BOUBOU81
    Voila un bout de code pour le trie des colonnes, attention il se fait que en croissant mais mettre dans l'ordre decroissant n'est pas compliqu�.

    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
    void __fastcall TForm1::DBGridTitleClick(TColumn *Column)
    {
       ColonneEnCours=Column->FieldName;
       AfficheGrille();
    }
    //---------------------------------------------------------------------------
    void TForm1::AfficheGrille(void)
    {
       AnsiString Sql;
       DM->Query->Close();
       DM->Query->SQL->Clear();
       Sql="Select *from table Order by "+ColonneEnCours+" ASC";
       DM->Query->SQL->Add(Sql);
       try
       {
          DM->Query->Open();
       }
       catch (EDatabaseError& e)
       {
       }
    }
    //---------------------------------------------------------------------------
    Dans ton code je voulais juste savoir � quoi correspondait "DM" car moi j'ai r�alis� un code tr�s proche (forcement j'ai pris exemple sur celui-ci ) mais j'ai directment fait
    et non :
    Et puisque ca ne fonctionne pas chez moi je me dis que l'erreur vient peut etre de la ?

  9. #9
    Membre �clair� Avatar de BOUBOU81
    Profil pro
    system integrator
    Inscrit en
    Juin 2004
    Messages
    358
    D�tails du profil
    Informations personnelles :
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : system integrator

    Informations forums :
    Inscription : Juin 2004
    Messages : 358
    Par d�faut
    non en fait le DM->, c'est que mon Query est dans un DataModule et non sur la fiche.
    ton souci ne vient pas de l�.
    mais qu'est ce qui ne fonctionne pas exactement,
    Tes donn�e s'affiche bien, pas de message d'erreur...

    est-ce que tu as exactement copier mon code, as tu bien l'evenement
    TitleClick a ton DBGrid

  10. #10
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut
    Voici exactement le code que j'ai :

    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
     
    void __fastcall TForm1::DBvisitatoriTitleClick(TColumn *Column)
    {
     AnsiString Colonna="";    // Déclaration d'une variable colonne
     AnsiString sql="";        // Déclaration de la variable accueillant la requete sql
     
     Colonna=Column->FieldName;     // Enregistre le nom de la colonne cliquée
     
     /* Enregistre la requete de tri */
     sql = "SELECT * FROM visitatori ORDER BY " + Colonna + " ASC";
     
     QRVisit->SQL->Close();
     QRVisit->SQL->Clear();         // Efface la précédente requete
     QRVisit->SQL->Add(sql);        // Ajout de la nouvelle requete
     QRVisit->Open();               // Execute la requete
     
     
     TBVisit->Refresh();            // Mise à jour de la table
    }
    Mes donn�e s'affiche correctement dans mon DBGrid.
    Je n'ai pas de message d'erreurs
    J'ai bien un �venement OnTitleClick.
    Mais lorsque je click sur une des colonne il ne se passe rien (elle ne sont pas tri�s, elle reste comme avant)

    J'ai v�rifi� que la requete etait bien enregistr� (sans espace, sans fautes,...) en la faisant afficher dans un edit et je n'y est vu aucun probl�me

    J'avoue que je trouve tout cela curieux

  11. #11
    Membre confirm� Avatar de Furlaz
    Homme Profil pro
    Responsable Qualit�
    Inscrit en
    Mai 2006
    Messages
    210
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Responsable Qualit�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par d�faut
    Si quelqu'un trouv� solution � mon probl�me ce serait g�nial,

    C'est une derni�res chose qu'il me manque pour mon projet de stage.

    Merci.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Probl�me de TDBGrid avec TMyQuery (MyDac)
    Par brotapz dans le forum Bases de donn�es
    R�ponses: 3
    Dernier message: 28/05/2010, 17h07
  2. Probl�mes avec TdbGrid Column.width
    Par frantzgac dans le forum Composants VCL
    R�ponses: 3
    Dernier message: 13/06/2008, 19h53
  3. Probl�me avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    R�ponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Probl�me avec la m�moire virtuelle
    Par Anonymous dans le forum CORBA
    R�ponses: 13
    Dernier message: 16/04/2002, 16h10

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