Les meilleures sources Access
Les meilleures sources AccessConsultez toutes les sources
Nombre d'auteurs : 44, nombre de sources : 147, création le 19 mars 2013
Versions : 2000 et supérieures
Pour fonctionner, ce code nécessite une référence Microsot ActiveX Data Object
Dim
WithEvents rsCli As
ADODB.Recordset
Dim
WithEvents rsEmp As
ADODB.Recordset
Dim
WithEvents rsCde As
ADODB.Recordset
Private
Sub
cmdUpdate_Click
(
)
'déclaration des variables
Dim
x As
Node
'Réaffectation des recordsets pour mise à jour
If
rsCli.State
=
adStateClosed
Then
rsCli.Open
"Clients"
, _
CurrentProject.Connection
, adOpenStatic
If
rsEmp.State
=
adStateClosed
Then
rsEmp.Open
"Employés"
, _
CurrentProject.Connection
, adOpenStatic
rsCli.Requery
: rsCli.MoveFirst
rsEmp.Requery
: rsEmp.MoveFirst
'Définition du treeview
ocxTree.Nodes.Clear
'--Clients
Set
x =
ocxTree.Nodes.Add
(
, , "c"
, "Clients"
, 1
)
x.ExpandedImage
=
2
Do
Until
rsCli.EOF
Set
x =
ocxTree.Nodes.Add
(
"c"
, tvwChild, "C-"
&
rsCli
(
0
), rsCli
(
1
) &
_
" ("
&
rsCli
(
2
) &
")"
, 1
)
rsCli.MoveNext
Loop
'--Employés
Set
x =
ocxTree.Nodes.Add
(
, , "e"
, "Employés"
, 1
)
x.ExpandedImage
=
2
Do
Until
rsEmp.EOF
Set
x =
ocxTree.Nodes.Add
(
"e"
, tvwChild, "E-"
&
rsEmp
(
0
), rsEmp
(
1
) &
_
" "
&
rsEmp
(
2
), 1
)
rsEmp.MoveNext
Loop
End
Sub
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'études 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
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 | Responsable Chauffage | 5 |
7 | VIAUD | Raymond | Technicien Chauffage | 6 |
8 | LOUIS | Remy | Technicien Chauffage | 6 |
9 | TERNIER | Sebastien | Responsable Bureau Etude | 5 |
10 | KOFFER | Fabien | Dessinateur | 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.
Ajouter la référence Microsoft DAO x.x Object Library
Code à placer dans un module :
'********************************************************************************
' 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
Code à placer sur l'évènement 'Sur Chargement' du formulaire contenant le treeview :
Private
Sub
Form_Load
(
)
Dim
odb As
DAO.Database
Set
odb =
CurrentDb
remplissageTreeView tvwEmploye, odb
End
Sub
Exemple d'une base Clients. Un formulaire principal et un sous formulaire.
Quand on ajoute une commande au client, pour qu'elle s'affiche dans le treeview :
Sur l'evenement AfterUpdate du sous formulaire :
Private
Sub
Form_AfterUpdate
(
)
Ajouter Parent.TreeView0
, Me.Code_client.Value
, "C"
&
Me.N
°_commande.Value
, Me.Date_commande.Value
End
Sub
Fonction d'ajout du noeud au treeview
' Ajoute la nouvelle commande au Treeview
Private
Sub
Ajouter
(
oTree As
Object, strParent As
String
, StrKey As
String
, strValue As
String
)
On
Error
GoTo
err
oTree.Nodes.Add
strParent, tvwChild, StrKey, strValue
oTree.Refresh
err
:
End
Sub
Exemple d'une base Clients. Un formulaire principal et un sous formulaire.
En cliquant sur un noeud, on filtre le formulaire principal qui affiche les clients.
Ce qui provoque (via la liaison champ pere / champ fils sur le n° Client),
pour la commande, l'affichage des commandes du client dans le sous formulaire
Private
Sub
TreeView0_NodeClick
(
ByVal
Node As
Object)
Dim
nodClient As
Node
If
Node.Parent
Is
Nothing
Then
Set
nodClient =
Node
Else
Set
nodClient =
Node.Parent
End
If
Me.RecordSource
=
"SELECT * FROM CLIENTS WHERE [Code Client]="
&
Chr
(
34
) &
nodClient.Key
&
Chr
(
34
)
End
Sub