Here's the MS-SQL view I came up with:
SELECT T1.irpCategory, T1.iwmleft, T1.iwmright, T1.swmCategoryName, T1.ircDepth, T2.ircParentID
FROM (SELECT TOP 100 PERCENT node.irpCategory, node.iwmleft, node.iwmright, node.swmCategoryName, (COUNT(parent.swmCategoryName) - 1)
AS ircDepth
FROM dbo.tblCategories AS node, dbo.tblCategories AS parent
WHERE node.iwmleft BETWEEN parent.iwmleft AND parent.iwmright
GROUP BY node.irpCategory, node.swmCategoryName, node.iwmleft, node.iwmright
ORDER BY node.iwmleft) T1 LEFT OUTER JOIN
(SELECT TOP 100 PERCENT irpCategory,
(SELECT TOP 1 irpCategory
FROM dbo.tblCategories t2
WHERE t2.iwmleft < t1.iwmleft AND t2.iwmright > t1.iwmright
ORDER BY t2.iwmright - t1.iwmright ASC) AS ircParentID
FROM dbo.tblCategories t1
ORDER BY iwmright - iwmleft DESC) T2 ON T1.irpCategory = T2.irpCategory
And the VB for the TreeCtrl object called tvCategories:
Private Sub Refresh_tvCategories()
On Error GoTo Err_Handler
Dim vNodeSet As Variant
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim bFirstItem As Boolean
Dim sFirstKey As String
Set db = CurrentDb
'SQLCategoriesList is a odbc passthru query to the view on the MSSQL server
Set rs = db.OpenRecordset("SELECT * FROM SQLCategoriesList")
bFirstItem = True
If Not rs.EOF Then
rs.MoveFirst
While Not rs.EOF
If IsNull(rs.Fields("ircParentID")) Then
Set vNodeSet = tvCategories.Nodes.Add()
vNodeSet.Key = "K" & rs.Fields("irpCategory")
vNodeSet.Expanded = False
vNodeSet.Text = rs.Fields("swmCategoryName")
Else
'Tree Controls need text for their IDs so I'm prefixing the ID numbers with the letter K
Set vNodeSet = tvCategories.Nodes.Add("K" & rs.Fields("ircParentID"), tvwChild)
vNodeSet.Key = "K" & rs.Fields("irpCategory")
vNodeSet.Expanded = False
vNodeSet.Text = rs.Fields("swmCategoryName")
End If
If bFirstItem Then
sFirstKey = vNodeSet.Key
bFirstItem = False
End If
rs.MoveNext
Wend
End If
'for some reason the form doesnt work properly unless an item has been selected at some point
tvCategories.Nodes(sFirstKey).Selected = True
'it can be unslected straight away
Exit_Err_Handler:
Exit Sub
Err_Handler:
Select Case Err.Number
Case vbObjectError + 1
Resume Next
Case Else
msgbox Err.Number & Err.Description
Resume Exit_Err_Handler
End Select
End Sub






0 comments:
Post a Comment