Introduction to Project Management |
Example 1.6: Multiple Projects
Often a project is divided into several subprojects, each of which
is then broken into activities with precedence constraints. For
reporting or accounting purposes, it may be essential to group
activities or to aggregate the information pertaining
to activities in a given group. Sometimes, totally different
projects use a common pool of resources and you may want to schedule
all the projects using the common pool; you may want to vary the
priority with which the resources are allotted to the activities on the
basis of the projects to which they belong. Often, you have
several projects that are essentially the same, with only a few minor
differences; these projects may also share a common pool of resources.
In such cases, you may want to have a project template listing
all the activities and their precedence relationships; for each
specific project you can copy the template, make any modifications that
are necessary for the given scenario, and determine the project
schedule accordingly.
This example illustrates some of these possibilities for a
multiproject scenario. The project is first scheduled using PROC CPM, and
then the PM procedure is used with the same input data set to illustrate
the project displayed in the PM Window.
Output 1.6.1: Network Diagram for Project Book
Consider a publishing company that accepts manuscripts from
different authors for publication. The publication of each book can be
treated as a project. Thus, at a given point in time, several projects,
almost identical in nature, may be in progress. Some of the resources
that may be needed are a technical editor, a copyeditor, and a graphic
artist. All the books that are currently being worked on share
a common pool of these resources. This example uses
a simplified version of
such a scenario to illustrate some of the ways in which you can
handle multiple projects competing for the same pool of resources.
The network in Output 1.6.1 represents some of the
tasks required to publish one book and the precedence constraints
among these tasks; the durations in the diagram are in weeks.
Suppose that
the generic project data are in the data set book, which is
displayed in Output 1.6.2. This data set
is used as a template for creating the Activity data set
for any book publishing project.
Suppose that the company is working on two books simultaneously.
The editor and artist must now allocate their time between the
two books. The following
program uses the template data set book to create Activity
data sets book1 and book2 corresponding to the publication of
each book. Any modifications to the generic project data
can be made in the DATA step or by using PROC PM.
In this example, the duration for the first activity,
`Preliminary Edit', is changed to two weeks for the second
book. The two Activity data sets book1 and book2 are also
displayed in Output 1.6.2.
data book1;
length act $6. succ $6.;
set book;
subproj = "Book 1";
act = "B1"||task;
if succ ^= " " then succ = "B1"||succ;
run;
title 'Publishing Book 1';
proc print data=book1;
var subproj task act succ id dur editor artist;
run;
data book2;
length act $6. succ $6.;
set book;
subproj = "Book 2";
act = "B2"||task;
if act = "B2PEDT" then dur = 2;
if succ ^= " " then succ = "B2"||succ;
run;
title 'Publishing Book 2';
proc print data=book2;
var subproj task act succ id dur editor artist;
run;
Output 1.6.2: Template and Activity Data Sets for Book Publishing Example
Publishing a Book |
Template Data Set |
Obs |
id |
task |
dur |
succ |
editor |
artist |
1 |
Preliminary Edit |
PEDT |
1 |
REV |
1 |
. |
2 |
Preliminary Edit |
PEDT |
1 |
GRPH |
1 |
. |
3 |
Revise Book |
REV |
2 |
CEDT |
1 |
. |
4 |
Graphics |
GRPH |
3 |
CEDT |
. |
1 |
5 |
Copyedit Book |
CEDT |
1 |
PRF |
1 |
. |
6 |
Proofread Book |
PRF |
1 |
PRNT |
1 |
. |
7 |
Print Book |
PRNT |
2 |
|
. |
. |
Obs |
subproj |
task |
act |
succ |
id |
dur |
editor |
artist |
1 |
Book 1 |
PEDT |
B1PEDT |
B1REV |
Preliminary Edit |
1 |
1 |
. |
2 |
Book 1 |
PEDT |
B1PEDT |
B1GRPH |
Preliminary Edit |
1 |
1 |
. |
3 |
Book 1 |
REV |
B1REV |
B1CEDT |
Revise Book |
2 |
1 |
. |
4 |
Book 1 |
GRPH |
B1GRPH |
B1CEDT |
Graphics |
3 |
. |
1 |
5 |
Book 1 |
CEDT |
B1CEDT |
B1PRF |
Copyedit Book |
1 |
1 |
. |
6 |
Book 1 |
PRF |
B1PRF |
B1PRNT |
Proofread Book |
1 |
1 |
. |
7 |
Book 1 |
PRNT |
B1PRNT |
|
Print Book |
2 |
. |
. |
Obs |
subproj |
task |
act |
succ |
id |
dur |
editor |
artist |
1 |
Book 2 |
PEDT |
B2PEDT |
B2REV |
Preliminary Edit |
2 |
1 |
. |
2 |
Book 2 |
PEDT |
B2PEDT |
B2GRPH |
Preliminary Edit |
2 |
1 |
. |
3 |
Book 2 |
REV |
B2REV |
B2CEDT |
Revise Book |
2 |
1 |
. |
4 |
Book 2 |
GRPH |
B2GRPH |
B2CEDT |
Graphics |
3 |
. |
1 |
5 |
Book 2 |
CEDT |
B2CEDT |
B2PRF |
Copyedit Book |
1 |
1 |
. |
6 |
Book 2 |
PRF |
B2PRF |
B2PRNT |
Proofread Book |
1 |
1 |
. |
7 |
Book 2 |
PRNT |
B2PRNT |
|
Print Book |
2 |
. |
. |
|
As a next step, the data sets for the two subprojects are combined to
form an Activity data set for the entire project. A variable
priority
is assigned the value `1' for activities pertaining to the first book and
the value `2' for those pertaining to the second one.
In other words, Book 1 has priority over Book 2.
The Resource data set specifies the availability for each of the
resources to be 1. The input data sets, books and resource,
are displayed in Output 1.6.3.
data books;
set book1 book2;
if subproj = "Book 1" then priority = 1;
else priority = 2;
run;
title 'Publishing Books 1 and 2';
proc print data=books;
var subproj priority task act succ id dur editor artist;
run;
data resource;
input avdate date7. editor artist;
format avdate date7.;
datalines;
1jan99 1 1
;
title 'Resources Available';
proc print data=resource;
run;
Output 1.6.3: Input Data Sets for Book Publishing Example
Obs |
subproj |
priority |
task |
act |
succ |
id |
dur |
editor |
artist |
1 |
Book 1 |
1 |
PEDT |
B1PEDT |
B1REV |
Preliminary Edit |
1 |
1 |
. |
2 |
Book 1 |
1 |
PEDT |
B1PEDT |
B1GRPH |
Preliminary Edit |
1 |
1 |
. |
3 |
Book 1 |
1 |
REV |
B1REV |
B1CEDT |
Revise Book |
2 |
1 |
. |
4 |
Book 1 |
1 |
GRPH |
B1GRPH |
B1CEDT |
Graphics |
3 |
. |
1 |
5 |
Book 1 |
1 |
CEDT |
B1CEDT |
B1PRF |
Copyedit Book |
1 |
1 |
. |
6 |
Book 1 |
1 |
PRF |
B1PRF |
B1PRNT |
Proofread Book |
1 |
1 |
. |
7 |
Book 1 |
1 |
PRNT |
B1PRNT |
|
Print Book |
2 |
. |
. |
8 |
Book 2 |
2 |
PEDT |
B2PEDT |
B2REV |
Preliminary Edit |
2 |
1 |
. |
9 |
Book 2 |
2 |
PEDT |
B2PEDT |
B2GRPH |
Preliminary Edit |
2 |
1 |
. |
10 |
Book 2 |
2 |
REV |
B2REV |
B2CEDT |
Revise Book |
2 |
1 |
. |
11 |
Book 2 |
2 |
GRPH |
B2GRPH |
B2CEDT |
Graphics |
3 |
. |
1 |
12 |
Book 2 |
2 |
CEDT |
B2CEDT |
B2PRF |
Copyedit Book |
1 |
1 |
. |
13 |
Book 2 |
2 |
PRF |
B2PRF |
B2PRNT |
Proofread Book |
1 |
1 |
. |
14 |
Book 2 |
2 |
PRNT |
B2PRNT |
|
Print Book |
2 |
. |
. |
Obs |
avdate |
editor |
artist |
1 |
01JAN99 |
1 |
1 |
|
PROC CPM is then invoked to schedule the project to start on
January 1, 1999. The PROJECT statement is used to indicate the
subproject to which each activity belongs. The data set
bookschd (displayed in Output 1.6.4) contains
the schedule for the entire project. The ADDACT option on the PROC CPM
statement adds observations for each of the subprojects, `Book 1'
and `Book 2', as well as one observation for the entire project.
These observations are added at the end of the list of the observations
corresponding to the observations in the input data set.
The Usage data set booksout is also displayed in Output 1.6.4.
proc cpm data=books resin=resource
out=bookschd resout=booksout
date='1jan99'd interval=week
addact;
act act;
dur dur;
succ succ;
resource editor artist / per=avdate avp rcp
rule=actprty actprty=priority
delayanalysis;
id id task;
project subproj;
run;
Output 1.6.4: Data Sets BOOKSCHD and BOOKSOUT
Schedule for Project BOOKS |
Obs |
subproj |
PROJ_DUR |
PROJ_LEV |
act |
succ |
dur |
id |
task |
editor |
artist |
S_START |
S_FINISH |
E_START |
E_FINISH |
L_START |
L_FINISH |
R_DELAY |
DELAY_R |
SUPPL_R |
1 |
Book 1 |
. |
2 |
B1PEDT |
B1REV |
1 |
Preliminary Edit |
PEDT |
1 |
. |
01JAN99 |
07JAN99 |
01JAN99 |
07JAN99 |
08JAN99 |
14JAN99 |
0 |
|
|
2 |
Book 1 |
. |
2 |
B1PEDT |
B1GRPH |
1 |
Preliminary Edit |
PEDT |
1 |
. |
01JAN99 |
07JAN99 |
01JAN99 |
07JAN99 |
08JAN99 |
14JAN99 |
0 |
|
|
3 |
Book 1 |
. |
2 |
B1REV |
B1CEDT |
2 |
Revise Book |
REV |
1 |
. |
08JAN99 |
21JAN99 |
08JAN99 |
21JAN99 |
22JAN99 |
04FEB99 |
0 |
|
|
4 |
Book 1 |
. |
2 |
B1GRPH |
B1CEDT |
3 |
Graphics |
GRPH |
. |
1 |
08JAN99 |
28JAN99 |
08JAN99 |
28JAN99 |
15JAN99 |
04FEB99 |
0 |
|
|
5 |
Book 1 |
. |
2 |
B1CEDT |
B1PRF |
1 |
Copyedit Book |
CEDT |
1 |
. |
05FEB99 |
11FEB99 |
29JAN99 |
04FEB99 |
05FEB99 |
11FEB99 |
1 |
editor |
|
6 |
Book 1 |
. |
2 |
B1PRF |
B1PRNT |
1 |
Proofread Book |
PRF |
1 |
. |
12FEB99 |
18FEB99 |
05FEB99 |
11FEB99 |
12FEB99 |
18FEB99 |
0 |
|
|
7 |
Book 1 |
. |
2 |
B1PRNT |
|
2 |
Print Book |
PRNT |
. |
. |
19FEB99 |
04MAR99 |
12FEB99 |
25FEB99 |
19FEB99 |
04MAR99 |
0 |
|
|
8 |
Book 2 |
. |
2 |
B2PEDT |
B2REV |
2 |
Preliminary Edit |
PEDT |
1 |
. |
22JAN99 |
04FEB99 |
01JAN99 |
14JAN99 |
01JAN99 |
14JAN99 |
3 |
editor |
|
9 |
Book 2 |
. |
2 |
B2PEDT |
B2GRPH |
2 |
Preliminary Edit |
PEDT |
1 |
. |
22JAN99 |
04FEB99 |
01JAN99 |
14JAN99 |
01JAN99 |
14JAN99 |
3 |
editor |
|
10 |
Book 2 |
. |
2 |
B2REV |
B2CEDT |
2 |
Revise Book |
REV |
1 |
. |
19FEB99 |
04MAR99 |
15JAN99 |
28JAN99 |
22JAN99 |
04FEB99 |
2 |
editor |
|
11 |
Book 2 |
. |
2 |
B2GRPH |
B2CEDT |
3 |
Graphics |
GRPH |
. |
1 |
05FEB99 |
25FEB99 |
15JAN99 |
04FEB99 |
15JAN99 |
04FEB99 |
0 |
|
|
12 |
Book 2 |
. |
2 |
B2CEDT |
B2PRF |
1 |
Copyedit Book |
CEDT |
1 |
. |
05MAR99 |
11MAR99 |
05FEB99 |
11FEB99 |
05FEB99 |
11FEB99 |
0 |
|
|
13 |
Book 2 |
. |
2 |
B2PRF |
B2PRNT |
1 |
Proofread Book |
PRF |
1 |
. |
12MAR99 |
18MAR99 |
12FEB99 |
18FEB99 |
12FEB99 |
18FEB99 |
0 |
|
|
14 |
Book 2 |
. |
2 |
B2PRNT |
|
2 |
Print Book |
PRNT |
. |
. |
19MAR99 |
01APR99 |
19FEB99 |
04MAR99 |
19FEB99 |
04MAR99 |
0 |
|
|
15 |
|
9 |
1 |
Book 1 |
|
. |
|
|
. |
. |
01JAN99 |
04MAR99 |
01JAN99 |
25FEB99 |
08JAN99 |
04MAR99 |
0 |
|
|
16 |
|
10 |
1 |
Book 2 |
|
. |
|
|
. |
. |
22JAN99 |
01APR99 |
01JAN99 |
04MAR99 |
01JAN99 |
04MAR99 |
3 |
|
|
17 |
|
13 |
0 |
|
|
. |
|
|
. |
. |
01JAN99 |
01APR99 |
01JAN99 |
04MAR99 |
01JAN99 |
04MAR99 |
0 |
|
|
Resource Usage for Project BOOKS |
Obs |
_TIME_ |
Reditor |
Aeditor |
Rartist |
Aartist |
1 |
01JAN99 |
1 |
0 |
0 |
1 |
2 |
08JAN99 |
1 |
0 |
1 |
0 |
3 |
15JAN99 |
1 |
0 |
1 |
0 |
4 |
22JAN99 |
1 |
0 |
1 |
0 |
5 |
29JAN99 |
1 |
0 |
0 |
1 |
6 |
05FEB99 |
1 |
0 |
1 |
0 |
7 |
12FEB99 |
1 |
0 |
1 |
0 |
8 |
19FEB99 |
1 |
0 |
1 |
0 |
9 |
26FEB99 |
1 |
0 |
0 |
1 |
10 |
05MAR99 |
1 |
0 |
0 |
1 |
11 |
12MAR99 |
1 |
0 |
0 |
1 |
12 |
19MAR99 |
0 |
1 |
0 |
1 |
13 |
26MAR99 |
0 |
1 |
0 |
1 |
14 |
02APR99 |
0 |
1 |
0 |
1 |
|
Compare the E_START and S_START
schedules (in data set bookschd)
and note that on January 1, the activity
`B1PEDT' for Book1
is scheduled to start while the preliminary editing of book 2
(activity B2PEDT) has
been postponed, due to subproject `Book 1' having priority over
subproject `Book 2'. On January 22, there is no activity
belonging to subproject `Book 1' that demands an editor; thus,
the activity `B2PEDT' is scheduled to start on that day. As a
result, the editor is working on an activity
in the second project for two weeks starting from January 22, 1999;
when `B1CEDT' is ready to start, the editor is
not available, causing a delay in this activity.
Thus, even though
the first book has
priority over the second book, the scheduling algorithm does not
keep a resource waiting for activities in the first project. However,
if you allow activity splitting, you can reclaim the resource for
the first book by allowing activities in the second project to be
split, if necessary. For details regarding the scheduling algorithm
allowing splitting of activities, see Chapter 2, "The CPM Procedure."
Note: The entire project finishes on April 1, 1999;
resource constraints have delayed project completion by four weeks.
The variable R_DELAY in the Schedule data set
bookschd indicates the amount of delay
in weeks caused by resource constraints. The value of R_DELAY
does not include any delay in the activity that is caused by a
resource delay in one of its predecessors. See Example 2.15 in
Chapter 2, "The CPM Procedure" for more details about the
R_DELAY variable.
The output data sets bookschd and booksout
can be used to produce graphical reports of
the schedule and the resource usage. In particular, the Schedule
data set can be used to produce a zoned, time-scaled network diagram
as shown in Output 1.6.5. The program used to produce the network
diagram is shown in the following code.
In this example, only the leaf tasks (those without any subtasks) are
used to draw the network diagram. Further, the activities are aligned
according to the resource-constrained start times and grouped
according to the subproject.
goptions hpos=98 vpos=60;
pattern1 v=e c=green;
pattern2 v=e c=red;
title c=black f=swiss h=4 'Schedule for Project Books';
proc netdraw data=bookschd(where=(proj_dur=.) graphics;
actnet / act=task succ=succ font=swiss
id=(task) nodefid nolabel
xbetween=8 htext=3 pcompress
zone=subproj zonepat zonespace
align=s_start separatearcs;
label subproj = 'Subproject';
run;
Output 1.6.5: Resource Constrained Schedule for Project Books
The same project can also be scheduled using the PM procedure, as shown
below. The resulting PM Window (after sorting the activities by the Early
Schedule) is shown in Output 1.6.6. The advantage with
using PROC PM is that you can use the PM Window to edit the activity
information, such as the durations, resource requirements, and so
forth.
proc pm data=books resin=resource
out=pmsched resout=pmrout
date='1jan99'd interval=week;
act act;
dur dur;
succ succ;
resource editor artist / per=avdate
avp rcp
rule=actprty
actprty=priority
delayanalysis;
id id task;
project subproj;
run;
Output 1.6.6: PM Window on Book Project
Copyright © 1999 by SAS Institute Inc., Cary, NC, USA. All rights reserved.