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