Chapter Contents
Chapter Contents
Previous
Previous
Next
Next
Introduction to Project Management

Example 1.8: Project Cost Control

Cost control and accounting are important aspects of project management. Cost data for a project may be associated with activities or groups of activities or with resources, such as personnel or equipment. For example, consider a project that consists of several subprojects, each of which is contracted to a different company. From the contracting company's point of view, each subproject can be treated as one cost item; all the company needs to know is how much each subproject is going to cost. On the other hand, another project may contain several activities, each of which requires two types of labor, skilled and unskilled. The cost for each activity in the project may have to be computed on the basis of how much skilled or unskilled labor that activity uses. In this case, activity and project costs are determined from the resources used. Further, for any project, there may be several ways in which costs need to be summarized and accounted for. In addition to determining the cost of each individual activity, you may want to determine periodic budgets for different departments that are involved with the project or compare the actual costs that were incurred with the budgeted costs.

It is easy to set up cost accounting systems using the output data sets produced by PROC CPM, whether costs are associated with activities or with resources. In fact, you can even treat cost as a consumable resource if you can estimate the cost per day for each of the activities (see Chapter 2, "The CPM Procedure," for details on resource allocation and types of resources). This example illustrates such a method for monitoring costs and shows how you can compute some of the standard cost performance measures used in project management.

The following three measures can be used to determine if a project is running on schedule and within budget (see Moder, Phillips, and Davis 1983, for a detailed discussion on project cost control):

Consider the survey example described earlier in this chapter. Suppose that it is possible to estimate the cost per day for each activity in the project. The following data set survcost contains the project data (activity, succ1 -succ3, id, duration) and a variable named cost containing the cost per day in dollars. In order to compute the BCWS for the project, you need to establish a baseline schedule. Suppose the early start schedule computed by PROC CPM is chosen as the baseline schedule. The Resource data set costavl establishes cost as a consumable resource, so that the CPM procedure can be used to accumulate costs (using the CUMUSAGE option).

The following program invokes PROC CPM with the RESOURCE statement and saves the Usage data set in survrout. The variable ecost in this Usage data set contains the cumulative expense incurred for the baseline schedule; this is the same as the budgeted cost of work scheduled (or BCWS) saved in the data set basecost.

   data survcost;
      input id        $ 1-20
            activity  $ 22-29  duration
            succ1     $ 34-41
            succ2     $ 43-50
            succ3     $ 52-59  cost;
      datalines;
Plan Survey          plan sur 4  hire per design q          300
Hire Personnel       hire per 5  trn per                    350
Design Questionnaire design q 3  trn per  select h print q  100
Train Personnel      trn per  3  cond sur                   500
Select Households    select h 3  cond sur                   300
Print Questionnaire  print q  4  cond sur                   250
Conduct Survey       cond sur 10 analyze                    200
Analyze Results      analyze  6                             500
;
   data holidata;
      format hol date7.;
      hol = '3jul98'd;
      run;

   data costavl;
      input per date7. otype $ cost;
      format per date7.;
      datalines;
   .       restype   2
   1jul98  reslevel  12000
   ;

   proc cpm date='1jul98'd interval=weekday
            data=survcost  resin=costavl   holidata=holidata
            out=sched      resout=survrout;
      activity   activity;
      successor  succ1-succ3;
      duration   duration;
      holiday    hol;
      id         id;
      resource   cost / period  = per
                        obstype = otype cumusage;
      run;

   data basecost (keep = _time_ bcws);
      set survrout;
      bcws = ecost;
      run;
Suppose that the project started as planned on July 1, 1998, but some of the activities took longer than planned and some of the cost estimates were found to be incorrect. The following data set, actual, contains updated information: the variables as and af contain the actual start and finish times of the activities that have been completed or are in progress. The variable actcost contains the revised cost per day for each activity. The following program combines this information with the existing project data and saves the result in the data set update, displayed in Output 1.8.1. The Resource data set costavl2 (also displayed in Output 1.8.1) defines cost and actcost as consumable resources.

   data actual;
      input id $ 1-20 as date9. af date9. actcost;
      format as af date7.;
      datalines;
   Plan Survey           1JUL98   8JUL98   275
   Hire Personnel        9JUL98  15JUL98   350
   Design Questionnaire 10JUL98  14JUL98   150
   Train Personnel      16JUL98  17JUL98   800
   Select Households    15JUL98  17JUL98   450
   Print Questionnaire  15JUL98  20JUL98   250
   Conduct Survey       21JUL98   .        200
   ;

   data update;
      merge survcost actual;
      run;

   title 'Activity Data Set UPDATE';
   proc print;
      run;

   data costavl2;
      input per date7. otype $ cost actcost;
      format per date7.;
      datalines;
   .       restype   2      2
   1jul98  reslevel  12000  12000
   ;

   title 'Resource Data Set COSTAVL2';
   proc print;
      run;


