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
Sommaire→Formulaires→TreeviewsVersions : 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 SubFonction 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


