SAS/ODS – Makro zum Routing der SAS-Ausgabe in ein RTF- oder PDF-Dokument

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Hans-Peter Altenburg: Hans-Peter Altenburg, Heinrich Stürzl, Almut Hahn, Carina Ortseifen, Grischa Pfister: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2008

Wir gehen der Einfachheit von folgender Verzeichnisstruktur aus: Neben einem Projekt-Hauptverzeichnis („MAINPROJEKT_XXX“) gibt es dort verschiedene Unterverzeichnisse, wie z.B. Data (für die Daten), P (für Programme), PDF (für PDF-Dokumente), RTF (für RTF-Dokumente), M (für SAS-Makros) usw.:

D:\....\MainProjekt_XXX
				\Data
				\M
				\P
				\PDF
				\RTF
				. . .

Zum Routing der Ausgabe benötigt man zwei SAS-Makros, welche etwa folgendermaßen aussehen können:

/* ---------------------------- ODS Start ------------- */
%MACRO StartODS(tout, stammpfad,Out_Dset) ;
%LET outpfad=&stammpfad\&tout ;
GOPTIONS ROTATE=Landscape ;
OPTIONS ORIENTATION=Landscape   PAPERSIZE="ISO A4"    ;
ODS LISTING CLOSE ;
ODS &tout FILE="&outpfad\&Out_DSet..&tout" STARTPAGE=NO 
%IF %UPCASE(&tout)=PDF %THEN %STR(NOTOC ; ) ;
                       %ELSE %STR( ; ) ;
%MEND ;
/* ---------------------------- ODS Start ------------- */ 

/* ---------------------------- ODS End --------------- */
%MACRO EndODS(tout) ;
ODS &tout CLOSE ;
ODS LISTING ;
%LET tout=  ;
%MEND ;
/* ---------------------------- ODS End --------------- */

Die Makrovariable "tout" bezeichnet den Dokument-Typ, also etwa RTF oder PDF. Die Makrovariable "stammpfad" bezeichnet den Projektpfad (z.B. MAINPROJEKT_XXX). Im angegebenen "stammpfad" muss ein Unterverzeichnis mit dem Namen RTF oder PDF existieren. Ein solches Verzeichnis könnte auch neu angelegt werden, dann muss das Makro entsprechend modifiziert werden. Die Makrovariable "Out_Dset" bezeichnet den Namen der Datei (ohne die Erweiterung RTF bzw. PDF!) in welche die SAS-Ausgabe geschrieben werden soll.

Während die Ausführung des Makros STARTODS(...) das Routing in eine entsprechende Datei startet, führt das Makro EndODS(...) die Ausgabe wieder zurück ins normale LISTING. Mehrere Start/End "Klammern" hintereinander mit unterschiedlichen Dateinamen erzeugen entsprechend verschiedene Ausgabe-Dateien in den Verzeichnissen (PDF oder RTF).

Falls die Pfade / Verzeichnisse zuerst mit Ausführung des StartODS-Makros im Projektverzeichnis "stammpfad" angelegt werden sollen, so kann ein entsprechender DATA-Step ins Makro eingebaut werden, z.B.:

...
DATA _NULL_ ;      * Anlegen der Projektunterverzeichnisse im Verzeichnis stammpfad ;
ReturnCode=DCREATE("PDF","&stammpfad") ;
PUT /// 'PFad für das Projektunterverzeichnis angelegt: ' Returncode /// ;
ReturnCode=DCREATE("RTF","&stammpfad") ;
PUT /// 'PFad für das Projektunterverzeichnis angelegt: ' Returncode /// ;
RUN ;
...

Siehe hierzu auch Tipps und Tricks vom letzten Jahr!

Die Ausgabe erfolgt im Beispiel im Quer-Format, wegen der langen SAS Outputs und damit Grafiken besser zu interpretieren sind.

Beispiel:

%LET stammpfad=D:\... MAINPROJEKT_XXX  ;
%LET PDF_DSet =Bsp_NVData ;
%INCLUDE "&stammpfad\M\StartEndODS.sas" ;          * Einlesen der Macros ;

TITLE1 H=2 C=BLUE 'Standard-Normal verteilte Zufallsvariablen' ; 

/* Erzeugen einer Test Datei */
DATA Bsp1 ;
DO Gruppe=1 TO 3 ;
	DO IDVar=1 TO 20 BY 1 ;
	xx=NORMAL(0) ;
	OUTPUT ;
	END ;
END ;
RUN ;


/* ---------------------------- ODS Start ---------------------- */
%LET DocType=PDF ;           * zB   PDF RTF    ;
%StartODS(&DocType,&stammpfad,&PDF_DSet)
/* ---------------------------- ODS Start ---------------------- */

PROC PRINT DATA=Bsp1 ;
BY Gruppe ;
ID IDVar ;
RUN ;

ODS &Doctype STARTPAGE=NOW ;   * neue Seite im Output ;

PROC MEANS DATA=Bsp1  N Mean STD VAR ;
BY Gruppe ;
VAR xx ;
RUN ;

/* ---------------------------- ODS End ------------------------ */
%EndODS(&DocType)
/* ---------------------------- ODS End ------------------------ */

Individuelle Änderungen und Erweiterungen sind natürlich jederzeit möglich. Das Beispiel lässt sich auch noch etwas modifizieren und die Ausgabe in zwei verschiedene Dateien mit Namen „LISTING“ bzw. „MeanStd“:

%LET DocType=PDF ;           * zB   PDF RTF    ;
/* - ODS Start - */ %StartODS(&DocType,&stammpfad,Listing)
/* ---------------------------- ODS Start ------------------ */
PROC PRINT DATA=Bsp1 ;
BY Gruppe ;
ID IDVar ;
RUN ;
/* - ODS End --- */ %EndODS(&DocType) /* -- ODS End -------- */
/* - ODS Start - */ %StartODS(&DocType,&stammpfad,MeanStd)
/* ---------------------------- ODS Start ------------------ */
PROC MEANS DATA=Bsp1  N Mean STD VAR ;
BY Gruppe ;
VAR xx ;
RUN ;
/* - ODS End --- */ %EndODS(&DocType) /* -- ODS End ------- */