Output 1.8.1: Project Cost Control: Progress Update

Activity Data Set UPDATE

Obs id activity duration succ1 succ2 succ3 cost as af actcost
1 Plan Survey plan sur 4 hire per design q   300 01JUL98 08JUL98 275
2 Hire Personnel hire per 5 trn per     350 09JUL98 15JUL98 350
3 Design Questionnaire design q 3 trn per select h print q 100 10JUL98 14JUL98 150
4 Train Personnel trn per 3 cond sur     500 16JUL98 17JUL98 800
5 Select Households select h 3 cond sur     300 15JUL98 17JUL98 450
6 Print Questionnaire print q 4 cond sur     250 15JUL98 20JUL98 250
7 Conduct Survey cond sur 10 analyze     200 21JUL98 . 200
8 Analyze Results analyze 6       500 . . .


Resource Data Set COSTAVL2

Obs per otype cost actcost
1 . restype 2 2
2 01JUL98 reslevel 12000 12000


Next, PROC CPM is used to revise the schedule by using the ACTUAL statement to specify the actual start and finish times and the RESOURCE statement to specify both the budgeted and the actual costs. The resulting schedule is saved in the data set updsched (displayed in Output 1.8.2) and the budgeted and the actual cumulative costs of the project (until the current date) are saved in the data set updtrout. These cumulative costs represent the budgeted cost of work performed (BCWP) and the actual cost of work performed (ACWP), respectively, and are saved in the data set updtcost. The two data sets basecost and updtcost are then merged to create a data set that contains the three measures: bcws, bcwp, and acwp. The resulting data set is displayed in Output 1.8.3.

   proc cpm date='1jul98'd interval=weekday
            data=update    resin=costavl2
            out=updsched   resout=updtrout
            holidata=holidata;
      activity   activity;
      successor  succ1-succ3;
      duration   duration;
      holiday    hol;
      id         id;
      resource   cost actcost / per     = per
                                obstype = otype
                                maxdate = '21jul98'd cumusage;
      actual / a_start=as a_finish=af;
      run;

   title 'Updated Schedule: Data Set UPDSCHED';
   proc print data=updsched;
      run;

   data updtcost (keep = _time_ bcwp acwp);
      set updtrout;
      bcwp = ecost;
      acwp = eactcost;
      run;

   /* Create a combined data set to contain the BCWS, BCWP, ACWP */
   /* per day and the cumulative values for these costs.         */
   data costs;
      merge basecost updtcost;
      run;

   title 'BCWS, BCWP, and ACWP';
   proc print data=costs;
      run;

Output 1.8.2: Project Cost Control: Updated Schedule

Updated Schedule: Data Set UPDSCHED

Obs activity succ1 succ2 succ3 duration STATUS A_DUR id cost actcost A_START A_FINISH S_START S_FINISH E_START E_FINISH L_START L_FINISH
1 plan sur hire per design q   4 Completed 5 Plan Survey 300 275 01JUL98 08JUL98 01JUL98 08JUL98 01JUL98 08JUL98 01JUL98 08JUL98
2 hire per trn per     5 Completed 5 Hire Personnel 350 350 09JUL98 15JUL98 09JUL98 15JUL98 09JUL98 15JUL98 09JUL98 15JUL98
3 design q trn per select h print q 3 Completed 3 Design Questionnaire 100 150 10JUL98 14JUL98 10JUL98 14JUL98 10JUL98 14JUL98 10JUL98 14JUL98
4 trn per cond sur     3 Completed 2 Train Personnel 500 800 16JUL98 17JUL98 16JUL98 17JUL98 16JUL98 17JUL98 16JUL98 17JUL98
5 select h cond sur     3 Completed 3 Select Households 300 450 15JUL98 17JUL98 15JUL98 17JUL98 15JUL98 17JUL98 15JUL98 17JUL98
6 print q cond sur     4 Completed 4 Print Questionnaire 250 250 15JUL98 20JUL98 15JUL98 20JUL98 15JUL98 20JUL98 15JUL98 20JUL98
7 cond sur analyze     10 In Progress . Conduct Survey 200 200 21JUL98 . 21JUL98 03AUG98 21JUL98 03AUG98 21JUL98 03AUG98
8 analyze       6 Pending . Analyze Results 500 . . . 04AUG98 11AUG98 04AUG98 11AUG98 04AUG98 11AUG98



