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

Algorithmes et structures de données Discussion :

TreeView - Remplissage recurssif d'une table


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut TreeView - Remplissage recurssif d'une table
    Salut,


    Voila mon probleme

    J'ai une table SQL dans laquelle j'ai la description d'une arborescence.

    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
     
    ID     |     Name      |        Parent
    1            a                     
    2            aaa                     
    3            sse
    4            erd                     1
    5            fdf                     3
    6            r                       1
    7            zzz                     8  
    8            bbb                     1
    9            ccc                     3
    10                                    ...
    11
    12
    ...
    Le but est de remplir un TreeView avec ces données chaque element (ID) sera un noeud fils avec un element 'parent' ...

    pour avoir un truc, suivant la table :
    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
     
    -a
    |
    |_erd
    |_r
    |_bbb
         |   
         |_zzz
     
    -aaa
     
    -se
    |_fdf
     
    etc...
    Le but est un algo récursif. La question a ete en partie résolue ici :
    http://www.developpez.net/forums/sho...d.php?t=267013

    Mais la solution n'est pas bonne, car on ne s'ocupe pas des branches filles et des filles de celles-ci.



    Voici le code que j'ai écrit (en Delphi)

    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
     
    procedure TfrmMain.makeTreeNodes(id : Integer; node : TTreeNode);
    var
      tvwNode         : TTreeNode;
      listOfNodes     : Array[0..255] of Integer;
      tempID,
      numberOfChilds,
      i               : Integer;
      tempName        : String;
     
    Begin
    numberOfChilds := 0;
         With DataModule1.qry_ForTreeView do
              Begin
                  SQL.Clear;
                  SQL.Add('SELECT * FROM TREE_VIEW_TABLE WHERE (PARENT = ' + IntToStr(id) + ')');
                  Open;
                  while NOT EOF do
                  Begin
                      tempID    := FieldByName('ID').AsInteger;
                      tempName  := FieldByName('BRANCH_NAME').AsString;
                      tvwNode   := tview.Items.AddChild(tvwNode , tempName);
                      listOfNodes[numberOfChilds] := tempID;
                      inc(numberOfChilds);
                      next;
                  end;
    ////---> Jusqu'ici ca devrait être bon
    /// ---> Après ca foire !!!
                  makeTreeNodes(listOfNodes[i],tvwNode.Item[i]);
                  Close;
              end;
    end;
    Après le next; end; , il me faudrait une 2ème boucle qui appelle la récursive pour démeler les branches....

    mais je n'arrive pas à l'implémenter...

    Note : tview est un treeview créé dans mon MainForm.


    Merci pour votre aide...

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Pourquoi ne pas indexer la table sur le champ 'parent' et travailler en itératif?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    Cette table fait partie d'une base de donnée. Il n'est pas possible de la changer ...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    la profondeur maximale de l'arbre est elle connue et raisonnable ?
    si oui un select imbriqué permet d'obtenir la solution en lecture directe

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    non la profondeur de l'arbre n'est pas connue d'avance mais elle ne devrait pas exceder 5 niveaux.

    Peux-tu me donner plus de précsions a propos du 'select' ?

    Merci

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    Voila la solution, c'est possible de l'améliorer mais elle fonctionne !

    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
     
    procedure TfrmMain.makeTreeNodes(id : Integer; node : TTreeNode);
    var
      tvwNode         : TTreeNode;
      tempID          : Integer;
      tempName        : String;
      myQuery         : TADOQuery;
     
    Begin
        myQuery := TADOQuery.Create(nil);
        myQuery.ConnectionString := DataModule1.ADOConnection.ConnectionString;
        myQuery.SQL.Clear;
        myQuery.SQL.Add('SELECT * FROM TREE_VIEW_TABLE WHERE (HIDDEN = 0) AND (PARENT = ' + IntToStr(id) + ')');
        myQuery.Open;
        With myQuery do
              Begin
                  while NOT EOF do
                  Begin
                      tempID    := FieldByName('ID').AsInteger;
                      tempName  := FieldByName('BRANCH_NAME').AsString;
                      tvwNode   := tview.Items.AddChild(node , tempName);
                      makeTreeNodes(tempID,tvwNode);
                      next;
                  end;
              end;
        myQuery.Close;
        myQuery.Free;
    end;

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

Discussions similaires

  1. [AC-2010] Remplissage automatique d'une Table
    Par guyhoquet dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/08/2014, 10h15
  2. Remplir un TreeView à l'aide d'une table.
    Par Dragonaute dans le forum C#
    Réponses: 0
    Dernier message: 03/06/2010, 23h19
  3. Remplissage automatique d'une table
    Par AzalTeeb dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/07/2008, 21h55
  4. comment creer un treeview a partir d une table
    Par steeves5 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/06/2006, 18h03
  5. access remplissage auto d'une table
    Par bjornd dans le forum Access
    Réponses: 2
    Dernier message: 09/11/2005, 08h05

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