WS

Tips zum Output Delivery System ODS

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 für die Erstellung verschiedener Formate aufzeigen.

  1. 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

  2. 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.

  3. 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 für verschiedene Ausgaben (HTML und PDF) leicht anpassen, ohne die anderen Style-Definitionen zu überschreiben.

  4. 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';
    
    
  5. 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;
    
  6. Unterdrücken von Seitenvorschüben, Titles und Footnotes:
    Die Seitenvorschübe werden mit der Option STARTPAGE=NEVER im ODS-Statement unterdrückt. 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;
    

 
zurück zum Anfang

© WS Unternehmensberatung und Controlling-Systeme GmbH
Friedrich-Weinbrenner-Straße 20
69126 Heidelberg

Tel.: 06221 / 401 409
Fax: 06221 / 401 422

EMail: info @ ws-unternehmensberatung.de

Amtsgericht Mannheim, HRB 335485
Geschäftsführer: Wilfried Schollenberger