1
votes

I'm writing a Project add-on (VSTO) using C#, to programatically generate an Earned Value Chart (Planned effort vs. Actual effort vs. Actual work completed), and I want to store weekly actual effort data within the Microsoft Project 2016 (MSP) file (.mpp).

In MSP: we don't need to know how much effort was spent on each activity. For this chart, I only require the actual effort for entire project for each week. We use different systems for measuring planned effort versus actual effort for each dev activity.

Sample dataset that I want to store: Week# Hrs per week 2018-W16 900.00 2018-W17 1038.50 2018-W18 811.25

I've got solutions for deriving/storing "Planned effort" and "Actual work completed". The final piece would be solved if I could store this "Weekly actual effort" data in the MSP file.

AFAIK, and to avoid XY problem: the contraints listed below are preventing me from using built-in MSP features (to generate graph) or datastore (to store my custom data).

Constraints

  • Within each project plan, I cannot alter these values on existing tasks: Resource Names, Duration, Start, Finish, Predecessor, Successor. Doing so would alter the plan and incur wrath of Architect and Project Manager upon me.

  • Our teams' actual hours are tracked in multiple external systems (eg: VSTS, Basecamp, custom app), and isn't subject to change to support my needs.

    • Extracting this data from MSP and time-tracking systems, then manually creating dataset to generate Earned Value Chart (in Excel) takes too long, want to automate this.
    • Assigning time-phased actual hours onto tasks (via View > Task Usage) has consequence of MSP automatically adjusting Duration on that task, which violates constraint above.
    • Tasks in MSP and items in external time-tracking systems are not mapped one-to-one. Manually deciding which hours go onto which MSP tasks is onerous and time-consuming. Storing hours with dates on MSP tasks suffers consequences mentioned in previous issue (auto-adjustment of Duration).
  • Arch & PM require project setting Auto-scheduling to be enabled. Manually-scheduled tasks are allowed, provided they are individually manually set this way (eg: manually override Start). I can temporarily disable Auto-scheduling during operations (via Microsoft.Office.Interop.MSProject.Application.Calculation = PjCalculation.pjManual), as long as I restore it afterwards.

What I've tried

  • Create dummy task with Duration = 0 days, and record hours via View > Task Usage. When assigning any hours to this task, MSP automatically adjusts Duration accordingly. Since this task now appears within the project plan, I suspect Arch/PM won't approve, since they make calculations from Duration values in the project.

  • Create a dummy user that isn't assigned to any tasks, and attempt to assign hours to it via View > Resource Usage. MSP prevents this (greyed-out), until I assign user to a task. Assigning this dummy user to any task, and then assigning any hours data, will result in MSP auto-adjusting Duration.

  • Create a dummy milestone task. Set fields: Duration = 0, Start = last day of week, Finish = last day of week, and store the weekly actual hours in a custom field (to avoid MSP auto-adjustment of Duration). Repeat for each week of project execution.

    • Technically this works, but requires user applying a filter (via View > Data > Filter) to avoid seeing all these extra dummy tasks (one per week) appearing within the project. I'm hoping for a better solution to store this data, or a better way to hide this data from user.
  • Examine .mpp file. Stored as binary data, which I can't decode. Attempt to learn datastore possibilities via Project Data Interchange XML Element Structure docs and MSP export to XML: I'm not seeing any fields I can use that wouldn't violate constraints listed above.

  • Google-fu: my searches for custom data storage ms project returns info about using custom-fields, which isn't enough to solve.
1
I've just spent the last year baking an EVMS into project using Excel to store the non-project data. If you want to get in touch I can give you the tour.Eric Christoph
@EricChristoph: sure! How to get in touch, without broadcasting our emails to spammers?Grumpy Curmudgeon
Look me up on LinkedInEric Christoph

1 Answers

1
votes

Sounds like your core problem is: I want to store project-level (so not task/resource/assignment data) somewhere in the .mpp flie. Take a look at a similar discussion Where can I save the settings entered by the user? ; there's expanded information about custom fields which I think may solve your problem.