如何在 VSTO MS 项目中使用多个 Task.Assignments?

How can I work with multiple Task.Assignments in VSTO MS Project?

我得到了一个 'Users' 的集合,它们正在两个日期(firstPerformance 和 LastPerformance)之间处理几个小时的任务。我想通过创建任务并设置开始、完成和工作来将该信息分配给任务:

Assignment a =  task.Assignments.Add(ResourceID: user.Resource.Id);
                                                  
a.Start = user.Performances.FirstPerformance;
a.Finish = user.Performances.LastPerformance;
a.Work = user.Performances.TotalTime * 60 // TotalTime is in hours while Work is in minutes 

在我这样做之前,我删除了任务的所有分配并将其设置为 pjFixedWork:

task.Type = PjTaskFixedType.pjFixedWork;
foreach (Assignment a in task.Assignments) a.Delete();

这会导致奇怪的行为: 在第一个 运行 中,它设置了 Work 和 Start in Project 正确并分配了正确的资源。 在第二个 运行 上,它设置工作、开始和完成正确 在第三个 运行 上,它还修复了 Unit

例如:

  1. 开始:19.10.21 完成:02.02.22 工作:288,75h 资源:Andreas
  2. 开始:19.10.21 完成:27.01.22 工作:288,75h 资源:Andreas [57%]
  3. 开始:19.10.21 完成:27.01.22 工作:288,75h 资源:Andreas [60%]

当然三个运行的输入都是一样的!

虽然我仍然不理解这种行为,但如果要分配的资源不止一个,我会遇到不同的情况。

我分配的数据如下所示:

User 1   First: 14.09.2021   Last: 02.12.2021    Total Time: 82,75
User 2   First: 31.08.2021   Last: 28.01.2022    Total Time: 263,5
User 3   First: 08.09.2021   Last: 09.09.2021    Total Time: 4,5
User 4   First: 02.12.2021   Last: 02.12.2021    Total Time: 1
User 5   First: 19.10.2021   Last: 28.01.2022    Total Time: 223
User 6   First: 06.12.2021   Last: 25.01.2022    Total Time: 18,5
User 7   First: 07.09.2021   Last: 14.12.2021    Total Time: 126

不同 运行 的结果如下所示:

  1. 开始:31.08.21 完成:14.01.22 工作:170h 资源:User1;用户2; ...
  2. 开始:31.08.21 完成:14.01.22 工作:169,04h 资源:User1;用户2; ...
  3. 开始:31.08.21 完成:14.01.22 工作:169,04h 资源:User1;用户2; ... 没有变化

由于我在资源上分配了 1 欧元/小时,我可以看到发生了一些事情,因为成本是:

User 1  0,21€
User 2  2,59€
User 3  0,16€
User 4  0,07€
User 5  30,79€
User 6  9,22€
User 7  126,00€

加起来是 169,04。

我做错了什么?

此致

安德烈亚斯

What am I doing wrong here?

你的代码没有错。 'wrong' 部分试图以其设计不适合的方式使用 Microsoft Project。让我解释一下。

Microsoft Project 使用关键路径法算法根据诸如任务持续时间、任务之间的链接以及约束日期和工作时间(日历)等其他依赖项等因素来安排任务。给定一组这些输入,Project 计算任务开始和完成日期、所需工作等。

如果不让 CPM 算法进行计算,而是将太多确切的日期(例如)强加到日程表中,就会出现问题。尝试为每个资源强制执行准确的工作量也不利于 CPM 引擎。

任务拥有多个资源是一个很好的迹象,表明它应该被拆分。拥有超过几周的任务也很好地表明它们可能会更好地分开。将大任务分解成更小的部分。

根据需要使用资源日历来限制每个资源的可用性。使用调配来确保资源不会过载。让 Project 做它最擅长的事——根据约束安排任务。准确地告诉 Project 每个资源将在何时以及在每个任务上工作多少与它的设计使用方式相反。别打了。

Rachel 的回答足够了,但这是我的作品的价值所在:

  1. 您在代码中分配给任务的资源应与任务本身的执行周期相同。 (即,如果任务在 21 年 8 月 31 日开始并在 22 年 1 月 14 日完成,则它的所有资源分配也应该在这些日期开始和完成)。当您开始解决这个问题时,MS Project 开始出现错误,您最终会开始在日程表中看到让您认为“到底发生了什么事?这毫无意义”的事情。假设您的 VSTO 将用于生产用途,这不是您想让用户受制于的东西。
  2. 不必担心分配给任务的资源单位。我不确定 MS Project 究竟是如何计算资源分配单位的(也许 Rachel 可以阐明这一点),但我发现它们通常没有意义并且令人困惑。我个人只是忽略它们。我只担心每个资源分配的总小时数。 (仅供参考,如果您正在处理设置为固定持续时间的任务,请厌倦 Effort Driven 标志)

关于在任务上处理资源分配的另外两件事:

  1. 如果您开始在代码中为任务删除或添加资源,您需要先将任务设置为 0% 完成。结果可能会有所不同。您可能已经在这样做了,但这就是我之前问过的原因。
  2. 从任务中删除资源分配时,请确保将任务设置为固定工期。
  3. 您可能希望在开始处理资源之前至少 将任务的原始持续时间和开始日期存储在内存中,这样您就可以确保任务仍在进行中在您更改资源分配后同时发生。