Table hiérarchique dans un TreeView en ADO

Signaler
Messages postés
140
Date d'inscription
jeudi 2 mai 2002
Statut
Membre
Dernière intervention
2 février 2010
-
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
-
Bonjour tout le monde

J'ai un p'tit soucis avec une manipulation d'enregistrement de type Recordset, j'espères que quelqu'un pourra m'aider.

Voila, j'accède donc via Ado, à une base de donnée et récupérer le contenu d'une table dans un objet RecordSet. Cette table est ma table "Utilisateurs", et elle est Hiérarchique, c'est à dire qu'une colonne me permet de savoir de quel autre enregistrement un enregistrement dépend. petit schéma:

TABLE:

    UseID | UserCode | UserLib | UserAppart
        1              1           Site 1           0
        2              2           Site 2           0
        3              3           User 1         2
        4              4           User 2         1
 

Voila, donc d'après cette table, j'ai 2 enregistrement "pères" (Site 1 et Site 2) et 2 utilisateurs qui appartiennent a ces sites.

J'aimerai donc faire une fonction qui me remplisse un TreeView pour représenter cette hiérarchie

j'ai fais ceci:

Private Function AddChild(oTreeView As TreeView, iCurrentNiv As Integer, ByVal adoRec As adodb.Recordset, sLblNiv As String)
       
    Dim Cpt As Integer
   
    adoRec.MoveFirst
    Cpt = 1
    While Not adoRec.EOF
        If adoRec.Fields("TU_APPART").Value = iCurrentNiv Then
            If iCurrentNiv = 0 Then
                Set nodx = oTreeView.Nodes.Add(, , sLblNiv & "-" & Cpt, adoRec.Fields("TU_LIB").Value)
            Else
                Set nodx = oTreeView.Nodes.Add(sLblNiv, tvwChild, sLblNiv & "-" & Cpt, adoRec.Fields("TU_LIB").Value)
            End If
           
            Call AddChild(Form1.TreeView1, adoRec.Fields("TU_CODE").Value, adoRec, sLblNiv & "-" & Cpt)
        End If
        adoRec.MoveNext
        Cpt = Cpt + 1
    Wend
  
End Function

Cette fonction prend en argument le TreeView à peupler, le niveau père à régarder, l'objet RecordSet et la Clef du père (ca c'est pour le treeview)

J'ai passer l'objet RecordSet en ByVal, donc normalement à chaque itération récursive de cette fonction, l'objet RecordSet doit etre dupliqué et le "moveNext" ne devrait affecter que la duplication, sauf que quand la fonction sort de l'itération, le curseur n'est plus au bon endroit ce qui fait planter la fonction....

je sais pas si je suis très clair, mais je penses que ceux qui pourraient répondre à ma question aurons compris....bien sur je peux apporter de détails s'il le faut...

merci pour vos idées

NiHaoMa

5 réponses

Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonjour,
Construit ta source de données de telle façon qu' elle soit elle même
hiérarchique


UserApprt      UserLib     UserCode
     0                Site 1         1
     0                Site 2         2
     1                User 2        4
     2                User 1        3




  Dans une boucle , tu parcours ton fichier
  Pour Chaque "TU_APPART" tu crée un parent
  Tant que c' est le même "TU_APPART"  tu crée
  un Child "TU_LIB"  .
  Et pas besoin de récursivité.
  Le Cpt etant incrémenté à chaque création de parent
  ou de Child, tu n' auras pas de problème à ce niveau.
 
Messages postés
140
Date d'inscription
jeudi 2 mai 2002
Statut
Membre
Dernière intervention
2 février 2010

Bonjour,

merci de ta réponse, toutefois, ta solution ne sera valable que si on considère que la source de donnée est toujours correctement positionnée. Seulement le principe du Base de données est justement de pouvoir ajouter ou supprimer des enregistrements, et là, à moins de faire une fonction pour à chaque fois réorganiser les enregistrements (ce qui avec ton schéma sera de toutes facons impossible puis tu ne précises pas quel "fils" appartient à quel "père"), c'est impossible à gérer...

Dans tous les cas, j'ai finis pas résoudre mon problème en utilisant les Bookmark de l'objet RecordSet, la fonction devient donc celle-ci:

Private Function AddChild(oTreeView As TreeView, iCurrentNiv As Integer, ByVal adoRec As adodb.Recordset, sLblNiv As String)
       
    Dim Cpt As Integer
    Dim vBookmark As Variant
   
   
    adoRec.MoveFirst
    Cpt = 1
    While Not adoRec.EOF
        If adoRec.Fields("TU_APPART").Value = iCurrentNiv Then
            If iCurrentNiv = 0 Then
                Set nodx = oTreeView.Nodes.Add(, , sLblNiv & "-" & Cpt, adoRec.Fields("TU_LIB").Value)
            Else
                Set nodx = oTreeView.Nodes.Add(sLblNiv, tvwChild, sLblNiv & "-" & Cpt, adoRec.Fields("TU_LIB").Value)
            End If
            vBookmark = adoRec.Bookmark
            Call AddChild(Form1.TreeView1, adoRec.Fields("TU_CODE").Value, adoRec, sLblNiv & "-" & Cpt)
            adoRec.Bookmark = vBookmark
        End If
        adoRec.MoveNext
        Cpt = Cpt + 1
    Wend
  
End Function

et là tout fonctionne correctement, quelque soit la position des enregistrements dans la table.

merci

NiHaoMa
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bon beh tant mieux ..
Ceci dit , quand je parlais de source de données,
je parlais de requête issue d' une ou de plusieures
tables liées.Le but de cette requête étant de me
renvoyer des données triées dans un ordre précis.
en l' occurence ici :TU_APPART, TU_LIB, TU_CODE...
Le but d' une requête est justement de pouvoir,
(et en temps réel), ...pour à chaque fois réorganiser
les enregistrements ...ce qui avec mon schéma sera
de toute facons possible ...
Messages postés
140
Date d'inscription
jeudi 2 mai 2002
Statut
Membre
Dernière intervention
2 février 2010

alors je te présentes mes excuse car effectivement je ne l'avais pas compris comme ca ;)
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
no problème
et tu n' as pas à t' excuser,
tu n' as pas fauté à ce que je sache !
tu as exprimé ton avis, c' est tout...