Output 1.8.3: Project Cost Control: BCWS, BCWP, ACWP

BCWS, BCWP, and ACWP

Obs _TIME_ bcws bcwp acwp
1 01JUL98 0 0 0
2 02JUL98 300 300 275
3 06JUL98 600 600 550
4 07JUL98 900 900 825
5 08JUL98 1200 1200 1100
6 09JUL98 1650 1500 1375
7 10JUL98 2100 1850 1725
8 13JUL98 2550 2300 2225
9 14JUL98 3450 2750 2725
10 15JUL98 4350 3200 3225
11 16JUL98 5400 4100 4275
12 17JUL98 6150 5150 5775
13 20JUL98 6650 6200 7275
14 21JUL98 6850 6450 7525
15 22JUL98 7050 . .
16 23JUL98 7250 . .
17 24JUL98 7450 . .
18 27JUL98 7650 . .
19 28JUL98 7850 . .
20 29JUL98 8050 . .
21 30JUL98 8250 . .
22 31JUL98 8450 . .
23 03AUG98 8650 . .
24 04AUG98 9150 . .
25 05AUG98 9650 . .
26 06AUG98 10150 . .
27 07AUG98 10650 . .
28 10AUG98 11150 . .
29 11AUG98 11650 . .


The data set costs, containing the required cost information, is then used as input to PROC GPLOT to produce a plot of the three cumulative cost measures. The plot is shown in Output 1.8.4.

Note: BCWS, BCWP, and ACWP are three of the cost measures used as part of Earned Value Analysis, which is an important component of the Cost/Schedule Control Systems Criteria (referred to as C/SCSC) that was established in 1967 by the Department of Defense (DOD) to standardize the reporting of cost and schedule performance on major contracts. Refer to Fleming (1988) for a detailed discussion of C/SCSC. Similar methods, such as the ones described in this example, can be used to calculate all the relevant measures for analyzing cost and schedule performance.

   /* Plot the cumulative costs */
   data costplot (keep=date dollars id);
      set costs;
      format date date7.;
      date = _time_;
      if bcws ^= . then do;
         dollars = BCWS; id = 1; output;
         end;
      if bcwp ^= . then do;
         dollars = BCWP; id = 2; output;
         end;
      if acwp ^= . then do;
         dollars = ACWP; id = 3; output;
         end;
      run;

   legend1 frame
           value=(f=swiss c=black j=l f=swiss 'BCWS' 'BCWP' 'ACWP')
           label=(f=swiss c=black);

   axis1 width=2
         order=('1jul98'd to '1aug98'd by week)
         length=60 pct
         value=(f=swiss c=black)
         label=(f=swiss c=black);

   axis2 width=2
         order=(0 to 12000 by 2000)
         length = 55 pct
         value=(f=swiss c=black)
         label=(f=swiss c=black);

   symbol1 i=join v=none c=green  w=4 l=1;
   symbol2 i=join v=none c=blue   w=4 l=2;
   symbol3 i=join v=none c=red    w=4 l=3;
   title f=swiss c=black 'Comparison of Costs';

   proc gplot data=costplot;
      plot dollars * date = id / legend=legend1
                                 haxis=axis1
                                 vaxis=axis2;
      run;

Output 1.8.4: Plot of BCWS, BCWP, and ACWP
in8.gif (3600 bytes)

Chapter Contents
Chapter Contents
Previous
Previous
Next
Next
Top
Top

Copyright © 1999 by SAS Institute Inc., Cary, NC, USA. All rights reserved.