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

VB.NET Discussion :

Ajouter un niveau de noeud dans un treeview (BDD SQL Server)


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Ajouter un niveau de noeud dans un treeview (BDD SQL Server)
    Bonjour,

    Je suis en découverte des treeviews actuellement et comment dire... je suis quelque peu en galère =D
    Je vous expose mon problème :

    J'ai une BDD (SQL Server) contenant 3 tables et pouvant en contenir plus par la suite. Pour l'instant j'ai :
    - une table T_DEPARTEMENT avec : id_departement (PK int); nom_dpt(varchar)
    - une table T_SERVICE avec : id_service (PK int); nom_service(varchar); id_departement(FK)
    - une table T_LABO_GRPE avec : id_labo_grpe(PK int); nom_labo_grpe(varchar)
    id_service(FK int)

    J'ai, depuis cette base, créé un treeview me donnant la liste des départements et des services par arborescence ce qui donne cela :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
        '---------------------------------------
        'Chargement de l'arbre des départements
        '---------------------------------------
        Protected Sub Charger_Departement()
            'Dim compteur_node As Integer
            Dim tv_node As TreeNode
            Dim tv_sous_node As TreeNode
            'Dim tv_sous_sous_node As TreeNode
            Dim phsel2 As String
            'Dim phsel3 As String
            Dim mydataadapter As Data.SqlClient.SqlDataAdapter
            Dim mydataview As Data.DataView
     
            'creation  du dataset
            mydataset = New Data.DataSet()
     
            'Mise à zéro du compteur de noeuds
            'compteur_node = 0
     
            'remplissage de la liste des départements
            '--------------------------------------
            phsel = " SELECT DISTINCT t_departement.id_departement,t_departement.nom_dpt  FROM t_departement, t_service "
            phsel = phsel + " WHERE t_departement.id_departement = t_service.id_departement"
            phsel = phsel + " ORDER BY id_departement"
            mydataset = New Data.DataSet()
            mydataadapter = New Data.SqlClient.SqlDataAdapter(phsel, connect_bd)
     
            mydataadapter.Fill(mydataset, "departement")
            mydataview = mydataset.Tables("departement").DefaultView
            Dim departement As Int16
            For departement = 0 To mydataview.Count - 1
                If Not IsDBNull(mydataview(departement)(0)) Then
                    tv_node = New TreeNode
                    tv_node.Value = mydataview(departement)(0)
                    tv_node.Text = mydataview(departement)(1)
                    Me.tv_test_trombi.Nodes.Add(tv_node)
                    'Sélection du noeud du département courant
                    tv_test_trombi.Nodes(departement).Select()
     
                    'Remplissage de la liste des services pour le département
                    phsel2 = " SELECT t_service.id_service,t_service.nom_service FROM t_service "
                    phsel2 = phsel2 + " WHERE t_service.id_departement=" & mydataview(departement)(0)
                    phsel2 = phsel2 + " ORDER BY id_service"
                    mycommand = New Data.SqlClient.SqlCommand(phsel2, connect_bd)
                    mydataread = mycommand.ExecuteReader()
                    Do While mydataread.Read()
                        tv_sous_node = New TreeNode
                        tv_sous_node.Value = mydataread(0)
                        tv_sous_node.Text = mydataread(1)
                        tv_test_trombi.SelectedNode.ChildNodes.Add(tv_sous_node)
                    Loop
                    mydataread.Close()
                End If
                'Suppression de la sélection du noeud du département courant
                tv_test_trombi.Nodes(departement).Selected = False
            Next
        End Sub
    Jusqu'ici tout roule et pas de problème mais...
    Mon problème et que je souhaite à partir de cela ajouter un troisième niveau de noeuds contenant les informations sur mes labo_groupe qui sont des "enfants" de services.
    Et là... c'est le drame, blocage, je suis dessus depuis 1 semaine en essayant toute sorte de chose mais je ne vois pas comment faire alors, je tire la sonnette d'alarme et vous demande A L'AIDE !!

    J'espère que j'ai été assez explicite dans l'exposition de mon problème et j'attends maintenant vos réponses svp =)

    Je vous remercie !

    PS : merci de ne pas me renvoyer vers d'autres liens du site car je crois avoir fais le tour déjà ^^

    number09

  2. #2
    Membre averti Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Points : 355
    Points
    355
    Par défaut
    Salut, comme t'es en SQL Server tu pourrait utiliser une CTE avec une requête "récursive". (Ca fait peur enh)

    En gros, tu sélectionne ton département, et un enfant (que tu recupere avec un join), tu le met dans une table temporaire, tu union ALL le même select, sauf que tu join sur ta table temporaire.

    De cette manière tu as Département A qui a comme enfant AA et AB. AA a comme enfant AAA.

    Donc dans ta table le premier sélect donne

    A AA

    Ensuite tu union le même select, sauf avec un join sur l'enfant de ta table (SQL server sélectionne toujours de bas en haut. Donc il prend ton dernier record inséré)

    Donc tu va aller chercher l'enfant qui a comme parent AA

    Donc ta table va devenir

    A AA

    AA AAA

    Et ainsi de suite

    En code ca donne :

    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
     
      use taBD ;
         with
         treeChild(id, Parent, parent_name, child, child_name, child_class)
         AS
    	 (select idDeTonParent AS 'Id Parent',idDeTonEnfant as 'Id Enfant' 
    			   from taTableAvecLeParent Parent
    	 inner join taTableEnfant Enfant on Parent.idDeTonEnfant= enfant.idDeTonEnfant 
     
    	  union all
    	  select idDeTonParent AS 'Id Parent',idDeTonEnfant as 'Id Enfant' 
    		  from hier
    		inner join taTableEnfant Enfant on Parent.idDeTonEnfant= enfant.idDeTonEnfant 
    		inner join treeChild on treeChild.child = enfant.IdDeTonEnfant --Tu INNER JOIN SUR LA TABLE CTE POUR RAMASSER LES ENFANTS DU DERNIER QUE TU AS AJOUTER
     
    	) 
    	 select * from treeChild;
    J'ai tapé ca de mémoire j'ai pas de Bd sous la main. Si c'est pas exactement ca, ca ne devrait pas en être très loin.


    Ta requête va te renvoyer tout tes noeuds existant, peu importe le nombre de niveaux.

    Il va suffir de remplir un treeview avec une fonction récursive. C'est pas très compliqué, tu trouvera facilement la réponse en cherchant un peu.

    Avec un peu de travail tu peux facilement produire un arbre qui ressemble à ceci :




    Bonne chance


    PS : J'ai utiliser exactement cette requête pour un arbre qui montre la hiérarchie de l'inventaire physique de mon gouvernement. 6-8 niveau de hiérarchie, avec environ 50 000 items ca prend dans les 5 secondes. (Sélection, génération et affichage de l'arbre inclus)
    Logic is like the sword -- those who appeal to it, shall perish by it.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Merci =)
    Merci beaucoup pour ton aide, je me permets du coup de t'emb^ter encore un peu
    Ton "hier" dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     select idDeTonParent AS 'Id Parent',idDeTonEnfant as 'Id Enfant' 
    		  from hier
    correspond à quoi stp ?

    Peux-tu me dire à quel moment ou comment doit être créée la table CTE également (je n'ai jamais utilisé de table temporaire désolé) ?

    Enfin, as-tu de quoi m'orienter sur les fonctions récursives stp car je ne connais pas non plus

    Merci encore !!

  4. #4
    Membre averti Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Points : 355
    Points
    355
    Par défaut
    Citation Envoyé par number9 Voir le message
    Ton "hier" dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     select idDeTonParent AS 'Id Parent',idDeTonEnfant as 'Id Enfant' 
    		  from hier
    correspond à quoi stp ?
    Oups

    J'ai tapé tout ca en me basant sur une que j'avais fait pour mon système. Désolé.

    Premièrement, en y réfléchissant un peu, tu va devoir l'adapter pour que ca fonctionne avec ta strucure de BD. Dans mon cas, les relations était stockées dans une tables, et les items dans l'autre. Donc je revenais toujours sur la même table.

    Pour ton cas, tu devras ajouter un union all pour chaque niveau de hiérarchie.

    select from departement

    union all

    select from service

    union all

    select from le niveau encore plus bas.


    En prenant soin de toujours faire un inner join sur le child dans ta CTE.

    La CTE est créée ici :

    (J'ai modifié pour l'adapter un peu plus a ton cas. Tu ajoutera dans cette table les champs que tu veux ramasser dans tes select. Exemple : nomPArent,idParent,nomEnfant,idEnfant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     with
         treeChild(idParent,idEnfant)
         AS
    Commence par essayer de mettre ca en place. Ensuite je t'aiderai pour la création de l'arbre. Je manque un petit peu de temps en ce moment.

    Bonne chance, je repasse demain
    Logic is like the sword -- those who appeal to it, shall perish by it.

  5. #5
    Membre averti Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Points : 355
    Points
    355
    Par défaut
    Salut!

    J'ai discuter de ton problème avec un pote à moi, qui est aussi membre de Développez. Magistross.

    Son idée, assez brillante, sera plus facilement entretenable que la mienne, et restera performante même si on ajoute des niveaux de hiérarchie. Je m'incline donc

    Avec ce que je t'ai proposé, avec deux trois niveaux de hiérarchie, il n'y aurais probablement pas de différences.

    Mais vaut mieux faire quelque chose de plus facile à entretenir, et à modifier advenant le besoin!

    Je vais, pour ma part, te montrer de quel manière récupérer tes données, et Magistross s'occupera de la partie cliente, avec le traitement récursif.

    Donc garde en note ce que je t'ai montré précédemment, ca pourra être utile un jour. Je t'explique de quelle façon récupérér tes données pour pouvoir utiliser la méthodes de Magistross dans mon prochain post, en revenant de dîner (Au Québec, ouais ouais ).
    Logic is like the sword -- those who appeal to it, shall perish by it.

  6. #6
    Membre averti Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Points : 355
    Points
    355
    Par défaut
    Bon, estomac plein, cerveau prêt.

    Premièrement, la requête SQL.

    Elle est toute simple, elle ramène les "branche" en quelque sorte.

    Le departement, avec son service, avec son labo.

    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
     
    - une table T_DEPARTEMENT avec : id_departement (PK int); nom_dpt(varchar)
    - une table T_SERVICE avec : id_service (PK int); nom_service(varchar); id_departement(FK)
    - une table T_LABO_GRPE avec : id_labo_grpe(PK int); nom_labo_grpe(varchar)--J'imagine qu'il y aura ici un id_service(FK INT) pour savoir 
    -----------------------------------------------------------------------------quel service utilise quel labo
     
    select nom_dpt,nom_service,nom_labo_grpe
     
    from T_DEPARTEMENT TD
     
    --J'ai mis des inner join. Donc tu aura seulement les departement, qui ont des services, qui ont un labo.
    --Si tu veux les departements qui n'ont pas de service, ou les services qui n'ont pas de labo, 
    --Il faudra utiliser des outer join !
    inner join T_SERVICE TS
    	ON TD.id_departement=TS.id_departement
    inner join T_LABO_GRPE TL
    	ON TS.id_service=TL.id_service
     
     
    --Tu pourra ici rajouter tes conditions where si tu veux un ou des departement,service,labo en particulier
    Ensuite le .net

    On va aller chercher nos données avec un datareader. Ca sera donc une boucle itérative(ton reader) qui appellera une fonction récursive.

    Ca va comme suit :
    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
     
    Imports System.Data.SqlClient
     
    Public Class Form1
     
        Private Sub getData()
     
            Dim sSql As String = "taRequete"
     
            ''Definition de ta chaine de connexion
            Dim sConnection As String = "server=nomServeur\Instance;database=baseDeDonnees;Trusted_Connection=true"
            ''Déclaration de la connexion SQL
            Using Con As New SqlConnection(sConnection)
                ''Ouverture de la connexion
                Con.Open()
                ''Déclaration et création du SQL Command, en lui passant ta connexion
                ''On spécifie aussi la requête SQL. Personnellement je stockerais la requête sur la BD. Mais c'est à toi de voir.
                Using Com As New SqlCommand(sSql, Con)
                    ''Active ton reader
                    Using RDR = Com.ExecuteReader()
                        ''Vérifie s'il contient des lignes
                        If RDR.HasRows Then
                            Do While RDR.Read
                                ''call de la fonction récursive, qui te sera expliqué par Magistross
                                imARecursiveFunctionOhYeah()
                            Loop
                        End If
                    End Using
                End Using
             End Using
        End Sub
     
        Private Sub imARecursiveFunctionOhYeah()
            ''To Be Defined
        End Sub
     
    End Class
    Je passe le flambeau au gars avec une photo bizzare

    Bonne chance
    Logic is like the sword -- those who appeal to it, shall perish by it.

  7. #7
    Membre régulier Avatar de Magistross
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 18
    Points : 73
    Points
    73
    Par défaut
    Oye !

    Voici la fameuse fonction en question :
    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
    Private Sub createTreeNode(ByVal level As Integer, ByVal maxDepth As Integer, ByRef reader As SqlDataReader, Optional ByRef parentNode As TreeNode = Nothing)
     
    	Dim node As New TreeNode
     
    	If reader(level).ToString = "" Then
    		Exit Sub
    	End If
     
    	node.Text = reader(level).ToString
    	node.Name = reader(level).ToString
     
    	If parentNode IsNot Nothing Then
    		If Not parentNode.Nodes.ContainsKey(node.Name) Then
    			parentNode.Nodes.Add(node)
    		Else
    			node = parentNode.Nodes(node.Name)
    		End If
    	Else
    		If Not TreeView1.Nodes.ContainsKey(node.Name) Then
    			TreeView1.Nodes.Add(node)
    		Else
    			node = TreeView1.Nodes(node.Name)
    		End If
    	End If
    	If maxDepth >= level + 1 Then
    		createTreeNode(level + 1, maxDepth, reader, node)
    	End If
    End Sub
    L'appel initial se fait à la ligne 25 du bloc de code VB fourni par Saintelaitlait. La ligne devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createTreeNode(0, RDR.FieldCount - 1, RDR)
    Prend note que je n'ai rien pu tester. Il se peut que la condition à la ligne 5 pour vérifier si un élément est vide ne soit pas correcte. Je te laisse valider ! Tu devras aussi remplacer les occurrences de "TreeView1" dans mon code par le nom de ton propre objet TreeView !

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/05/2011, 19h36
  2. Problème d'ajout de noeud dans un treeview
    Par kince dans le forum SharePoint
    Réponses: 1
    Dernier message: 01/06/2007, 13h51
  3. Problème d'ajout de noeud dans un treeview
    Par kince dans le forum VB.NET
    Réponses: 1
    Dernier message: 31/05/2007, 18h57
  4. [VB]Déplacer un noeud dans un TreeView
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/11/2005, 18h27
  5. Pbs pour Glisser-Deplacer des noeuds dans un TreeView.
    Par psau dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/09/2004, 21h02

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