在数据表中重新编号工作分解结构(WBS)

时间:2019-06-19 18:55:32

标签: vb.net datatable iteration

一个多级WBS,用户可以删除一些不适用于其项目的任务。目标是对整个WBS重新编号,以便不跳过任何编号。示例:1.1.1、1.1.2、1.1.4-删除了编号1.1.3。每个WBS元素可能具有也可能不具有需要重新编号的子元素。 我在数据表中有数据,这些字段包括:WBS_ID,WBSNo,ParentID,ParentNo,SortKey(原始WBS编号)和注释。 WBS_ID是UID,ParentID是父WBS元素的WBS_ID。 WBS的第一个元素的ParentID字段为空值。

我似乎无法掌握如何进行迭代函数调用以创建WBS编号。

Dim dTb As New DataTable
    Using Conn
        Conn.Open()
        Using dad As New SqlClient.SqlDataAdapter(vSqlStr, Conn)
            dad.SelectCommand.Parameters.Add("@ProjectID", SqlDbType.Int)
            dad.SelectCommand.Parameters.Add("@Revision", SqlDbType.Int)
            dad.SelectCommand.Parameters("@ProjectID").Value = vProjectID
            dad.SelectCommand.Parameters("@Revision").Value = vRevision
            dad.Fill(dTb) 'Now we have a table with all the elements .
        End Using
        Conn.Close()
    End Using
    'Now work with the datatable
    'WBS_ID, WBSNo, WBSLevel, ParentID, ParentNo, SortKey, Notes
    dTb.DefaultView.Sort = "SortKey ASC"
    dTb = dTb.DefaultView.ToTable
    Dim vRowCount As Int16
    vRowCount = dTb.Rows.Count
    Dim vCurRow As Int16 = 0
    For x = 0 To vRowCount - 1
        If Not IsDBNull(dTb.Rows(x)("ParentID")) Then

        Else
            dTb.Rows(x)("WBSNo") = "1"
        End If
        dTb.Rows(x)("Notes") = dTb.Rows(x)("Notes") & vbCrLf & "<<< Old WBS No. = " & dTb.Rows(x)("SortKey")
    Next

为WBS重新编号,从“ 1”开始,元素的每个子代都将以父代号加上句点(。)进行编号,然后从1开始依次进行;每个孩子都可以有孩子。

1 个答案:

答案 0 :(得分:0)

我编写了一个递归子例程来更新数据表,然后编写了另一个例程来更新数据库。

Sub RenumberChildren(vParentID As Int16, vParentWBSNo As String)
    Dim ChildCount As Int16 = 0
    For x = 0 To dTb.Rows.Count - 1

        If Not IsDBNull(dTb.Rows(x)("ParentID")) Then
            If dTb.Rows(x)("ParentID") = vParentID Then
                ChildCount += 1
                dTb.Rows(x)("WBSNo") = vParentWBSNo & "." & ChildCount
                RenumberChildren(dTb.Rows(x)("WBS_ID"), dTb.Rows(x)("WBSNo"))
            End If
        End If
    Next


End Sub