首页 > 解决方案 > MS Project - 如何获取外部依赖任务的唯一 ID?

问题描述

我正在使用 c# 中的一个工具来查看任务的依赖关系,然后过滤 MS Project 文件中的这些依赖关系。它在“常规”MS 项目文件中工作得很好,但我不知道如何使它在包含链接源子项目的集成主项目文件中工作。

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

多项目示例图片

我想要做的是遍历“Preliminary Design Review 2”的Task Dependencies对象,并获取前任依赖项的所有UID。我期待 External Dependency.From 的 UID 返回 6 或 8388614(初步设计审查 1 的 UID 值)。给定这些值中的任何一个,我都可以计算任务的源 UID 或主项目 UID。

但是,当我实际将其放入代码并循环通过“初步设计评审 2”的任务依赖项时,它返回 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());
        }
    }

底线

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

标签: c#vstoms-project

解决方案


是否可以在不通过 Task.UniqueIDPredecessors/Successors 字符串解析的情况下获取外部依赖项的“真实”UID?

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

此模式将匹配大多数前任/后继字符串:

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

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

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

上面显示的正则表达式模式正在寻找以天为单位的领先/滞后时间。如果需要,可以对其进行修改以查找以其他单位(即分钟、小时、周、月和年)表示的提前/滞后时间。

请注意,可以从“项目选项”对话框的“高级”选项卡中逐个项目地格式化工期单位标签:

项目选项框

可以使用DayLabelDisplaySpaceBeforeTimeLabels等属性通过代码读取和更改设置。

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

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

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

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


推荐阅读