Homepage
Unternehmensprofil
Angebot
Tools
Vorträge
Gedanken
Tips
Kunden und Presse
Ihre Meinung
Kontakt
|
Mit der Version 8 wurde das Output Delivery System (ODS) eingeführt.
Damit ist es möglich, optisch ansprechende Ausgaben für verschiedene
Medien zu erzeugen. Die wichtigsten sind:
- Druckausgaben
- HTML-Ausgaben einschließlich Grafiken
- PDF für den Acrobat-Reader
Theoretisch ist es möglich, in einem Schritt mehrere Formate gleichzeitig
zu erzeugen, indem gleichzeitig mehrere Ausgabekanäle mit verschiedenen
Styles geöffnet werden. Aber anspruchsvolle HTML-Ausgaben erfordern doch
manuelle Eingriffe, so dass manchmal Macros mit if-then-else-Konstruktionen
notwendig werden, um die verschiedenen Formate mit einem Programm zu erzeugen.
Hier sind einige Tips aus unserer Paraxis aufgelistet, die insbesondere den
Nutzen von ODS fr die Erstellung verschiedener Formate aufzeigen. Reine
HTML-Ausgaben erstellen wir meistens noch "zu Fuß" oder (am
liebsten) mit HTMLOUT.
Diese Liste soll und kann die umfangreichen Dokumentationen und Anleitungen nicht ersetzen, aber einige Tips geben,
die man anderswo schwer findet.
- Ruhe bewahren und nicht verzweifeln:
Vieles an ODS ist weder intuitiv einleuchtend noch gut dokumentiert.
Trotzdem lohnt die gründliche Lektüre des Handbuchs "A
Complete Guide to the Output Delivery System" und die Analyse der
mitgelieferten Styles und Templates
- Analyse der SAS-Styles:
Die von SAS gelieferten Templates und Styles sind sehr informativ. Ausgangspunkt
ist der minimal.style. Am default.style kann man sehr schön sehen, wie eigene
Styles implementiert werden können.
- Aus dem "Results"-Window mit der rechten Maustaste das Popup-Menu
öffnen und das Templates-Window aufrufen. Die SAS-Styles stehen in
Sashelp.Templmst.Styles
- Die Style-Definitionen können jetzt geöffnet, in Dateien
gespeichert oder auch gedruckt werden.
- Wenn die Vererbung wie beim Default-Style zu kompliziert wird, kann man
das Programm abspeichern und mit dem folgenden SAS-Programm aufbereiten:
ods listing;
proc template;
source styles.default /file="styledef";
run;
Data stdef_tab (index=(from));
infile "styledef" pad lrecl=200;
input c $100.;
if c =:"style";
style = scan(c,2);
from = scan(c,4);
RUN;
DATA stdef_tree;
Length from $32;
Array f (10) $32 ;
point = 1;
do while(1);
from = f(point);
select(point);
when(1) set stdef_tab key=from;
when(2) set stdef_tab key=from;
when(3) set stdef_tab key=from;
when(4) set stdef_tab key=from;
when(5) set stdef_tab key=from;
when(6) set stdef_tab key=from;
when(7) set stdef_tab key=from;
when(8) set stdef_tab key=from;
when(9) set stdef_tab key=from;
when(10) set stdef_tab key=from;
end;
if _iorc_ = 0 then do;
point +1;
f(point) = style;
end;
else do;
output;
f(point) = "";
point + -1;
if point LT 1 then stop;
end;
end;
RUN;
Proc print data=std_tree;
var f2 - f8;
run;
Damit lässt sich die Vererbungshierarchie darstellen und die richte Stelle zum
Überschreiben eines Elements leicht finden.
- Listen komplett überscreiben:
Im default.style werden Schriften und Farben indirekt über listen angespropchen. Diese
Listen können z.B. mit "replace fonts" und "replace colors" überschrieben werden. Alle
Elemente verwenden dann automatisch die neue Definition.
Dabei muss darauf geachtet werden, dass in der neuen Definition wieder alle Elemente
enthalten sind. Am Besten kopiert man die Definition aus der Vorlage. So lassen sich z.B. für die
Farben und Schriften fr verschiedene Ausgaben (HTML und PDF) leicht anpassen, ohne die anderen
Style-Definitionen zu überschreiben.
- Farbwahl in den Überschriften:
In Title- unf Footnote-Statements funktionieren die von SAS/Graph bekannten
Optionen, wie C=RED für das Umschalten auf Rot. Eleganter sind aber die mit
Version 8.2 eingeführten Escape-Sequenzen.
Beispiel:
ods escapechar='\';
title2 '\S=foreground=redred \S=foreground=greengreen \S= und normal';
Damit lassen sich auch Fonts und andere Eigenschaften direkt ansteuern. Leider
funktioniert die indirekte Auswahl über Tabellen im Style nicht (immer?).
Auch die Ausrichtung lässt sich besser mit den SAS/Graph-Optionen
erzeugen.
Die folgenden Beispiele eignen sich zum Modifizieren und Testen.
title1 'Hier funktioniert weder Farb- noch Fontwahl \S=font=fonts("FixedFont") '
'foreground=color_list("fgA2")red \S= normal';
title2 'Aber das funktioniert'
' \S=foreground=green font=("Courier",2)green Courier'
' \S=foreground=blue font=("Arial, Helvetica, Helv",8)blue Arial'
' \S= normal';
title3 '\S=just=L So funktioniert linksbündiger Text';
* und hier ein Beispiel mit SAS/Graph-Optionen;
title4 j=L c=cyan 'links' j=c c=green h=4 'zentriert' j=r c=blue h=1 'rechts';
- Seitengröße in PDF-Ausgaben:
Die SAS-Optionen funktionieren wie bei Druckausgaben, z.B.:
OPTIONS PAPERSIZE="ISO A4" ORIENTATION=LANDSCAPE;
OPTIONS PAPERSIZE="Letter" ORIENTATION=PORTRAIT;
- Unterdrücken von Seitenvorschüben, Titles und
Footnotes:
Die Seitenvorschübe werden mit der Option STARTPAGE=NEVER im ODS-Statement
unterdrckt.
Sie funktioniert nur bei ODS PRINTER ..., nicht bei HTML.
(Aber auch bei ODS PRINTER PDF ist das Ergebnis nicht immer wie gewünscht.)
Bei HTML können die Title nach dem ersten Step gelöscht und die Footnote vor
dem letzten Step gesetzt werden.
Eventuelle By-Variablen müßten dann z.B. in
einem compute-Block von Proc Report angezeigt werden.
Ein etwas rudimentäres Beispiel wäre:
options papersize="ISO A4" orientation=LANDSCAPE;
options nobyline;
ods printer pdf file="~/data/test2.pdf" startpage=NEVER;* style=wstest;
ods html file="~/data/test2.html" style=default;
ods escapechar='\';
title 'Überschrift';
/* zusätzlicher Text am Anfang der Ausgabe */
data _null_;
file print ods; *evtl. =(template='datastep.def');
length name $200;
put "Erster Text ist hier";
put "Zweite Zeile kommt auch hier";
run;
/*
Nur bei HTML Title löschen;
*/
title;
proc report data=work.class nowd;
by age;
column age name
height weight;
define age /id group;
define name /id group;
break after age/SUMMARIZE;
define height /mean;
define weight /mean;
compute before _page_ ;
ott= "Alter ist"!!put(age,2.); line ott $11.;
ENDCOMP;
RUN;
/*
Text am Ende der Ausgabe
Nur bei HTML: Footnote erst hier setzen;
*/
Footnote "XYZ";
data _null_;
file print ods; * =(template='datastep.def');
length text $200;
put "\S=foreground=redDas Dicke Ende kommt bestimmt";
put "und zwar HHIIEERR";
run;
ods _ALL_ close;
title;
footnote;
|