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

Langage Delphi Discussion :

Tri sur clic d'un titre colonne d'un dbgrid


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Consultant informatique
    Inscrit en
    Octobre 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 240
    Points : 103
    Points
    103
    Par défaut Tri sur clic d'un titre colonne d'un dbgrid
    Slt à tous,
    Je ne suis pas un expert mais un débutant...
    J'ai trouvé une procédure(Voir après) qui permet de trier une colonne d'un dbgrid par ordre croissant ou décroissant mais j'ai 2 soucis.
    1° lorsque le titre de la colonne a été modifié (ce n'est plus le nom du champ de la BDD) cela bug. Comment faire car je ne peux pas renommer le nom du champ?
    2° la procédure fonctionne mais uniquement pour l'apparence du nom du titre il n'y a pas de modification dans le tri. Pourquoi?
    Merci de votre aide.
    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
    29
    30
    31
    32
    33
    34
    35
    procedure TForm2.DBG_SaisieTitleClick(Column:TColumn);
    var
    i:integer;
    SavePlace:TBookmark;
    begin
    for i:=0 To DBGrid1.Columns.Count -1 Do
    begin
    Column.Title.Color:=clBtnFace;
    end;
    Try
    SavePlace:=Query1.GetBookmark;
       If column.title.caption=ClasseFiche then
       begin
          if sens ='ASC' then
             sens:='DESC'
          else
             sens:='ASC'
          end
       else begin
          sens:='ASC';
          ClasseFiche:=Column.title.caption;
       end;
       if sens ='ASC'then
          Column.Title.color := clRed //Nom
       else
       Column.Title.color:=clBtnFace;
       Query1.Active:=False;
       Query1.sql.clear;
       Query1.sql.add('SELECT * FROM  ' +'MaTable'+ '  order By '+ClasseFiche+' '+Sens);
       Query1.Active:=True;
       Query1.GotoBookmark(SavePlace);
    Finally
       Query1.FreeBookmark(SavePlace);
       end;
    end;
    Disposer du "Savoir" c'est bien, le partager c'est encore mieux. !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 131
    Points
    13 131
    Par défaut
    Utilise Column.FieldName.
    (Le Bookmark sera aussi dans les choux après la fermeture .)

  3. #3
    Membre régulier
    Consultant informatique
    Inscrit en
    Octobre 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 240
    Points : 103
    Points
    103
    Par défaut
    Merci pour la réponse à ma première question.
    Cela fonctionne partout sans renommer les champs ni les titres.
    Reste à comprendre pourquoi le tri ne s'effectue pas.
    Le query1 déposer sur la form ne doit-il pas recevoir une sql pour lui donner la fonction de tri alphabétique?
    Disposer du "Savoir" c'est bien, le partager c'est encore mieux. !

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    je te passe un autre code (semblable à celui que tu as présenté) qui traite de ton problème et prend en charge le sens du tri, le nom du champ et sans BookMark .

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    var StrSql, StrFieldName, StrFields, StrSqlDesc : string ;
    begin
    { Si le type des données sous jacent est de type chaine, entier, valeur réelle
      alors on peut faire le tri,
    }
      if Column.Field.DataType in [ftString, ftInteger, ftFloat] then begin
         strsql :=  'select %s from country order by %s ASC';
         StrSqlDesc := 'Select %s from country order by %s DESC';
         {on récupère l'ensemble des noms des différents champs car plus rapide
          qu'un select *
         }
         StrFields := GetColname;
         {On recupère le nom du champ qui participera au tri clause order by CHAMP
         }
         StrFieldName := Column.FieldName ;
         with Query1 do begin
           Close;                           // fermeture
           SensTri := GetSensTri(Sql.Text); // sens de tri actuel
           SQL.Clear;                       // suppression du texte de la requete
           {suivant le sens de tri actuel on va inverser le tri}
             case sensTri of
               0 : Sql.Text := Format(StrSqlDesc,[strFields,StrFieldname]);
               -1,1 :SQL.Text := Format(strSql,[strFields,StrFieldName]);
             end; //case
           Open;
           StatusBar1.SimpleText := Copy(Sql.Text,1,length(Sql.Text)-2);
           DbGrid1.Hint := StatusBar1.SimpleText;
         end;// width
      end;// if
    end;
    //------------------------------------------------------------------------------
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SensTri := 1;
      if not Query1.Active then
      Query1.Open;
    end;
    //------------------------------------------------------------------------------
    function TForm1.GetColname: string;
    var i : integer;
    begin
      for i := 0 to DBGrid1.Columns.Count -1 do
       Result := Result + DBGrid1.Columns[i].FieldName +','+#32;
      if Result <> emptyStr then
       Result := Copy(Result,1,length(Result)-2);
    end;
    //------------------------------------------------------------------------------
    function TForm1.GetSensTri(S: string): integer;
    var i,j : integer;
    begin
      Result := -1;
      i := pos('ASC',s) ; J := pos('DESC',s);
      if i > 0 then begin
       Result := 0;
       Exit;
      end;
      if J > 0 then begin
       Result := 1;
       exit;
      end;
    end;
    Bonne chance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 102
    Points : 87
    Points
    87
    Par défaut
    le composant gratuit avec code smdbgrid fait cela automatiquement.

    + des filtres + ...

    sur www.scalabium.com

    Pascal07

  6. #6
    Membre régulier
    Consultant informatique
    Inscrit en
    Octobre 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 240
    Points : 103
    Points
    103
    Par défaut
    Merci Pascal,pour cette info au sujet de smdbgrid.
    Je l'ai installé mais as-tu idée s'il existe une aide sur ces composants?
    Merci aux autres également pour leurs infos.
    Disposer du "Savoir" c'est bien, le partager c'est encore mieux. !

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut à tous,

    J'ai réalisé un programme qui ouvre n'importe quelles bases access et tu peux en tapant une requete dans un Memo recupérer dans un DbGrid classique l'ensemble des colonnes que l'utilisateur à choisi dans sa requete.
    Afin justement d'éviter de tomber sur ton probleme j'ai tout simplement réalisé mon order by non pas sur le titre de la colonne (Column.FieldName : indiqué par AndNotOr) qui pourtant fonctionne mais sur le numéro de la colonne indiquant le champ (Column.Index) ce qui permet d'éviter tout les problemes de nombre de colonne, nom de colonne et autre.

    Si vous voulez essayer :
    http://rainconnu2.free.fr/devcom/MDBDeveloppeur.zip

    D'ailleur tous les commentaires sont les bienvenues, pour l'utilisation :
    - ouvrer une base access.....les tables apparaissent
    - clique droit sur une table et choisir ouvrir
    - ensuite taper la requete que vous voulez
    - Cliquer sur le bouton actualiser.
    (il y a d'autre fonctions que je vous laisse découvrir)

    Tu pourras voir comme le tri fonctionne dans les deux sens (ASC ou DESC) dans n'importe quel colonne (j'ai pas encore géré les champs Blob et memo, ils apparaissent tel quel)

    @+

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/12/2013, 14h42
  2. [DBGrid] Tri d'un clic sur l'en-tête de colonne
    Par pifou25 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/09/2006, 17h03
  3. [VB6][ListView] Tri sur chaque colonne
    Par frlap dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/05/2004, 11h20
  4. tri sur la xème colonne
    Par r-zo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/07/2003, 13h41
  5. [VB6] [MSHFlexGrid] Tri sur clic dans la première ligne
    Par degreste dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 06/03/2003, 00h42

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