Deeper Understanding

Data Mapping between SchedEx Core fields and MSProject for upload

Modified on Wed, 23 Sep at 4:02 PM

TABLE OF CONTENTS


Introduction

If you make a Config using a Template with no SchedEx Terms, the "standard" fields of a schedule will automatically be transferred during an upload, according to the new Schedule Data Ontology - SDO.

This article describes the logic by which the Core field name is populated, on upload, from a Formula that resembles the actual source code used. It is applied relative to the various API response fields in a Microsoft Project (.mpp) file, read through the Aspose.Tasks library – Prj = project, Tsk = task, Rsc = resource, Asn = resource assignment (note that the highlighted words correspond with column names in tables below). 

There will be a table for each Planning Object Type (Schedule, Resource, Activity, Resource Assignment, Successor, and Structure).

Microsoft Project is an upload-only (export) connector – it has no download (import) operation, so there is no reverse direction to document.


Note that the Core Fields read from a named Microsoft Project field can be overridden by mappings in Config (ILAP Term → host field).


Microsoft Project has no Profile concept, and every resource assignment is treated as staff time. Successor links between activities are added from the project's task links during export.


Schedule Core Fields

Core field nameApi response fieldFormula
DescriptionPrj.NameDescription = Prj.Name. Same property as Code – the MSP project has no separate description.
CompletedDatePrj.FinishDateCompletedDate = Prj.FinishDate
StartedDatePrj.StartDateStartedDate = Prj.StartDate. The project-level StartDate holds the estimated day of starting.
CurrentProgress(not populated by MSP)
CutoffDatePrj.StatusDateCutoffDate = Prj.StatusDate
CodePrj.NameCode = Prj.Name


Resource Core Fields

Core field nameApi response fieldFormula
DescriptionRsc.NameDescription = Rsc.Name
CodeRsc.InitialsCode = Rsc.Initials. Uses the resource's initials.


Activity Core Fields

Core field nameApi response fieldFormula
ActivityType
3 = RegularActivity
6 = Hammock
4 = MilestoneStart
5 = MilestoneFinish
Tsk.IsMilestone;
Tsk.EarlyFinish (post-process)
initial:
if Tsk.IsMilestone == true return MilestoneStart (4)
else return RegularActivity (3)
post-process:
for each milestone activity where EarlyFinish == max(EarlyFinish across all activities)
promote to MilestoneFinish (5)
Hammock (6) is never emitted by MSP.
DescriptionTsk.NameDescription = Tsk.Name
FinishAsEarlyAsPossible(not populated by MSP)
FinishNoLaterThanTsk.ConstraintType,
Tsk.ConstraintDate
if Tsk.ConstraintType == FinishNoLaterThan return Tsk.ConstraintDate else null
MustFinishOnTsk.ConstraintType,
Tsk.ConstraintDate
if Tsk.ConstraintType == MustFinishOn return Tsk.ConstraintDate else null
MustStartOnTsk.ConstraintType,
Tsk.ConstraintDate
if Tsk.ConstraintType == MustStartOn return Tsk.ConstraintDate else null
StartAsEarlyAsPossibleTsk.ConstraintTypeif Tsk.ConstraintType == AsSoonAsPossible OR no recognised constraint return true else null
StartAsLateAsPossibleTsk.ConstraintTypeif Tsk.ConstraintType == AsLateAsPossible return true else null
StartNoEarlierThanTsk.ConstraintType,
Tsk.ConstraintDate
if Tsk.ConstraintType == StartNoEarlierThan return Tsk.ConstraintDate else null
StartNoLaterThanTsk.ConstraintType,
Tsk.ConstraintDate
if Tsk.ConstraintType == StartNoLaterThan return Tsk.ConstraintDate else null
ActualFinishTsk.ActualFinishif Tsk.ActualFinish == DateTime.MinValue return null else return Tsk.ActualFinish (sentinel-checked).
ActualStartTsk.ActualStartif Tsk.ActualStart == DateTime.MinValue return null else return Tsk.ActualStart (sentinel-checked).
ActualWorkHours(not populated by MSP)
CurrentProgressTsk.PercentWorkCompleteCurrentProgress = Tsk.PercentWorkComplete
EarlyStartTsk.EarlyStartEarlyStart = Tsk.EarlyStart
EarlyFinishTsk.EarlyFinishEarlyFinish = Tsk.EarlyFinish
LateFinishTsk.LateFinishLateFinish = Tsk.LateFinish
LateStartTsk.LateStartLateStart = Tsk.LateStart
FreeFloatHoursTsk.FreeSlackTimeSpanFreeFloatHours = Tsk.FreeSlackTimeSpan.TotalHours
TotalFloatHoursTsk.TotalSlackTimeSpanTotalFloatHours = Tsk.TotalSlackTimeSpan.TotalHours
PlannedWorkHoursTsk.WorkPlannedWorkHours = Tsk.Work (already in hours).
RemainingWorkHoursTsk.RemainingWorkRemainingWorkHours = Tsk.RemainingWork (already in hours).
IsAlwaysOnSchedule(not populated by MSP)
IsCancelledTsk.IsActiveIsCancelled = NOT Tsk.IsActive
CancelledDatederived from IsCancelledif IsCancelled == true return today's date else null. MSP has no host-provided cancellation date, so today's date is used as the closest available value.
PlannedProgressTsk.PercentCompletePlannedProgress = Tsk.PercentComplete
DurationHoursTsk.DurationDurationHours = Tsk.Duration.TimeSpan.TotalHours
RemainingDurationHoursTsk.RemainingDurationRemainingDurationHours = Tsk.RemainingDuration.TimeSpan.TotalHours
FinishOnOrAfterTsk.ConstraintType,
Tsk.ConstraintDate
if Tsk.ConstraintType == FinishNoEarlierThan return Tsk.ConstraintDate else null
FrontLineDate(not populated by MSP)
CalendarTsk.Calendar
(fallback Prj.Calendar)
let msCal = Tsk.Calendar ?? Prj.Calendar
find the exported calendar whose Code == msCal.Uid (as string).
If the task has no per-task calendar, the project default is used.
CodeTsk.UidCode = Tsk.Uid padded to 6 characters with leading zeros (for lexicographic sort).


