%let name=restaurant; filename odsout '.'; /* This is a sas imitation/enhancement of Charles Kyd's dasbhoard at... http://www.exceluser.com/dash/xbw2.htm */ %let background_color=cxf3f7f7; %let darker_blue=cx084d7d; %let lighter_blue=cx759ab6; %let tan_bars=cxbe824d; %let text_color=gray33; /* albany amt has funky pixel under the 'e' */ /* %let font='Albany AMT'; %let fontb='Albany AMT/bold'; */ %let font='Arial'; %let fontb='Arial/bold'; /* Since we're using greplay, the background color is in effect for everything. (To override that, you'd need to annotate a colored box in the background.) */ goptions cback=&background_color; goptions ftitle=&fontb ftext=&font ctext=&text_color; data titlanno; length function $8 style color $25; length html $ 500 text $200; xsys='3'; ysys='3'; /* wireframe boxes */ /* Charlie Kyd box (at bottom) */ function='move'; x=0; y=0; output; function='bar'; x=100; y=3; color="white"; style="solid"; line=0; output; function='move'; x=0; y=0; output; function='bar'; x=100; y=3; color="gray"; style="empty"; line=0; output; color="&text_color"; style="empty"; /* top/title box */ function='move'; x=0; y=94; output; function='bar'; x=100; y=100; output; /* bar chart box */ function='move'; x=0; y=65; output; function='bar'; x=100; y=94; output; /* sales and expense analysis box */ function='move'; x=0; y=47; output; function='bar'; x=100; y=65; output; /* menu groups box */ function='move'; x=0; y=34; output; function='bar'; x=100; y=47; output; /* stores box */ function='move'; x=0; y=18; output; function='bar'; x=100; y=34; output; /* competitor prices box */ function='move'; x=0; y=3; output; function='bar'; x=100; y=18; output; /* blue bars */ color="&darker_blue"; style="solid"; /* top/title blue bar */ function='move'; x=0+.9; y=94+.7; output; function='bar'; x=100-.9; y=100-.7; output; /* sales and expense blue bar */ function='move'; x=0+.9; y=65-3; output; function='bar'; x=43; y=65-.7; output; /* menu groups blue bar */ function='move'; x=0+.9; y=47-3; output; function='bar'; x=43; y=47-.7; output; /* stores blue bar */ function='move'; x=0+.9; y=34-3; output; function='bar'; x=43; y=34-.7; output; /* competitor blue bar */ function='move'; x=0+.9; y=18-3; output; function='bar'; x=43; y=18-.7; output; /* New v9.2 point-size hsys, for text */ hsys='d'; function='label'; color="white"; style="&font"; x=2; y=94.6-.7; position='3'; size=19; text="Performance for the Month"; output; x=98; y=94.6-.1; position='1'; size=13; text="January, 2008"; output; color="&text_color"; x=22/2; y=94-2; position='5'; size=10; text="COMMENTARY"; output; x=22+((15+11)/2); y=94-2; position='5'; size=10; text="SALES"; output; x=22+15+11+((15+11)/2); y=94-2; position='5'; size=10; text="NEW CUSTOMERS"; output; x=22+15+11+15+11+((15+11)/2); y=94-2; position='5'; size=10; text="CUSTOMERS"; output; x=22+((15+11)/2); y=94-4; position='5'; size=7; text="($ thousand)"; output; color="white"; position='6'; size=10; x=2; y=65-1.7; text="SALES AND EXPENSE ANALYSIS"; output; x=2; y=47-1.7; text="MENU GROUPS"; output; x=2; y=34-1.7; text="STORES"; output; x=2; y=18-1.7; text="COMPETITOR PRICES"; output; style="&font"; html='title='||quote("Mel's Diner")||' href="http://www.melsdiners.com"'; x=30; y=18-1.7; text="Mel's Diner"; output; color="gray"; style="&font"; html='title="exceluser.com" href="http://www.exceluser.com/dash/xbw2.htm"'; x=50; y=1.5; position='5'; size=10; text="SAS/Graph imitation of Charles Kyd's Exceluser dashboard"; output; html=''; color="&lighter_blue"; style="&font"; x=87; y=32.5; position='5'; size=7; text="GROWTH -vs- TARGET"; output; run; /* Commentary */ data commentanno; input text $ 1-50; datalines; Sales continued their downward trend again this week. The continuing rise in gasoline prices increased freight costs and has hurt gross profits throughout the company. The recent series of ads has increased breakfast traffic. The series for dinner traffic starts Feb-8. All items have been repriced. New menus to be completed by Feb-4 and distributed by Feb-8. ; run; data commentanno; set commentanno; xsys='3'; ysys='3'; hsys='d'; function='label'; size=7; position='6'; /* Hmm... albany amt puts a strange pixel below each 'e' style='"Albany AMT"'; */ style="&font"; color="&text_color"; x=7; y=99-(_n_*5.5); run; /* Generate some plausibly-real random data */ data saleyear; format date date9.; do date = '01jan2007'd to '28jan2008'd by 7; sales=110+250*ranuni(27168); n+1; if n>20 and n<32 then sales=sales+30; if n>42 then sales=sales-10; if n<18 then sales=sales-40; if sales<180 then sales=180; if n<8 then sales=sales-40; output ; end ; run ; data salemnth; set saleyear; where date >= '07jan2008'd; length htmlvar $100; htmlvar='title='||quote( 'Week of '||trim(left(put(date,date9.)))||': '||'0d'x ||trim(left(put(sales*1000,dollar10.0))) ) || ' href="restaurant.htm"'; run; /* Generate some plausibly-real random data */ data ncusyear; format date date9.; do date = '01jan2007'd to '28jan2008'd by 7; customers=20+20*ranuni(27168); customers=customers+3*ranuni(8762); n+1; if n>20 and n<32 then customers=customers+10; if n>42 then customers=customers-5; if n<18 then customers=customers-10; if customers<10 then customers=10; output ; end ; run ; data ncusmnth; set ncusyear; where date >= '07jan2008'd; length htmlvar $100; htmlvar='title='||quote( 'Week of '||trim(left(put(date,date9.)))||': '||'0d'x ||trim(left(put(customers,comma5.0))) ) || ' href="restaurant.htm"'; run; /* Generate some plausibly-real random data */ data custyear; format date date9.; do date = '01jan2007'd to '28jan2008'd by 7; /* customers=120+140*ranuni(27168); n+1; if n>20 and n<32 then customers=customers+28; if n>42 then customers=customers-14+(24*ranuni(8234)); if n<18 then customers=customers-38; if n<8 then customers=customers-11; */ customers=60+200*ranuni(27168); n+1; if n>20 and n<32 then customers=customers+30; if n>42 then customers=customers-15; if n<18 then customers=customers-40; if customers<100 then customers=100; if n<8 then customers=customers-30; if n>=54 then customers=customers+10*ranuni(2395); output ; end ; run ; data custmnth; set custyear; where date >= '07jan2008'd; customers=customers+8*ranuni(928374); length htmlvar $100; htmlvar='title='||quote( 'Week of '||trim(left(put(date,date9.)))||': '||'0d'x ||trim(left(put(customers,comma5.0))) ) || ' href="restaurant.htm"'; run; goptions device=png; ODS LISTING CLOSE; ODS HTML path=odsout body="&name..htm" (title="Restaurant Dashboard (Created using SAS/Graph)") metatext='name="keywords" content="sas/graph, greplay, dashboard, restaurant dashboard, example"' style=minimal; goptions nodisplay; /* The main title slide, with the boxes around areas, etc */ goptions xpixels=560 ypixels=817; title " "; proc gslide des="" name="titles" anno=titlanno; run; /* The slide with the 'Commentary' */ goptions xpixels=123 ypixels=204; title " "; proc gslide des="" name="comment" anno=commentanno; run; /* Sales year (52 week) plot */ goptions xpixels=90 ypixels=204; goptions htext=7pt; symbol1 v=none i=needle width=2 c=&lighter_blue; axis1 label=none order=(0 to 400 by 50) major=none minor=none value=(t=1 '') offset=(0,0); axis2 label=none order=('01jan2007'd to '01jan2008'd by 364) minor=none offset=(4,0); title h=2pct " "; footnote1 "Past Year"; footnote2 c=lig "+40%"; footnote3 h=2pct " "; proc gplot data=saleyear; format date monname3.; plot sales*date=1 / vaxis=axis1 autovref cvref=graydd haxis=axis2 cframe=white des="" name="saleyear"; run; /* Sales month (4 week) plot */ goptions xpixels=54 ypixels=204; goptions htext=7pt; axis1 label=none value=none major=none order=(0 to 400 by 50) minor=none offset=(0,0); axis2 label=none value=(h=7pt t=1 " " t=2 " " t=3 " " t=4 " ") offset=(18,18); pattern1 v=solid c=&lighter_blue; title h=3pct " "; footnote1 "Current"; footnote2 "Month"; footnote3 h=2pct " "; proc gchart data=salemnth; vbar date / discrete type=sum sumvar=sales raxis=axis1 maxis=axis2 coutline=same cframe=white width=1 space=1 width=17 space=9 autoref cref=graydd clipref html=htmlvar des="" name="salemnth"; run; /* New Customers year (52 week) plot */ goptions xpixels=90 ypixels=204; goptions htext=7pt; symbol1 v=none i=needle width=2 c=&tan_bars; axis1 label=none order=(0 to 60 by 10) major=none minor=none value=(t=1 '') offset=(0,0); axis2 label=none order=('01jan2007'd to '01jan2008'd by 364) minor=none offset=(4,0); title h=2pct " "; footnote1 "Past Year"; footnote2 c=lig "+25%"; footnote3 h=2pct " "; proc gplot data=ncusyear; format date monname3.; plot customers*date=1 / vaxis=axis1 autovref cvref=graydd haxis=axis2 cframe=white des="" name="ncusyear"; run; /* New Customers month (4 week) plot */ goptions xpixels=54 ypixels=204; goptions htext=7pt; axis1 label=none value=none major=none order=(0 to 60 by 10) minor=none offset=(0,0); axis2 label=none value=(h=7pt t=1 " " t=2 " " t=3 " " t=4 " ") offset=(18,18); pattern1 v=solid c=&tan_bars; title h=3pct " "; footnote1 "Current"; footnote2 "Month"; footnote3 h=2pct " "; proc gchart data=ncusmnth; vbar date / discrete type=sum sumvar=customers raxis=axis1 maxis=axis2 coutline=same cframe=white width=17 space=9 autoref cref=graydd clipref html=htmlvar des="" name="ncusmnth"; run; /* Customers year (52 week) plot */ goptions xpixels=90 ypixels=204; goptions htext=7pt; symbol1 v=none i=needle width=2 c=&darker_blue; axis1 label=none order=(0 to 300 by 50) major=none minor=none value=(t=1 '') offset=(0,0); axis2 label=none order=('01jan2007'd to '01jan2008'd by 364) minor=none offset=(4,0); title h=2pct " "; footnote1 "Past Year"; footnote2 c=lig "+55%"; footnote3 h=2pct " "; proc gplot data=custyear; format date monname3.; plot customers*date=1 / vaxis=axis1 autovref cvref=graydd haxis=axis2 cframe=white des="" name="custyear"; run; /* Customers month (4 week) plot */ goptions xpixels=54 ypixels=204; goptions htext=7pt; axis1 label=none value=none major=none order=(0 to 300 by 50) minor=none offset=(0,0); axis2 label=none value=(h=7pt t=1 " " t=2 " " t=3 " " t=4 " ") offset=(18,18); pattern1 v=solid c=&darker_blue; title h=3pct " "; footnote1 "Current"; footnote2 "Month"; footnote3 h=2pct " "; proc gchart data=custmnth; vbar date / discrete type=sum sumvar=customers raxis=axis1 maxis=axis2 coutline=same cframe=white width=17 space=9 autoref cref=graydd clipref html=htmlvar des="" name="custmnth"; run; /* Sales and Expense Analysis */ /* year */ %let food_y=-3.4; %let bev_y=-9.1; %let bake_y=-21.4; %let pay_y=-10.0; %let fab_y=-29.7; %let brk_y=-16.1; /* week */ %let food_w=-0.2; %let bev_w=0.1; %let bake_w=0.0; %let pay_w=1.2; %let fab_w=-3.3; %let brk_w=-0.2; /* Latest */ %let food_l=3,628; %let bev_l=1,168; %let bake_l=440; %let pay_l=2,152; %let fab_l=1,078; %let brk_l=333; %let spe_y=-3.4; %let gms_y=-9.1; %let turn_y=-21.4; %let abs_y=+5.2; %let als_y=+8.2; %let coffee_y=+1.2; %let spe_w=-0.2; %let gms_w=0.1; %let turn_w=0.0; %let abs_w=+0.1; %let als_w=+0.2; %let coffee_w=0.0; %let spe_l=2,628; %let gms_l=31%; %let turn_l=0.30%; %let abs_l=4.89; %let als_l=5.23; %let coffee_l=0.85; data salesexp; length function $8 text $50 style $20; xsys='3'; ysys='3'; hsys='d'; size=7; function='label'; style="&font"; position='6'; x=2; color="&lighter_blue"; style="&font"; y=70; text='SALES'; output; color="&text_color"; style="&font"; y=y-8; text='Food'; output; y=y-8; text='Beverages'; output; y=y-8; text='Bakery'; output; color="&lighter_blue"; style="&fontb"; y=33; text='EXPENSES'; output; color="&text_color"; style="&font"; y=y-8; text='Payroll'; output; y=y-8; text='Food and Beverages'; output; y=y-8; text='Breakage'; output; x=52; color="&lighter_blue"; style="&fontb"; y=70; text='SALES'; output; color="&text_color"; style="&font"; y=y-8; text='Sales per Employee'; output; y=y-8; text='Gross Margin on Sales'; output; y=y-8; text='Employee Turnover'; output; color="&lighter_blue"; style="&fontb"; y=33; text='EXPENSES'; output; color="&text_color"; style="&font"; y=y-8; text='Average Breakfast Special'; output; y=y-8; text='Average Lunch Special'; output; y=y-8; text='Cup of Coffee'; output; position='4'; x=46; style="&fontb"; y=70; text="Week"; output; style="&font"; y=y-8; text="&food_w"; output; y=y-8; text="&bev_w"; output; y=y-8; text="&bake_w"; output; style="&fontb"; y=33; text="Week"; output; style="&font"; y=y-8; text="&pay_w"; output; y=y-8; text="&fab_w"; output; y=y-8; text="&brk_w"; output; x=x-8; style="&fontb"; y=70; text="Year"; output; style="&font"; y=y-8; text="&food_y"; output; y=y-8; text="&bev_y"; output; y=y-8; text="&bake_y"; output; style="&fontb"; y=33; text="Year"; output; style="&font"; y=y-8; text="&pay_y"; output; y=y-8; text="&fab_y"; output; y=y-8; text="&brk_y"; output; x=x-9; style="&fontb"; y=70; text="Latest"; output; style="&font"; y=y-8; text="&food_l"; output; y=y-8; text="&bev_l"; output; y=y-8; text="&bake_l"; output; style="&fontb"; y=33; text="Latest"; output; style="&font"; y=y-8; text="&pay_l"; output; y=y-8; text="&fab_l"; output; y=y-8; text="&brk_l"; output; x=98; style="&fontb"; y=70; text="Week"; output; style="&font"; y=y-8; text="&spe_w"; output; y=y-8; text="&gms_w"; output; y=y-8; text="&turn_w"; output; style="&fontb"; y=33; text="Week"; output; style="&font"; y=y-8; text="&abs_w"; output; y=y-8; text="&als_w"; output; y=y-8; text="&coffee_w"; output; x=x-8; style="&fontb"; y=70; text="Year"; output; style="&font"; y=y-8; text="&spe_y"; output; y=y-8; text="&gms_y"; output; y=y-8; text="&turn_y"; output; style="&fontb"; y=33; text="Year"; output; style="&font"; y=y-8; text="&abs_y"; output; y=y-8; text="&als_y"; output; y=y-8; text="&coffee_y"; output; x=x-9; style="&fontb"; y=70; text="Latest"; output; style="&font"; y=y-8; text="&spe_l"; output; y=y-8; text="&gms_l"; output; y=y-8; text="&turn_l"; output; style="&fontb"; y=33; text="Latest"; output; style="&font"; y=y-8; text="&abs_l"; output; y=y-8; text="&als_l"; output; y=y-8; text="&coffee_l"; output; /* some extra column header info */ style="&fontb"; y=78; x=44; text="% Change"; output; x=95.6; text="% Change"; output; /* draw the lines under the column headers */ line=1; size=.01; color="graycc"; x=2; y=65; function='move'; output; x=x+43.8; function='draw'; output; x=2; y=28; function='move'; output; x=x+43.8; function='draw'; output; x=52; y=65; function='move'; output; x=x+45.6; function='draw'; output; x=52; y=28; function='move'; output; x=x+45.6; function='draw'; output; run; goptions xpixels=560 ypixels=147; title; footnote; proc gslide des="" name="salesexp" anno=salesexp; run; /* Menu Groups */ data menu_anno; length function $8 text $50 style $20; xsys='3'; ysys='3'; hsys='d'; size=7; function='label'; style="&font"; /* albany amt has funky pixel under the 'e' */ position='6'; x=2; color="&lighter_blue"; style="&fontb"; y=59; text='SALES'; output; color="&text_color"; style="&font"; y=y-11; text='1. Dinners'; output; y=y-11; text='2. Omelettes'; output; y=y-11; text='3. Desserts'; output; y=y-11; text='4. Sandwiches'; output; position='4'; x=33; style="&fontb"; y=59; text="Year"; output; color="&text_color"; style="&font"; y=y-11; text="16.4"; output; y=y-11; text="28.8"; output; y=y-11; text="19.1"; output; y=y-11; text="5.9"; output; x=41; style="&fontb"; y=59; text="Month"; output; color="&text_color"; style="&font"; y=y-11; text="3.2"; output; y=y-11; text="3.0"; output; y=y-11; text="3.0"; output; y=y-11; text="2.6"; output; position='6'; x=47; color="&lighter_blue"; style="&fontb"; y=59; text='STRONGEST ITEM IN GROUP'; output; color="&text_color"; style="&font"; y=y-11; text="Chicken-Fried Steak"; output; y=y-11; text="Ham & Cheese Omelette"; output; y=y-11; text="Toll House Pie"; output; y=y-11; text="BLT Sandwich"; output; position='4'; x=80; style="&fontb"; y=59; text="Price"; output; color="&text_color"; style="&font"; y=y-11; text="6.9"; output; y=y-11; text="4.8"; output; y=y-11; text="3.3"; output; y=y-11; text="3.3"; output; x=90; style="&fontb"; y=59; text="Year"; output; color="&text_color"; style="&font"; y=y-11; text="22.7"; output; y=y-11; text="27.6"; output; y=y-11; text="29.2"; output; y=y-11; text="-15.9"; output; x=98; style="&fontb"; y=59; text="Month"; output; color="&text_color"; style="&font"; y=y-11; text="5.1"; output; y=y-11; text="3.1"; output; y=y-11; text="4.8"; output; y=y-11; text="6.4"; output; /* some extra column header info */ style="&fontb"; y=70; x=39; text="% Change"; output; x=92; text="% Change"; output; /* draw the lines under the column headers */ line=1; size=.01; color="graycc"; x=2; y=52.5; function='move'; output; x=x+38.8; function='draw'; output; x=47; y=52.5; function='move'; output; x=x+50.7; function='draw'; output; run; goptions xpixels=560 ypixels=106; title; footnote; proc gslide des="" name="menu" anno=menu_anno; run; /* Stores */ data stores_anno; length function $8 text $50 style $20; xsys='3'; ysys='3'; hsys='d'; size=7; function='label'; style="&font"; /* albany amt has funky pixel under the 'e' */ x=2; position='6'; color="&lighter_blue"; style="&fontb"; y=75; text='LEADERS'; output; color="&text_color"; style="&fontb"; y=y-10; text='Month Sales Growth'; output; style="&font"; y=y-8; text='1. Mill Creek #37'; output; y=y-8; text='2. Ellensburg #23'; output; y=y-8; text='3. Tacoma #19'; output; y=40; color="&text_color"; style="&fontb"; y=y-10; text='Year Sales Growth'; output; style="&font"; y=y-8; text='1. Everett #31'; output; y=y-8; text='2. Mill Creek #37'; output; y=y-8; text='3. Tacoma #19'; output; x=2+41; position='4'; y=75; color="&text_color"; style="&fontb"; y=y-10; text='%'; output; style="&font"; y=y-8; text='5.5'; output; y=y-8; text='2.3'; output; y=y-8; text='1.5'; output; y=40; color="&text_color"; style="&fontb"; y=y-10; text='%'; output; style="&font"; y=y-8; text='63.8'; output; y=y-8; text='38.8'; output; y=y-8; text='33.2'; output; x=50; position='6'; color="&lighter_blue"; style="&fontb"; y=75; text='LAGGARDS'; output; color="&text_color"; style="&fontb"; y=y-10; text='Month Sales Growth'; output; style="&font"; y=y-8; text='1. Maynard Grove #22'; output; y=y-8; text='2. Reedy Lane #5'; output; y=y-8; text='3. Harrison Blvd #12'; output; y=40; color="&text_color"; style="&fontb"; y=y-10; text='Year Sales Growth'; output; style="&font"; y=y-8; text='1. Ellensburg #23'; output; y=y-8; text='2. Harrison Blvd #12'; output; y=y-8; text='3. Western Roadway #2'; output; x=50+41; position='4'; y=75; color="&text_color"; style="&fontb"; y=y-10; text='%'; output; style="&font"; y=y-8; text='-20.3'; output; y=y-8; text='-16.6'; output; y=y-8; text='-10.3'; output; y=40; color="&text_color"; style="&fontb"; y=y-10; text='%'; output; style="&font"; y=y-8; text='-46.0'; output; y=y-8; text='-36.4'; output; y=y-8; text='-34.9'; output; /* draw the lines under the column headers */ line=1; size=.01; color="graycc"; x=2; y=60; function='move'; output; x=x+41; function='draw'; output; x=2; y=25; function='move'; output; x=x+41; function='draw'; output; x=50; y=60; function='move'; output; x=x+41; function='draw'; output; x=50; y=25; function='move'; output; x=x+41; function='draw'; output; run; goptions xpixels=392 ypixels=131; title; footnote; proc gslide des="" name="stores" anno=stores_anno; run; /* Growth */ /* yearly growth */ data growy; format value percentn7.0; input value target; length htmlvar $100; htmlvar='title='||quote( 'Past year growth: '||trim(left(put(value,percentn7.1))) || '0d'x || 'Past year target: '||trim(left(put(target,percentn7.1))) ) || ' href="restaurant.htm"'; foo='aaa'; datalines; .400 .327 ; run; data target_anno; set growy; length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (value >= target) then color="cx00ff00"; else color="red"; xsys='2'; ysys='2'; midpoint=foo; y=target; size=.01; output; xsys='7'; x=20; size=6; output; style='markere'; color="black"; xsys='2'; ysys='2'; midpoint=foo; y=target; size=.01; output; xsys='7'; x=20; size=6; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="black"; function='move'; midpoint=foo; y=target; output; function='draw'; xsys='7'; x=20; output; function='draw'; xsys='7'; x=-40; output; run; goptions xpixels=84 ypixels=131; title1 h=15pct " "; title2 h=7pt font=&fontb j=right "Year "; footnote h=5pct " "; pattern1 v=solid c=&lighter_blue; axis1 label=none order=(-.40 to .60 by .20) minor=none offset=(0,0); axis2 label=none value=none offset=(25,25); proc gchart data=growy anno=target_anno; vbar foo / type=sum sumvar=value cframe=white raxis=axis1 maxis=axis2 width=25 coutline=same autoref cref=graydd clipref html=htmlvar des="" name="growyear"; run; /* month growth */ data growm; format value percentn7.0; input value target; length htmlvar $100; htmlvar='title='||quote( 'Past month growth: '||trim(left(put(value,percentn7.1))) || '0d'x || 'Past month target: '||trim(left(put(target,percentn7.1))) ) || ' href="restaurant.htm"'; foo='aaa'; datalines; -.03 .04 ; run; data target_anno; set growm; length style color $ 12; hsys='3'; when='a'; position='5'; text='A'; function='label'; style='marker'; if (value >= target) then color="cx00ff00"; else color="red"; xsys='2'; ysys='2'; midpoint=foo; y=target; size=.01; output; xsys='7'; x=20; size=6; output; style='markere'; color="black"; xsys='2'; ysys='2'; midpoint=foo; y=target; size=.01; output; xsys='7'; x=20; size=6; output; hsys='3'; position='5'; xsys='2'; ysys='2'; hsys='3'; position='5'; size=1; color="black"; function='move'; midpoint=foo; y=target; output; function='draw'; xsys='7'; x=20; output; function='draw'; xsys='7'; x=-40; output; run; goptions xpixels=84 ypixels=131; title1 h=15pct " "; title2 h=7pt font=&fontb j=right "Month "; footnote h=5pct " "; pattern1 v=solid c=&lighter_blue; axis1 label=none order=(-.10 to .15 by .05) minor=none offset=(0,0); axis2 label=none value=none offset=(25,25); proc gchart data=growm anno=target_anno; vbar foo / type=sum sumvar=value cframe=white raxis=axis1 maxis=axis2 width=25 coutline=same autoref cref=graydd clipref html=htmlvar des="" name="growmnth"; run; /* Competitor Prices */ data competitor; length function $8 text $50 style $20 imgpath $50; xsys='3'; ysys='3'; when='b'; x=28; y=40; function='move'; output; x=x+8; y=y+35; function='image'; imgpath='pic_coffee.gif'; style='fit'; output; x=28+15; y=40; function='move'; output; x=x+8; y=y+35; function='image'; imgpath='pic_breakfast.gif'; style='fit'; output; x=28+30; y=40; function='move'; output; x=x+8; y=y+35; function='image'; imgpath='pic_steak.gif'; style='fit'; output; x=28+45; y=40; function='move'; output; x=x+8; y=y+35; function='image'; imgpath='pic_beer.gif'; style='fit'; output; x=28+60; y=40; function='move'; output; x=x+8; y=y+35; function='image'; imgpath='pic_pie.gif'; style='fit'; output; function='label'; style="&font"; hsys='d'; size=7; position='5'; color="&text_color"; x=32.3; y=35; text='Cup of Coffee'; output; x=x+15; y=35; text='Bacon & Eggs'; output; x=x+15; y=35; text='T-Bone Steak'; output; x=x+15; y=35; text='Bud Lite, 12 oz.'; output; x=x+15; y=35; text='Slice Pie'; output; x=32.3; y=25; text='$1.25'; output; x=x+15; y=25; text='$4.95'; output; x=x+15; y=25; text='$11.95'; output; x=x+15; y=25; text='$2.95'; output; x=x+15; y=25; text='$3.95'; output; /* You'd probably want to color-code negative ones red, if there were any. */ color="green"; x=32.3; y=15; text="0%"; output; x=x+15; y=15; text="+10%"; output; x=x+15; y=15; text="+12%"; output; color="red"; x=x+15; y=15; text="-5%"; output; color="green"; x=x+15; y=15; text="+10%"; output; run; data comptext; input text $ 1-50; datalines; Dollar amounts taken from the competitor's menu during the week. Percentage indicates difference between our price and the competitor's price. ; run; data comptext; set comptext; xsys='3'; ysys='3'; hsys='d'; function='label'; size=7; position='6'; style="&font"; color="&text_color"; x=1.8; y=79-(_n_*9.2); run; data competitor; set competitor comptext; run; goptions xpixels=560 ypixels=122; title; footnote; proc gslide des="" name="compete" anno=competitor; run; goptions xpixels=560 ypixels=817; goptions display; goptions noborder; proc greplay tc=tempcat nofs igout=work.gseg; tdef rdpgrid des='Royal Dutch Petroleum' 0/llx = 0 lly = 0 ulx = 0 uly =100 urx =100 ury =100 lrx =100 lry = 0 7/llx = 0 lly = 65 ulx = 0 uly = 90 urx = 22 ury = 90 lrx = 22 lry = 65 1/llx = 22 lly = 65 ulx = 22 uly = 90 urx = 38 ury = 90 lrx = 38 lry = 65 2/llx = 38 lly = 65 ulx = 38 uly = 90 urx = 47 ury = 90 lrx = 47 lry = 65 3/llx = 48 lly = 65 ulx = 48 uly = 90 urx = 64 ury = 90 lrx = 64 lry = 65 4/llx = 64 lly = 65 ulx = 64 uly = 90 urx = 73 ury = 90 lrx = 73 lry = 65 5/llx = 74 lly = 65 ulx = 74 uly = 90 urx = 90 ury = 90 lrx = 90 lry = 65 6/llx = 90 lly = 65 ulx = 90 uly = 90 urx = 99 ury = 90 lrx = 99 lry = 65 8/llx = 0 lly = 47 ulx = 0 uly = 65 urx =100 ury = 65 lrx =100 lry = 47 9/llx = 0 lly = 34 ulx = 0 uly = 47 urx =100 ury = 47 lrx =100 lry = 34 10/llx = 0 lly = 18 ulx = 0 uly = 34 urx = 70 ury = 34 lrx = 70 lry = 18 11/llx = 70 lly = 18 ulx = 70 uly = 34 urx = 85 ury = 34 lrx = 85 lry = 18 12/llx = 85 lly = 18 ulx = 85 uly = 34 urx =100 ury = 34 lrx =100 lry = 18 13/llx = 0 lly = 3 ulx = 0 uly = 18 urx =100 ury = 18 lrx =100 lry = 3 ; run; template = rdpgrid; treplay 7:comment 1:saleyear 2:salemnth 3:ncusyear 4:ncusmnth 5:custyear 6:custmnth 8:salesexp 9:menu 10:stores 11:growyear 12:growmnth 13:compete 0:titles des='' name="&name"; run; quit; ODS HTML CLOSE; ODS LISTING;