Изменение нумерации структуры работ (WBS) в таблице данных - PullRequest
0 голосов
/ 19 июня 2019

Многоуровневая СПП пользователи смогли удалить некоторые задачи, которые не применимы к их проекту.Цель состоит в том, чтобы изменить нумерацию всей WBS, чтобы не пропустить ни одного номера.Пример: 1.1.1, 1.1.2, 1.1.4 - номер 1.1.3 был удален.Каждый СПП-элемент может иметь или не иметь дочерние элементы, которые также должны быть перенумерованы.У меня есть данные в виде данных, поля: WBS_ID, WBSNo, ParentID, ParentNo, SortKey (исходный номер WBS) и примечания.WBS_ID - это UID, ParentID - это WBS_ID родительского элемента WBS.Первый элемент 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 голосов
/ 20 июня 2019

Я написал рекурсивную подпрограмму для обновления таблицы данных, а затем еще одну подпрограмму для обновления базы данных.

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
...