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

Composants VCL Delphi Discussion :

TiboQuery + twwDbGrid -> change l'order by des grid.colonnes sans recharger la query


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Par défaut TiboQuery + twwDbGrid -> change l'order by des grid.colonnes sans recharger la query
    Bonjour,

    J'ai une query avec un order by sur date_course
    ID, DATE_COURSE, COURSE_TITLE

    Ma twwDbGrid est reliée a un datasource qui lui même est sur la query. Jusque là c'est très classique.
    En cliquant sur le header d'une colonne de ma grid je recharge la query en changeant le order by.

    Le hic c'est que si je sélectionne des lignes dans ma grid puis que je change le order by, vu que je recharge ma query je perds mes lignes sélectionnées.

    Je me suis donc intéressé aux index, en me disant qu'il est peut être possible de jouer sur les index pour changer l'ordre dans ma grid sans recharger ma query.
    J'ai trouvé pas mal de doc sur l’utilisation d'un clientDataset mais ce n'est pas ce que j'utilise.

    Pour le moment j'ai supprimé mon order by dans ma query et dans le form.create j'ai noté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ibqry_getHorairesDays.IndexDefs.add('DATE_COURSE'+'Idx', 'DATE_COURSE',[ixDescending])
    Mais après ?

    Bon peut être que ce n'est pas possible ou que je ne vais pas dans la bonne direction.

    Merci pour votre aide.

    Bertrand

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 715
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par beletot Voir le message
    Mais après ?
    Rendre actif l'index sans ça cela sert à rien, et indiqué l'index à utiliser du moins est-ce ainsi avec Firedac,

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Par défaut
    Bonjour SergioMaster,

    Rendre actif l'index sans ça cela sert à rien, et indiqué l'index à utiliser du moins est-ce ainsi avec Firedac,
    Oui je comprends bien l'idée mais je ne trouve pas la function à utiliser.
    Avec un clientDataset, il existe un function indexName mais elle n'existe pas avec IboQuery.

    Tu fais comment avec FireDac ?

    Bertrand

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 715
    Billets dans le blog
    65
    Par défaut
    En gros

    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
     
    // avant l'ouverture de la requête
    with fdQuery1.Indexes.Add do
      begin
         Fields:='INDEX';
         Name:='BY_INDEX';
         Active:=True;
      end;
    with fdQuery1.Indexes.Add do
      begin
         Fields:='CODE';
         Name:='BY_CODE';
         Active:=True;
      end;
    with fdQuery1.Indexes.Add do
      begin
         Fields:='NOM;CODE';
         Name:='BY_NOM';
         Active:=True;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Changement d'index ie. par code 
    fdQuery1.IndexName:='BY_CODE';
    mais il y a aussi la possiblité d'utiliser simplement FDQuery1.IndexFieldNames:='NOM' tout simplement (sans index même si ça va plus vite avec)
    on peut même "amélioré" ce type de tri
    Spécifiez le nom de chaque champ sur lequel indexer l'ensemble de données, en séparant les noms par des points-virgules. L'ordre des noms de champs est significatif. Spécifiez facultativement le suffixe pour tous les champs de la forme champ[:[D][A][N]], où :

    D -- utiliser le tri descendant sur ce champ.
    A -- utiliser le tri ascendant sur ce champ.
    N -- utiliser le tri insensible à la casse sur ce champ.
    ce qui fait que pour un click sur un titre on peut facilement coder le tri (même faire du descendant/ascendant). J'ai du écrire ça quelque part (forum/tutoriel) il y a longtemps

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 129
    Par défaut
    Sinon suffit de mémoriser le ID, faire le Refresh du OrderBy puis refaire un Locate, puis forcer un scroll si l'on veut repositionner vraiment le DBGrid tel qu'il était
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 129
    Par défaut
    Et sinon, on peut utiliser un TCLientDataSet

    sur une TDBGrid, je me suis fait un assistant pour DrawColumnArrowSort

    Et une classe TDBGridSliteSortAssistant qui fait le lien entre le DBGrid et le Query, via un TClientDataSet.IndexFieldNames pour faire un tri local sans relancer le SQL à chaque fois
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Par défaut
    Bonjour ShaiLeTroll,

    J'ai changé mon composant query pour celui en FireAdc

    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
    with fdqry_getHorairesDays.Indexes.Add do
      begin
         Fields:='NOM';
         Name:='BY_NOM';
         //Options:=[soNoCase,soNullFirst,soDescending];
         Options:=[soNoCase,soNullFirst];
         Active:=True;
      end;
     
      // Changement d'index ie. par code
      //fdqry_getHorairesDays.IndexName:='BY_USERNAME';
      fdqry_getHorairesDays.IndexName:='BY_NOM';
     
      fdqry_getHorairesDays.Open();
      fdqry_getHorairesDays.First;
    Ma grid est en multiselect mais le code de sergioMaster fonctionne bien. Je garde mes sélections.

    Sans connaitre les avantages de l'un et de l'autre.
    Serai t’il plus intéressant que j'utilise le compo TfdQuery à la place de TiboQuery ?

    Merci pour vos réponses

    Bertrand

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 715
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par beletot Voir le message
    Sans connaitre les avantages de l'un et de l'autre.
    à quel propos? création d'index ou pas ?
    Serait-il plus intéressant que j'utilise le compo TfdQuery à la place de TiboQuery ?
    Je suis fan de Firedac mais je n'ai jamais utilisé IBO ou si peu que cela n'est pas la peine d'en parler

    J'ai vu quelque chose qui me "chagrine" un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fdqry_getHorairesDays.Open();
    <s>fdqry_getHorairesDays.First; </s>
    s'il y a open il est forcément à first donc la seconde instruction est inutile

    dans la syntaxe des FDquery.Open il y a quelque chose que je n'ai retrouvé dans aucun autres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fdQuery.Open('',[paramètres'])
    le '', chaine vide indique que le SQL ne change pas mais passe les paramètres
    le Open() simple nécessite un close
    le Open('') fait un close/open avec même SQL et paramètres

    Je ne parles pas des macros et autres trucs

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Par défaut
    Serait-il plus intéressant que j'utilise le compo TfdQuery à la place de TiboQuery ?
    Je parlais de façon générale, je ne connais pas les composants Fireadc

    Pour le first, c'est étrange le curseur de position dans ma grid va se positionner vers disons la moitié des records.
    Le first force ma grid a se repositionner sur le premier record.

    Si je change par après l'index avec un indexname, là elle va bien se placer au début, sur le premier record.

    le '', chaine vide indique que le SQL ne change pas mais passe les paramètres
    le Open() simple nécessite un close
    le Open('') fait un close/open avec même SQL et paramètres
    C'est intéressant, il faut le savoir.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Par défaut
    Tant que j'y suis.

    procedure TDatas.fd_databaseBeforeConnect(Sender: TObject);
    begin
    fd_database.Params.username := Self.config.GetValue('database.username');
    fd_database.Params.Values['Server'] := Self.config.GetValue('database.host');
    //fd_database.Params.Server := Self.config.GetValue('database.host'); //not working
    end;
    Une idée de pourquoi fd_database.Params.Server ne passe pas

    Bertrand

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 715
    Billets dans le blog
    65
    Par défaut
    Oui, il faut passer par un Tfdphysxxxxxxxparams où xxxxxxx est le type de driver

    exemple avec Firebird
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with DataBase.Params as TFDPhysFBConnectionDefParams do
     begin
        Server:=config.GetValue('database.host');
        user:='SYSDBA';
        password:='masterkey';
        ...
     end;
     
    //ou
    // TFDPhysFBConnectionDefParams(DataBase.Params).serveur:=config.GetValue('database.host');
    // etc...

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 76
    Par défaut
    Bonjour,

    Merci pour la précision.
    Oui, il faut passer par un Tfdphysxxxxxxxparams où xxxxxxx est le type de driver
    J'ai envoyé un mail chez ibo pour cette histoire d'index.
    Je vais attendre sa réponse puis je fermerai le post.

    Merci pour vos aides

    Bertrand

  13. #13
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Par défaut
    Bonjour,

    Nous avons réussi à avancer sur cette histoire d'index.
    Dans le composant visuel d'iboquery, vous avez un onglet "Ordering" qui permet de créer les index :

    Nom : Capture.PNG
