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