Notes on the activity export:
• Summary tasks are skipped unless the Config is set to include them; the root task is always skipped.
• Only activities that pass the configured Activity Filter are exported.
• Resource assignments are limited to work resources.
• Successor links (to following activities) are added in a second pass from the project's task links.


Resource Assignment Core Fields

Resource Assignments are nested under an Activity.

Core field nameApi response fieldFormula
PlannedHoursAsn.WorkPlannedHours = Asn.Work in hours (computed via minutes / 60 for legacy compatibility).
ActualHoursAsn.ActualWorkActualHours = Asn.ActualWork in hours.
CurrentProgressAsn.PercentWorkCompleteCurrentProgress = Asn.PercentWorkComplete
ResourceUsageType(constant)ResourceUsageType = StaffTime (2). Hard-coded for MSP.
Profile(not populated by MSP)MSP has no profile concept.
ResourceAsn.Resource.Rsc.IdResolved to the exported Resource matching Asn.Resource.Rsc.Id.
EarlyStartResourceAssignment.StartEarlyStart = ResourceAssignment.Start (direct property).
EarlyFinishResourceAssignment.FinishEarlyFinish = ResourceAssignment.Finish (direct property).
LagHoursResourceAssignment.DelayLagHours = ResourceAssignment.Delay.TimeSpan.TotalHours
CodeAsn.UidCode = Asn.Uid


Successor Core Fields

Successor links (activity links) are read from the project's task links in a second pass. Each link becomes a Successor on the predecessor activity, pointing at the successor activity.

Core field nameApi response fieldFormula
Type
0 = StartToStart
1 = StartToFinish
2 = FinishToStart
3 = FinishToFinish
TaskLink.LinkTypeStartToStart → 0
StartToFinish → 1
FinishToStart → 2
FinishToFinish → 3
(any other value → 3)
LagHoursTaskLink.LinkLagLagHours = TaskLink.LinkLag / 600. Aspose stores lag in tenths of a minute, so dividing by 600 converts to hours.
SuccessorObjectTaskLink.SuccTaskResolved to the successor Activity (the link target). The link is appended to the predecessor activity's Successors collection.
Calendar(successor activity's calendar)Inherits the calendar of the successor activity.
CodeTsk.Uid
(predecessor + successor)
Code = predecessor activity Code + "|" + successor activity Code (the two activity codes joined with a pipe).


Structure Core Fields

Microsoft Project exports up to two kinds of structure: Outline-Code structures (from the project's outline-code / custom lookup fields) and a WBS structure (the task work-breakdown hierarchy). Each activity is linked during export to the structure elements it belongs to.

Outline-Code Structure

Core field nameApi response fieldFormula
Type
0 = Wbs
1 = FlatList
2 = HierarchicalList
OutlineCode.FieldIdFlatList (1) if the field is a Text-type extended attribute (no parent/child); otherwise HierarchicalList (2).
DescriptionOutlineCode.FieldNameDescription = "{field type} Structure for field {FieldName}".
StructureElementsOutlineCode.ValuesOne Structure Element per non-blank outline value (see sub-table).
CodePrj.Uid,
OutlineCode.FieldId
Code = project Uid + "|" + FieldId.

Outline-Code Structure Element (nested under the structure)

Core field nameApi response fieldFormula
CodeOutlineCodeValue.ValueCode = value.Value
DescriptionOutlineCodeValue.DescriptionDescription = value.Description
ParentElementOutlineCodeValue.ParentValueIdFor HierarchicalList structures, linked to the parent value (matched by ParentValueId); top-level values have no parent.

WBS Structure

Core field nameApi response fieldFormula
Type(constant)Type = Wbs (0).
Description(constant)Description = "Wbs".
StructureElementsRootTask + descendantsOne Structure Element per task in the outline tree, built recursively. Summary tasks and the root task are always included so the parent/child chain stays intact.
CodePrj.UidCode = project Uid + "-WBS".

WBS Structure Element (nested under the structure)

Core field nameApi response fieldFormula
CodeTsk.WBSCode = Tsk.WBS (the task's WBS code).
DescriptionTsk.WBS,
Tsk.WBSLevel
Description = "Wbs - {Tsk.WBS}, Level - {Tsk.WBSLevel}".
ParentElementparent TaskLinked to the element created for the parent task.


When a specific field is configured as the WBS, that outline-code structure is simply re-typed as Wbs instead of producing a separate WBS structure. Each activity is linked to its outline-code element (by the activity's field value) and to its default-WBS element (by the task's WBS code).



Was this article helpful?

That’s Great!

Thank you for your feedback

Sorry! We couldn't be helpful

Thank you for your feedback

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article