Søger du en specifik kategori?

 



Oprettet fre. d. 06. februar 2009 kl. 10:53

nih
nih (33.455 point)
Guidens karaktér
1
2
3
4
5

TreeView i Access I

Dette er en artikel om, hvordan man kan bruge et TreeView til at præsentere data fra en Access database med flere en til mange relationer. Mit eksempel er en database over telefonnumre i virksomheder med flere afdelinger
Rettelser:   

10/08 2004 - Original udgave
16/08 2004 - Uddybende forklaringer
18/08 2004 - Små rettelser med hjælp fra Mugs :)


Baggrund

Et TreeView kan præsentere data fra flere en til mange relationer på en overskuelig måde. Mange gange ses formulare med 3 eller flere indlejrede underformulare, hvilket kan virke uoverskueligt.

Løsningen er et TreeView, som er opbygget ligesom Windows Stifinder. Brugeren kan folde træet ind og ud ved at klikke på de enkelte elementer kaldet noder. TreeViewet, der findes i Access er desværre ikke dataafhængigt - vi skal selv sørge for at træet er opdateret med de rigtige data fra vores tabeller/forespørgsler.

Mit eksempel er lidt tænkt, men viser principperne for hvordan træet loades med de korrekte data. Mit eksempel skitserer et eller flere firmaer med hver flere afdelinger der igen har flere ansatte med en masse telefoner.

Vi starter med tabellerne:

TabelStruktur

Følgende tabeller oprettes

tFirma:     firmaId, FirmaNavn
tAfdeling:     afdId, firmaId, afdNavn
tMedarbejdere:     medArbId, afdId, medArbNavn
tTelfon:     tlfId, medArbId, tlfNr, art


Felterne siger sig selv på nær art, der kan anvendes til at angive om det er privat, mobil e.a.

Det er en fordel at reltionerne sættes rigtigt, ellers vil koden fejle når f.eks en tAnsat ikke er relateret til en tAfdeling.

Det vil være en god ide at indsætte nogle test data, så vi kan se resultatet af vores anstrengelser senere.

Formularen

Der oprettes en formular med:
-liste (Den almindelige fra værktøjskassen)
-et treeview værktøjslinje: værktøjskasse - flere kontrolementer - Micosoft treeView Control

De navngives i egenskabsarket med hhv. lstTlf og ctlTree

I lstTlf sættes 'AntalKolloner' = 4 og
'KolloneBredde = 0cm;3cm;2cm;3cm


Koden

Så kommer det sjove ;o)

Vi starter med at loade data ind i træet når formularen åbnes.

Først slettes noderne i træet - dvs. de data der måtte være slettes

Så åbner vi den første tabel som et recordset og løber alle posterne igennem

For hver post oprettes en rodNode med navnet på firmaet som text og firmaId som key. Firmaid'et sættes sammen med ordet "firma" så vi senere ved at noder med ordet "firma" i deres key kommer fra tabellen firma.

Derefter åbnes tabellen tAfdeling og på samme måde som gennemløbes tabellen og for hver post operttes en childNode. Anvendes afdNavnet som nodens text og afdId som key OG den relateres til den Node i træet der har en key med værdien "firma" & firmaId.


På formens VedIndlæsning lægges følgende kode ind:

Private Sub Form_Load()
    'Alle noder i træet fjernes
    ctlTree.Nodes.Clear

    Dim rs As New ADODB.Recordset

    ' åbner tabellen tFirma og tilføjer en rodNode for hver
    ' nodens key sættes = "firma" & firmaId for senere at
    ' bruge den når der vælges en node i træet samt lave
    ' child noder

    rs.Open "tfirma", CurrentProject.Connection
    Do While Not rs.EOF
        ctlTree.Nodes.Add , , "firma" & rs!FirmaId, rs!firmanavn
        rs.MoveNext
    Loop
    rs.Close

    ' vi fortsætter med at åbne medarbejdertabellen og
    ' tiføje en afdeling med reference til rodnodens
    ' key værdi = firma id

    rs.Open "tAfdeling", CurrentProject.Connection
    Do While Not rs.EOF
    ctlTree.Nodes.Add "firma" & rs!FirmaId, tvwChild, "afd" & rs!AfdID, rs!afdnavn
        rs.MoveNext
    Loop
    rs.Close

    rs.Open "tMedarbejdere", CurrentProject.Connection
    Do While Not rs.EOF
    ctlTree.Nodes.Add "afd" & rs!AfdID, tvwChild, "medArb" & rs!medArbId, rs!medArbNavn
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing

