Можно ли использовать FieldNameToFieldConstant с объектом TaskDependency - PullRequest
0 голосов
/ 29 января 2020

Я использую объект TaskDependency для трассировки предшественников для целевой задачи. Затем я хочу обновить одно из полей «Число» значением текущей пары ссылок. Я увеличиваю это значение, проходя по каждой ссылке в трассе. Я использую это поле «Номер» в качестве поля сортировки, поэтому трассировка может быть представлена ​​в порядке логики c, а не в порядке идентификатора задачи

. Я хочу, чтобы это поле номера было ЛЮБОМ доступным полем номера, обозначенным пользовательским Имя, так что это пользовательское поле. Я экспериментировал с .Getfield и .SetField для чтения и записи этого увеличенного числа.

У меня есть подпрограмма, которая проверяет все числовые поля для пользовательского имени, связанного с этой процедурой. Я назвал эту процедуру CustomNumberNameExists, и эта функция возвращает строку, такую ​​как Number18, если Number18 имеет настраиваемое имя «MarkedPred». Она также возвращает 9-символьный идентификатор поля «C», ie 188743994 для поля Number18.

Подпрограмма, определяющая, какое поле Number было настроено с пользовательским именем MarkedPred:

enter code here

    For i = 1 to 20
         if (CustomFieldGetName(C) = "MarkedPred") Then
             fldMarkedPred = "Number" & i
             MarkedPred_Method = C
         End If
    next i

Подпрограмма для обратного отслеживания сети при выполнении одной целевой задачи:

enter code here

    Sub DepPredNew(Tsk As Task)

    Dim Dep As TaskDependency    
    Dim SumT As Task    
    Dim SubT As Task    

   'First Section processes for PredSelAll = False  = Only Incomplete tasks 

   If PredSelAll = False Then                                                                              
        If (Tsk.Marked = False) Then
             Tsk.Marked = True

   'exclude links to external tasks                                                                   
        For Each Dep In Tsk.TaskDependencies                                          
            If (Dep.From.ExternalTask = True) Then                            
                Debug.Print ("found Dep.From.ExternalTask= " & Dep.From.ExternalTask)                         
                GoTo NextOne
            End If

            If ((Dep.From.ID <> Tsk.ID) And (Dep.From.PercentComplete <> 100)) Then
               Projectfield = FieldNameToFieldConstant("MarkedPred")
                    If (Dep.From.Number18 = 0) Then  'And (Dep.From.Predecessors <> "")) Then
                        LogicOrder = LogicOrder + 1
                        Dep.From.Number18 = LogicOrder
                        Tsk.Marked = True
                    End If
                    DepPredNew Dep.From   
    NextOne:

        End If
    Next Dep
End If

Все вышеперечисленные процедуры работают по желанию, за исключением того, что они жестко запрограммированы для использования поля Number18. Я хотел бы заменить все экземпляры .Number18 на «MarkedPred», чтобы сделать эту подпрограмму гибкой, чтобы ЛЮБОЕ доступное поле номера можно было настроить с помощью пользовательского имени - MarkedPred. Я пытаюсь использовать Projectfield, например Dep.From.Projectfield, вместо использования Dep.From.Number18.

Возможно ли это?

1 Ответ

0 голосов
/ 29 января 2020

Это именно то, для чего предназначены GetField и SetField .

Измените Dep.From.Number18 на Dep.From.GetField(Projectfield) и Dep.From.SetField(Projectfield).

К вашему сведению: переместите Projectfield = FieldNameToFieldConstant("MarkedPred") за пределы l oop, поскольку его нужно рассчитать только один раз. Еще лучше было бы переместить его за пределы этой рекурсивной процедуры и сделать его переменной уровня модуля; в противном случае он все еще вызывается для каждой задачи.

...