Cost Analysis (intpme08)

/****************************************************************/
/*          S A S   S A M P L E   L I B R A R Y                 */
/*                                                              */
/*    NAME: INTPME08                                            */
/*   TITLE: Cost Analysis (intpme08)                            */
/* PRODUCT: OR                                                  */
/*  SYSTEM: ALL                                                 */
/*    KEYS:                                                     */
/*   PROCS: CPM, PRINT                                          */
/*    DATA:                                                     */
/*                                                              */
/* SUPPORT:                             UPDATE:                 */
/*     REF: Example 8 from the chapter, Introduction to Project */
/*          Management.                                         */
/*    MISC:                                                     */
/*                                                              */
/****************************************************************/

data survcost;
   format id $20. activity $8. succ1-succ3 $8. ;
   input id & activity & duration succ1 & succ2 & succ3 & 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 = '4jul03'd;
   run;

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

proc cpm date='1jul03'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;

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

data work.update;
   merge survcost actual;
   run;

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

title 'Activity Data Set UPDATE';
proc print data=work.update;
   run;

title 'Resource Data Set COSTAVL2';
proc print data=costavl2;
   run;

proc cpm date='1jul03'd interval=weekday
         data=work.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 = '21jul03'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;

   /* 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=(c=black j=l 'BCWS' 'BCWP' 'ACWP')
        label=(c=black);

axis1 width=2
      order=('1jul03'd to '1aug03'd by week)
      length=60 pct
      value=(c=black)
      label=(c=black);

axis2 width=2
      order=(0 to 12000 by 2000)
      length = 55 pct
      value=(c=black)
      label=(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 c=black h=2.5 'Comparison of Costs';

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