[AccessD] Treeview control

Roz Clarke roz.clarke at donnslaw.co.uk
Wed Apr 30 03:12:37 CDT 2003


Many, many thanks for your suggestions everyone. Lots to try out & learn!

-----Original Message-----
From: Michael Maddison [mailto:michael.maddison at ddisolutions.com.au] 
Sent: 30 April 2003 05:09
To: accessd at databaseadvisors.com
Subject: RE: [AccessD] Treeview control


Hi Roz,

Further to the other suggestions may I suggest that you have a look at using
the MSDataShape provider to return a heirachical recordset. It allows you to
return the child recordsets at the same time.  This means that you no longer
have to loop through what can be a quite large rslevel2 recordset and can
speed up the process by a significant amount...

Quick example...

'Open a connection
    sConnect = "Data Source = " & sFileName & "; " & _
                "Provider = MSDataShape; " & _
                "Data Provider = Microsoft.Jet.OLEDB.4.0; "

   Set cnn = New ADODB.Connection
   cnn.CursorLocation = adUseClient
   cnn.ConnectionString = sConnect
   cnn.Open
   
   Set rsLevel1 = New ADODB.Recordset
   rsLevel1 .CursorLocation = adUseClient
   rsLevel1 .CursorType = adOpenStatic

strSQL = "SHAPE {SELECT Forest.Forest FROM Forest GROUP BY Forest.Forest
ORDER BY Forest.Forest}" _ & " APPEND ((SHAPE {SELECT Base.Compartment,
Forest.Forest  FROM (Base INNER JOIN Forest ON Base.ForestKey =
Forest.ForestKey) INNER JOIN Patch ON Base.BaseKey = Patch.BaseKey GROUP BY
Forest.Forest, Base.Compartment ORDER BY Base.Compartment})) AS Comp RELATE
Forest  to Forest)" 

'What is happening here is we have a parent query that returns all the
Forests.  We then append all the compartments in each forest 'joined on the
Forest key using the RELATE command. 'When we open the rsLevel1 rs for each
row if there are child records, the last field (in this instance called
Comp) will contain 'another recordset that will contain those child records.

   rsLevel1 .Open strSQL, cnn, , , adCmdText

  If not rsLevel1.eof Then
	Do while not rsLevel1.eof
	    'Add the parent node	    
	    Set nodX = Me.trv.Nodes.Add(rsLevel1.Fields("Forest").Value,
tvwChild, rsLevel1.Fields("Forest"), UCase(rsLevel1![Forest]), 49, 53)
		'Retrieve the child recordset
		Set rsLevel2 = rsLevel1.Fields("Comp").Value
		Do while not rsLevel2.eof
			Set nodX =
Me.trv.Nodes.Add(rsLevel2.Fields("Forest").Value, tvwChild, x &
rsLevel2.Fields("Compartment"), UCase(rsLevel2![Compartment]), 48, 52)
		rsLevel2.movenext
		Loop
	    rsLevel1.movenext
	loop
   End if


		
I hope you find this usefull.  I've used this technique to build a treeview
up to 5 levels deep and it works very well.

cheers

Michael M



I may be WAY off on this, but whenever I use a treeview, I assign my own
key, and text, with the .Add function.  It doesn't look like you are
assigning keys.

Drew
-----Original Message-----
From: Roz Clarke [mailto:roz.clarke at donnslaw.co.uk]
Sent: Tuesday, April 29, 2003 9:47 AM
To: 'accessd at databaseadvisors.com'
Subject: [AccessD] Treeview control


Hi all 
I've been playing with the treeview control (v6) for the first time today.
I've worked my way through an MS tutorial, adapting it to suit my purposes.
Can anyone help explain why the following code, which should give me 2
levels on the tree, only gives me the 1st level? None of the child nodes
appear. Private Sub Form_Open(Cancel As Integer) 
Dim db As Database 
Set db = CurrentDb 
Dim nd As Node 
Dim cnn As New ADODB.Connection 
Set cnn = CurrentProject.Connection 
Dim rsLevel1 As New ADODB.Recordset 
rsLevel1.Open "qryTopLevelTasks", cnn, adOpenKeyset, adLockOptimistic 
Dim rsLevel2 As New ADODB.Recordset 
rsLevel2.Open "qry2ndLevelTasks", cnn, adOpenKeyset, adLockOptimistic 
Dim intIndex As Integer 
rsLevel1.MoveFirst 
'add all the top level nodes (tasks with no child records) 
Do Until rsLevel1.EOF = True 
        Set nd = Treeview.Nodes.Add() 
        nd.Text = rsLevel1!tsk_Description 
        intIndex = nd.Index 
        'add all the 2nd level nodes matching this as parent task 
        Do Until rsLevel2.EOF = True 
            If rsLevel2!tsk_ParentTaskID = rsLevel1!tsk_TaskID Then 
                Set nd = Treeview.Nodes.Add(intIndex, tvwChild) 
                nd.Text = rsLevel2!tsk_Description 
            End If 
            rsLevel2.MoveNext 
        Loop      
        rsLevel1.MoveNext 
Loop 
End Sub 
Stepping through the code, the indices match between the parent and child
records and no error comes up. 
TIA 
Roz 
_______________________________________________
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com


More information about the AccessD mailing list