Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Contribuez
Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/07/2006, 19h46   #1
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Par défaut Exemple de remplissage de treeview

Contexte : Application de gestion de personnel. Le directeur souhaite pouvoir consulter la hiérarchie directe entre ses employés :

Exemple :

Le dessinateur dépend du responsable du bureau d’étude qui lui-même dépend du responsable technique qui dépend du directeur général.

Spécificité : Chaque employé est sous les ordres d’un seul et unique chef. Le TreeView ne permet pas de gérer les héritages multiples.

Structure :

Une seule table : tblEmploye(NumEmploye,NomEmploye,PrenomEmploye,RoleEmploye,ResponsableEmploye#)

ResponsableEmploye correspond au numéro de l’employé qui le dirige. Il s’agit donc d’une clé étrangère.

Jeu d’essai :

tblEmploye
Citation:
NumEmploye NomEmploye PrenomEmploye RoleEmploye ResponsableEmploye
1 MARTIN Paul Secrétaire Commerciale 3
2 DUPONT Marthe Commerciale 3
3 JEAN Lucie Responsable Commerciale 4
4 ETIENNE Dominique Directeur Général 0
5 RENNE Stephanie Responsable technique 4
6 LUCY Marc ResponsableChauffage 5
7 VIAUD Raymond Technicien Chauffage 6
8 LOUIS Remy Technicien Chauffage 6
9 TERNIER Sebastien Responsable Bureau Etude 5
10 KOFFER Fabier Dessisnateur 9
Principe : Parcourir la liste des employés pour remplir le treeview. Ce parcours est dit récursif :


On commence à l’empoyé qui n’a pas de responsable, puis ceux sous ses ordres, etc.

Dans un module :

Code :
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
Option Compare Database
Option Explicit
 
 
 
'********************************************************************************
'     Procédure de remplissage de Treeview
'
'       @oT : Controle Treeview qui affichera les données
'       @oDb : Objet database.
'       @intEmploye : Numéro de l'emloyé responsable
'
'********************************************************************************
 
Public Sub remplissageTreeView(oT As Object, odb As DAO.Database, Optional intEmploye As Integer = 0)
Dim strSQL As String
Dim oRst As DAO.Recordset
Dim strLibelle As String
strSQL = "SELECT NumEmploye,NomEmploye,PrenomEmploye,RoleEmploye FROM tblemploye WHERE Responsableemploye=" & intEmploye
Set oRst = odb.OpenRecordset(strSQL)
With oRst
    While Not .EOF
        'Récupère le nom, le prénom et le role
        strLibelle = .Fields(1).Value & " " & .Fields(2).Value & " (" & .Fields(3).Value & ")"
        'Test le cas de la racine
        If intEmploye = 0 Then
            oT.Nodes.Add Key:="Emp" & .Fields(0).Value, _
                 Text:=strLibelle
        Else
            oT.Nodes.Add "Emp" & intEmploye, tvwChild, "Emp" & .Fields(0).Value, strLibelle
        End If
        'Lance le même traitement avec ce responsable
        remplissageTreeView oT, odb, .Fields(0).Value
        'Passe à l'enregistrement suivant
        .MoveNext
    Wend
End With
'Ferme le recordset
oRst.Close: Set oRst = Nothing
End Sub

Le code qui déclenchera cette procédure sera écrit dans l’événement Load du formulaire contenant le TreeView :

Citation:
Private Sub Form_Load()
Dim odb As DAO.Database
Set odb = CurrentDb
remplissageTreeView tvwEmploye, odb
End Sub
Vous remarquerez que pour que ce code fonctionne vous devez ajouter la référence Microsoft Data Access Object Library à votre projet.
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 09h35   #2
Membre habitué
 
Inscription : septembre 2005
Messages : 310
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : septembre 2005
Messages : 310
Points : 104
Points : 104
'jour Tofalu, 'jour tout le monde,

Merci pour cette source qui, je pense, pourra en aider plus d'un :-)

Tu nous indque ne permet pas de gérer les héritages multiples, c'est fou ça il n'y a vraiement aucun moyen de le faire ?

Car comment ferais-tu alors, dans le cas d'un employé ayant 2 responsables directs, pour visualiser l'ensemble des employés d'un responsable sachant qu'une personne peut apparaitre sous un voir plusieurs responsables ?
Autre exemple : j'ai une société qui commercialise des caisses à outils et donc je souhaite recenser tous les modèles de caisses avec les outils standards (clés, pinces,...) vendus avec la caisse. Un même type d'outils peut donc apparaitre dans plusieurs caisses, comment faire ?

Dans ces cas là on tombe à chaque fois en "Key is not unique in collection".

C'est là que l'on va voir jusqu'où la folie d'access (dans le bon sens du terme ;-) peut nous emmener.

Merci d'avance pour les réponses à ces questions ;-)
@+
JeremieT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 11h46   #3
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Tu as mal compris.

On ne peut pas représenter un fils déscendant de deux parents directement. Par contre on peut créer un fils décendant du pere et un fils (le même) descendant de la mère. Par contre, tu ne pourras pas avoir un arbre : un héritage multiple

Pour cette histoire de clé, il suffit d'avoir une clé composite : Parent & Enfant
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 12h22   #4
Membre habitué
 
Inscription : septembre 2005
Messages : 310
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : septembre 2005
Messages : 310
Points : 104
Points : 104
Donc finalement, je peux avoir un arbre avec cette situation si je crée une clé composite ? ou alors je n'ai toujours rien compris lol !!!
JeremieT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 14h06   #5
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Ce ne sera pas un arbre, puisqu'un même noeud (géographiquement parlant) ne pourra pas déscendre de deux branches.

Par contre une donnée sera illustrée par deux noeuds distincts descendant chacun d'une branche différente. Le plus simple pour montrer que l'on ne peux pas avoir d'arbre est d'en dessiner un sur une feuille. Tu t'apercevra alors que ça ne correspond pas à l'aspect graphique du treeview
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 15h24   #6
Membre habitué
 
Inscription : septembre 2005
Messages : 310
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : septembre 2005
Messages : 310
Points : 104
Points : 104
Effectivement, j'ai bien compris le principe.
Donc l'idée serait de créer un 3ème champ dans la table, par exemple, qui contiendrait la concatenation des 2 autres champs ?

Si je prends un exemple basique avec des valeurs numérique :
-> un arbre (frmTreeview.JPG)
->basé sur cette table (tblTreeview.jpg)
->à l'aide de ce code (venant de developpez.com bien sur ;-))
Code :
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
Option Compare Database
Option Explicit
 
Public Sub RemplirTreeview(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 tblTreeview1.ArticleFab FROM tblTreeview AS tblTreeview1 LEFT JOIN tblTreeview AS tblTreeview2 ON tblTreeview1.ArticleFab = tblTreeview2.ArticleComposant WHERE (((tblTreeview2.ArticleComposant) Is Null))"
   Set Rs = CurrentDb.OpenRecordset(Sql, dbOpenSnapshot)
 
   Do Until Rs.EOF
   Tree.Nodes.Add , , "f" & Rs!ArticleFab, Rs!ArticleFab
   Tree.Nodes("f" & Rs!ArticleFab).EnsureVisible
 
   RemplirTreeview 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
 
   RemplirTreeview Tree, 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
RemplirTreeview Tw.Object, 0
End Sub
En voulant ajouter un enregistrement 1/22, j'ai le pb de noeud, je crée donc un 3ème champ dans la table (tblTreeviewAfter.jpg) qui est la concaténation des 2 autres.
Que dois-je changer dans le code, c'est là que j'ai du mal !!! Je me pencherais bien sur
Code :
   Tree.Nodes.Add "f" & Article_Fab, tvwChild, "f" & Rs!ArticleComposant, Rs!ArticleComposant
mais je suis pas sur !

Merci d'avance...
JeremieT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 17h17   #7
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 255
Points : 5 255
Resalut,

une petite question:

si tu ajoute l'enregistrement: 2 12, 12 étant le père de 121,122 on aura alors:

les branches:

1-12-121
1-12-122

mais aussi

2-12-121
2-12-122


dans ce cas si tu prend (ArticleFab,ArticleComposant) comme clé tu aura 2 fois 12-121 et 2 fois 12-122 comme clé dans ton arbre et donc 1 message d'erreur !

Dans ce cas il faut concaténer tous les noeuds depuis la racine pour avoir une clé unique.

Peux-tu préciser ?

@+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 17h36   #8
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
La clé de 12 n'est pas 2 mais :

1-12 et 2-12

La clé composite de 121 n'est pas 12-121 mais 1-12-121 et 2-12-121.

Mais bon aprés, on peut s'arranger comme on veut. Par exemple un id unique (génération incrémentale) suivie de la clé de l'enregistrement (et non du noeud)
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 17h42   #9
Membre habitué
 
Inscription : septembre 2005
Messages : 310
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : septembre 2005
Messages : 310
Points : 104
Points : 104
-> User mon problème est bien là, il va falloir que je concatene pour éviter les message d'erreur mais je ne sais pas comment ensuite alimenter le treeview avec ces id unique...!

-> Tofalu je pense avoir compris le principe mais derrière comment j'alimente le treeview ? :-)

Merci
JeremieT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2006, 17h51   #10
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 255
Points : 5 255
pour concatener dans ta sub tu peux essayer ca:

Code :
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
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
 
   If Key = "" 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!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" & Key, tvwChild, "f" & Key & "-" & rs!ArticleComposant, rs!ArticleComposant
   tree.Nodes("f" & Key & "-" & rs!ArticleComposant).EnsureVisible
 
   Remplir_treeview tree, rs!ArticleComposant, Key & "-" & rs!ArticleComposant
   rs.MoveNext
   Loop
 
   End If
 
 
rs.Close: Set rs = Nothing
 
End Sub

et sur open de ton form:

Code :
1
2
3
4
 
Dim Tw As Access.Control
Set Tw = Me.TreeView1
Remplir_treeview Tw.Object
@+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2006, 09h49   #11
Membre habitué
 
Inscription : septembre 2005
Messages : 310
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : septembre 2005
Messages : 310
Points : 104
Points : 104
Merci User...

Vous trouverez en pj une image du treeview ;-).
Cependant il me reste 3 tites questions :
1) pourquoi le treeview est-il "dérouléé à l'ouverture, comment faire pour réduire toutes les branches ?
2) 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 table ?
3) 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 encore énormément à tous pour votre aide...
@+

Code :
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
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
   tree.Nodes("f" & rs!ArticleFab).EnsureVisible
 
    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
   tree.Nodes("f" & ArticleId & rs!ArticleComposant).EnsureVisible
 
   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
JeremieT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2006, 14h16   #12
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 255
Points : 5 255
Salut,

pour le 1),

il faut supprimer dans le code les commandes:

tree.Nodes("f" & rs!ArticleFab).EnsureVisible

et

tree.Nodes("f" & ArticleId & rs!ArticleComposant).EnsureVisible

2):Je verrai d'ici ce soir si je peux l'optimiser..
(Essaie de comprendre le code, ca peut t'aider à y voir plus clair, il y a juste la recherche des racines dans la table qui est différent du code de Tofalu)

3) Ca aussi pour le moment je n'ai pas le temps..mais j'y reviens..

@+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2006, 14h22   #13
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Attention, ce forum est réservé aux contributions. Pas aux questions relatives à ton projet. Merci d'enrichir ton topic prinicpal pour toute question
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2006, 16h09   #14
Membre habitué
 
Inscription : septembre 2005
Messages : 310
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : septembre 2005
Messages : 310
Points : 104
Points : 104
-> User, merci pour ton aide, il est vrai que j'ai du mal avec ce code, mais je n'ai ni aide, ni assisstant et sous 97 sur le pc où je suis donc c'est bancale ;-)

-> Tofalu j'avoue que là il aurait été préférable de revenir sur l'autre fil, j'ai complètement zappé c'est ma faute J'essai de faire un bilan de l'avancement sur l'autre fil et je le réactiverai ainsi.

Merciiiiiiiiiii
JeremieT est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h58.


 
 
 
 
Partenaires

Hébergement Web