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 :

[Firedac]Changement d'index pour une FDMemTable


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut [Firedac]Changement d'index pour une FDMemTable
    Bonjour,

    je rame sur un truc qui me semble bête.

    Je charge le résultat d'une requête dans une table mémoire et je lui construis des index
    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
    procedure TDatas.MemMatieres(const SetActiveIndex : String='CODEASC');
    begin
     FDMatieres.Active:=True;
     FDMatieres.FetchAll;
     FDMemMatieres.Data:=FDMatieres.Data;
     FDMatieres.Active:=False;
     FDMemMatieres.Indexes.Clear;
     FDMemMatieres.AddIndex('CODEASC','CODE','',[]);
     FDMemMatieres.AddIndex('CODEDSC','CODE','',[soDescending]);
     FDMemMatieres.AddIndex('DESCASC','DESIGNATION','',[]);
     FDMemMatieres.AddIndex('DESCDSC','DESIGNATION','',[soDescending]);
     FDMemMatieres.IndexesActive:=True;
     FDMemMatieres.IndexName:=SetActiveIndex;
     FDMemMatieres.Active:=True;
    end;
    Nom : Capture.PNG
Affichages : 484
Taille : 26,4 Ko
    cliquer sur l'entête de colonne permet de 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    procedure TFormMatiere.BtnCodeClick(Sender: TObject);
    begin
    LiaisonListeMat.Active:=False;
    case btnCode.ImageIndex of
      1 : begin
            btnCode.ImageIndex:=0;
            // index ascendant sur code
            Datas.FDMemMatieres.IndexName:='CODEASC';
      end
      else begin
             BtnCode.ImageIndex:=1;
             BtnCode.TextSettings.Font.Style:=[TFontStyle.fsBold];
             btnDesc.TextSettings.Font.Style:=[];
             btnDesc.ImageIndex:=-1;
             // changer index descendant sur code
             Datas.FDMemMatieres.IndexName:='CODEDSC';
           end;
     end;
    Datas.FDMemMatieres.First;
    LiaisonListeMat.Active:=True;
    end;
     
    procedure TFormMatiere.btnDescClick(Sender: TObject);
    begin
    LiaisonListeMat.Active:=False;
    case btnDesc.ImageIndex of
      1 : begin
            btnDesc.ImageIndex:=0;
            // index ascendant sur Designation
            Datas.FDMemMatieres.IndexName:='DESCASC';
      end
      else begin
             btnDesc.ImageIndex:=1;
             btnDesc.TextSettings.Font.Style:=[TFontStyle.fsBold];
             btnCode.TextSettings.Font.Style:=[];
             btnCode.ImageIndex:=-1;
             // changer index descendant sur Designation
             Datas.FDMemMatieres.IndexName:='DESCDSC';
           end;
     end;
    Datas.FDMemMatieres.First;
    LiaisonListeMat.Active:=True;
    end;
    et cela fonctionne parfaitement.

    J'ai voulu ajouter un bouton [Rafraîchir] et c'est là ma galère je ne comprends pas pourquoi cela ne fonctionne pas
    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
    procedure TFormMatiere.BtnRefreshClick(Sender: TObject);
    var tri : String;
    begin
    ListeMatiere.BeginUpdate; // normalement inutile
    LiaisonListeMat.Active:=False;
    Datas.FDMemMatieres.IndexesActive:=False; 
    Datas.FDMemMatieres.Active:=False;
    if BtnCode.ImageIndex=0 then tri:='CODEASC';
    if BtnCode.ImageIndex=1 then tri:='CODEDSC';
    if BtnDesc.ImageIndex=0 then tri:='DESCASC';
    if BtnDesc.ImageIndex=1 then tri:='DESCDSC';
    Datas.MemMatieres(tri);
    Datas.FDMemMatieres.First;   // normalement inutile
    LiaisonListeMat.Active:=True;
    ListeMatiere.EndUpdate;        // normalement inutile
    end;
    la valeur de tri est correcte mais les lignes sont en vrac
    j'obtiens ceci en clicquant sur le bouton
    Nom : Capture_2.PNG
Affichages : 466
Taille : 7,6 Ko
    alors que je devrais avoir ceci
    Nom : Capture_3.PNG
