TABLE OF CONTENTS
- Introduction
- Schedule Core Fields
- Resource Core Fields
- Activity Core Fields
- Resource Assignment Core Fields
- Successor Core Fields
- Structure Core Fields
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 name | Api response field | Formula |
| Description | Prj.Name | Description = Prj.Name. Same property as Code – the MSP project has no separate description. |
| CompletedDate | Prj.FinishDate | CompletedDate = Prj.FinishDate |
| StartedDate | Prj.StartDate | StartedDate = Prj.StartDate. The project-level StartDate holds the estimated day of starting. |
| CurrentProgress | (not populated by MSP) | |
| CutoffDate | Prj.StatusDate | CutoffDate = Prj.StatusDate |
| Code | Prj.Name | Code = Prj.Name |
Resource Core Fields
| Core field name | Api response field | Formula |
| Description | Rsc.Name | Description = Rsc.Name |
| Code | Rsc.Initials | Code = Rsc.Initials. Uses the resource's initials. |
Activity Core Fields
| Core field name | Api response field | Formula |
| 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. |
| Description | Tsk.Name | Description = Tsk.Name |
| FinishAsEarlyAsPossible | (not populated by MSP) | |
| FinishNoLaterThan | Tsk.ConstraintType, Tsk.ConstraintDate | if Tsk.ConstraintType == FinishNoLaterThan return Tsk.ConstraintDate else null |
| MustFinishOn | Tsk.ConstraintType, Tsk.ConstraintDate | if Tsk.ConstraintType == MustFinishOn return Tsk.ConstraintDate else null |
| MustStartOn | Tsk.ConstraintType, Tsk.ConstraintDate | if Tsk.ConstraintType == MustStartOn return Tsk.ConstraintDate else null |
| StartAsEarlyAsPossible | Tsk.ConstraintType | if Tsk.ConstraintType == AsSoonAsPossible OR no recognised constraint return true else null |
| StartAsLateAsPossible | Tsk.ConstraintType | if Tsk.ConstraintType == AsLateAsPossible return true else null |
| StartNoEarlierThan | Tsk.ConstraintType, Tsk.ConstraintDate | if Tsk.ConstraintType == StartNoEarlierThan return Tsk.ConstraintDate else null |
| StartNoLaterThan | Tsk.ConstraintType, Tsk.ConstraintDate | if Tsk.ConstraintType == StartNoLaterThan return Tsk.ConstraintDate else null |
| ActualFinish | Tsk.ActualFinish | if Tsk.ActualFinish == DateTime.MinValue return null else return Tsk.ActualFinish (sentinel-checked). |
| ActualStart | Tsk.ActualStart | if Tsk.ActualStart == DateTime.MinValue return null else return Tsk.ActualStart (sentinel-checked). |
| ActualWorkHours | (not populated by MSP) | |
| CurrentProgress | Tsk.PercentWorkComplete | CurrentProgress = Tsk.PercentWorkComplete |
| EarlyStart | Tsk.EarlyStart | EarlyStart = Tsk.EarlyStart |
| EarlyFinish | Tsk.EarlyFinish | EarlyFinish = Tsk.EarlyFinish |
| LateFinish | Tsk.LateFinish | LateFinish = Tsk.LateFinish |
| LateStart | Tsk.LateStart | LateStart = Tsk.LateStart |
| FreeFloatHours | Tsk.FreeSlackTimeSpan | FreeFloatHours = Tsk.FreeSlackTimeSpan.TotalHours |
| TotalFloatHours | Tsk.TotalSlackTimeSpan | TotalFloatHours = Tsk.TotalSlackTimeSpan.TotalHours |
| PlannedWorkHours | Tsk.Work | PlannedWorkHours = Tsk.Work (already in hours). |
| RemainingWorkHours | Tsk.RemainingWork | RemainingWorkHours = Tsk.RemainingWork (already in hours). |
| IsAlwaysOnSchedule | (not populated by MSP) | |
| IsCancelled | Tsk.IsActive | IsCancelled = NOT Tsk.IsActive |
| CancelledDate | derived from IsCancelled | if 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. |
| PlannedProgress | Tsk.PercentComplete | PlannedProgress = Tsk.PercentComplete |
| DurationHours | Tsk.Duration | DurationHours = Tsk.Duration.TimeSpan.TotalHours |
| RemainingDurationHours | Tsk.RemainingDuration | RemainingDurationHours = Tsk.RemainingDuration.TimeSpan.TotalHours |
| FinishOnOrAfter | Tsk.ConstraintType, Tsk.ConstraintDate | if Tsk.ConstraintType == FinishNoEarlierThan return Tsk.ConstraintDate else null |
| FrontLineDate | (not populated by MSP) | |
| Calendar | Tsk.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. |
| Code | Tsk.Uid | Code = 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 name | Api response field | Formula |
| PlannedHours | Asn.Work | PlannedHours = Asn.Work in hours (computed via minutes / 60 for legacy compatibility). |
| ActualHours | Asn.ActualWork | ActualHours = Asn.ActualWork in hours. |
| CurrentProgress | Asn.PercentWorkComplete | CurrentProgress = Asn.PercentWorkComplete |
| ResourceUsageType | (constant) | ResourceUsageType = StaffTime (2). Hard-coded for MSP. |
| Profile | (not populated by MSP) | MSP has no profile concept. |
| Resource | Asn.Resource.Rsc.Id | Resolved to the exported Resource matching Asn.Resource.Rsc.Id. |
| EarlyStart | ResourceAssignment.Start | EarlyStart = ResourceAssignment.Start (direct property). |
| EarlyFinish | ResourceAssignment.Finish | EarlyFinish = ResourceAssignment.Finish (direct property). |
| LagHours | ResourceAssignment.Delay | LagHours = ResourceAssignment.Delay.TimeSpan.TotalHours |
| Code | Asn.Uid | Code = 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 name | Api response field | Formula |
| Type 0 = StartToStart 1 = StartToFinish 2 = FinishToStart 3 = FinishToFinish | TaskLink.LinkType | StartToStart → 0 StartToFinish → 1 FinishToStart → 2 FinishToFinish → 3 (any other value → 3) |
| LagHours | TaskLink.LinkLag | LagHours = TaskLink.LinkLag / 600. Aspose stores lag in tenths of a minute, so dividing by 600 converts to hours. |
| SuccessorObject | TaskLink.SuccTask | Resolved 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. |
| Code | Tsk.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 name | Api response field | Formula |
| Type 0 = Wbs 1 = FlatList 2 = HierarchicalList | OutlineCode.FieldId | FlatList (1) if the field is a Text-type extended attribute (no parent/child); otherwise HierarchicalList (2). |
| Description | OutlineCode.FieldName | Description = "{field type} Structure for field {FieldName}". |
| StructureElements | OutlineCode.Values | One Structure Element per non-blank outline value (see sub-table). |
| Code | Prj.Uid, OutlineCode.FieldId | Code = project Uid + "|" + FieldId. |
Outline-Code Structure Element (nested under the structure)
| Core field name | Api response field | Formula |
| Code | OutlineCodeValue.Value | Code = value.Value |
| Description | OutlineCodeValue.Description | Description = value.Description |
| ParentElement | OutlineCodeValue.ParentValueId | For HierarchicalList structures, linked to the parent value (matched by ParentValueId); top-level values have no parent. |
WBS Structure
| Core field name | Api response field | Formula |
| Type | (constant) | Type = Wbs (0). |
| Description | (constant) | Description = "Wbs". |
| StructureElements | RootTask + descendants | One 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. |
| Code | Prj.Uid | Code = project Uid + "-WBS". |
WBS Structure Element (nested under the structure)
| Core field name | Api response field | Formula |
| Code | Tsk.WBS | Code = Tsk.WBS (the task's WBS code). |
| Description | Tsk.WBS, Tsk.WBSLevel | Description = "Wbs - {Tsk.WBS}, Level - {Tsk.WBSLevel}". |
| ParentElement | parent Task | Linked 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
Feedback sent
We appreciate your effort and will try to fix the article