Using ODS Regions to Create Custom Reports Kate Morrow, M.S. Statistician Vermont Oxford Network, Burlington, VT Background • Vermont Oxford Network is a non-profit membership organization of hospitals with neonatal intensive care units • The Network has over 900 members worldwide • Reporting team was asked to produce a concise and attractive data report for members • ODS was used to pull together several different objects created in SAS to output a cohesive report • The code presented is meant to provide a template for reports that can be easily modified as needed ODS Setup ods escapechar='^'; *For use in inline formatting; ods listing close; *Turn the listing output off; ods pdf file=“<filepath>.pdf" notoc uniform style=journal; *Output file (notoc=No table of contents in PDF, uniform=Keeps the width of output tables constant across pages); %annomac; *Compiles Annotate macros; options nodate nonumber orientation=landscape; ods layout start width=11 in height=8.5 in; *Page Size; Example Report 2 3 1 4 5 1. ODS PDF Text goptions reset=all transparency; *Transparency removes the background color from the text box.; ods region width=2.1 in height=8 in x=25 y=100; *The width and height statements determine the size of the space allotted for the ‘object’ (here a line of text). The x and y statements determine placement on the page. (0,0) denotes the upper left corner.; ods pdf text="^S={just=l font=('Helvetica', 14pt)}Sparklines are shown by overlaying plots on empty columns in proc repot. ^n^n^nThe sparklines depict the rates for a hospital in a given quarter (green dots) compared to network first and third quartiles (grey bar upper and lower limits) and averages (black line). ^n^n^nThis report combines text, shapes, tables, graphs, and images. ODS Region allows you to do truly custom reporting."; *S={} is the style statement justifying the text to the left and determining the ‘font’, font size, and style.; *^n uses ODS ESCHAPECHAR to break to a new line.; 2. Lines and Shapes Lines ods region width=10.5 in height=8.5 in x=0 y=55; data annolines; length function color $10; retain xsys ysys '5'; * Syntax for the LINE macro; *LINE (x1, y1, x2, y2, color, line_type, size); %line(0,100,100,100,vig,1,2) run; proc gslide anno=annolines; * Use the annotate data set; run; quit; *proc gslide uses the annotate data set and draws the line based on the data on the page; Shapes ods region width=2.4 in height=8 in x=0 y=55; *Because the object is a box, it will fill the entire 2.4inx8in space.; goptions reset=all; goptions cback=CXE2E2E2; *Custom color in RBG format.; proc gslide; run; quit; *Draws the box.; 3. Proc Report a b ods region width = 8 in height = 9 in x = 360 y = 180; proc report data=dummy (where=(q=1)) nofs b c a style(header)=[background=CXE2E2E2 bordertopcolor=vig font_face='Helvitica' font_size=8] style(column)=[bordertopcolor=white borderbottomcolor=white font_face='Helvitica' font_size=6 height=0.7 in]; d column ("Outcome" varno) total ("Quarter" fill1-fill4); define varno /" " order order=internal ' ' format=ofmt. c* e d style(header)=[bordertopcolor=CXE2E2E2] style(column)=[font_weight=bold just=left width=495 vjust=b]; define total/'N' style(header)=[bordertopcolor=CXE2E2E2] style(column)=[width=90 just=center e vjust=b rightmargin=10]; define fill1/'1' style(header)=[bordertopcolor=CXE2E2E2] style(column)=[color=white width=125]; define fill2/'2' style(header)=[bordertopcolor=CXE2E2E2] style(column)=[color=white width=125]; define fill3/'3' style(header)=[bordertopcolor=CXE2E2E2] style(column)=[color=white width=125]; define fill4/'4' style(header)=[bordertopcolor=CXE2E2E2] style(column)=[color=white width=125]; run; quit; *The define statements are column specific so any style changes must be done to all columns; 4. Sparklines * Macro to create sparklines; %macro trends; %let y=330; /* Starting y value for ODS Region */ %do i=1 %to 5; axis1 label=none major=none minor=none style=0 value=none order=(1 to 4 by 1); axis2 label=none major=none minor=none style=0 value=none; symbol1 c=gray i=join l=1 w=1; symbol2 c=gray i=join l=1 w=1; symbol3 c=black i=join l=1 w=3; symbol4 c=vig v=dot h=2; pattern1 c=white v=solid; pattern2 c=ligr v=solid; ods region width = 2.75 in height =0.75 in x=1050 y=&y; proc gplot data=dummy (where=(varno=&i )); plot (firstq thirdq allavg hospavg)*q/areas=2 overlay vaxis=axis2 haxis=axis1; run; quit; %let y=%sysevalf(&y + 160); *Adds to the y value so the next sparkline plot falls under the previous one.; %end; %mend trends; goptions device=gif transparency; %trends; 5. Pictures goptions device=tiffp noborder transparency; ods region width=1.14 in height=0.4 in x=1500 y=1150; filename logo <filepath>.tif"; proc gslide iframe=logo cframe=vig imagestyle=fit; run; quit; *cframe changes the color of the border around the picture and imagestyle=fit forces the image to fit in the region provided Sample Pages of a Final Report