C# 如何在MS Project文件中存储自定义(非任务)数据?

C# 如何在MS Project文件中存储自定义(非任务)数据?,c#,vsto,project-management,ms-project,C#,Vsto,Project Management,Ms Project,我正在使用C编写一个项目附加组件VSTO,以编程方式生成挣值图表计划工作量、实际工作量和实际完成工作量,并希望在Microsoft Project 2016 MSP文件.mpp中存储每周实际工作量数据 在MSP中:我们不需要知道每个活动花费了多少精力。对于这个图表,我只需要每周整个项目的实际工作量。我们使用不同的系统来衡量每个开发活动的计划工作量与实际工作量 我要存储的示例数据集: 每周小时数/周 2018-W16 900.00 2018-W17 1038.50 2018-W18 811.25

我正在使用C编写一个项目附加组件VSTO,以编程方式生成挣值图表计划工作量、实际工作量和实际完成工作量,并希望在Microsoft Project 2016 MSP文件.mpp中存储每周实际工作量数据

在MSP中:我们不需要知道每个活动花费了多少精力。对于这个图表,我只需要每周整个项目的实际工作量。我们使用不同的系统来衡量每个开发活动的计划工作量与实际工作量

我要存储的示例数据集: 每周小时数/周 2018-W16 900.00 2018-W17 1038.50 2018-W18 811.25

我已经找到了获取/存储计划工作和实际完成工作的解决方案。如果我能将每周实际工作量数据存储在MSP文件中,那么最后一个问题就解决了

好的,为了避免:下面列出的限制条件阻止我使用内置的MSP功能生成图形或数据存储来存储自定义数据

约束条件 在每个项目计划中,我无法更改现有任务的这些值:资源名称、持续时间、开始、完成、前置任务、后续任务。这样做会改变计划,并招致建筑师和项目经理对我的愤怒

我们团队的实际工作时间在多个外部系统中进行跟踪,例如:VST、Basecamp、定制应用程序,并且不会因支持我的需要而进行更改

从MSP和时间跟踪系统中提取此数据,然后手动创建数据集以在Excel中生成挣值图表需要的时间太长,是否要自动执行此操作。 通过查看>任务使用情况将分时间段的实际小时数分配给任务会导致MSP自动调整该任务的持续时间,这违反了上述约束。 MSP中的任务和外部时间跟踪系统中的项目不会一一映射。手动决定MSP任务的执行时间既繁重又耗时。在MSP任务上存储带有日期的小时会导致上一期“自动调整持续时间”中提到的后果。 Arch&PM要求启用项目设置自动计划。允许手动计划的任务,前提是它们以这种方式单独手动设置,例如:手动覆盖启动。我可以在操作期间通过Microsoft.Office.Interop.MSProject.Application.Calculation=PjCalculation.pjManual临时禁用自动调度,只要我随后恢复它

我试过的 创建持续时间为0天的虚拟任务,并通过查看>任务使用情况记录小时数。为该任务分配任何小时时,MSP会自动相应地调整持续时间。由于此任务现在出现在项目计划中,我怀疑Arch/PM不会批准,因为他们根据项目中的工期值进行计算

创建一个未分配给任何任务的虚拟用户,并尝试通过查看>资源使用情况为其分配小时数。MSP将阻止此变灰,直到我将用户分配给任务。将此虚拟用户分配给任何任务,然后分配任何小时数据,将导致MSP自动调整持续时间

创建一个虚拟里程碑任务。设置字段:持续时间=0,开始时间=一周的最后一天,结束时间=一周的最后一天,并将每周实际小时数存储在自定义字段中,以避免MSP自动调整持续时间。在项目执行的每一周重复上述步骤

从技术上讲,这是可行的,但需要用户通过视图>数据>过滤器应用过滤器,以避免在项目中每周出现一个额外的虚拟任务。我希望有一个更好的解决方案来存储这些数据,或者有一个更好的方法对用户隐藏这些数据。 检查.mpp文件。存储为二进制数据,我无法解码。尝试通过文档和MSP导出到XML来了解数据存储的可能性:我没有看到任何可以使用的字段不会违反上面列出的约束

GoogleFu:我对自定义数据存储的搜索ms项目返回有关使用自定义字段的信息,这还不足以解决这个问题。
听起来你的核心问题是:我想存储项目级数据,而不是.mpp文件中的任务/资源/分配数据。看看类似的讨论;有关于自定义字段的扩展信息,我认为这可能会解决您的问题

我去年刚刚用Excel将EVMS烘焙到项目中,以存储非项目数据。如果你想联系我,我可以带你参观。@EricChristoph:当然!如何在不向垃圾邮件发送者广播我们的电子邮件的情况下取得联系?请访问LinkedInYes,您的解决方案ActiveProject.Comments=非常长的字符串可以很好地实现这一目的。在调试期间,我注意到另一个MSP插件在其中存储了一些JSON数据,这证实了您的方法。美好的