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

Bases de données Delphi Discussion :

[TSMDBGrid] Gestion des critères de tri


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [TSMDBGrid] Gestion des critères de tri
    Salut,
    utilisant la grille TSMDBGrid j'aimerais savoir comment gérer au mieux la modifications des critères de tri ?

    Aujourd'hui j'utilise des tableaux pour les gérer, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure SetTableauTri(ATriCroissant : Boolean; Var ATAbleau : Array of TSMSortType; ATypeTriColonne: Array of TSMSortType);
    Var I: Integer;
    begin
     for I := 0 to High(ATypeTriColonne) do
     begin
      if ATriCroissant
       then ATableau[I]:=ATypeTriColonne[I]
       else if ATypeTriColonne[I]=stAscending
             then ATableau[I]:=stDescending
             else ATableau[I]:=ATypeTriColonne[I]
     end;
    end;
    Ce tableaux permet par la suite de construire la clause Order By.

    Existe-t-il une autre approche ?

    Merci.

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Donc tu essais de trier sur un TQuery, c'est ça ?
    Bidouilleuse Delphi

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je préfère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure SetTableauTri(ATriCroissant : Boolean; Var ATAbleau : Array of TSMSortType; ATypeTriColonne: Array of TSMSortType);
    Var I: Integer;
    begin
     for I := 0 to High(ATypeTriColonne) do
     begin
         if ATriCroissant then ATableau[I]:=ATypeTriColonne[I]
         else ATableau[I]:=stDescending;
     end;
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    OOOOOOOOOOOOKAY, je vois aussi...

    Non, le truc que je fais n'a rien à voir avec une table, (quoique très similaire à ta méthode).

    A la place d'une table, j'utilise un ensemble qui représente l'ensemble des champs ordonnés par ordre décroissants (ceux qui sont absents de l'ensemble sont supposés l'être par ordre croissant, ce qui est l'ordre par défaut d'une base de donnée en général) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type 
    TMesChamps=(mcChamp1,mcChamp2,mcChamp3); //3Champs dans ma table
    var SortDescSet=set of TMesChamps;
    ou alors (mais c'est moins documentant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var SortDescSet:set of byte; //si 0 est présent dans mon ensemble, le champ n°0 sera trié par ordre décroissant,etc...
    Après quoi, si je clique sur mon entète de colonne pour changer l'ordre de tri :
    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
    //OnClick de la colonne :
    begin
    ...
    if index in SortDescSet then exclude(SortDescSet,index)
                                   else exclude(SortDescSet,index);
    MiseAJourOrderBy;
     
    ...
    end;
     
     
    procedure MiseAJourOrderBy;
    var i:integer;
         ClauseOrderBy:string;
    begin
      ...
      ClauseOrderBy:='Order by ';
      for i:=0 to FieldCount-1 do
      begin 
         if i in SortDescSet 
         then ClauseOrderBy:=ClauseOrderBy+FieldbyIndex(i).FieldName+' desc'
         else  ClauseOrderBy:=ClauseOrderBy+FieldbyIndex(i).FieldName+' asc';
         if i<FieldCount-1 then ClauseOrderBy:=ClauseOrderBy+',';
      end;
    end;
    Bien sur, c'est du à la louche, c'est surtout pour te montrer le principe que j'utilise.

    ça m'évite de me trimbaler des tables à tout bout de champ et de bouffer la mémoire vive

    voilà
    Bidouilleuse Delphi

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pour ma part je fait simple mais le trie et fait sur un seul colonne que l'utilisateur à cliké
    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
     
    Const
        Instr:String='select * from Eleves';
    var
       Cole:Integer;
       Direct:Boolean;
    procedure TFArticles.Initialise;
    begin
         cole:=-1;
         Direct:=false;
    end;
    procedure TFArticles.DBGrid1TitleClick(Column: TColumn);
    var s:string;
    begin
         s:=Instr+' ORDER BY ['+column.Field.FieldName+'] ';
         if Cole<>column.Field.FieldNo then
           begin
             Cole:=column.Field.FieldNo;
             Direct:=false;
           end
         else
           begin
              Direct:=not Direct;
           end;
         if Direct then s:=s+' DESC;';
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par waskol
    Donc tu essais de trier sur un TQuery, c'est ça ?
    Oui
    Citation Envoyé par edam
    je préfère
    Oui tu as raison mais, n'ayant pas tout communiqué sur le contexte d'usage, cela ne convient dans mon cas.
    A l'origine l'utilisateur sélectionne le type de tri par menu (cas de tri combiné) et je ne fais qu'inverser la clause "order by" et dans ce cas.
    Donc les colonnes indiquées "stNone" ne sont pas concernées par la modification de la clause.

    Je n'utilise pas de table mais des tableaux.
    Pour l'utilisation d'un ensemble au lieu d'un tableau l'approche est identique, bien que l'opérateur "in" facilite le code.
    Pour l'évenement onclick de la colonne je ne pense pas que dans mon cas cela m'aide.

    Je vais regarder ça de plus prés. En tout cas je vous remercie pour votre aide.

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

Discussions similaires

  1. vc++6 try catch gestion des exceptions..
    Par eomer212 dans le forum Visual C++
    Réponses: 2
    Dernier message: 27/01/2011, 00h12
  2. Gestion des erreurs avec le try catch
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 8
    Dernier message: 03/03/2010, 10h22
  3. Gestion des exceptions imbriquée dans des Try et boucle
    Par Droïde Système7 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/01/2010, 18h30
  4. Réponses: 2
    Dernier message: 04/06/2008, 13h10
  5. Gestion des exeptions (try catch) en Java
    Par EIN-LESER dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 21/05/2008, 19h51

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