This example illustrates the use of multiple calendars within a project. The data for this example are the same as the data
used in Example 4.10 to illustrate the CPM Procedure. The input data sets to PROC CPM are displayed in Output 8.9.1. The WORKDATA
data set defines several shift patterns, which in turn are identified with four different calendars in the CALEDATA
data set:
The 'DEFAULT' calendar has five 8-hour workdays (8 a.m. - 4 p.m.) on Monday through Friday and holidays on Saturday and Sunday.
The 'OVT_CAL' calendar defines the “overtime” calendar that is followed by the Engineering department to build the prototype. The 'OVT_CAL' calendar has five 10-hour workdays (8 a.m. - 6 p.m.) on Monday through Friday, a 4-hour halfday (8 a.m. - 12 noon) on Saturday and a holiday on Sunday.
The 'PROD_CAL' calendar defines the “production” calendar that is used for full-scale production of the widget. The 'PROD_CAL' calendar consists of continuous work from Monday 8 a.m. through Saturday 6 p.m. except for two 2-hour breaks per day from 6 a.m. to 8 a.m. and from 6 p.m. to 8 p.m. Thus, 'PROD_CAL' is made up of eleven 8-hour shifts per week; six day shifts and five night shifts.
The 'Eng_cal' calendar defines the calendar followed by the Engineering department for writing the specifications for the prototype. The 'Eng_cal' calendar has the same work pattern as the default calendar with an extra holiday period of seven days starting on December 8, 2003.
The HOLIDATA
data set defines the appropriate holidays for the different calendars. The project data set WIDGVAC
includes a variable named CAL
to identify the appropriate calendar for each activity.
Output 8.9.1: Multiple Calendars: Data Sets
Multiple Calendars |
Workdays Data Set |
Obs | fullday | halfday | ovtday | s1 | s2 | s3 |
---|---|---|---|---|---|---|
1 | 8:00 | 8:00 | 8:00 | . | 8:00 | . |
2 | 16:00 | 12:00 | 18:00 | 6:00 | 18:00 | 6:00 |
3 | . | . | . | 8:00 | 20:00 | 8:00 |
4 | . | . | . | 18:00 | . | 18:00 |
5 | . | . | . | 20:00 | . | . |
6 | . | . | . | . | . | . |
Calendar Data Set |
Obs | cal | _sun_ | _mon_ | _tue_ | _wed_ | _thu_ | _fri_ | _sat_ |
---|---|---|---|---|---|---|---|---|
1 | DEFAULT | holiday | fullday | fullday | fullday | fullday | fullday | holiday |
2 | OVT_CAL | holiday | ovtday | ovtday | ovtday | ovtday | ovtday | halfday |
3 | PROD_CAL | holiday | s2 | s1 | s1 | s1 | s1 | s3 |
4 | Eng_cal |
Holidays Data Set |
Obs | holiday | holifin | holidur | cal |
---|---|---|---|---|
1 | 08DEC03 | . | 7 | Eng_cal |
2 | 24DEC03 | 26DEC03 | . | |
3 | 01JAN04 | 01JAN04 | . |
Project Data Set |
Obs | task | succ1 | succ2 | succ3 | days | cal |
---|---|---|---|---|---|---|
1 | Approve Plan | Drawings | Study Market | Write Specs | 5.5 | DEFAULT |
2 | Drawings | Prototype | 10.0 | DEFAULT | ||
3 | Study Market | Mkt. Strat. | 5.0 | DEFAULT | ||
4 | Write Specs | Prototype | 4.5 | Eng_cal | ||
5 | Prototype | Materials | Facility | 15.0 | OVT_CAL | |
6 | Mkt. Strat. | Test Market | Marketing | 10.0 | DEFAULT | |
7 | Materials | Init. Prod. | 10.0 | DEFAULT | ||
8 | Facility | Init. Prod. | 10.0 | DEFAULT | ||
9 | Init. Prod. | Test Market | Marketing | Evaluate | 10.0 | DEFAULT |
10 | Evaluate | Changes | 10.0 | DEFAULT | ||
11 | Test Market | Changes | 15.0 | DEFAULT | ||
12 | Changes | Production | 5.0 | DEFAULT | ||
13 | Production | 0.0 | PROD_CAL | |||
14 | Marketing | 0.0 | DEFAULT |
The program used to invoke PROC CPM and PROC GANTT follows. The CALENDAR= and WORKDAY= options are specified in the
PROC GANTT statement to identify the CALEDATA
and WORKDATA
data sets, respectively. The CALID= option in the CHART statement names the variable identifying the
calendar that each observation refers to in the WIDGVAC
and CALEDATA
data sets. Since the value of MININTERVAL= is DTDAY, setting the
SCALE= value to 12 ensures that a single column on the Gantt chart represents
two hours. This is done in order to be able to detect a two hour difference between schedules. Consequently, the MINDATE=
and MAXDATE= options are used to control
the output produced by PROC GANTT. The resulting Gantt chart is shown in Output 8.9.2. Notice the 5 column duration for 'Prototype' on December 29, 2003 representing a 10-hour day versus the 4 column duration
for 'Mkt. Strat.' for the same day representing 8 hours of work. Although MAXDATE= is set to 8 a.m. on January 2, 2004, the
last tick mark is the beginning of January 3, 2004. This is because the specified value of the MAXDATE= option does not correspond
to a tick mark (based on the SCALE= and MININTERVAL= options); the value used is the first tick mark appearing after the value
of the MAXDATE= option.
proc cpm date='01dec03'd interval=workday data=widgvac out=schedvac holidata=holidata workday=workdata calendar=caledata; holiday holiday / holifin=holifin holidur=holidur; activity task; duration days; successor succ1 succ2 succ3; calid cal; run; title h=2 'Gantt Example 9'; title2 h=1.5 'Multiple Calendars'; proc gantt data=schedvac holidata=holidata workday=workdata calendar=caledata ; chart / holiday=(holiday) holiend=(holifin) calid=cal markbreak scale=12 mindate='27dec03:00:00'dt maxdate='02jan04:08:00'dt pcompress; id task; run;