Example 4.6 Changing Duration Units
This example illustrates the use of the INTERVAL= option to identify the units of duration to PROC CPM. In the previous examples, it was assumed that work can be done on the activities all seven days of the week without any break. Suppose now that you want to schedule the activities only on weekdays. To do so, specify INTERVAL=WEEKDAY in the PROC CPM statement. Output 4.6.1 displays the schedule produced by PROC CPM. Note that, with a shorter work week, the project finishes on March 8, 2004, instead of on February 9, 2004.
proc cpm data=widget out=save
date='1dec03'd interval=weekday;
activity task;
succ succ1 succ2 succ3;
duration days;
run;
title 'Changing Duration Units';
title2 'INTERVAL=WEEKDAY';
proc print;
id task;
var e_: l_: t_float f_float;
run;
Output 4.6.1
Changing Duration Units: INTERVAL=WEEKDAY
01DEC03 |
05DEC03 |
01DEC03 |
05DEC03 |
0 |
0 |
08DEC03 |
19DEC03 |
08DEC03 |
19DEC03 |
0 |
0 |
08DEC03 |
12DEC03 |
19JAN04 |
23JAN04 |
30 |
0 |
08DEC03 |
12DEC03 |
15DEC03 |
19DEC03 |
5 |
5 |
22DEC03 |
09JAN04 |
22DEC03 |
09JAN04 |
0 |
0 |
15DEC03 |
26DEC03 |
26JAN04 |
06FEB04 |
30 |
30 |
12JAN04 |
23JAN04 |
12JAN04 |
23JAN04 |
0 |
0 |
12JAN04 |
23JAN04 |
12JAN04 |
23JAN04 |
0 |
0 |
26JAN04 |
06FEB04 |
26JAN04 |
06FEB04 |
0 |
0 |
09FEB04 |
20FEB04 |
16FEB04 |
27FEB04 |
5 |
5 |
09FEB04 |
27FEB04 |
09FEB04 |
27FEB04 |
0 |
0 |
01MAR04 |
05MAR04 |
01MAR04 |
05MAR04 |
0 |
0 |
08MAR04 |
08MAR04 |
08MAR04 |
08MAR04 |
0 |
0 |
09FEB04 |
09FEB04 |
08MAR04 |
08MAR04 |
20 |
20 |
To display the weekday schedule on a calendar, use the WEEKDAY option in the PROC CALENDAR statement. The following code sorts the Schedule data set by the E_START variable and produces a calendar shown in Output 4.6.2, which displays the schedule of activities for the month of December.
proc sort;
by e_start;
run;
/* truncate schedule: print only for december */
data december;
set save;
e_finish = min('31dec03'd, e_finish);
if e_start <= '31dec03'd;
run;
title3 'Calendar of Schedule';
options nodate pageno=1 ps=50;
proc calendar data=december schedule weekdays;
id e_start;
finish e_finish;
var task;
run;
Output 4.6.2
Changing Duration Units: WEEKDAY Calendar for December
----------------------------------------------------------------------------
| |
| December 2003 |
| |
|--------------------------------------------------------------------------|
| Monday | Tuesday | Wednesday | Thursday | Friday |
|--------------+--------------+--------------+--------------+--------------|
| 1 | 2 | 3 | 4 | 5 |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
|+==============================Approve Plan==============================+|
|--------------+--------------+--------------+--------------+--------------|
| 8 | 9 | 10 | 11 | 12 |
| | | | | |
| | | | | |
|+==============================Write Specs===============================+|
|+==============================Study Market==============================+|
|+================================Drawings================================>|
|--------------+--------------+--------------+--------------+--------------|
| 15 | 16 | 17 | 18 | 19 |
| | | | | |
| | | | | |
| | | | | |
|+==============================Mkt. Strat.===============================>|
|<================================Drawings================================+|
|--------------+--------------+--------------+--------------+--------------|
| 22 | 23 | 24 | 25 | 26 |
| | | | | |
| | | | | |
| | | | | |
|+===============================Prototype================================>|
|<==============================Mkt. Strat.===============================+|
|--------------+--------------+--------------+--------------+--------------|
| 29 | 30 | 31 | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
|<================Prototype=================+| | |
----------------------------------------------------------------------------
|
The durations of the activities in the project are multiples of 5. Thus, if work is done only on weekdays, all activities in the project last 0, 1, 2, or 3 weeks. The INTERVAL= option can also be used to set the units of duration to hours, minutes, seconds, years, months, quarters, or weeks. In this example, the data set WIDGWK is created from WIDGET to set the durations in weeks. PROC CPM is then invoked with INTERVAL=WEEK, and the resulting schedule is displayed in Output 4.6.3. Note that the float values are also expressed in units of weeks.
data widgwk;
set widget;
weeks = days / 5;
run;
proc cpm data=widgwk date='1dec03'd interval=week;
activity task;
successor succ1 succ2 succ3;
duration weeks;
id task;
run;
title2 'INTERVAL=WEEK';
proc print;
id task;
var e_: l_: t_float f_float;
run;
Output 4.6.3
Changing Duration Units: INTERVAL=WEEK
01DEC03 |
07DEC03 |
01DEC03 |
07DEC03 |
0 |
0 |
08DEC03 |
21DEC03 |
08DEC03 |
21DEC03 |
0 |
0 |
08DEC03 |
14DEC03 |
19JAN04 |
25JAN04 |
6 |
0 |
08DEC03 |
14DEC03 |
15DEC03 |
21DEC03 |
1 |
1 |
22DEC03 |
11JAN04 |
22DEC03 |
11JAN04 |
0 |
0 |
15DEC03 |
28DEC03 |
26JAN04 |
08FEB04 |
6 |
6 |
12JAN04 |
25JAN04 |
12JAN04 |
25JAN04 |
0 |
0 |
12JAN04 |
25JAN04 |
12JAN04 |
25JAN04 |
0 |
0 |
26JAN04 |
08FEB04 |
26JAN04 |
08FEB04 |
0 |
0 |
09FEB04 |
22FEB04 |
16FEB04 |
29FEB04 |
1 |
1 |
09FEB04 |
29FEB04 |
09FEB04 |
29FEB04 |
0 |
0 |
01MAR04 |
07MAR04 |
01MAR04 |
07MAR04 |
0 |
0 |
08MAR04 |
08MAR04 |
08MAR04 |
08MAR04 |
0 |
0 |
09FEB04 |
09FEB04 |
08MAR04 |
08MAR04 |
4 |
4 |