P6 and Microsoft Project
XER → MSPDI (and Back) at a Conceptual Level
What typically survives XER → MSPDI and back

This is not a field-by-field map. It is what usually survives a conceptual round-trip through MPXJ-style objects into MSPDI, and what usually does not. Marked uncertain where we lack a primary citation.
Never write a real MPP. See mpxj.md.
Typically survives (has an analogue)
| P6 / XER | Project / MSPDI | Caveat |
|---|---|---|
| TASK rows (activities) | Tasks | WBS nodes become summaries, not extra activities |
FS / SS / FF / SF + lag_hr_cnt | PredecessorLink Type 1/3/0/2 + LinkLag | MSPDI Type: 0=FF, 1=FS, 2=SF, 3=SS (Microsoft). Lag calendars may differ |
| Calendars at a coarse level | Project/base calendars, optional task calendar | Exception blob → Project exceptions is lossy; hours/day may not match |
| Constraints with an analogue | ConstraintType 0–7 | Mandatory Start/Finish collapse to MSO/MFO. See p6/constraints.md |
| PROJWBS hierarchy | Summary tasks + outline | Project has no PROJWBS table |
| Resource names / assignments (units) | Resources + assignments | Curves, roles, primary resource semantics uncertain |
| Planned / remaining durations (hours) | Duration / RemainingDuration | Calendar used to expand hours will differ |
| Actual start / finish | ActualStart / ActualFinish |
Usually does not survive (no faithful analogue, or converter drops it)
| P6 concept | Why |
|---|---|
| Activity codes (ACTVTYPE / ACTVCODE / TASKACTV) | Project has outline codes / custom fields, not P6 activity codes |
| Activity steps | No MSPDI step table |
| LOE / WBS-summary / resource-dependent activity types | Project task types are Fixed Units/Duration/Work, not P6 activity types |
| P6 UDF mapping | Extended attributes exist but types/tables do not line up automatically |
Resource curves (curv_id, *_crv) | MSPDI timephased is optional; MPXJ writer defaults it off |
| Retained-logic / progress-override / actual-dates flag | Project has no equivalent schedule option |
| Data Date vs Status Date | Must map last_recalc_date → Status Date, not StartDate. Easy to get wrong |
Must Finish By (plan_end_date) | Not the same as Project FinishDate / deadline / FNLT — mapping uncertain |
| Longest-path critical vs TF threshold | Project critical slack limit is a different control |
| Percent-complete type (Duration/Physical/Units/Scope) | Project % Complete is duration-based; Physical is EV-only |
| Duration % Complete formula | P6 (Planned−Remaining)/Planned vs Project Actual/Duration |
| Expected Finish as a schedule driver | No cited MSPDI equivalent |
| P6 notebooks, risks, baselines-in-XER | XER does not carry baselines (Oracle); notebooks/risks not in MSPDI |
Uncertain (do not implement as fact)
- Whether MPXJ writes P6 calendar exceptions into MSPDI exception records completely.
- Role assignments vs resources.
- How suspend/resume dates land.
- Whether secondary constraints (
cstr_type2) are dropped (Project has one constraint per task). - Units % Complete ↔ % Work Complete as a mechanical identity (similar idea, not cited as equal).
P6 vs Project disagreements to keep
- Remaining duration % formula (see
p6/remaining-duration.mdvsmsp/percent-complete.md). - Mandatory vs On constraints.
- Data Date vs Status Date vs Start Date.
- WBS is a table in P6; summaries in Project.
- Retained logic has no Project flag.
Sources
- MPXJ read/write lists [27 Aug 2026]
- MPXJ FAQ [27 Aug 2026]
- Microsoft PredecessorLink Type [27 Aug 2026]
- Microsoft ConstraintType [27 Aug 2026]
- Oracle XER vs XML baselines [27 Aug 2026]
- Oracle TASKPRED / TASK / PROJECT maps (see
p6/)