Construction Project (evme02)
/***************************************************************/
/* */
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: evme02 */
/* TITLE: Construction Project (evme02) */
/* PRODUCT: OR */
/* SYSTEM: ALL */
/* KEYS: OR */
/* PROCS: CPM, SORT, Earned Value Macros */
/* DATA: */
/* */
/* SUPPORT: UPDATE: */
/* REF: */
/* MISC: Example 2 from the Earned Value Management Macros */
/* chapter of Project Management. */
/* */
/***************************************************************/
/* Schedule input */
data build;
input activity $ s1 $ s2 $ s3 $ s4 $ dur
cost spct & $32. rate project $7. id & $20.
cranes carpntrs laborers;
datalines;
a . . . . 1 0 0 0 Build House . . .
b . . . . 1 0 0 0 a Landscaping . . .
c . . . . 1 0 0 0 a Drainage . . .
d . . . . 1 0 0 0 a Wiring . . .
e . . . . 1 0 0 0 a Plumbing . . .
f . . . . 1 0 0 0 a Foundation . . .
g . . . . 1 0 0 0 a Roofing . . .
h . . . . 1 0 0 0 a Flooring . . .
A B . . . 4 5250 50 20 f Excavate & Footers 1 2 2
B C E S . 2 1500 25 15 f Pour Foundation 1 2 4
F J . . . 2 950 50 20 f Pour Basement 1 . 4
G K . . . 3 1025 25 30 e Rough Plumbing . . 2
E F G . . 1 1000 25 50 e Basement Plumbing . . .
N . . . . 2 350 25 20 e Finish Plumbing . . .
J K . . . 4 325 50 40 a Heat & Ventilation 1 . .
K L . . . 10 14500 1,2,3,4 20 a Plaster . . .
T . . . . 2 750 25 15 h Varnish Floor . . 3
L M N P . 3 425 50 25 h Finish Flooring . 4 .
H L . . . 2 575 25 45 d Initial Wiring . . .
M V . . . 1 375 25 25 d Kitchen Fixtures . . .
V . . . . 1 550 25 50 d Finish Electrical . . .
P U . . . 3 1450 25 20 d Finish Carpentry . 4 .
Q R . . . 2 725 50 40 g Finish Roof 1 3 .
C D H J Q 4 9500 25 35 g Frame & Roof 1 4 .
D W . . . 6 9500 1,2,3 45 a Brickwork 1 . 2
U T . . . 3 3250 50 30 a Paint . . .
R W . . . 1 1200 50 15 c Gutters & Downspouts 1 . .
S X . . . 1 150 25 15 c Storm Drains 1 2 2
W X . . . 2 425 25 25 b Finish Grading . . 2
X . . . . 5 2475 25 25 b Walks & Landscape 1 2 2
;
proc sort data=build;
by project;
run;
/* Resources */
data breslvl;
input period cranes carpntrs laborers;
datalines;
0 1 5 4
;
/* Produce initial schedule */
proc cpm data=build out=sbout
resin=breslvl resout=bres
date='04SEP10'd;
activity activity;
duration dur;
id id;
successor s1-s4;
project project / addwbs;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp delayanalysis;
run;
/* Rename variables */
data gbsched;
set sbout;
keep id activity dur s_start s_finish wbs_code project
proj_lev;
rename dur=Duration;
rename s_start=Start;
rename s_finish=Finish;
label wbs_code='WBS Code';
label id='Activity';
run;
/* Sort schedule by WBS code */
proc sort data=gbsched;
by wbs_code;
run;
title 'Planned Construction Schedule';
proc print data=gbsched label;
var id wbs_code duration start finish;
run;
/* Show WBS chart */
%evg_wbs_chart(
structure=gbsched,
activity=activity,
project=project,
id=wbs_code id,
rotate=N,
rotatetext=N,
defid=N
);
/* Initial costs */
data gbase;
set build;
keep id activity cost spct rate;
rename spct=SPct;
rename cost=Cost;
label spct='Start Pct./Weights';
label id='Activity';
rename rate=Rate;
run;
title 'Planned Construction Costs';
proc print data=gbase label;
var id cost spct rate;
run;
/* Daily planned value */
title;
%eva_planned_value(
plansched=gbsched,
activity=activity,
start=start,
finish=finish,
budgetcost=gbase,
rate=rate,
cost=cost,
spct=spct,
taskpv=bout,
pv=gbcost
);
title 'Daily Planned Value';
proc print data=gbcost label;
run;
/* Update schedule with actuals */
data actual;
input activity $8. as : date7. af : date7. actcost actrate
pctcomp;
format as af date7.;
datalines;
A 04SEP10 11SEP10 6350 30 100
B 12SEP10 14SEP10 2700 30 100
;
data order;
set build;
retain _seqno_ 0;
_seqno_ = _seqno_ + 1;
run;
proc sort data=order;
by activity;
run;
proc sort data=actual;
by activity;
run;
data build2;
merge actual order;
by activity;
run;
proc sort data=build2;
by _seqno_;
run;
proc cpm data=build2 out=sbout2 resin=breslvl resout=bres
date='04SEP10'd;
activity activity;
duration dur;
id id;
successor s1-s4;
project project / addwbs;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp delayanalysis;
actual / a_start=as a_finish=af timenow='15SEP10'd
pctcomp=pctcomp;
run;
/* Rename variables */
data gasched;
set sbout2;
keep activity id dur s_start s_finish proj_lev wbs_code;
rename dur=a_dur;
rename s_start=Start;
rename s_finish=Finish;
label id='Activity';
label wbs_code='WBS Code';
label dur='Duration';
run;
title 'Updated Construction Schedule';
proc print data=gasched label;
var id wbs_code a_dur start finish;
run;
/* Updated costs */
data gact;
set build2;
keep id activity cost spct rate;
if actrate ne . then do;
rate=actrate;
end;
if actcost ne . then do;
cost=actcost;
end;
label id='Activity';
label rate='Rate';
label cost='Cost';
label spct='Start Pct./Weights';
run;
title 'Updated Construction Costs';
proc print data=gact label;
var id rate cost spct;
run;
/* Daily planned value */
title;
%eva_earned_value(
revisesched=gasched,
activity=activity,
start=start,
finish=finish,
actualcost=gact,
rate=rate,
cost=cost,
spct=spct,
taskpv=bout,
ev=gacost
);
title 'Daily Earned Value and Revised Cost';
proc print data=gacost label;
run;
%eva_metrics(
pv=gbcost,
ev=gacost,
timenow='04SEP10'd '15SEP10'd '01OCT10'd '17OCT10'd
);
/* Produce summary data for 15SEP10 for charts */
%eva_metrics(
pv=gbcost,
ev=gacost,
timenow='15SEP10'd
);
%eva_task_metrics(
activity=id,
plansched=gbsched,
revisesched=gasched,
start=start,
finish=finish,
budgetcost=gbase,
actualcost=gact,
cost=cost,
spct=spct,
rate=rate,
timenow='15SEP10'd,
aggregate=Y
);
%evg_cost_plot;
%evg_schedule_plot;
%evg_index_plot;
%evg_variance_plot;
%evg_gantt_chart(
activity=id,
plansched=gbsched,
revisesched=gasched,
start=start,
finish=finish,
timenow='15SEP10'd,
id=wbs cv sv,
height=3,
scale=40
);