Search code examples
sassas-macro

SAS macro which will generate the PDF/Excel/RTF report from the input SAS dataset


need GENERIC SAS macro TO generate the PDF/Excel/RTF report from the input SAS dataset.

THE FOLLOWING are the parameters to use---->

1) indsn – Input Dataset 2) varlist – List of Variables to be printed. If none then print all variables in the dataset 3) report_type – PDF or Excel or RTF. You need to use appropriate ODS statements. 4) title1 – Title1 of the report 5) footnote1 – Footnote1 of the report 6) report_location – Physical location of the report

please help me in building a logic for the above question???

Tried do far:

data test; 
input ID var1 var2 var3 var4; 
cards; 

1 6 4 4 5 6 5 4 5 5 3 7 9 5 9
7 9 4 8 6 run; ods pdf file='/folders/myfolders/v.pdf';

proc print data=work.test; 
var ID; run; 
ods pdf close; 

%macro reportgen(indsn=,varlist=, report_type=, title1=, footnote=, report_location=); 
%local i nextword; %let dsid =%sysfunc(open(&indsn)); 
%do i=1 %to %sysfunc(countw(&varlist)); 
%let nextword = %scan(&varlist, &i); 
%end; 
%mend reportgen; 
%macro reportgen(indsn=work.test,varlist=var1 var2 var4,report_type=,title1=,footnote=,report_location);

this only half of the macro.


Solution

  • First of all, welcome to the site!

    Here is a macro that meets your needs:

    *ProcessBody;
    %macro reportgen(indsn=,varlist=, report_type=, title1=, footnote1=, report_location=);
    
        /* Windows related option */
        goptions device=actximg;
    
        /* Check if report path specified and abort gracefully if it isn't */
        %if "&report_location"="" %then
            %do;
    
                data _NULL_;
                    putlog "ERROR: No destionation. Report aborted.";
                RUN;
            %GOTO done; 
            %end;
    
        /* If varlist present, then keep only varlist */
        %if &varlist ne %then
            %do;
    
                data tmp (keep= &varlist);
                    set &indsn;
                run;
    
                %let indsn=tmp;
            %end;
    
        /* Close all ODS destionations before oppening the one required */
        ODS _ALL_ close;
    
        ODS &report_type file="&report_location";
    
        /* Specify Title and Footnote */ 
        %if &title1 ne %then
            %do;
                title "&title1";
            %end;
    
        %if &footnote1 ne %then
            %do;
                footnote "&footnote1";
            %end;
    
        /* Print the output */ 
        proc print data=&indsn;
        run;
    
        /* Completion */ 
        ODS _ALL_ close;
        %done:
    %mend;
    

    Example call:

    %reportgen(indsn=sashelp.class,varlist=name,report_type=RTF,title1=Hello World!,footnote1=Goodbye World!,report_location=/home/tmp/test.RTF);