**************************************************************************************************** * PROGRAM OVERVIEW **************************************************************************************************** * * PROGRAM: output_report.sas * Created (mm/dd/yyyy): 02/24/2021 * *-------------------------------------------------------------------------------------------------- * PURPOSE: This macro drives the calling of each macro to produce a report * * Program inputs: * * * Program outputs: * - qrp_report.pdf * - qrp_report.xlsx * * PARAMETERS: * - destination: ODS destination. Valid values: excel or pdf * - font: font * - fontsize = font size * - footfontsize = font size for footnotes, typically set as 1 pt smaller than fontsize * - bordersize = line thickness for top/bottom report lines * * Programming Notes: * * *-------------------------------------------------------------------------------------------------- * CONTACT INFO: * Sentinel Coordinating Center * info@sentinelsystem.org * ***************************************************************************************************; %macro output_report(destination = , font=, fontsize=, footfontsize=, bordersize=); %put =====> MACRO CALLED: output_report; ***************************************************************************************************; * Set up and initialize report template ***************************************************************************************************; /*report template*/ %report_template(outputtype = &destination., fontsize = &fontsize., font = &font.); ods listing close; ods select all; ods noresults; options nodate nonumber orientation = landscape; %if &destination. = excel %then %do; ods excel file="&REPORTROOT.output/qrp_report.xlsx" NOGTITLE style = qrp_report_excel options(embedded_titles="yes" sheet_interval="proc" gridlines="off" embedded_footnotes= "yes" flow="tables"); %end; %if &destination. = pdf %then %do; ods pdf file="&REPORTROOT.output/qrp_report.pdf" NOGTITLE dpi=300 pdftoc=1 style = qrp_report_pdf; %end; ods noproctitle; options nodate nonumber orientation=portrait; ods escapechar="^"; title; /* Counter for figure number */ %let figurenum=1; /* Counter for table number */ %let tablenum=1; ***************************************************************************************************; * Table of Contents ***************************************************************************************************; %if &destination. = excel %then %do; ods excel options(sheet_name="Table of Contents" tab_color = "orange"); %end; ods proclabel = "Table of Contents"; proc report data = tableofcontents nofs nowd headline headskip split="*" style(report) = {rules = none frame = box borderwidth =1pt bordercolor = black cellpadding=1.75pt}; columns ( "Table of Contents" tabnum caption); define tabnum / order=data ' ' style(column)=[just=R width=1.1in fontweight=bold textdecoration=underline]; define caption / order=data ' ' style(column)=[just=L]; run; ***************************************************************************************************; * Baseline tables ***************************************************************************************************; %baseline_output(); ***************************************************************************************************; * Covariate profile tables ***************************************************************************************************; %if &numprofilecovarstoinclude > 0 %then %do; %baseline_profile_output; %let tablenum = %eval(&tablenum + 1); %end; ***************************************************************************************************; * Effect estimate tables ***************************************************************************************************; %if %index(&reporttype,L2) %then %do; /* Need to set to landscape so PDF tables don't wrap */ options orientation = landscape; %l2_effect_estimate_output; options orientation = portrait; %end; ***************************************************************************************************; * Code distribution tables ***************************************************************************************************; %if &output_code_distribution. eq Y %then %do; %codedistribution_output; %let tablenum = %eval(&tablenum + 1); %end; ***************************************************************************************************; * Attrition tables ***************************************************************************************************; %if %sysfunc(prxmatch(m/T1|T2L1|T2L2|T4L1|T4L2|T5|T6/i,&reporttype.)) %then %do; %if &look_start = 1 %then %do; %let look_end = 1; %do periodid = %eval(&look_start) %to %eval(&look_end); /* Check to see if either dataset exists */ %isdata(dataset=agg_patient_attrition); %let attrition_patient = &nobs; %isdata(dataset=agg_episode_attrition); %let attrition_episode = &nobs; %if &attrition_patient > 0 or &attrition_episode > 0 %then %do; /* reset counter to reset table letter */ %let tablecount=1; %if (&attrition_patient > 0 and &attrition_episode = 0) or (&attrition_patient = 0 and &attrition_episode > 0) %then %do; %let tablecount = 0; %end; options orientation = landscape; %attrition_output(tabletype=episode); %attrition_output(tabletype=patient); options orientation = portrait; %let tablenum = %eval(&tablenum + 1); %end; %end;/*periodid */ %end;/* Remove when Monitoring period bug is fixed in DEV-18262 */ %end; ***************************************************************************************************; * PS Histograms ***************************************************************************************************; %if %index(&reporttype,L2) and %index(&figurelist,F1) %then %do; %l2_psdistribution_output; %end; ***************************************************************************************************; * Forest Plots ***************************************************************************************************; %if %index(&reporttype,L2) and %index(&figurelist,F2) %then %do; %l2_forestplot_driver; %end; ***************************************************************************************************; * Appendices ***************************************************************************************************; %appendix_output(); ***************************************************************************************************; * Clean up ***************************************************************************************************; ods _all_ close; ods listing; ods results; %put =====> END MACRO: output_report ; %mend output_report;