DIVERSE REPORT GENERATION By Chris Speck PAREXEL International Durham, NC.

Post on 01-Apr-2015

217 views 0 download

Tags:

Transcript of DIVERSE REPORT GENERATION By Chris Speck PAREXEL International Durham, NC.

DIVERSE REPORT GENERATION

By Chris SpeckPAREXEL International

Durham, NC

Introduction• Diverse Report Generation (DRG)

– A dynamic way to produce listings or patient profiles – A new way of thinking about report generation

• DRG Goals– Automation of large reporting jobs in one macro with

minimal code– Synthesis of multiple and disparate datasets– 1-step updates for adding or removing outputs – Easy portability between projects– Potential for expansion of capabilities

Alternative Ways of Reporting• Suppose we need to produce patient profile

documents with data from 4 datasets.• Intuitive: Loop through a macro using Brute Force

– Difficult to edit, especially for large jobs– Difficult to transport across studies– Prone to bugs

Alternative Ways of Reporting• Loop through a macro using macro logic

– Same difficulties as previous example

PROC REPORTData=ADMH

PROC REPORTData=ADAE

YES

NO

LISTING MACRO USING MACRO LOGIC

Get/Derive dataset List

Moredatasets

?

ADMH?

YES

NO ADAE?

YES

NO

PROC REPORTData=ADVS

ADVS?

YES

ADEG?

YES

NO

NO

PROC REPORTData=ADEG

DRG Method of Reporting• Call %MakeReport macro which has only one

PROC REPORT and writes code at run time• To update program, need only to add new

macro calls not new PROC REPORTS

YES

NO

PATIENT PROFILES MACRO USING DRG

Get/Derive Patient List

MorePatients

?

MAKE REPORT MACRO

%MakeReport Macro Call:

ADMH

%MakeReport Macro Call:

ADAE

%MakeReport Macro Call:

ADVS

%MakeReport Macro Call:

ADEG

DRG Method of Reporting• How can DRG possibly do this:– with only one PROC REPORT?– while avoiding lengthy macro logic?– With datasets having differing numbers of variables?• Column statements would differ across datasets.• The number of define statements would differ across

datasets.• The width of columns would be different for each dataset.

DRG Method of Reporting• Five steps:

1. Subsetting data2. Adding blank observation to

datasets if necessary3. Capturing metadata (variables,

labels) from SASHELP.VTABLE4. Building DEFINE statements into

a PROC SQL macro variable5. Inserting DEFINE macro variable

into PROC REPORT

• PARAMETERS– Dataset name– Variable list– Where statement– Column widths – Autofit flag– Titles and headers

Macro Call Example

• Note that parameters and their values are arbitrary

Macro Call Example

• Note that parameters and their values are arbitrary

Part of Patient List mentioned on Slides 3 and 4

Optional Parameters

Steps 1-3• Establish macro variables– &DEFINE becomes PROC REPORT define statements– &EMPTY tells PROC REPORT if any observations met

the WHERE criteria. Default is N.– &LS resolves to Line Size. For this example, &LS=125.

• Subset data with WHERE parameter• Insert blank observation if dataset is empty– &EMPTY is assigned here. Y if no observations meet

WHERE criteria

Step 1: Subset Data• The Code:

Step 1: Subset Data• The Code: Common sense

dataset suffixKeep only variables

parameter list

RETAIN sorts variables

according to parameter list

WHERE parameter subsets data

Step 2: Insert Blank Row• Insert empty observation into &DS.RPT0 if

dataset is empty so PROC REPORT can read it.

Step 2: Insert Blank Row• Insert empty observation into &DS.RPT0 if

dataset is empty so PROC REPORT can read it.Temporary variable equal to

number of observations

Step 2: Insert Blank Row• Insert empty observation into &DS.RPT0 if

dataset is empty so PROC REPORT can read it.

Takes us to MODIFY with no change

Temporary variable equal to number of observations

Step 2: Insert Blank Row• Insert empty observation into &DS.RPT0 if

dataset is empty so PROC REPORT can read it.

Takes us to MODIFY with no change

Takes us to MODIFY with changes

Temporary variable equal to number of observations

Step 2: Insert Blank Row• Insert empty observation into &DS.RPT0 if

dataset is empty so PROC REPORT can read it.

Takes us to MODIFY with no change

Takes us to MODIFY with changes

Modifies dataset without having to read it into the PDV. Hence no SET statement

Temporary variable equal to number of observations

Step 3: Capturing Metadata

• The Code:

Step 3: Capturing Metadata

• The Code:Macro logic used because WIDTH

and AUTOFIT are optional

Step 3: Capturing Metadata

• &DS.RPT1 should look something like this:NAME LABEL WIDTH

MHCAT Category for Medical History 20

MHTERM Reported Term for Medical History

30

MHPTT Preferred Term for Medical History

30

MHSTDAT Start Date 20

MHONGO Ongoing? 10

What was horizontal is now vertical

What would WIDTH be if AUTOFIT=Y?

Step 4: Building DEFINE Statements

• The Code:

Step 4: Building DEFINE Statements

• The Code:Using SELECT and INTO to build

macro variable called DEFINE. This becomes PROC REPORT code.

Semi-colon ends each SAS

statement.

Step 4: Building DEFINE Statements

• The Code if using ODS RTF:

Use STYLE statements and percents instead of

absolute widths

Step 4: Building DEFINE Statements

• &DEFINE should ultimately look something like this:

Step 5: Produce Reports

• The Code:

Step 5: Produce Reports

• The Code:Inserting variable list,

title and header parameters

Inserting &DEFINE macro variable as PROC REPORT code

Using &EMPTY to provide notice if no observations

match WHERE criteria

Error Checking Examples

• Do datasets and variables exist?• Do number of values in WIDTHS and VARS

parameters match?• Is sum of WIDTH values and appropriate

spacing values ≤ &LS?• Are WIDTHS and AUTOFIT parameters

populated at the same time?

Final Thoughts on DRG

• Datasets must be pre-programmed, sorted, and ready for reporting

• Best for profile, listing, or similar reporting in which data has little treatment in PROC REPORT

• Not best approach if using complex COMPUTE blocks or PROC REPORT to alter data

• BY, GROUP, ORDER, and BREAK statements can be introduced through additional parameters

Conclusion

• DRG is an alternative brute force and macro logic automation

• DRG allows for shorter programming times, more elegant and transportable code

• By having SAS write code for us, DRG is an effective way to utilize the power of SAS

CONTACT INFORMATION

Chris SpeckPrincipal ProgrammerPAREXEL International, Durham, NCchris.speck@parexel.com