c# - 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(无论是在源项目中还是在主项目中)?
解决方案
是否可以在不通过 Task.UniqueIDPredecessors/Successors 字符串解析的情况下获取外部依赖项的“真实”UID?
本机任务唯一 ID 不会在幽灵任务的任务级别的任何地方公开。但是,可以使用 regex解析 UniqueIDPredecessors 字符串。
此模式将匹配大多数前任/后继字符串:
(((<>\\[^\\]+\\)+)|([A-Z]:|\\)\\([^\\]+\\)+)?\d+([FS]{2}([+-]\d+d)?)?(?=,|$)
我建议创建一个使用此正则表达式模式的新扩展来拆分 UniqueIDPredecessors 和 UniqueIDSuccessors 属性,以便获取外部任务的本机 UID。
关于持续时间单位及其标签的更新
上面显示的正则表达式模式正在寻找以天为单位的领先/滞后时间。如果需要,可以对其进行修改以查找以其他单位(即分钟、小时、周、月和年)表示的提前/滞后时间。
请注意,可以从“项目选项”对话框的“高级”选项卡中逐个项目地格式化工期单位标签:
可以使用DayLabelDisplay和SpaceBeforeTimeLabels等属性通过代码读取和更改设置。
在使用正则表达式模式匹配前置字符串中的持续时间之前,请记下用户的当前设置,然后更改它们以匹配正则表达式的预期,然后在最后重置用户的原始设置。
最后一点:持续时间也可以表示为经过的时间,可以认为是日历时间而不是工作时间。例如,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)?)?(?=,|$)
推荐阅读
- c++ - 使用 libgit2 从另一个分支创建新的 git 存储库?
- angular - Angular 6 - 使用延迟加载模块时反应形式出现问题
- amazon-web-services - 负载平衡多实例集群背后的事件源
- c# - 如何在不强制用户进行身份验证的情况下以编程方式读取租户 ID 或 AAD 域名
- css - CSS 不可预测的包装习惯
- javascript - 使用正则表达式抓取 url iframe 字符串
- javascript - Fetch:如何使用etags?
- java - 地理编码器仅返回空对象
- python - KeyError 没有格式化错误信息
- javascript - Twitter 图片未出现在 WordPress 网站的推文中