cs_nihaoma
Messages postés140Date d'inscriptionjeudi 2 mai 2002StatutMembreDernière intervention 2 février 2010
-
23 nov. 2006 à 12:42
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 2007
-
23 nov. 2006 à 15:46
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...
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 23 nov. 2006 à 13:31
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.
cs_nihaoma
Messages postés140Date d'inscriptionjeudi 2 mai 2002StatutMembreDernière intervention 2 février 2010 23 nov. 2006 à 14:07
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.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 23 nov. 2006 à 15:36
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 ...