End Sub

Det var det nu tegnes træet rigtigt når formen åbnes :o)

Herefter skal listboxen fyldes med telefonnumre fra de firmaer, afdelinger eller ansatte brugeren klikker på.

treeWiets hændelse NodeClick kan anvendes til at finde ud af hvilken node vores bruger har klikket på (valgt).

Der oprettes en SQL sætning (evt cuttet fra forespørgsels designeren) som vi kan arbejde videre på.

Herefter tjekkes om nodens keyValue indeholder ordet firma, afd eller medarb.

Hvis f.eks key indeholder ordet "afd" så barberes de første 3 tegn væk of tilbage står afdId som sættes ind i SQL'en som en where del.

Så er det bare at opdatere lstboxen med den nye SQL


'Hændelsen node_Click indeholder den node der klikkes på
'vi trækker værdien key ud og opdatere listboxen

Private Sub ctlTree_NodeClick(ByVal Node As Object)

    'dynamisk foresp til lstboxen
   
        ssql = "SELECT tlfId, MedarbNavn, tlfArt, tlfNr  " & _
    "FROM (tAfdeling INNER JOIN tMedarbejdere ON tAfdeling.afdId = tMedarbejdere.afdId) INNER JOIN tTelfon ON tMedarbejdere.medarbId = tTelfon.medArbId "
   
    'Hvis key indeholder: "firma" & nr
    'ved jeg det er id fra tabellen tFirma.
    '"afd" & nr fra tAfdelng osv

    If InStr(Node.Key, "firma") Then
    ssql = ssql & "where firmaid = " & Mid(Node.Key, 6)
    ElseIf InStr(Node.Key, "afd") Then
    ssql = ssql & "where tAfdeling!afdId = " & Mid(Node.Key, 4)
    ElseIf InStr(Node.Key, "medArb") Then
    ssql = ssql & "where tMedarbejdere!medArbId = " & Mid(Node.Key, 7)
    Else
        ssql = ""
    End If

    'lstboxen opdateres:
    Me.lstTlf.RowSource = ssql
    Me.lstTlf.Requery
   
End Sub

Jeg håber koden er kommenteret godt nok og i kan bruge dette lille eksempel til noget.

Jeg vil i næste udgave vise hvorledes man med en rekursiv procedure kan bygge et træ vha. en tabel
tNode:NodeId, ParrentId, Navn

Niels

Konstruktive kommentare er velkomne
- så kan jeg forhåbentlig forbedre min skrive færdigheder.

Skrevet fre. d. 13. august 2004 kl. 22:01| #1


Skrevet man. d. 16. august 2004 kl. 23:28| #2

Godt eksempel, som jeg glæder mig til at afprøve. Jeg har aldrig fået taget tiden til at afprøve Treeview-objektet, selvom jeg sagtens kan se mange muligheder i det.
Dog kan jeg ikke lade være at bemærke, at du bruger CurrentProject.Connection flere gange i stedet for at erklære et connection-objekt, ligesom indrykninger vil fremme læsevenligheden.

Skrevet tir. d. 17. august 2004 kl. 21:23| #3

mugs (162.402 point)
Har længe haft kig på denne control, men ikke haft lejlighed til at sætte mig ind i den. Denne konstruktive og velformulerede artikel giver mig et velrettet spark i den rigtige retning. Vil anvende controllen til at styre medarbejderes placering i et hieraki med få afdelinger og mange underafdelinger

Skrevet tor. d. 19. august 2004 kl. 12:46| #4

-anders- (18.837 point)
Har selv længe haft lyst til at benytte denne control som "navigator", glimrende eks. og super godt forklaret, har nu fået mod på at prøve denne control. Keep up the work.
Anders.

Skrevet man. d. 18. oktober 2004 kl. 21:24| #5

markou (12.265 point)
Ligesom nedenstående kommentar, har jeg længe selv haft ønske om at benytte TreeView, men har aldrig fået det til at virke - det kan jeg nu ! Kanon artikel !

Skrevet man. d. 22. november 2004 kl. 15:30| #6

charlotterj (13.330 point)
God artikel

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
12 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger