【问题标题】:Create hierarchy from recordset从记录集创建层次结构
【发布时间】:2019-12-28 11:03:48
【问题描述】:

我有以下问题: 我必须对具有层次结构的记录集的数据进行排序。

这是来自数据库的数据。

您会看到有两列,POS 和 PARENT。 这些值必须相互关联。 如果 PARENT 为 0,那么新排序中的值只是获得一个连续的数字。在这种情况下 1-3。

其他值每个都得到一个新的连续数字,基于父级。

我很确定我可以在 C# 中解决这个问题,但在这种情况下,VB6 是强制性的。不幸的是,我在用 VB6 解决问题时遇到了极大的问题。

【问题讨论】:

    标签: list vb6 hierarchy adodb recordset


    【解决方案1】:

    这看起来像一个链表练习。您可以创建一个具有 FirstChild 对象和 NextItem 对象的 clsListItem 类:

    Public Position As Integer
    Public Hierarchy As String
    Public FirstChild As clsListItem
    Public NextItem As clsListItem
    

    当您沿着列表向下移动时,您会创建一个新对象并查找其父对象。然后检查父级的 FirstChild 是否存在。如果不是,则将该对象设置为 FirstChild,否则使用 NextItem 在子对象中导航,直到 NextItem 为 Nothing。然后将对象设置为 NextItem:

    Public Sub Sort(ByVal p_sList As String)
        Dim arrLines
        Dim arrFields
        Dim iCounter As Integer
        Dim objItem As clsListItem
        Dim objParent As clsListItem
        Dim objChild As clsListItem
        Dim iPosition As Integer
        Dim iParent As Integer
        Dim iParentIndex As Integer
        Dim iChildIndex As Integer
    
        ' Split values into lines
        arrLines = Split(p_sList, vbCrLf)
    
        ' Initialize Parent Index
        iParentIndex = 1
    
        For iCounter = 1 To UBound(arrLines) + 1
    
            arrFields = Split(arrLines(iCounter - 1), ",")
    
            iPosition = arrFields(0)
            iParent = arrFields(1)
    
            ' Get Item
            Set objItem = GetItem(iPosition)
    
            If iParent = 0 Then
    
                ' This is a top-level item
                objItem.Hierarchy = iParentIndex
                iParentIndex = iParentIndex + 1
    
            Else
    
                ' Get Parent
                Set objParent = GetItem(iParent)
    
                ' Initialize Child Index
                iChildIndex = 1
    
                If objParent.FirstChild Is Nothing Then
                    ' We are the first child
                    Set objParent.FirstChild = objItem
                Else
    
                    ' Find last child
                    Set objChild = objParent.FirstChild
                    iChildIndex = iChildIndex + 1
    
                    Do While Not objChild.NextItem Is Nothing
                        Set objChild = objChild.NextItem
                        iChildIndex = iChildIndex + 1
                    Loop
    
                    Set objChild.NextItem = objItem
    
                End If
    
                objItem.Hierarchy = objParent.Hierarchy & "." & iChildIndex
    
            End If
    
        Next
    
        Dim sMessage As String
    
        For iCounter = 1 To colListItems.Count
            Set objItem = colListItems.item(iCounter)
            With objItem
                sMessage = sMessage & .Position & ": " & .Hierarchy & vbCrLf
            End With
        Next
    
        MsgBox sMessage
    
    End Sub
    

    这应该将所有数据组织到具有所需层次结构的对象中。

    获取/创建项目的辅助函数:

    Public Function GetItem(ByVal p_iPosition As Integer) As clsListItem
        Dim objItem As clsListItem
    
        On Error GoTo ItemNotFound
    
        Set objItem = colListItems.item("P" & p_iPosition)
    
        GoTo ReturnItem
    
    ItemNotFound:
    
        Set objItem = New clsListItem
        objItem.Position = p_iPosition
    
        colListItems.Add objItem, "P" & p_iPosition
    
    ReturnItem:
        Set GetItem = objItem
    End Function
    

    最后,我用来创建您拥有的值表的代码(仔细检查,可能是错字):

    Private Function AddPair(ByVal p_sList As String, ByVal p_iPos As Integer, ByVal p_iParent As Integer) As String
        Dim sReturn As String
    
        sReturn = p_sList
    
        If sReturn <> "" Then sReturn = sReturn & vbCrLf
    
        sReturn = sReturn & p_iPos & "," & p_iParent
    
        AddPair = sReturn
    
    
    End Function
    

    这是主要的子程序:

    Private Sub Form_Load()
        Dim list As String
    
        list = AddPair(list, 1, 0)
        list = AddPair(list, 13, 0)
        list = AddPair(list, 16, 0)
        list = AddPair(list, 2, 1)
        list = AddPair(list, 12, 1)
        list = AddPair(list, 3, 2)
        list = AddPair(list, 4, 2)
        list = AddPair(list, 5, 2)
        list = AddPair(list, 6, 2)
        list = AddPair(list, 7, 2)
        list = AddPair(list, 8, 7)
        list = AddPair(list, 11, 7)
        list = AddPair(list, 9, 8)
        list = AddPair(list, 10, 8)
        list = AddPair(list, 14, 13)
        list = AddPair(list, 15, 13)
        list = AddPair(list, 17, 16)
        list = AddPair(list, 18, 16)
    
        Sort (list)
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2013-06-07
      • 1970-01-01
      • 2017-09-20
      • 2019-09-13
      • 2017-04-18
      相关资源
      最近更新 更多