Affichages : 464
Taille : 8,0 Ko

    Une idée, un truc qui crève les yeux ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Généralement j'utilise 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
    15
     
    procedure TForm1.DBGrid2TitleClick(Column: TColumn);
    var
      st1 : string ;
    begin
      st1 := Column.FieldName ;
      with CDS1 do
      begin
        Close;
        IndexDefs.Clear;
        IndexFieldNames := st1 ;
        Open;
        //Fields[0].Visible := false ;
      end;
    end;
    et j'utilise aussi ces fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      FDMemTable1.CopyDataSet(ClientDataSet1,[coStructure, coRestart, coAppend]);
      FDMemTable1.Open;
    c'est à dire la requête produit un dataSet qui est ensuite recopié dans le FDMemtable

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    @Alweber Ce n'est pas tant le remplissage qui me préoccupe, FDMemMatieres.Data:=FDMatieres.Data; fonctionne parfaitement,
    c'est plutôt la partie index.

    À l'ouverture du programme la table est remplie en fonction de ce SQL
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CODE,DESIGNATION,SAISON,TYPE,ATELIER,CODE_FAMILLE  FROM MATIERES
    ORDER BY CODE
    Donc, effectivement, l'ordre est par CODE, le contournement de mon problème : utiliser une macro pour "jouer" sur l'ordre au lancement de la requête
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CODE,DESIGNATION,SAISON,TYPE,ATELIER,CODE_FAMILLE  FROM MATIERES
    &Ordre
    voilà donc mon nouveau code pour le bouton [Rafraîchir]
    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
    procedure TFormMatiere.BtnRefreshClick(Sender: TObject);
    var tri,index : String;
    begin
    LiaisonListeMat.Active:=False;
    if BtnCode.ImageIndex=0 then
      begin
        tri:='ORDER BY CODE';
        index:='CODEASC'
      end;
    if BtnCode.ImageIndex=1 then
      begin
        tri:='ORDER BY CODE DESC';
        index:='CODEDSC'
      end;
    if BtnDesc.ImageIndex=0 then
      begin
        tri:='ORDER BY DESIGNATION';
        index:='DESCASC'
      end;
    if BtnDesc.ImageIndex=1 then
      begin
        tri:='ORDER BY DESIGNATION DESC';
        index:='DESCDSC'
      end;
    Datas.MemMatieres(tri,index);
    LiaisonListeMat.Active:=True;
    end;
    Pourtant, naïvement ? Je pensais que, comme cela fonctionnait avec les index lors du click sur les titres, changer l'index courant au rafraichissement fonctionnerait de la même manière. Il y a très certainement une subtilité qui m'échappe, il faut que je me replonge dans la bible de Cary Jensen
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Je viens de faire un test cela semble marcher
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FDQuery1.Close;
      FDQuery1.SQL.Text :=
        'SELECT CODE,DESIGNATION,SAISON,TYPE,ATELIER,CODE_FAMILLE FROM MATIERES';
      FDQuery1.Open;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      st1: string;
    begin
      FDMemTable1.Close;
      FDMemTable1.CopyDataSet(FDQuery1, [coStructure, coRestart, coAppend]);
      FDMemTable1.IndexDefs.Clear;
      FDMemTable1.AddIndex('CODEASC', 'CODE', '', []);
      FDMemTable1.AddIndex('CODEDSC', 'CODE', '', [soDescending]);
      FDMemTable1.AddIndex('DESCASC', 'DESIGNATION', '', []);
      FDMemTable1.AddIndex('DESCDSC', 'DESIGNATION', '', [soDescending]);
      FDMemTable1.Open;
      FDMemTable1.IndexName := 'CODEASC';
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      FDMemTable1.IndexName := 'CODEDSC'
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      FDMemTable1.IndexName := 'DESCDSC'
    end;

Discussions similaires

  1. Changement de Style pour une valeure Précise
    Par Martony74 dans le forum Langage
    Réponses: 9
    Dernier message: 23/10/2008, 15h45
  2. logging des index pour une BD standby
    Par learn dans le forum Oracle
    Réponses: 8
    Dernier message: 14/12/2005, 12h14
  3. Changement de tablespace pour une table
    Par slyv dans le forum Oracle
    Réponses: 5
    Dernier message: 28/04/2005, 20h46
  4. Créer un index pour une Base de données
    Par john7 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/01/2005, 21h43

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