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

Access Discussion :

[A97] Alimentation d'un Treeview, compréhension des noeuds


Sujet :

Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut [A97] Alimentation d'un Treeview, compréhension des noeuds
    Bonjour à tous,

    J'espère que vous ne m'en voudrez pas de créer un nouveau fil, mais le 1er étant devenu obsolète je pense que c'est la solution la plus simple.
    Je vous expose mon souci :
    J'aimerais faire un treeview basé sur une table "tblTreeview" comprenant 2 champs [ArticleFab], [ArticleComposant].
    Les enregistrements sont donc de ce type :
    ArticleFab______ArticleComposant
    1______________11
    1______________12
    1______________13
    12_____________121
    12_____________122
    2______________22
    2______________23
    22_____________221
    ...

    L'article de niveau 1 (père) est représenté en gras, niveau 2 en italique,...et je peux ainsi avoir x niveaux.

    Donc un [ArticleFab] peut aussi être [ArticleComposant] et inversement.
    Le Treeview devrait ressembler à cela :

    ¤ 1
    ___|
    ___->11
    ___->12
    ______|
    ______->121
    ______->122
    __->13

    ¤ 2
    ___|
    ___->22
    ______|
    ______->221
    ___->23

    Pour alimenter le 1er niveau j'utilise ce code que j'ai trouvé sur un forum anglophone :
    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
    Private Sub Form_Open(Cancel As Integer)
    Dim Tw As Access.Control
    Dim Rs As DAO.Recordset
     
      Set Tw = Me.twTreeView
      Set Rs = CurrentDb.OpenRecordset("SELECT DISTINCT tblTreeview1.ArticleFab FROM tblTreeview AS tblTreeview1 LEFT JOIN tblTreeview AS tblTreeview2 ON tblTreeview1.ArticleFab = tblTreeview2.ArticleComposant WHERE (((tblTreeview2.ArticleComposant) Is Null))", dbOpenSnapshot)
      With Tw.Object
        VBA.Err.Clear
        While Not Rs.EOF
          .Nodes.Add , , "f" & Rs.Fields(0).Value, Rs.Fields(0).Value
          Rs.MoveNext
        Wend
        Rs.Close: Set Rs = Nothing
      End With
    End Sub
    Là il n'y a pas de pb même si je ne comprends pas vraiement la ligne du .Nodes, -> si quelqu'un veut me la déchiffrer je suis preneur ;-)

    Ma question est pour la suite je ne sait comment faire pour alimenter les niveaux 2, 3, 4,...

    Merci d'avance à tous.
    @+

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Et les pages sources ? On donne un exemple de treeview

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par Tofalu
    Et les pages sources ? On donne un exemple de treeview
    je sais bien tofalu ;-)

    mais alors soit je suis vraiement nul et j'ai rien compris soit il manque des commentaires pour que l'apprenti qui a du mal puisse comprendre ;-)

    je veux bien également le détail des paramètres derrière le .Nodes.Add pq là je patauge...

    Merciii

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 261
    Points : 19 424
    Points
    19 424
    Billets dans le blog
    63
    Par défaut
    Salut,

    J'ai essayé d'adapter le code de Tofalu à tes besoins (chez moi ca marche),
    par curiosité je me suis crée une table comme la tienne et j'ai ajouter un treeview sur ma form, voici la procedure de remplissage du treeview:

    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
     
     
     
    Public Sub Remplir_treeview(tree As Object, Article_Fab As Long)
    Dim sql As String
    Dim rs As DAO.recordset
    Dim Art_Fab As Long
     
       If Article_Fab = 0 Then ' premier niveau
       sql = "select DISTINCT ArticleFab from tblTreeview where [ArticleFab] Not In (select ArticleComposant from  tblTreeview;)" & _
             " order by ArticleFab ;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
     
       Do Until rs.EOF
       tree.Nodes.Add , , "f" & rs!ArticleFab, rs!ArticleFab
       tree.Nodes("f" & rs!ArticleFab).EnsureVisible
     
       Remplir_treeview tree, rs!ArticleFab
       rs.MoveNext
       Loop
     
     
       Else
       sql = "select * from tblTreeview where [ArticleFab]=" & Article_Fab & _
          " order by ArticleComposant;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
     
       Do Until rs.EOF
       tree.Nodes.Add "f" & Article_Fab, tvwChild, "f" & rs!ArticleComposant, rs!ArticleComposant
       tree.Nodes("f" & rs!ArticleComposant).EnsureVisible
     
       Remplir_treeview tree, rs!ArticleComposant
       rs.MoveNext
       Loop
     
       End If
     
     
    rs.Close: Set rs = Nothing
     
    End Sub

    et sur ouverture de ton form le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Tw As Access.Control
    Set Tw = Me.TreeView1
    Remplir_treeview Tw.Object, 0


    voila j'espère que ca répondra à ton problème,

    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par Tofalu
    merci Tofalu pour la source supplémentaire que tu viens de rajouter :-)



    Merci User pour le code c'est parfait ainsi, je vais maintenant m'atteler à bien le comprendre...

    Par contre il y a un cas qui ne fonctionne pas auxquels je n'avais pas pensé dans un 1er temps : un élément de niveau 2, 3, ou autre peut se trouver dans plusieurs noeuds (ex en rajoutant l'enregistrement 2 11, 11 ayant alors pour père 1 et 2 ).
    Nous tombons alors en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Key is not Unique in collection
    et là mystère pour contourner cette possibilité...

    Merci encore bcp...
    Bon réveil...
    @+...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut
    Bonjour tout le monde !!!

    Voici le code résultant de User Tofalu pour alimenter le treeview...
    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
    Option Compare Database
    Option Explicit
     
    Public Sub FillTreeview(tree As Object, Article_Fab As Long, ArticleId As String)
    Dim sql As String
    Dim rs As DAO.Recordset
     
       If ArticleId = "" Then ' premier niveau
       sql = "select DISTINCT ArticleFab from tblTreeview where [ArticleFab] Not In (select ArticleComposant from  tblTreeview;)" & _
             " order by ArticleFab ;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
     
       Do Until rs.EOF
       tree.Nodes.Add , , "f" & rs!ArticleFab, rs!ArticleFab
     
        FillTreeview tree, rs!ArticleFab, rs!ArticleFab
       rs.MoveNext
       Loop
     
       Else
       sql = "select DISTINCT * from tblTreeview where [ArticleFab]=" & Article_Fab & _
          " order by ArticleComposant;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
     
       Do Until rs.EOF
       tree.Nodes.Add "f" & ArticleId, tvwChild, "f" & ArticleId & rs!ArticleComposant, rs!ArticleComposant
     
       FillTreeview tree, rs!ArticleComposant, ArticleId & rs!ArticleComposant
       rs.MoveNext
       Loop
     
       End If
     
    rs.Close: Set rs = Nothing
     
    End Sub
     
     
    Private Sub Form_Open(Cancel As Integer)
    Dim Tw As Access.Control
    Set Tw = Me.twTreeView
    FillTreeview Tw.Object, 0, ""
    End Sub
    Il reste cependant 2 interrogations suite à ça ;-)
    1) je parcours 4000 lignes environ donc il met quelques 40/45sec à s'ouvrir, ne peut-on pas l'optimiser en terme de rapidité ? Je suis basé sur une seule table.
    2) plutôt que d'avoir une série de chiffres, j'ai la correspondance avec des références textuel que j'ai inséré dans la table tblTreeview en [FabDescription] & [ComposantDescription]. Je suppose qu'il est préférable de garder les numérique pour construire le treeview, mais comment faire apparaitre ces données présentes dans ces 2 champs ald des valeurs numérique ?

    Merci à tous...

    P.S. une fois le fil résolu je le mettrais "au propre" en contribution grâce à vous tous :-)

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 261
    Points : 19 424
    Points
    19 424
    Billets dans le blog
    63
    Par défaut
    Salut,

    pour optimiser le code je n'ai pour le moment pas trouvé de solution,

    pour ce qui est du champs description j'ai modifié le 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
    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
    Public Sub Remplir_treeview(tree As Object, Optional Article_Fab As Long = 0, Optional Key As String = "")
    Dim sql As String
    Dim rs As DAO.recordset
    Dim Art_Fab As Long
    
       If Article_Fab = 0 Then
       sql = "select * from tblTreeview where [ArticleFab] Not In (select ArticleComposant from  tblTreeview;)" & _
             " order by ArticleFab, ArticleComposant ;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
                      
       Do Until rs.EOF
       
       tree.Nodes.Add , , "f" & rs!ArticleFab, rs!FabDescription & rs!ComposantDescription
       Art_Fab = rs!ArticleFab
          
          Do While (Art_Fab = rs!ArticleFab)
          tree.Nodes.Add "f" & Art_Fab, tvwChild, "f" & Art_Fab & "-" & rs!ArticleComposant, rs!FabDescription & rs!ComposantDescription
          Remplir_treeview tree, rs!ArticleComposant, Art_Fab & "-" & rs!ArticleComposant
          rs.MoveNext
          
             If rs.EOF Then
             Exit Do
             End If
          
          Loop
       
       Loop
          
       Else
       sql = "select * from tblTreeview where [ArticleFab]=" & Article_Fab & _
          " order by ArticleComposant;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
          
       Do Until rs.EOF
       tree.Nodes.Add "f" & Key, tvwChild, "f" & Key & "-" & rs!ArticleComposant, rs!FabDescription & rs!ComposantDescription
       
       Remplir_treeview tree, rs!ArticleComposant, Key & "-" & rs!ArticleComposant
       rs.MoveNext
       Loop
    
       End If
    
       
    rs.Close: Set rs = Nothing
             
    End Sub 
    
    
    Private Sub Form_Open(Cancel As Integer)
    Dim Tw As Access.Control
    Set Tw = Me.twTreeView
    FillTreeview Tw.Object
    End Sub

    Remarque importante:

    personnellement plutot que:
    rs!FabDescription & rs!ComposantDescription

    j'aurai plutot vu 1 seul champ description:
    rs!Description



    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 261
    Points : 19 424
    Points
    19 424
    Billets dans le blog
    63
    Par défaut
    Salut,

    Pour info, concernant la lenteur du code cela vient du fait que la requête source du recordSet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sql = "select * from tblTreeview where [ArticleFab]=" & Article_Fab & _
          " order by ArticleComposant;"
       Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)
     
    entre autre

    est éxécuté près de 3000 fois et qu'elle porte sur environ 3500 enregistrement ...


    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut
    Salut,

    J'ai remplacé la 1ère par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT tblTreeview1.ArticleFab FROM tblTreeview tblTreeview1 _
    LEFT OUTER JOIN tblTreeview tblTreeview2 ON tblTreeview1.ArticleFab = tblTreeview2.ArticleComposant _
    WHERE tblTreeview2.ArticleComposant IS NULL;
    qui me fait déjà gagné une dizaine de secondes ;-)

    Par contre je vois pas encore pour la 2ème...

    @+

Discussions similaires

  1. Réponses: 20
    Dernier message: 05/03/2009, 02h46
  2. treeview - Ordre des Noeuds et BDD
    Par Elwe31 dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/03/2008, 10h25
  3. Treeview : memoriser l'etat des noeuds d'un treeview
    Par tuxor dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/04/2006, 04h28
  4. [c#] comment faire pour garder des noeuds ouverts treeview?
    Par irnbru dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/11/2005, 00h47
  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