Affichages : 181
Taille : 11,2 Ko

    Lorsque vous appuyez sur le bouton create, vous pouvez choisir le champ et si l'index sera descendant (DESC). Si vous voulez faire du tri ascendant ET descendant, vous devez cocher cette option. Sans cela, il ne fera que de l'ascendant.
    Le composant se charge ensuite de remplir les informations nécessaires dans ORDERINGITEMS et OrderingLinks

    Nom : Capture1.PNG
Affichages : 172
Taille : 10,5 Ko

    Il lui donne un numéro. Cela commencera par toujours à 1. Le 0 étant réservé pour le fait de ne pas indexé.

    Après, il faut jour avec la propriété "OrderingItemNo" pour faire varier l'index. Dans l'exemple, nous mettrons 1 pour trier sur le nom de manière ascendante. L'astuce pour la manière descendante, c'est qu'il faut mettre sa valeur négative, à savoir -1.

    Le dernier problème rencontré, c'est que lorsqu'il réindex la grid, la ligne sélectionné reste la même alors que ce n'est plus le même record. Si quelqu'un a des idées pour que le record sélectionné à la base reste le même après le changement d'index, nous sommes preneurs des idées

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 715
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par lave_01 Voir le message
    Le dernier problème rencontré, c'est que lorsqu'il réindex la grid, la ligne sélectionné reste la même alors que ce n'est plus le même record. Si quelqu'un a des idées pour que le record sélectionné à la base reste le même après le changement d'index, nous sommes preneurs des idées
    Ce que je fais en général est la chose suivante :
    • un disablecontrols pour éviter le scintillement
    • une mémorisation de la clé de l'enregistrement cours
    • le changement d'ordre
    • un repositionnement sur l'enregistrement en cours (lookup ou findkey ...)
    • un enablecontrols

Discussions similaires

  1. Envoyer des paramètres get sans recharger ma page ?
    Par neo18045 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 28/06/2014, 15h43
  2. Réponses: 6
    Dernier message: 22/04/2011, 11h17
  3. changes-maven-plugin : perte des accents
    Par polo54 dans le forum Maven
    Réponses: 2
    Dernier message: 08/12/2008, 19h14
  4. Réponses: 6
    Dernier message: 19/04/2008, 15h03
  5. [XSD] Problème d'order sur des noeuds dans un schema
    Par jesus144 dans le forum Valider
    Réponses: 2
    Dernier message: 13/04/2006, 16h59

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