MS Project - 如何获得外部依赖任务的唯一 ID?

MS Project - How can I get the Unique ID of an External Dependency Task?

我正在使用 c# 开发一个工具,该工具将查看任务的依赖关系,然后针对这些依赖关系过滤 MS Project 文件。它在“常规”MS 项目文件中运行良好,但我无法弄清楚如何使其在包含链接源子项目的集成主项目文件中运行。

这是我正在做的事情的一个例子——在这个例子中的集成项目文件中,我将“SSI_Example 1”项目中的里程碑“初步设计审查 1”作为里程碑的前身“SSI_Example 2”项目

中的“初步设计审查 2”

我想要做的是循环遍历“初步设计审查 2”的任务依赖对象,并获取前任依赖项的所有 UID。我期望外部 Dependency.From 到 return 的 UID 为 6 或 8388614(初步设计审查 1 的 UID 值)。给定这些值中的任何一个,我可以计算任务的源 UID 或主项目 UID。

然而,当我实际将其放入代码并循环遍历“初步设计审查 2”的任务依赖项时,它 returns 107 作为外部前身的 UID。似乎 107 是在源项目中创建的“幽灵任务”的 UID

代码示例如下:

private void TestGetPredessorUID(MSP.Task t)
    {
        var taskDependencyList = t.TaskDependencies.ToList(); //ToList is an extention I created method

        //Get only the Predecessor dependencies of the task
        //the GetUID method will always return the UID of the task as it is in the integrated file (source UID + source project seed value)
        taskDependencyList = taskDependencyList.Where(tDep => GetUID(tDep.To) == GetUID(t)).ToList();

        foreach (var dep in taskDependencyList)
        {
            /* If the dependency is an external dependency, dep.From it returns the UID of the "ghost task" not the UID of actual task, 
             even if we are inside the integrated "Master" Project */
            Debug.Print(dep.From.UniqueID.ToString());
        }
    }

底线

是否可以在不通过任务解析的情况下获取外部依赖项的“真实”UID(无论是在源项目还是主项目中)。Predecessors/Successors 或 Task.UniqueID Predecessors/Successors 字符串?

Is it possible to get the "real" UID of an external dependency without parsing through the Task.UniqueIDPredecessors/Successors string?

幽灵任务的本机任务唯一 ID 不会在任务级别的任何地方公开。但是,可以解析 UniqueIDPredecessors 字符串 using regex.

此模式将匹配大多数 predecessor/successor 个字符串:

(((<>\[^\]+\)+)|([A-Z]:|\)\([^\]+\)+)?\d+([FS]{2}([+-]\d+d)?)?(?=,|$)

我建议创建一个使用此正则表达式模式的新扩展来拆分 UniqueIDPredecessors 和 UniqueIDSuccessors 属性,以便获取外部任务的本机 UID。

有关持续时间单位及其标签的更新

上面显示的正则表达式模式正在寻找 lead/lag 以天为单位的时间。如果需要,可以修改它以查找以其他单位(即分钟、小时、周、月和年)表示的 lead/lag 时间。

请注意,持续时间单位 标签 可以在“项目选项”对话框的“高级”选项卡中逐个项目地设置格式:

可以使用 DayLabelDisplay and SpaceBeforeTimeLabels.

等属性通过代码读取和更改设置

在使用正则表达式模式匹配前置字符串中的持续时间之前,记下用户的当前设置,然后更改它们以匹配正则表达式的预期,然后在最后重置用户的原始设置。

最后一点:持续时间也可以表示为经过的时间,可以认为是日历时间而不是工作时间。例如,9/1/2021 + 30ed = 10/1/2021 而 9/1/2021 + 30d = 10/12/2021。经过的持续时间通常在滞后时间中发现(例如,任务可以在混凝土固化后开始)。因此,正则表达式模式应在 lead/lag 时间单位之前包含一个可选的 'e'。

这是一个未经测试的正则表达式模式,已更新为包括经过的持续时间和所有可能的单位:

(((<>\[^\]+\)+)|([A-Z]:|\)\([^\]+\)+)?\d+([FS]{2}([+-]\d+e?(min|hr|d|wk|mon|yr)?)?(?=,|$)