The most recent build of BPC Logic Filter includes improved calculation of relative floats for tasks whose Resource Calendars are substantially different from the effective Task and Project Calendars. While reviewing those improvements, I compiled this summary of the three different Calendar types used in Microsoft Project (MSP) schedules – with particular attention to their use in logic-driven scheduling and Slack calculation. The summary moves from the simplest (Project Calendar only) to the most complex (combined Task and Resource calendars) case. The conclusions are based on my own (imperfect) testing in MSP Professional 2010 and 2016 environments, and I’d welcome any corrections.
Dale Howard of Sensei Project Solutions has provided an excellent general examination of Calendars in Microsoft Project. It may prove useful to review his post before proceeding.
A. Project Calendar
- The Project Calendar is used to schedule all tasks in a project IN THE ABSENCE OF OTHER CALENDARS. When present, Task Calendars supersede all of the Project Calendar’s functions, and Resource Calendars supersede some – but not all – of the Project Calendar’s functions.
- Without Task or Resource Calendars, each task’s early start date occurs when all logic constraints have been satisfied and the Project Calendar makes work time available. The task’s early finish occurs when the assigned duration has been fully expended according to the Project calendar.
- Relationship lags are computed according to the Project Calendar.
- Start Slack, Finish Slack, and Total Slack are computed using the Project Calendar.
- The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions is the Project Calendar.*
- Because only a single calendar is involved in all schedule calculations, Total Slack may be a reliable indicator of Critical Path within a single project schedule.
- If two projects with different project calendars are joined together with inter-project dependencies, then the interaction of working periods between linked tasks can cause Total Slack to vary along a single driving logic path.
B. Project Calendar PLUS Resource Calendars
- Each Resource possesses a unique Resource Calendar, which is comprised of a Base Calendar with specific modifications/exceptions. For example, the Base Calendar for all resources in a particular country may include standard weekends and holidays for that country. These are inherited by the Resource Calendar, while exceptions may be applied for specific Resource vacations. By default, the Base Calendar is the Project Calendar at the time the resource is created. An alternate Base Calendar can be assigned afterward. The Resource Calendar has the same name as the Resource.
- When one or more resources are assigned to a task, the task is scheduled according to a) predecessor and successor logic, including lags; and b) the available working times in the Resource Calendars. The task’s early start date occurs when all logic constraints have been satisfied and at least one assigned resource has available work-time. The task’s early finish date occurs when the last resource assignment is completed – AND for Fixed-duration tasks with positive duration, the specified duration has been expended. For tasks that are not of type “Fixed Duration,” the Duration is the sum of all the intervals (from start to finish) during which at least one resource is working. Thus, a task with multiple resources (each with a unique calendar) may have a Duration and Start/Finish dates that do not directly correspond to ANY single defined Calendar. For Fixed-Duration tasks, the Duration is the difference between the early start and early finish as computed using the Project Calendar. Thus, a Fixed-Duration task with 12-hours of work by a night-shift resource can have a Duration of Zero, based on the Project’s Standard calendar. Moreover, a Fixed-Duration task with a specified duration of 2 days and 16 hours of work by a weekend-working resource may start on Saturday (when the resource is available) and not be completed until Tuesday evening, when its specified duration has been expended according to the project calendar. During the backward pass, Late dates are established similarly, based on (resource) working-time calendars.
- Relationship lags are computed using the Project Calendar.
- Start Slack, Finish Slack, and Total Slack are computed using the Project Calendar.
- The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields remains the Project Calendar. When used in custom Resource fields, the default calendar for these functions is the Resource’s Base Calendar, which is often the Project Calendar.*
- Since a resource calendar may delay a task from starting work during an available work period as defined in the Project Calendar, the task’s driving predecessor may possess slack. Thus, Total Slack can vary along a single driving logic path.
C. Project Calendar PLUS Task Calendars (No Resource Calendars OR “Ignore Resource Calendars” Selected)
- A task calendar may be created and assigned to multiple tasks. Each Task Calendar is a Base Calendar that may be created by copying and modifying an existing Base Calendar. (Because it is a base calendar itself, a task calendar does not inherit information from other calendars.)
- Task Calendars may be used to refine schedule constraints based on the nature of the tasks being performed. E.g. seasonal or environmental limitations. Task Calendars may also be used to represent resource restrictions when no resources have been assigned (e.g. a year-end non-work period for certain tasks in a master/summary schedule.) When “Ignore Resource Calendars” is checked, then assigned Resources will be compelled to work exactly according to the Task Calendar, possibly violating their own work time availability.
- Without effective Resource restrictions, the task’s early start date occurs when all logic constraints have been satisfied and the Task Calendar makes work time available. The task’s early finish occurs when the assigned duration has been fully expended according to the Task Calendar.
- Relationship lags are computed according to the Task Calendar of the successor task, if it has one, or the Project Calendar.
- Start Slack, Finish Slack, and Total Slack for each task are computed using the Task Calendar, if it has one, or the Project Calendar.
- The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields is the Task Calendar, if one exists, or the Project Calendar.*
- The interval between a driving predecessor and a driven successor may possess work time according to the predecessor’s calendar but not the successor’s. The driving predecessor may possess slack. Thus, Total Slack can vary along a single driving logic path.
D. Elapsed-Durations
- For most practical purposes, specifying a task duration using an “elapsed” unit (edays, for example), is essentially the same as: a) Applying a 24-hour task calendar with “ignore resource calendars” selected; AND b) Assigning a duration value that accounts for the project’s hours-per-day, hours-per-week, and days-per-month settings. For example, 1 elapsed day is the same as 24 hours or 3 “days” (8-hours each) applied to a 24-hour working calendar. (Since mixing duration “days” with 24-hour calendars routinely causes confusion, it is good practice to instead specify such durations in hours.)
- Any task with an elapsed duration will have the Task Calendar field disabled. (A stored value may be visible, but it is inactive as long as the duration units are elapsed.)
- Since elapsed-duration tasks automatically ignore resource calendars, any assigned Resources will be compelled to work 100% without rest, possibly violating their own work time availability. Consequently, it’s not a good idea to routinely apply elapsed durations together with resource loading. Even machines need downtime for maintenance.
- Without effective Resource restrictions, the task’s early start date occurs when all logic constraints have been satisfied, period. The task’s early finish occurs when the elapsed duration has been fully expended.
- Non-elapsed relationship lags are computed according to the Task Calendar of the successor task, if it has one, or the Project Calendar.
- Start Slack, Finish Slack, and Total Slack for each elapsed-duration task are computed on the basis of elapsed time.
- For tasks with elapsed durations, the default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields is the 24-Hour Calendar.*
- The interval between an elapsed-duration predecessor and its driven (non-elapsed) successor may possess non-working time according to the successor’s effective calendar (task, resource, or project). The driving predecessor may possess slack. Thus, Total Slack can vary along a single driving logic path.
E. Project Calendar PLUS Task Calendars PLUS Resource Calendars (NOT “Ignored”)
If the task’s “Ignore Resource Calendars” box is NOT checked, then:
- Each task is scheduled only during work time that is available in BOTH the Task Calendar and the applicable Resource Calendar for each assignment.
- The task’s early start date occurs when all logic constraints have been satisfied, the Task Calendar makes work time available, AND at least one assigned resource has available work time. The task’s early finish occurs when the last assignment is completed within the combined work time restrictions.
- Relationship lags are computed according to the Task Calendar of the successor task, if it has one, or the Project Calendar.
- Start Slack, Finish Slack, and Total Slack are computed using the Task Calendar, if any, or the Project Calendar.
- The default calendar for ProjDateAdd, ProjDateSub, and ProjDateDiff functions used in custom Task fields remains the Task Calendar, if one exists, or the Project Calendar. When used in custom Resource fields, the default calendar for these functions remains the Resource’s Base Calendar.*
- As a result of either resource-delays or task calendar mismatches, Total Slack can vary along a single driving logic path.
* Note: The comparable Project VBA functions (Application.) DateAdd, DateSubtract, and DateDifference always default to the Project Calendar of the ActiveProject.
F. Slack and Calendars Re-Cap
In general, the Project Calendar of a fully resource-loaded project schedule plays no direct role in the calculation of the Early and Late dates, but it plays a primary role in MSP’s subsequent calculation of Slack based on those dates. Conversely, although resource calendars can fundamentally alter the logic-driven dates of a typical resource-loaded task, MSP ignores them in the Slack calculation. As a consequence, both the calculation and interpretation of Total Slack in a resource-loaded schedule become greatly simplified, if sometimes misleading.
Alternately, whenever a task calendar is applied (with or without resource-loading), that same calendar is used to calculate the Dates AND the Slack. Consequently, the calculation of Total Slack seems to be more correct and can be equally simple to calculate (using a Task- rather than Project-Calendar), but its interpretation can be confusing.
For example, the chart below illustrates two alternate methods for modeling a calendar-restricted Board-approval activity in a project schedule. The Board meets on the third Wednesday of each month for, among other items, approving key project commitments. If the project team fails to prepare the necessary documents in sufficient time for the meeting, then the approvals (and follow-on tasks) will be delayed by a month. (This is exactly how project governance works in some organizations.) For this example, the board-approval, preparation, and follow-up activities are not on the Critical Path for the project, finishing up about a month before the project’s finish milestone.
In the first case, the restraint on the Board Approval task is modeled by applying a Task Calendar with only the third Wednesday of each month as a working day. In the second case, the restraint is modeled by loading a “Board Availability” resource whose Base Calendar is exactly the same as the Task Calendar applied above. Early Dates and Late Dates for all tasks are identical for both cases, and the only difference is the Total Slack of the Board Approval task. This value is computed as the difference between the task’s Late Finish (17Apr’19) and its Early Finish (20Mar’19). When the restraint is applied using the Task Calendar, the Total Slack of 1 day reflects the fact that one Board Meeting/availability day exists between the two dates. With the restraint applied using a resource calendar, the Project Calendar applies, and Total Slack of 20 days reflects the twenty weekdays between the two dates.
In either case, the example also illustrates the difficulty of identifying logic paths using Total Slack alone.
G. A Note on the Resource Availability Grid
The Resource Availability Grid (part of the Resource Information dialog window) is sometimes seen as an alternate/supplemental method for specifying resource working time. Unlike the Resource Calendar, however, Resource Availability entries do not participate in the working-time definitions that drive the scheduling calculations. Rather, they serve as a time-phased version of the Max Units property for identifying over-allocation of resources. Once flagged, MSP can attempt to resolve these over-allocations through automatic resource-leveling. This is distinct from logic-driven scheduling.