一个多级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开始依次进行;每个孩子都可以有孩子。
答案 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