%let name=scen3b; filename odsout '.'; goptions device=gif; goptions nodisplay; /* renamed sheet from 'Scenario #3' to 'Scenario3' because of microsoft jett problem */ /* Because of the way the data is arranged in the spreadsheet, this is kinda cumbersome, and you have to do it 1 row at a time... */ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met1 REPLACE; SHEET="'Scenario3$'"; RANGE='A19:N19'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met1; set act_met1 (drop=f2); run; proc transpose data=act_met1 out=act_met1; by f1; run; data act_met1 (keep=month revenue); set act_met1; metric=f1; revenue=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met2 REPLACE; SHEET="'Scenario3$'"; RANGE='A20:N20'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met2; set act_met2 (drop=f2); run; proc transpose data=act_met2 out=act_met2; by f1; run; data act_met2 (keep=month profit); set act_met2; metric=f1; profit=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met3 REPLACE; SHEET="'Scenario3$'"; RANGE='A21:N21'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met3; set act_met3 (drop=f2); run; proc transpose data=act_met3 out=act_met3; by f1; run; data act_met3 (keep=month order_size); set act_met3; metric=f1; order_size=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met4 REPLACE; SHEET="'Scenario3$'"; RANGE='A22:N22'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met4; set act_met4 (drop=f2); run; proc transpose data=act_met4 out=act_met4; by f1; run; data act_met4 (keep=month market_share); set act_met4; metric=f1; market_share=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met5 REPLACE; SHEET="'Scenario3$'"; RANGE='A23:N23'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met5; set act_met5 (drop=f2); run; proc transpose data=act_met5 out=act_met5; by f1; run; data act_met5 (keep=month satisfaction); set act_met5; metric=f1; satisfaction=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met6 REPLACE; SHEET="'Scenario3$'"; RANGE='A24:N24'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met6; set act_met6 (drop=f2); run; proc transpose data=act_met6 out=act_met6; by f1; run; data act_met6 (keep=month on_time); set act_met6; metric=f1; on_time=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_met7 REPLACE; SHEET="'Scenario3$'"; RANGE='A25:N25'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_met7; set act_met7 (drop=f2); run; proc transpose data=act_met7 out=act_met7; by f1; run; data act_met7 (keep=month new_cust); set act_met7; metric=f1; new_cust=col1; month=0; month=(scan(_name_,1,'F')-2); run; data act_met; merge act_met1 act_met2 act_met3 act_met4 act_met5 act_met6 act_met7; run; data act_met; set act_met; if month in (1 2 3) then quarter='Q1'; if month in (4 5 6) then quarter='Q2'; if month in (7 8 9) then quarter='Q3'; if month in (10 11 12) then quarter='Q4'; run; proc sql; create table act_met_sum as select unique quarter, sum(revenue) as revenue, sum(profit) as profit, avg(order_size) as order_size, avg(market_share) as market_share, avg(satisfaction) as satisfaction, avg(on_time) as on_time, sum(new_cust) as new_cust from act_met group by quarter; quit; run; /*-----*/ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met1 REPLACE; SHEET="'Scenario3$'"; RANGE='A68:E68'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met1 out=tgt_met1; by f1; run; data tgt_met1 (keep=quarter revenue); set tgt_met1; metric=f1; revenue=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met2 REPLACE; SHEET="'Scenario3$'"; RANGE='A69:E69'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met2 out=tgt_met2; by f1; run; data tgt_met2 (keep=quarter profit); set tgt_met2; metric=f1; profit=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met3 REPLACE; SHEET="'Scenario3$'"; RANGE='A70:E70'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met3 out=tgt_met3; by f1; run; data tgt_met3 (keep=quarter order_size); set tgt_met3; metric=f1; order_size=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met4 REPLACE; SHEET="'Scenario3$'"; RANGE='A71:E71'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met4 out=tgt_met4; by f1; run; data tgt_met4 (keep=quarter market_share); set tgt_met4; metric=f1; market_share=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met5 REPLACE; SHEET="'Scenario3$'"; RANGE='A72:E72'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met5 out=tgt_met5; by f1; run; data tgt_met5 (keep=quarter satisfaction); set tgt_met5; metric=f1; satisfaction=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met6 REPLACE; SHEET="'Scenario3$'"; RANGE='A73:E73'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met6 out=tgt_met6; by f1; run; data tgt_met6 (keep=quarter on_time); set tgt_met6; metric=f1; on_time=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_met7 REPLACE; SHEET="'Scenario3$'"; RANGE='A74:E74'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_met7 out=tgt_met7; by f1; run; data tgt_met7 (keep=quarter new_cust); set tgt_met7; metric=f1; new_cust=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; data tgt_met; merge tgt_met1 tgt_met2 tgt_met3 tgt_met4 tgt_met5 tgt_met6 tgt_met7; run; proc sql; create table tgt_met_sum as select unique quarter, sum(revenue) as revenue, sum(profit) as profit, avg(order_size) as order_size, avg(market_share) as market_share, avg(satisfaction) as satisfaction, avg(on_time) as on_time, sum(new_cust) as new_cust from tgt_met group by quarter; quit; run; proc datasets; modify act_met_sum; rename revenue = a_revenue; rename profit = a_profit; rename order_size = a_order_size; rename market_share = a_market_share; rename satisfaction = a_satisfaction; rename on_time = a_on_time; rename new_cust = a_new_cust; run; proc datasets; modify tgt_met_sum; rename revenue = t_revenue; rename profit = t_profit; rename order_size = t_order_size; rename market_share = t_market_share; rename satisfaction = t_satisfaction; rename on_time = t_on_time; rename new_cust = t_new_cust; run; data metrics; merge act_met_sum tgt_met_sum; run; proc format; picture kdollar low-high='0009k ' (prefix='$' mult=.001); run; data metrics; set metrics; format a_revenue kdollar.; format a_profit kdollar.; format a_market_share percent6.0; format a_on_time percent6.0; length ev_revenue $ 12; length ev_profit $ 12; length ev_order_size $ 12; length ev_market_share $ 12; length ev_satisfaction $ 12; length ev_on_time $ 12; length ev_new_cust $ 12; /* Evaluation of actual, as a percentage of target */ pct_revenue=a_revenue/t_revenue; if pct_revenue < .6 then ev_revenue='Poor'; else if pct_revenue < .9 then ev_revenue='Satisfactory'; else if pct_revenue >=.9 then ev_revenue='Good'; pct_profit=a_profit/t_profit; if pct_profit < .6 then ev_profit='Poor'; else if pct_profit < .8 then ev_profit='Satisfactory'; else if pct_profit >=.8 then ev_profit='Good'; pct_order_size=a_order_size/t_order_size; if pct_order_size < .5 then ev_order_size='Poor'; else if pct_order_size < .75 then ev_order_size='Satisfactory'; else if pct_order_size >=.75 then ev_order_size='Good'; pct_market_share=a_market_share/t_market_share; if pct_market_share < .65 then ev_market_share='Poor'; else if pct_market_share < .9 then ev_market_share='Satisfactory'; else if pct_market_share >=.9 then ev_market_share='Good'; pct_satisfaction=a_satisfaction/t_satisfaction; if pct_satisfaction < .6 then ev_satisfaction='Poor'; else if pct_satisfaction < .9 then ev_satisfaction='Satisfactory'; else if pct_satisfaction >=.9 then ev_satisfaction='Good'; pct_on_time=a_on_time/t_on_time; if pct_on_time < .6 then ev_on_time='Poor'; else if pct_on_time < .9 then ev_on_time='Satisfactory'; else if pct_on_time >=.9 then ev_on_time='Good'; pct_new_cust=a_new_cust/t_new_cust; if pct_new_cust < .5 then ev_new_cust='Poor'; else if pct_new_cust < .85 then ev_new_cust='Satisfactory'; else if pct_new_cust >=.85 then ev_new_cust='Good'; run; /* This is a missing-value placeholder, to guarantee that all the bar charts use the 2 colors in the same way. */ data foometrics; length ev_revenue $ 12; length ev_profit $ 12; length ev_order_size $ 12; length ev_market_share $ 12; length ev_satisfaction $ 12; length ev_on_time $ 12; length ev_new_cust $ 12; a_revenue=.; a_profit=.; a_order_size=.; a_market_share=.; a_satisfaction=.; a_on_time=.; a_new_cust=.; quarter='Q1'; ev_revenue='Poor'; ev_profit='Poor'; ev_order_size='Poor'; ev_market_share='Poor'; ev_satisfaction='Poor'; ev_on_time='Poor'; ev_new_cust='Poor'; output; ev_revenue='Satisfactory'; ev_profit='Satisfactory'; ev_order_size='Satisfactory'; ev_market_share='Satisfactory'; ev_satisfaction='Satisfactory'; ev_on_time='Satisfactory'; ev_new_cust='Satisfactory'; output; ev_revenue='Good'; ev_profit='Good'; ev_order_size='Good'; ev_market_share='Good'; ev_Good='Good'; ev_on_time='Good'; ev_new_cust='Good'; output; run; data metrics; set metrics foometrics; run; /* Add html charttips */ data metrics; set metrics; length htm_revenue $ 200; length htm_profit $ 200; length htm_order_size $ 200; length htm_market_share $ 200; length htm_satisfaction $ 200; length htm_on_time $ 200; length htm_new_cust $ 200; htm_revenue='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_revenue,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_revenue,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_revenue,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_profit='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_profit,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_profit,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_profit,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_order_size='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_order_size,comma8.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_order_size,comma8.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_order_size,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_market_share='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_market_share,percent6.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_market_share,percent6.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_market_share,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_satisfaction='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_satisfaction,comma5.1))) ||'0D'x|| 'Actual: '|| trim(left(put(a_satisfaction,comma5.1))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_satisfaction,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_on_time='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_on_time,percent6.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_on_time,percent6.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_on_time,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_new_cust='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_new_cust,comma5.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_new_cust,comma5.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_new_cust,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; run; goptions xpixels=980 ypixels=550; goptions gunit=pct htitle=11 ftitle="arial/bo" htext=8.5 ftext="arial"; goptions xpixels=200 ypixels=200; %let green=cxc2e699; %let pink=cxfa9fb5; %let red=cxff0000; %let gray=gray; %let crefgray=graycc; pattern1 v=s c=&green; pattern2 v=s c=&red; pattern3 v=s c=&pink; title "Revenue"; axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_revenue^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_revenue eq 'Good') then color="&green"; else if (ev_revenue eq 'Poor') then color="&red"; else if (ev_revenue eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_revenue; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_revenue; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_revenue; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_revenue subgroup=ev_revenue nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_revenue des="" name="plot16" ; run; /* proc print data=metrics; var quarter a_revenue t_revenue ev_revenue pct_revenue; run; */ title "Profit"; axis1 label=none minor=none major=(h=2) offset=(0,8); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_profit^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_profit eq 'Good') then color="&green"; else if (ev_profit eq 'Poor') then color="&red"; else if (ev_profit eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_profit; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_profit; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_profit; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_profit subgroup=ev_profit nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_profit des="" name="plot17" ; run; /* proc print data=metrics; var quarter a_profit t_profit ev_profit pct_profit; run; */ title "Order Size"; axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_order_size^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_order_size eq 'Good') then color="&green"; else if (ev_order_size eq 'Poor') then color="&red"; else if (ev_order_size eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_order_size; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_order_size; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_order_size; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_order_size subgroup=ev_order_size nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_order_size des="" name="plot2" ; run; /* proc print data=metrics; var quarter a_order_size t_order_size ev_order_size pct_order_size; run; */ title "Market Share"; axis1 label=none minor=none major=(h=2) offset=(0,10); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_market_share^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_market_share eq 'Good') then color="&green"; else if (ev_market_share eq 'Poor') then color="&red"; else if (ev_market_share eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_market_share; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_market_share; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_market_share; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_market_share subgroup=ev_market_share nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_market_share des="" name="plot1" ; run; /* proc print data=metrics; var quarter a_market_share t_market_share ev_market_share pct_market_share; run; */ title "Satisfaction"; axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 5 by 1); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_satisfaction^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_satisfaction eq 'Good') then color="&green"; else if (ev_satisfaction eq 'Poor') then color="&red"; else if (ev_satisfaction eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_satisfaction; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_satisfaction; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_satisfaction; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_satisfaction subgroup=ev_satisfaction nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_satisfaction des="" name="plot5" ; run; /* proc print data=metrics; var quarter a_satisfaction t_satisfaction ev_satisfaction pct_satisfaction; run; */ title "On Time Delivery"; axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 1 by .25); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_on_time^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_on_time eq 'Good') then color="&green"; else if (ev_on_time eq 'Poor') then color="&red"; else if (ev_on_time eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_on_time; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_on_time; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_on_time; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_on_time subgroup=ev_on_time nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_on_time des="" name="plot4" ; run; /* proc print data=metrics; var quarter a_on_time t_on_time ev_on_time pct_on_time; run; */ title "New Customers"; axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,10); data targets; set metrics (where=(t_new_cust^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_new_cust eq 'Good') then color="&green"; else if (ev_new_cust eq 'Poor') then color="&red"; else if (ev_new_cust eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_new_cust; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_new_cust; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_new_cust; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=metrics anno=targets; vbar quarter / discrete type=sum sumvar=a_new_cust subgroup=ev_new_cust nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_new_cust des="" name="plot3" ; run; /* proc print data=metrics; var quarter a_new_cust t_new_cust ev_new_cust pct_new_cust; run; */ /* Revenue by product (rvp) */ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvp1 REPLACE; SHEET="'Scenario3$'"; RANGE='A29:N29'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvp1; set act_rvp1 (drop=f2); run; proc transpose data=act_rvp1 out=act_rvp1; by f1; run; data act_rvp1 (keep=month cabernet); set act_rvp1; product=f1; cabernet=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvp2 REPLACE; SHEET="'Scenario3$'"; RANGE='A30:N30'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvp2; set act_rvp2 (drop=f2); run; proc transpose data=act_rvp2 out=act_rvp2; by f1; run; data act_rvp2 (keep=month zinfandel); set act_rvp2; product=f1; zinfandel=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvp3 REPLACE; SHEET="'Scenario3$'"; RANGE='A31:N31'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvp3; set act_rvp3 (drop=f2); run; proc transpose data=act_rvp3 out=act_rvp3; by f1; run; data act_rvp3 (keep=month merlot); set act_rvp3; product=f1; merlot=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvp4 REPLACE; SHEET="'Scenario3$'"; RANGE='A32:N32'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvp4; set act_rvp4 (drop=f2); run; proc transpose data=act_rvp4 out=act_rvp4; by f1; run; data act_rvp4 (keep=month chardonnay); set act_rvp4; product=f1; chardonnay=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvp5 REPLACE; SHEET="'Scenario3$'"; RANGE='A33:N33'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvp5; set act_rvp5 (drop=f2); run; proc transpose data=act_rvp5 out=act_rvp5; by f1; run; data act_rvp5 (keep=month sauvignan_blanc); set act_rvp5; product=f1; sauvignan_blanc=col1; month=0; month=(scan(_name_,1,'F')-2); run; data act_rvp; merge act_rvp1 act_rvp2 act_rvp3 act_rvp4 act_rvp5; run; data act_rvp; set act_rvp; if month in (1 2 3) then quarter='Q1'; if month in (4 5 6) then quarter='Q2'; if month in (7 8 9) then quarter='Q3'; if month in (10 11 12) then quarter='Q4'; run; proc sql; create table act_rvp_sum as select unique quarter, sum(cabernet) as cabernet, sum(zinfandel) as zinfandel, sum(merlot) as merlot, sum(chardonnay) as chardonnay, sum(sauvignan_blanc) as sauvignan_blanc from act_rvp group by quarter; quit; run; /*-----*/ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvp1 REPLACE; SHEET="'Scenario3$'"; RANGE='A77:E77'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvp1 out=tgt_rvp1; by f1; run; data tgt_rvp1 (keep=quarter cabernet); set tgt_rvp1; product=f1; cabernet=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvp2 REPLACE; SHEET="'Scenario3$'"; RANGE='A78:E78'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvp2 out=tgt_rvp2; by f1; run; data tgt_rvp2 (keep=quarter zinfandel); set tgt_rvp2; product=f1; zinfandel=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvp3 REPLACE; SHEET="'Scenario3$'"; RANGE='A79:E79'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvp3 out=tgt_rvp3; by f1; run; data tgt_rvp3 (keep=quarter merlot); set tgt_rvp3; product=f1; merlot=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvp4 REPLACE; SHEET="'Scenario3$'"; RANGE='A80:E80'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvp4 out=tgt_rvp4; by f1; run; data tgt_rvp4 (keep=quarter chardonnay); set tgt_rvp4; product=f1; chardonnay=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvp5 REPLACE; SHEET="'Scenario3$'"; RANGE='A81:E81'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvp5 out=tgt_rvp5; by f1; run; data tgt_rvp5 (keep=quarter sauvignan_blanc); set tgt_rvp5; product=f1; sauvignan_blanc=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; data tgt_rvp; merge tgt_rvp1 tgt_rvp2 tgt_rvp3 tgt_rvp4 tgt_rvp5; run; proc sql; create table tgt_rvp_sum as select unique quarter, sum(cabernet) as cabernet, sum(zinfandel) as zinfandel, sum(merlot) as merlot, sum(chardonnay) as chardonnay, sum(sauvignan_blanc) as sauvignan_blanc from tgt_rvp group by quarter; quit; run; proc datasets; modify act_rvp_sum; rename cabernet = a_cabernet; rename zinfandel = a_zinfandel; rename merlot = a_merlot; rename chardonnay = a_chardonnay; rename sauvignan_blanc = a_sauvignan_blanc; run; proc datasets; modify tgt_rvp_sum; rename cabernet = t_cabernet; rename zinfandel = t_zinfandel; rename merlot = t_merlot; rename chardonnay = t_chardonnay; rename sauvignan_blanc = t_sauvignan_blanc; run; data products; merge act_rvp_sum tgt_rvp_sum; run; proc format; picture kdollar low-high='0009k ' (prefix='$' mult=.001); run; data products; set products; format a_cabernet kdollar.; format a_zinfandel kdollar.; format a_merlot kdollar.; format a_chardonnay kdollar.; format a_sauvignan_blanc kdollar.; length ev_cabernet $ 12; length ev_zinfandel $ 12; length ev_merlot $ 12; length ev_chardonnay $ 12; length ev_sauvignan_blanc $ 12; /* Evaluation of actual, as a percentage of target */ pct_cabernet=a_cabernet/t_cabernet; if pct_cabernet < .6 then ev_cabernet='Poor'; else if pct_cabernet < .9 then ev_cabernet='Satisfactory'; else if pct_cabernet >=.9 then ev_cabernet='Good'; pct_zinfandel=a_zinfandel/t_zinfandel; if pct_zinfandel < .6 then ev_zinfandel='Poor'; else if pct_zinfandel < .9 then ev_zinfandel='Satisfactory'; else if pct_zinfandel >=.9 then ev_zinfandel='Good'; pct_merlot=a_merlot/t_merlot; if pct_merlot < .6 then ev_merlot='Poor'; else if pct_merlot < .9 then ev_merlot='Satisfactory'; else if pct_merlot >=.9 then ev_merlot='Good'; pct_chardonnay=a_chardonnay/t_chardonnay; if pct_chardonnay < .6 then ev_chardonnay='Poor'; else if pct_chardonnay < .9 then ev_chardonnay='Satisfactory'; else if pct_chardonnay >=.9 then ev_chardonnay='Good'; pct_sauvignan_blanc =a_sauvignan_blanc /t_sauvignan_blanc ; if pct_sauvignan_blanc < .6 then ev_sauvignan_blanc ='Poor'; else if pct_sauvignan_blanc < .9 then ev_sauvignan_blanc ='Satisfactory'; else if pct_sauvignan_blanc >=.9 then ev_sauvignan_blanc ='Good'; run; /* This is a missing-value placeholder, to guarantee that all the bar charts use the 2 colors in the same way. */ data fooproducts; length ev_cabernet $ 12; length ev_zinfandel $ 12; length ev_merlot $ 12; length ev_chardonnay $ 12; length ev_sauvignan_blanc $ 12; a_cabernet=.; a_zinfandel=.; a_merlot=.; a_chardonnay=.; a_sauvignan_blanc =.; quarter='Q1'; ev_cabernet='Poor'; ev_zinfandel='Poor'; ev_merlot='Poor'; ev_chardonnay='Poor'; ev_sauvignan_blanc ='Poor'; output; ev_cabernet='Satisfactory'; ev_zinfandel='Satisfactory'; ev_merlot='Satisfactory'; ev_chardonnay='Satisfactory'; ev_sauvignan_blanc ='Satisfactory'; output; ev_cabernet='Good'; ev_zinfandel='Good'; ev_merlot='Good'; ev_chardonnay='Good'; ev_sauvignan_blanc ='Good'; output; run; data products; set products fooproducts; run; /* Add html charttips */ data products; set products; length htm_cabernet $ 200; length htm_zinfandel $ 200; length htm_merlot $ 200; length htm_chardonnay $ 200; length htm_sauvignan_blanc $ 200; htm_cabernet='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_cabernet,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_cabernet,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_cabernet,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_zinfandel='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_zinfandel,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_zinfandel,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_zinfandel,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_merlot='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_merlot,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_merlot,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_merlot,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_chardonnay='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_chardonnay,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_chardonnay,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_chardonnay,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_sauvignan_blanc ='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_sauvignan_blanc,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_sauvignan_blanc,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_sauvignan_blanc ,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; run; goptions xpixels=980 ypixels=550; goptions xpixels=200 ypixels=200; %let green=cxc2e699; %let pink=cxfa9fb5; %let red=cxff0000; %let gray=gray; pattern1 v=s c=&green; pattern2 v=s c=&red; pattern3 v=s c=&pink; /* Use this axis for all the wine product charts */ axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 125000 by 25000); title "Cabernet"; * axis1 label=none minor=none major=(h=2) offset=(0,0) ; axis2 label=none offset=(8,10); data targets; set products (where=(t_cabernet^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_cabernet eq 'Good') then color="&green"; else if (ev_cabernet eq 'Poor') then color="&red"; else if (ev_cabernet eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_cabernet; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_cabernet; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_cabernet; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_cabernet subgroup=ev_cabernet nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_cabernet des="" name="plot7" ; run; /* proc print data=products; var quarter a_cabernet t_cabernet ev_cabernet pct_cabernet; run; */ title "Zinfandel"; * axis1 label=none minor=none major=(h=2) offset=(0,0) ; axis2 label=none offset=(8,10); data targets; set products (where=(t_zinfandel^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_zinfandel eq 'Good') then color="&green"; else if (ev_zinfandel eq 'Poor') then color="&red"; else if (ev_zinfandel eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_zinfandel; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_zinfandel; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_zinfandel; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_zinfandel subgroup=ev_zinfandel nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_zinfandel des="" name="plot10" ; run; /* proc print data=products; var quarter a_zinfandel t_zinfandel ev_zinfandel pct_zinfandel; run; */ title "Merlot"; * axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 40000 by 10000); axis2 label=none offset=(8,10); data targets; set products (where=(t_merlot^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_merlot eq 'Good') then color="&green"; else if (ev_merlot eq 'Poor') then color="&red"; else if (ev_merlot eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_merlot; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_merlot; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_merlot; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_merlot subgroup=ev_merlot nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_merlot des="" name="plot8" ; run; /* proc print data=products; var quarter a_merlot t_merlot ev_merlot pct_merlot; run; */ title "Chardonnay"; * axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 125000 by 25000); axis2 label=none offset=(8,10); data targets; set products (where=(t_chardonnay^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_chardonnay eq 'Good') then color="&green"; else if (ev_chardonnay eq 'Poor') then color="&red"; else if (ev_chardonnay eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_chardonnay; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_chardonnay; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_chardonnay; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_chardonnay subgroup=ev_chardonnay nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_chardonnay des="" name="plot6" ; run; /* proc print data=products; var quarter a_chardonnay t_chardonnay ev_chardonnay pct_chardonnay; run; */ title "Sauvignan Blanc "; * axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,10); data targets; set products (where=(t_sauvignan_blanc ^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_sauvignan_blanc eq 'Good') then color="&green"; else if (ev_sauvignan_blanc eq 'Poor') then color="&red"; else if (ev_sauvignan_blanc eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_sauvignan_blanc ; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_sauvignan_blanc ; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_sauvignan_blanc; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_sauvignan_blanc subgroup=ev_sauvignan_blanc nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_sauvignan_blanc des="" name="plot9" ; run; /* proc print data=products; var quarter a_sauvignan_blanc t_sauvignan_blanc ev_sauvignan_blanc pct_sauvignan_blanc ; run; */ /* Revenue by region (rvr) */ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvr1 REPLACE; SHEET="'Scenario3$'"; RANGE='A37:N37'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvr1; set act_rvr1 (drop=f2); run; proc transpose data=act_rvr1 out=act_rvr1; by f1; run; data act_rvr1 (keep=month namerica); set act_rvr1; product=f1; namerica=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvr2 REPLACE; SHEET="'Scenario3$'"; RANGE='A38:N38'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvr2; set act_rvr2 (drop=f2); run; proc transpose data=act_rvr2 out=act_rvr2; by f1; run; data act_rvr2 (keep=month europe); set act_rvr2; product=f1; europe=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvr3 REPLACE; SHEET="'Scenario3$'"; RANGE='A39:N39'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvr3; set act_rvr3 (drop=f2); run; proc transpose data=act_rvr3 out=act_rvr3; by f1; run; data act_rvr3 (keep=month asia); set act_rvr3; product=f1; asia=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvr4 REPLACE; SHEET="'Scenario3$'"; RANGE='A40:N40'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvr4; set act_rvr4 (drop=f2); run; proc transpose data=act_rvr4 out=act_rvr4; by f1; run; data act_rvr4 (keep=month samerica); set act_rvr4; product=f1; samerica=col1; month=0; month=(scan(_name_,1,'F')-2); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=act_rvr5 REPLACE; SHEET="'Scenario3$'"; RANGE='A41:N41'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; data act_rvr5; set act_rvr5 (drop=f2); run; proc transpose data=act_rvr5 out=act_rvr5; by f1; run; data act_rvr5 (keep=month mideast); set act_rvr5; product=f1; mideast=col1; month=0; month=(scan(_name_,1,'F')-2); run; data act_rvr; merge act_rvr1 act_rvr2 act_rvr3 act_rvr4 act_rvr5; run; data act_rvr; set act_rvr; if month in (1 2 3) then quarter='Q1'; if month in (4 5 6) then quarter='Q2'; if month in (7 8 9) then quarter='Q3'; if month in (10 11 12) then quarter='Q4'; run; proc sql; create table act_rvr_sum as select unique quarter, sum(namerica) as namerica, sum(europe) as europe, sum(asia) as asia, sum(samerica) as samerica, sum(mideast) as mideast from act_rvr group by quarter; quit; run; /*-----*/ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvr1 REPLACE; SHEET="'Scenario3$'"; RANGE='A84:E84'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvr1 out=tgt_rvr1; by f1; run; data tgt_rvr1 (keep=quarter namerica); set tgt_rvr1; product=f1; namerica=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvr2 REPLACE; SHEET="'Scenario3$'"; RANGE='A85:E85'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvr2 out=tgt_rvr2; by f1; run; data tgt_rvr2 (keep=quarter europe); set tgt_rvr2; product=f1; europe=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvr3 REPLACE; SHEET="'Scenario3$'"; RANGE='A86:E86'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvr3 out=tgt_rvr3; by f1; run; data tgt_rvr3 (keep=quarter asia); set tgt_rvr3; product=f1; asia=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvr4 REPLACE; SHEET="'Scenario3$'"; RANGE='A87:E87'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvr4 out=tgt_rvr4; by f1; run; data tgt_rvr4 (keep=quarter samerica); set tgt_rvr4; product=f1; samerica=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=tgt_rvr5 REPLACE; SHEET="'Scenario3$'"; RANGE='A88:E88'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc transpose data=tgt_rvr5 out=tgt_rvr5; by f1; run; data tgt_rvr5 (keep=quarter mideast); set tgt_rvr5; product=f1; mideast=col1; quarter='Q'||trim(left((scan(_name_,1,'F')-1))); run; data tgt_rvr; merge tgt_rvr1 tgt_rvr2 tgt_rvr3 tgt_rvr4 tgt_rvr5; run; proc sql; create table tgt_rvr_sum as select unique quarter, sum(namerica) as namerica, sum(europe) as europe, sum(asia) as asia, sum(samerica) as samerica, sum(mideast) as mideast from tgt_rvr group by quarter; quit; run; proc datasets; modify act_rvr_sum; rename namerica = a_namerica; rename europe = a_europe; rename asia = a_asia; rename samerica = a_samerica; rename mideast = a_mideast; run; proc datasets; modify tgt_rvr_sum; rename namerica = t_namerica; rename europe = t_europe; rename asia = t_asia; rename samerica = t_samerica; rename mideast = t_mideast; run; data products; merge act_rvr_sum tgt_rvr_sum; run; proc format; picture kdollar low-high='0009k ' (prefix='$' mult=.001); run; data products; set products; format a_namerica kdollar.; format a_europe kdollar.; format a_asia kdollar.; format a_samerica kdollar.; format a_mideast kdollar.; length ev_namerica $ 12; length ev_europe $ 12; length ev_asia $ 12; length ev_samerica $ 12; length ev_mideast $ 12; /* Evaluation of actual, as a percentage of target */ pct_namerica=a_namerica/t_namerica; if pct_namerica < .6 then ev_namerica='Poor'; else if pct_namerica < .9 then ev_namerica='Satisfactory'; else if pct_namerica >=.9 then ev_namerica='Good'; pct_europe=a_europe/t_europe; if pct_europe < .6 then ev_europe='Poor'; else if pct_europe < .9 then ev_europe='Satisfactory'; else if pct_europe >=.9 then ev_europe='Good'; pct_asia=a_asia/t_asia; if pct_asia < .6 then ev_asia='Poor'; else if pct_asia < .9 then ev_asia='Satisfactory'; else if pct_asia >=.9 then ev_asia='Good'; pct_samerica=a_samerica/t_samerica; if pct_samerica < .6 then ev_samerica='Poor'; else if pct_samerica < .9 then ev_samerica='Satisfactory'; else if pct_samerica >=.9 then ev_samerica='Good'; pct_mideast =a_mideast /t_mideast ; if pct_mideast < .6 then ev_mideast ='Poor'; else if pct_mideast < .9 then ev_mideast ='Satisfactory'; else if pct_mideast >=.9 then ev_mideast ='Good'; run; /* This is a missing-value placeholder, to guarantee that all the bar charts use the 2 colors in the same way. */ data fooproducts; length ev_namerica $ 12; length ev_europe $ 12; length ev_asia $ 12; length ev_samerica $ 12; length ev_mideast $ 12; a_namerica=.; a_europe=.; a_asia=.; a_samerica=.; a_mideast =.; quarter='Q1'; ev_namerica='Poor'; ev_europe='Poor'; ev_asia='Poor'; ev_samerica='Poor'; ev_mideast ='Poor'; output; ev_namerica='Satisfactory'; ev_europe='Satisfactory'; ev_asia='Satisfactory'; ev_samerica='Satisfactory'; ev_mideast ='Satisfactory'; output; ev_namerica='Good'; ev_europe='Good'; ev_asia='Good'; ev_samerica='Good'; ev_mideast ='Good'; output; run; data products; set products fooproducts; run; /* Add html charttips */ data products; set products; length htm_namerica $ 200; length htm_europe $ 200; length htm_asia $ 200; length htm_samerica $ 200; length htm_mideast $ 200; htm_namerica='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_namerica,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_namerica,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_namerica,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_europe='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_europe,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_europe,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_europe,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_asia='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_asia,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_asia,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_asia,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_samerica='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_samerica,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_samerica,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_samerica,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; htm_mideast ='title='||quote( 'Quarter: '|| trim(left(quarter)) ||'0D'x|| 'Target: '|| trim(left(put(t_mideast,dollar12.0))) ||'0D'x|| 'Actual: '|| trim(left(put(a_mideast,dollar12.0))) ||'0D'x|| 'Actual as Percent of Target: '|| trim(left(put(pct_mideast ,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; run; goptions xpixels=980 ypixels=550; goptions xpixels=200 ypixels=200; %let green=cxc2e699; %let pink=cxfa9fb5; %let red=cxff0000; %let gray=gray; pattern1 v=s c=&green; pattern2 v=s c=&red; pattern3 v=s c=&pink; /* Use the same axis for all regions */ axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 125000 by 25000); title "North America"; * axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 125000 by 25000); axis2 label=none offset=(8,10); data targets; set products (where=(t_namerica^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_namerica eq 'Good') then color="&green"; else if (ev_namerica eq 'Poor') then color="&red"; else if (ev_namerica eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_namerica; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_namerica; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_namerica; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_namerica subgroup=ev_namerica nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_namerica des="" name="plot11" ; run; /* proc print data=products; var quarter a_namerica t_namerica ev_namerica pct_namerica; run; */ title "Europe"; * axis1 label=none minor=none major=(h=2) offset=(0,0) ; axis2 label=none offset=(8,10); data targets; set products (where=(t_europe^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_europe eq 'Good') then color="&green"; else if (ev_europe eq 'Poor') then color="&red"; else if (ev_europe eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_europe; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_europe; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_europe; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_europe subgroup=ev_europe nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_europe des="" name="plot13" ; run; /* proc print data=products; var quarter a_europe t_europe ev_europe pct_europe; run; */ title "Asia"; * axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,10); data targets; set products (where=(t_asia^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_asia eq 'Good') then color="&green"; else if (ev_asia eq 'Poor') then color="&red"; else if (ev_asia eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_asia; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_asia; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_asia; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_asia subgroup=ev_asia nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_asia des="" name="plot12" ; run; /* proc print data=products; var quarter a_asia t_asia ev_asia pct_asia; run; */ title "South America"; * axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,10); data targets; set products (where=(t_samerica^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_samerica eq 'Good') then color="&green"; else if (ev_samerica eq 'Poor') then color="&red"; else if (ev_samerica eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_samerica; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_samerica; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_samerica; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_samerica subgroup=ev_samerica nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_samerica des="" name="plot15" ; run; /* proc print data=products; var quarter a_samerica t_samerica ev_samerica pct_samerica; run; */ title "Middle East"; * axis1 label=none minor=none major=(h=2) offset=(0,0) order=(0 to 20000 by 5000); axis2 label=none offset=(8,10); data targets; set products (where=(t_mideast ^=.)); length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (ev_mideast eq 'Good') then color="&green"; else if (ev_mideast eq 'Poor') then color="&red"; else if (ev_mideast eq 'Satisfactory') then color="&pink"; xsys='2'; ysys='2'; midpoint=quarter; y=t_mideast ; size=.01; output; xsys='7'; x=9; size=4; output; style='markere'; color="&gray"; xsys='2'; ysys='2'; midpoint=quarter; y=t_mideast ; size=.01; output; xsys='7'; x=9; size=4; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="&gray"; function='move'; midpoint=quarter; y=t_mideast; output; function='draw'; xsys='7'; x=6; output; function='draw'; xsys='7'; x=-12; output; run; proc gchart data=products anno=targets; vbar quarter / discrete type=sum sumvar=a_mideast subgroup=ev_mideast nolegend raxis=axis1 maxis=axis2 autoref cref=&crefgray clipref coutline=&gray width=14 space=14 html=htm_mideast des="" name="plot14" ; run; /* proc print data=products; var quarter a_mideast t_mideast ev_mideast pct_mideast ; run; */ /* Pipeline Revenue by region (rvr) */ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=pip_rgn REPLACE; SHEET="'Scenario3$'"; RANGE='A59:E63'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc sort data=pip_rgn out=pip_rgn; by f1; run; proc datasets; modify pip_rgn; rename f1 = Region; rename f2 = P1; rename f3 = P2; rename f4 = P3; rename f5 = P4; run; proc transpose data=pip_rgn out=pip_rgn; by Region; run; data pip_rgn; set pip_rgn (drop = _label_); run; proc datasets; modify pip_rgn; rename _name_ = Probability; rename col1 = amount; run; proc format; picture kdollar low-high='0009k ' (prefix='$' mult=.001); run; data pip_rgn; set pip_rgn; format amount kdollar.; if probability eq 'P1' then psale=.9; if probability eq 'P2' then psale=.75; if probability eq 'P3' then psale=.5; if probability eq 'P4' then psale=.25; length htm_pip $ 200; htm_pip='title='||quote( 'Region: '|| trim(left(region)) ||'0D'x|| 'Amount in Pipeline: '|| trim(left(put(amount,dollar12.0))) ||'0D'x|| 'Probability of Closing Sale: '|| trim(left(put(psale,percent6.0))) ) ||' '|| 'href="scenario3.xls"'; run; %let c1=cx2171b5; %let c2=cx6baed6; %let c3=cxbdd7e7; %let c4=cxeff3ff; %let gray=graybb; pattern1 v=s c=&c1; pattern2 v=s c=&c2; pattern3 v=s c=&c3; pattern4 v=s c=&c4; /* Fake a legend using annotate */ data legnanno; length function color $ 8 style $ 12 position $ 1 text $ 50; retain xsys ysys '3' hsys '3' when 'a'; function='label'; style="marker"; text='U'; size=10; position='5'; x=83; y=60; color="&c4"; output; y=y-12; color="&c3"; output; y=y-12; color="&c2"; output; y=y-12; color="&c1"; output; style="markere"; text='U'; size=10; position='5'; color="&gray"; x=83; y=60; output; y=y-12; output; y=y-12; output; y=y-12; output; style='"arial"'; size=8; position='6'; color='black'; x=87; y=61; text="25%"; output; y=y-12; text="50%"; output; y=y-12; text="75%"; output; y=y-12; text="90%"; output; function='label'; position='5'; style='"arial"'; size=9; x=87; y=85; text='Probability'; output; x=87; y=76; text='of Sale'; output; run; goptions xpixels=300 ypixels=200; axis1 label=none minor=none major=(h=2) offset=(0,0); axis2 label=none offset=(8,8) value=(j=right); title "Sales Pipeline"; title2 a=-90 h=30pct " "; /* footnote color=&gray box=1 bcolor=&gray c=black "Probability: " c=&c1 f=marker "U" f="arial" c=black "90% " c=&c2 f=marker "U" f="arial" c=black "75% " c=&c3 f=marker "U" f="arial" c=black "50% " c=&c4 f=marker "U" f="arial" c=black "25%" ; */ proc gchart data=pip_rgn anno=legnanno; hbar region / discrete type=sum sumvar=amount subgroup=probability nolegend autoref cref=&crefgray clipref raxis=axis1 maxis=axis2 coutline=&gray width=14 space=14 nostats descending html=htm_pip des="" name="plot18" ; run; /* proc print data=pip_rgn; run; */ /* Pipeline Revenue by region (rvr) */ PROC IMPORT DATAFILE= "scenario3.xls" DBMS=EXCEL OUT=custsale REPLACE; SHEET="'Scenario3$'"; RANGE='A44:D53'; GETNAMES=NO; MIXED=NO; SCANTEXT=YES; RUN; proc sort data=custsale out=custsale; by f1; run; proc datasets; modify custsale; rename f1 = Customer; rename f2 = cPipe; rename f3 = bQTD; rename f4 = YTD; run; data custsale (drop=ytd); set custsale; aYTDmQTD=YTD-bQTD; run; proc transpose data=custsale out=custsale; by Customer; run; data custsale; set custsale (drop = _label_); run; proc datasets; modify custsale; rename _name_ = chunk; rename col1 = amount; run; proc format; picture kdollar low-high='0009k ' (prefix='$' mult=.001); run; data custsale; set custsale; format amount kdollar.; length description $ 100; if chunk eq 'cPipe' then description='In the pipeline.'; else if chunk eq 'bQTD' then description='Quarter-to-date.'; else if chunk eq 'aYTDmQTD' then description='Year-to-date minus Quarter-to-date.'; length htm_cust $ 200; htm_cust='title='||quote( 'Customer: '|| trim(left(customer)) ||'0D'x|| 'Amount: '|| trim(left(put(amount,dollar12.0))) ||'0D'x|| 'Description: '|| trim(left(description)) ) ||' '|| 'href="scenario3.xls"'; run; %let d1=cx2171b5; %let d2=cx2171b5; %let d3=cxeff3ff; %let gray=graybb; /* bar segment legend */ data legend3; length function $8 color style $12 text $30; xsys='3'; ysys='3'; hsys='3'; when='A'; color="&c1"; style='msolid'; function='poly'; x=85; y=20; output; function='polycont'; x=x+4; output; y=y+30; output; x=x-4; output; y=y-30; output; color="&d2"; function='poly'; x=85; y=50; output; function='polycont'; x=x+4; output; y=y+10; output; x=x-4; output; y=y-10; output; color="&d3"; function='poly'; x=85; y=60; output; function='polycont'; x=x+4; output; y=y+10; output; x=x-4; output; y=y-10; output; color="&gray"; size=.1; function='move'; x=85; y=20; output; function='draw'; x=x+4; output; y=y+30; output; x=x-4; output; y=y-30; output; function='move'; x=85; y=50; output; function='draw'; x=x+4; output; y=y+10; output; x=x-4; output; y=y-10; output; function='move'; x=85; y=60; output; function='draw'; x=x+4; output; y=y+10; output; x=x-4; output; y=y-10; output; color='gray99'; function='move'; x=90.6; y=61; output; function='draw'; y=y+8; output; function='move'; x=90.6; y=51; output; function='draw'; y=y+8; output; function='move'; x=83.4; y=20; output; function='draw'; y=y+39; output; function='label'; position='6'; style='centx'; color='gray99'; style='"arial"'; size=8; color='black'; x=92; y=66.5; text='Pipe'; output; x=92; y=57; text='QTD'; output; x=77; y=41; text='YTD'; output; /* Then add some legend labels */ function='label'; position='5'; style='"arial"'; size=9; x=86; y=87; text='Bar'; output; x=86; y=78; text='Segments'; output; run; pattern1 v=s c=&d1; pattern2 v=s c=&d2; pattern3 v=s c=&d3; goptions xpixels=400 ypixels=200; axis1 label=none minor=none major=(number=4 h=2) offset=(0,0); axis2 label=none offset=(5,5) value=(j=right); title "Top 10 Customers"; title2 a=-90 h=40pct " "; footnote; proc gchart data=custsale anno=legend3; hbar customer / discrete type=sum sumvar=amount subgroup=chunk autoref cref=&crefgray clipref raxis=axis1 maxis=axis2 coutline=&gray width=14 space=14 nostats nolegend descending html=htm_cust des="" name="plot19" ; run; /* proc print data=custsale; run; */ /* Annotate a title and legend at the top/right of the page */ %let gray=gray; data titlanno; length function color $ 8 style $ 12 position $ 1 text $ 50; retain xsys ysys '3' hsys '3' when 'a'; function='label'; position='5'; x=75; y=97; color='black'; size=4; style='"arial/bo"'; text='Sales Dashboard'; output; x=75; y=93; color='black'; size=2.5; style='"arial"'; text='(All currency in US $)'; output; x=75; y=89; color='black'; size=2.5; style='"arial"'; text='19dec2004'; output; style="marker"; text='U'; size=2; x=44; y=84; color="&red"; output; y=y+3; color="&pink"; output; y=y+3; color="&green"; output; y=y+3; color="gray"; size=1.5; text='A'; output; style="markere"; text='U'; size=2; x=44; y=84; color="&gray"; output; y=y+3; color="&gray"; output; y=y+3; color="&gray"; output; style='"arial"'; size=1.75; color="black"; position='6'; x=45.5; y=84.3; text="Poor"; output; y=y+3; text="Satisfactory"; output; y=y+3; text="Good"; output; y=y+3; text="Target"; output; run; goptions xpixels=900 ypixels=800; title; footnote; proc gslide des="" name="titles" anno=titlanno; run; GOPTIONS DEVICE=gif; goptions display; goptions xpixels=900 ypixels=800; goptions cback=grayee; ODS LISTING CLOSE; ODS HTML path=odsout body="&name..htm" (title="Scenario 3 (Sales Dashboard)") style=minimal ; goptions border; /* *** Now, put it all together onto one page, using proc greplay */ %let greout=white; proc greplay tc=tempcat nofs igout=work.gseg; tdef dashbrd des='Dashboard' /* Top Row (plot16 & plot17 */ 16/llx = 0 lly = 80 ulx = 0 uly =100 urx =20 ury =100 lrx =20 lry = 80 17/llx =20 lly = 80 ulx =20 uly =100 urx =40 ury =100 lrx =40 lry = 80 1/llx = 0 lly = 60 ulx = 0 uly = 79 urx =20 ury = 79 lrx =20 lry = 60 2/llx =20 lly = 60 ulx =20 uly = 79 urx =40 ury = 79 lrx =40 lry = 60 3/llx =40 lly = 60 ulx =40 uly = 79 urx =60 ury = 79 lrx =60 lry = 60 4/llx =60 lly = 60 ulx =60 uly = 79 urx =80 ury = 79 lrx =80 lry = 60 5/llx =80 lly = 60 ulx =80 uly = 79 urx =100 ury = 79 lrx =100 lry = 60 6/llx = 0 lly = 40 ulx = 0 uly = 59 urx =20 ury = 59 lrx =20 lry = 40 7/llx =20 lly = 40 ulx =20 uly = 59 urx =40 ury = 59 lrx =40 lry = 40 8/llx =40 lly = 40 ulx =40 uly = 59 urx =60 ury = 59 lrx =60 lry = 40 9/llx =60 lly = 40 ulx =60 uly = 59 urx =80 ury = 59 lrx =80 lry = 40 10/llx =80 lly = 40 ulx =80 uly = 59 urx =100 ury = 59 lrx =100 lry = 40 11/llx = 0 lly = 20 ulx = 0 uly = 39 urx =20 ury = 39 lrx =20 lry = 20 12/llx =20 lly = 20 ulx =20 uly = 39 urx =40 ury = 39 lrx =40 lry = 20 13/llx =40 lly = 20 ulx =40 uly = 39 urx =60 ury = 39 lrx =60 lry = 20 14/llx =60 lly = 20 ulx =60 uly = 39 urx =80 ury = 39 lrx =80 lry = 20 15/llx =80 lly = 20 ulx =80 uly = 39 urx =100 ury = 39 lrx =100 lry = 20 18/llx =10 lly = 0 ulx =10 uly = 19 urx =45 ury = 19 lrx =45 lry = 0 19/llx =45 lly = 0 ulx =45 uly = 19 urx =95 ury = 19 lrx =95 lry = 0 0/llx = 0 lly = 0 ulx = 0 uly =100 urx =100 ury =100 lrx =100 lry = 0 ; template = dashbrd; treplay 16:plot16 17:plot17 0:titles 1:plot1 2:plot2 3:plot3 4:plot4 5:plot5 6:plot6 7:plot7 8:plot8 9:plot9 10:plot10 11:plot11 12:plot12 13:plot13 14:plot14 15:plot15 18:plot18 19:plot19 des='' name="&name"; run; quit; ODS HTML CLOSE; ODS LISTING;