73
Universitätsrechenzentrum Heidelberg SAS-Makro-Programmierung: Eine Einführung Holger Geißler & Dr. Carina Ortseifen Oktober 1995 Universitätsrechenzentrum Heidelberg, 1995, Im Neuenheimer Feld 293, D-69120 Heidelberg

SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

U n i v e r s i t ä t s r e c h e n z e n t r u m H e i d e l b e r g

SAS-Makro-Programmierung: Eine Einführung

Holger Geißler & Dr. Carina Ortseifen

Oktober 1995

Universitätsrechenzentrum Heidelberg, 1995, Im Neuenheimer Feld 293, D-69120 Heidelberg

Page 2: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

2

VORWORT.................................................................................................................................................................4 LEGENDE ..................................................................................................................................................................5

1. EINFÜHRUNG .................................................................................................................................................6

1.1 WAS IST EIN SAS-MAKRO?.................................................................................................................................6 1.2 WO WIRD DIE SAS-MAKRO-SPRACHE EINGESETZT? ...........................................................................................6 1.3 ELEMENTE DER MAKRO-SPRACHE......................................................................................................................6

2. SAS-MAKROVARIABLEN ............................................................................................................................7

2.1 AUTOMATISCHE MAKROVARIABLEN...................................................................................................................8 2.2 BENUTZERDEFINIERTE MAKROVARIABLEN.......................................................................................................10

2.2.1 Erzeugung von benutzerdefinierten Makrovariablen ...............................................................................10 2.2.2 Ausgabe des Wertes benutzerdefinierter Makrovariablen........................................................................10 2.2.3 Verkettung von Makros ............................................................................................................................10 2.2.4 Indirekte Zuweisung von Werten ..............................................................................................................11 2.2.5 Das Auflösen von mehrfachen Ampersands .............................................................................................11

ÜBUNGSAUFGABEN.................................................................................................................................................11

3. DIE %MACRO-ANWEISUNG.....................................................................................................................13

3.1 DEFINITION UND AUFRUF VON SAS-MAKROS...................................................................................................13 3.2 MAKRO-NAME..................................................................................................................................................13 3.3 MAKRO-PARAMETER ........................................................................................................................................13

3.3.1 Positions- und Schlüsselparameter ..........................................................................................................14 ÜBUNGSAUFGABEN.................................................................................................................................................15

4. LOKALE UND GLOBALE MAKROVARIABLEN...................................................................................16

4.1 ERZEUGUNG VON LOKALEN UND GLOBALEN MAKROVARIABLEN......................................................................16 4.1.1 Die %Global-Anweisung..........................................................................................................................17 4.1.2 Die %Local-Anweisung............................................................................................................................18

4.2 MAKROS INNERHALB VON MAKROS..................................................................................................................18 ÜBUNGSAUFGABEN.................................................................................................................................................19

5. SAS-MAKRO-PROGRAMMANWEISUNGEN...........................................................................................20

5.1 %*-ANWEISUNG ...............................................................................................................................................20 5.2 %PUT-ANWEISUNG...........................................................................................................................................21 5.3 %INPUT-ANWEISUNG........................................................................................................................................21 5.4 %IF - %THEN / %ELSE-ANWEISUNG.................................................................................................................22 5.5 %DO - %END-ANWEISUNG...............................................................................................................................22 ÜBUNGSAUFGABE ...................................................................................................................................................23 5.6 %DO - %TO - %END-ANWEISUNG (ITERATIVE %DO-ANWEISUNG) .................................................................23 5.7 %DO - %UNTIL - %END-ANWEISUNG...............................................................................................................24 5.8 %DO - %WHILE - %END-ANWEISUNG..............................................................................................................25 5.9 %GOTO LABEL; %LABEL-ANWEISUNG..............................................................................................................25 5.10 %SYSEXEC-ANWEISUNG.................................................................................................................................26 5.11 %KEYDEF-ANWEISUNG ..................................................................................................................................28 ÜBUNGSAUFGABEN.................................................................................................................................................28 5.12 %WINDOW-ANWEISUNG.................................................................................................................................28

5.12.1 Fensteroptionen......................................................................................................................................29 5.12.2 Felddefinitionen .....................................................................................................................................30 5.12.3 Gruppen-Definition ................................................................................................................................31 5.12.4 Automatische Variablen .........................................................................................................................31

5.13 %DISPLAY-ANWEISUNG..................................................................................................................................33 ÜBUNGSAUFGABE ...................................................................................................................................................34

6. SAS-MAKRO-FUNKTIONEN.......................................................................................................................34

6.1 FUNKTIONEN ZUR BEARBEITUNG VON ZEICHENKETTEN ...................................................................................36 6.1.1 %INDEX-FUNKTION .......................................................................................................................................36 6.1.2 %LENGTH-FUNKTION ....................................................................................................................................37 6.1.3 %SCAN- UND %QSCAN-FUNKTION ................................................................................................................37 6.1.4 %SUBSTR- UND %QSUBSTR-FUNKTION.........................................................................................................39

Page 3: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

3

6.1.5 %UPCASE- UND %QUPCASE-FUNKTION ........................................................................................................39 ÜBUNGSAUFGABE ...................................................................................................................................................40 6.2 %EVAL FUNKTION ZUR AUSWERTUNG VON LOGISCHEN UND NUMERISCHEN AUSDRÜCKEN.............................41 6.2.1 %EVAL-FUNKTION.........................................................................................................................................41 ÜBUNGSAUFGABEN.................................................................................................................................................43 6.3 FUNKTIONEN ZUR BEARBEITUNG VON SPEZIELLEN ZEICHEN (TEXTFUNKTIONEN) ............................................43 6.3.1 %QUOTE-FUNKTION ......................................................................................................................................45 6.3.2 %BQUOTE-FUNKTION ....................................................................................................................................45 6.3.3 %NRQUOTE-FUNKTION..................................................................................................................................46 6.3.4 %NRBQUOTE-FUNKTION................................................................................................................................46 6.3.5 %UNQUOTE-FUNKTION..................................................................................................................................46 6.3.6 %STR-FUNKTION ...........................................................................................................................................47 6.3.7 %NRSTR-FUNKTION.......................................................................................................................................47 6.3.8 %SUPERQ-FUNKTION.....................................................................................................................................48 ÜBUNGSAUFGABEN.................................................................................................................................................48

7. BERÜHRUNGSPUNKTE ZWISCHEN MAKRO-SPRACHE UND DATENSCHRITT .........................49

7.1 ZUGRIFF AUF DATEN IN SAS-MAKROS .............................................................................................................49 7.1.1 SYMGET-FUNKTION .......................................................................................................................................49 7.1.2 SYMPUT-FUNKTION .......................................................................................................................................52 7.1.3 RESOLVE-FUNKTION......................................................................................................................................54 7.2 %SYSPROD-FUNKTION......................................................................................................................................55 7.3 EXECUTE-ROUTINE...........................................................................................................................................56 ÜBUNGSAUFGABEN.................................................................................................................................................58

8. AUFRUF VON SAS-MAKROS......................................................................................................................58

8.1 NAMED STYLED MAKROS .................................................................................................................................59 8.2 STATEMENT STYLED MAKROS ..........................................................................................................................59 8.3 COMMAND STYLED MAKROS ............................................................................................................................60

9. MAKRO-BIBLIOTHEKEN (AUTOCALL-FACILITY).............................................................................60

9.1 AUTOMATISCHER AUFRUF VON MAKROS (AUTOCALL FACILITY) .....................................................................60 9.2 AUTOMATISCHES SPEICHERN VON KOMPILIERTEN MAKROS .............................................................................62 9.3 ALLGEMEINE SYSTEMOPTIONEN .......................................................................................................................64

10. FEHLERMELDUNGEN UND MÖGLICHE URSACHEN.......................................................................65

LÖSUNGVORSCHLÄGE ZU DEN ÜBUNGSAUFGABEN ...........................................................................66

ZUSÄTZLICHE ÜBUNGSAUFGABEN ...........................................................................................................71

LITERATURLISTE: ...........................................................................................................................................74

INDEX...................................................................................................................................................................75

Page 4: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

4

Vorwort

Für wen ist dieses Skript gedacht? Dieses Skript ist eine Einführung in die Makroprogrammierung mit SAS, keine Einführung in SAS. Der mit SAS vertraute Anwender wird mit diesem Skript eine erste Anleitung zur Erstellung eigener Makros finden. Für Anwender, die SAS bislang nicht oder nur selten benutzt haben, wird dieses Skript keine Hilfe sein, da es auf einem grundlegenden Verständnis von SAS aufbaut und bestimmte Kenntnisse voraussetzt. Es liegt im Wesen der Makros, daß es erst dann Sinn macht die Makroprogrammierung zu lernen, wenn Sie bestimmte Abläufe in SAS öfters wiederholen müssen.

Was will dieses Skript?

Eine Einführung in die Makroprogrammierung sein. Der erfahrene SAS-Makro-programmierer wird hier wenig Neues finden. Die AnwenderIn, die ihre ersten Schritte in die Welt der Makros unternehmen will, soll nach Lektüre des Skripts in der Lage sein, einfachere Makros zu schreiben. Vermittelt werden soll außerdem, ein grundlegendes Verständnis für den Aufbau und die Struktur von Makros in SAS.

Wie arbeiten Sie am Besten mit diesem Skript?

Am Besten, indem Sie vorne anfangen, und es bis zum Schluß aufmerksam lesen. Außerdem sollten Sie die Übungsaufgaben bearbeiten, da gerade bei der Arbeit mit dem Computer praktisches Ausprobieren unerläßlich ist. Es gibt zu jedem größeren Abschnitt (meist ist dies ein Kapitel) mehrere Übungsaufgaben, die nach dem Studium des jeweiligen Abschnitts gelöst werden sollten. Wenn es mal gar nicht funktioniert, bleibt natürlich immer noch der Blick in die Lösungen, die sich im hinteren Teil des Buches befinden.

Das vorliegende Skript basiert auf Kursunterlagen, die für SAS-Makroprogrammierkurse am Universitätsrechenzentrums erstellt wurden. Die Literatur, die in diesem Skript verwendet wurde, ist ausnahmslos in der Bibliothek des Universitätsrechenzentrum verfügbar. Bei Fragen und Hinweise erreichen Sie uns entweder über Telefon oder per E-Mail. Holger Geißler, � 565582, E-Mail: holger.geiß[email protected] Carina Ortseifen, � 564541, E-Mail: [email protected]

Page 5: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

5

Legende

SAS-Schlüsselworte, -Anweisungen und sonstige Programmzeilen sind in Courier geschrieben: %macro, %nrstr; C:\SAS, Hervorhebungen im Text sind Fett gesetzt:

Makro-Parameter können entweder als Positionsparameter (posparm) oder Schlüssel-parameter (keyparm) übergeben werden. Benennungen, die variabel sind, werden in der

Optionen und Argumente, die der Benutzer wählen kann, sind kursiv in Times New Roman geschrieben: %keydef key-name | 'key-name' | "keyname" <text>; Numerierungen in schwarzen Kreisen sind Erläuterungen zu Beispielprogrammen: � Mit dieser %let-Anweisung wird die Makrovariable name global definiert.

Page 6: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

6

1. Einführung

1.1 Was ist ein SAS-Makro?

Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches aus SAS-Elementen wie z.B. Proc- und Data-Schritten bestehen kann. Falls Sie regelmäßig die gleichen Programmanweisungen durchführen müssen, kann es zeitsparend sein, sich dafür ein Makro zu schreiben. Nachdem das Makro einmal aktiviert ist, kann es immer wieder allein durch seinen Namen aufgerufen und benutzt werden. Das Makro spricht einen eigens für die Makro-Sprache bereitgestellten Prozessor an, der durch Schlüsselzeichen, wie z.B. das Prozentzeichen "%" aktiviert wird. Dieser Prozessor nennt sich Makro-Prozessor. Mit Hilfe der SAS-Makro-Sprache können Sie mit ihm kommunizieren. Beispiel: %macro aufruf;

libname co v604 'N:\SASurz\daten';libname co608 v608 'N:\SASurz\daten';libname daten 'M:\SAS\daten';libname b 'B:\';libname a 'A:\';libname library 'M:\SAS\formate';

%mend aufruf;Aufruf: %aufruf

Bevor Sie mit einem Makro arbeiten können, müssen sie es kompilieren. Dies geschieht dadurch, das sie das gesamte Makro submittieren. Durch den Aufruf wird der Makro-Prozessor aktiviert, der nun die Programmanweisungen durchführt. Das Makro aufruf setzt alle notwendigen Libname-Anweisungen. Da sie normalerweise bei jeder SAS-Sitzung gesetzt werden müssen, ist es zeitsparend, sie durch ein Makro zusammenzufassen. 1.2 Wo wird die SAS-Makro-Sprache eingesetzt?

Die SAS-Makro-Sprache wird an folgenden Stellen eingesetzt: • Zusammenfassung von Proc- und Data-Schritten, die häufig wiederholt werden müssen • Erzeugung von Anwendungen, die das SAS-System bisher nicht anbietet, z.B. der Jonckheere-Test • Erzeugung von datenabhängigen Programmen durch eine Schnittstelle zu SAS-Dateien (DATA Step Interface) • Entwicklung von Eingabefenstern • Automatische Einbindung von Systeminformationen (z.B. Datum, Uhrzeit und Betriebssystem) • Bedingtes Ausführen von Daten- und Prozedurschritten

1.3 Elemente der Makro-Sprache

Es gibt vier wesentliche Elemente der SAS-Makro-Sprache: • Makrovariablen • Makro-Programmanweisungen • Makro-Funktionen • Makro-Routinen

Page 7: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

7

Makrovariablen unterscheiden sich grundlegend von den Variablen einer SAS-Datei. Der Wert einer Datenschritt-Variablen hängt von der Beobachtung ab, die sie gerade darstellt. Datenschritt-Variablen können nur in Data- oder Proc-Schritten verwendet werden. Makrovariablen sind dagegen überall einsetzbar. Sie haben einen konstanten Wert, den ihnen zugewiesen oder vorgegeben wird. Makrovariablen speichern Zeichenketten ab und können manipuliert werden. Es gibt zwei unterschiedliche Arten von Makrovariablen: Benutzerdefinierte und Automatische Variablen. Benutzerdefinierte Makrovariablen können, wie der Name schon sagt, vom der Benutzer selbst bestimmt werden. Sie können lokal oder global vereinbart werden. (siehe Kap. 2.2). Ihr zugewiesener Wert bleibt konstant bis er explizit geändert wird. Automatische Makrovariablen beginnen immer mit den Buchstaben SYS. Sie enthalten z.B. Informationen über das Datum, das Betriebssystem oder den Ausführungsmodus. Makro-Programmanweisungen sind den Anweisungen im Datenschritts ähnlich. Der Unterschied besteht darin, daß Makro-Programmanweisungen immer mit "%" beginnen, auf das ein Makro-Schlüsselwort folgt. Sie können z.B. Variablen verändern, Werte zuweisen und ausgeben, und sie können Verzweigen und bedingtes Ausführen (%IF..%THEN) von SAS-Anweisungen herbeiführen. Makro-Funktionen verarbeiten Argumente (z.B. Zeichenketten). Sie können z.B. logische Ausdrücke auswerten und Zeichenketten zählen. Sie sind den Funktionen im Datenschritt ähnlich, weisen darüber hinaus aber auch spezielle Möglichkeiten auf, die nur im Makrobereich gelten. Makro-Funktionen sind auch im Data- oder Proc-Schritt einsetzbar. Makro-Routinen bewerkstelligen z.B. den Datenaustausch zwischen Makros und Data-Schritt (SYMPUT, SYMGET) oder rufen Anwendungen innerhalb eines Makros auf.

2. SAS-Makrovariablen

Syntax: &Variablenname Länge: 1-8 Zeichen, der Variablenname muß mit einem Buchstaben oder einem Unterstrich beginnen, gefolgt von Buchstaben, Zahlen oder Unterstrichen. Beispiel: &SYSDATE

&SDS &HANSI SAS-Makrovariablen sind gekennzeichnet durch ein Ampersand (&) gefolgt von mindestens einem nichtleeren Zeichen. Es gibt

• automatische Makrovariablen (die direkt vom SAS System zur Verfügung gestellt werden) und • benutzerdefinierte Makrovariablen.

Der Makro-Prozessor setzt an die Stelle des Variablennamens den entsprechenden Wert ein (Textstring). Dieser Textstring kann mindestens 1024 Zeichen lang sein, der maximale Wert ist vom Betriebssystem abhängig.

Page 8: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

8

2.1 Automatische Makrovariablen

Automatische Makrovariablen werden automatisch vom Makro-Prozessor zur Verfügung gestellt. Sie beginnen alle mit den Buchstaben SYS. Da diese Kombination für das SAS-System reserviert ist, sollten Sie deshalb nie diese Kombination am Anfang eines Variablennamens benutzen. Die wichtigsten automatischen Makrovariablen und ihre Funktion:

SYSDATE Aktuelles Datum des Programmstarts SYSDAY Wochentag des Programmstarts SYSTIME Zeit des Programmstarts

SYSENV Ausführungsmodus, FORE=interaktiv, BACK=Batchjob SYSSCP Betriebssystem (als Abkürzung) SYSVER SAS-Version SYSDEVIC aktueller Device Driver SYSSCPL ausführlichere Infos zum Betriebssystem (ab SAS-Version

6.10)

SYSERR Fehlerinformation (Return Code) von Prozeduren SYSINFO ähnlich wie SYSERR SYSFILRC Return Code der letzten Filename-Anweisung SYSLIBRC Return Code der letzten Libname-Anweisung SYSRC Return Code des letzten Betriebssystem-Kommandos

SYSLAST Name der zuletzt erzeugten SAS-Datei

libref.dateiname (ein Name) SYSDSN Name der zuletzt erzeugten SAS-Datei

libref dateiname (zwei Namen) Verwendet werden können diese Variablen u.a. in Textzeilen, die mit

• Title-Anweisungen, • Footnote-Anweisungen • Note-Anweisungen und • Put-Anweisungen

erzeugt werden. Falls Sie, wie z.B. im nächsten Beispiel, Title- und Footnote-Anweisungen benutzen, müssen Sie doppelte Anführungszeichen (Gänsefüßchen) verwenden, da ansonsten die automatischen Makrovariablen nicht aufgelöst werden. Beispiel: proc gslide;

title "Heute ist &sysday, der &sysdate,&systime Uhr";footnote "SAS-Version &sysver";run;

Anmerkung: Die automatischen Makrovariablen geben ihre Information in englischer Sprache aus. Alle automatischen Makrovariablen finden Sie auf den Seiten 55-59 im "SAS Guide to Makro Processing" beschrieben.

Page 9: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

9

2.2 Benutzerdefinierte Makrovariablen

Sie können eigene Makrovariablen auf verschiedene Weise definieren. Die einfachste und gebräuchlichste Art ist die Verwendung von "%let". Weitere Möglichkeiten der Erzeugung benutzerdefinierter Makrovariablen finden Sie im Kapitel 4.1. 2.2.1 Erzeugung von benutzerdefinierten Makrovariablen Syntax: %let makrovariable=wert; Beispiel: %let A=13;

%let Name=Alois Vorderhuf%let Monat=November

Die Variable makrovariable wird erzeugt, falls diese nicht bereits existiert, und sie bekommt den Wert wert zugewiesen. Falls Sie der gleichen Variablen nacheinander mehrere Werte zuweisen, wird der Wert überschrieben. Als Wert können Sie beliebige Zeichenketten zuweisen. Es ist auch möglich, Makrovariablen bereits bestehende Makrovariablen als Wert zuzuweisen. Beispiel: %let Datum=&SYSDATE; Die Zuweisung erfordert keine Anführungszeichen. Werden diese trotzdem verwendet, werden sie als Teil des Wertes interpretiert. Die %LET-Anweisung entfernt führende und nachfolgende Leerzeichen des zugewiesenen Textes. Wollen Sie nachfolgende Leerzeichen berücksichtigen oder ein Semikolon als Textzeichen verwenden, müssen Sie die "%STR-Funktion" (siehe Kap. 6.3.6) verwenden. Beispiel: %let Name=%STR( Herr Hans Ulrich Meier);

%let Druck=%STR(Proc Print; Run;); Falls Sie dagegen nur %let druck=Proc print;run;schreiben, hat ihre Variable druck nur den Wert "Proc print", da die %let-Anweisung nur bis zum Semikolon liest. 2.2.2 Ausgabe des Wertes benutzerdefinierter Makrovariablen Wenn Sie sich den Wert ihrer Makrovariablen anzeigen lassen wollen, verwenden Sie am einfachsten die "%put-Anweisung". Sie schreibt den Wert ihrer Makrovariablen ins LOG-Fenster. (Analog zur Put-Anweisung für die Ausgabe von normalen Variablen.) Beispiel: %put &Name;Ausführlich beschrieben wird die "%put-Anweisung" in Kapitel 5.2. 2.2.3 Verkettung von Makros Sie können Text direkt an einen Makro-Namen anhängen. Damit läßt sich z.B. eine Variablenliste für die Keep-Anweisung erzeugen: Beispiel: Ergebnis: %LET start=1;%LET ende=10;keep var&start-var&ende;

keep var1-var10

Page 10: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

10

Wollen Sie Makrovariablen voranstellen, müssen Sie dies folgendermaßen tun: Beispiel: %let prefix=item;

var &prefix.1-&prefix.10; Der Punkt beendet die Makro-Anweisung und es wird die var-Anweisung var item1-item10erzeugt. Ohne den Punkt sucht der Makro-Prozessor nach den Makrovariablen &prefix1, bzw. &prefix10. Zur Erzeugung eines zweiteiligen SAS-Dateinamens sind daher zwei hintereinander folgende Punkte zu verwenden: Einen zum Beenden der Makrovariablen, den anderen zur Abtrennung des Librefs vom Dateinamen: Beispiel: %let lref=mein;

%let dat=eins;

data &lref&dat; erzeugt data meineins;data &lref.&dat; erzeugt ebenfalls data meineins;data &lref..&dat;erzeugt dagegen data mein.eins; 2.2.4 Indirekte Zuweisung von Werten Beispiel: Ergebnis: %let device=hp7475a;%let &device=online;%put &device=&hp7475a; hp7475a=online Die Zeile %put der &device ist &hp7475a..; liefert der hp7475a ist online, da die eingesetzte Makrovariable &device zu hp7475a aufgelöst wird. 2.2.5 Das Auflösen von mehrfachen Ampersands Zwei Ampersands (&&) lösen sich zu einem Ampersand (&) auf. Mehrfache Ampersands sind sinnvoll beim Auflösen von Variablen, die einen gemeinsamen Stamm und numerische Endungen haben. Beispiel: %Let device1=hp7475a;

%Let device2=hp7475b;%Let device3=xcolor;%Let device4=ps300;%let n=3;

Ergebnis: %put &device&n; erzeugt einen Fehler, da &device nicht referenziert ist. %put &&&device&n; löst zuerst && zu & auf, danach &n zu 3 und letztendlich &device3 zuxcolor. Übungsaufgaben

1. Welchen Wert nehmen die Variablen an, wenn Sie die folgenden Anweisungen der Reihe nach ausführen? Überlegen Sie sich die Antworten zunächst ohne Zuhilfenahme von SAS und überprüfen Sie danach am Computer, indem Sie die Anweisungen ausführen, ob ihre Antworten richtig waren.

Anweisung Wert

Page 11: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

11

%let vname=hans; %let name=&vname Schreiner; %let nachname=Schreiner; %let nname=&&nachname; 2. Im Verzeichnis n:\SASurz\daten finden Sie die SAS-Datei IRIS.SSD mit den Meßergebnissen von Fishers berühmtem Experiment mit seinen Iris-Arten. Schreiben Sie ein SAS-Programm zum Ausdruck der Datei (proc print). Übergeben Sie Libref und Dateinamen über Makrovariaben. Bilden Sie eine Titel- Anweisung, die aussagt, um welche Datei es sich handelt. Versehen Sie die Fußnote mit dem aktuellen Datum und der Uhrzeit. 3. Gegeben seien folgende %let Anweisungen %let a=Hallo;

%let a1=Auf Wiedersehen;%let b=Gutes Gelingen;%let c=Tschuess;

Überlegen Sie, was die folgenden %put-Anweisungen erzeugen und überprüfen Sie es: %put &a,&b;

%put c&a,&b;%put c&a.&b;%put &c,&a1;%put &c,&a.1;

4. Submittieren Sie folgendes Programm. Woran liegt es, daß der Makro-Prozessor die automatischen Makrovariablen nicht auflöst? proc gslide;

title 'Grafik vom &Sysdate, SAS-Version &sysver';run;

TIP! Verwenden Sie folgende System-Optionen, die Ihnen bei der Fehlersuche behilflich sind: • MPRINT• MLOGIC• SYMBOLGEN

Alle drei System-Optionen geben zusätzliche Informationen über das ablaufende SAS-Makro im Log-Fenster aus. Sie aktivieren sie, indem sie die Options-Anweisung entsprechend einstellen. Aufruf: options symbolgen mlogic mprint; MPRINT: Der Makro-Prozessor gibt den aufgelösten SAS-Code aus. Sie erfahren dadurch, ob eine Makro-Programmanweisung ausgeführt wurde oder nicht. MLOGIC: Spiegelt den Ablauf des Makros, indem es zeitgleich die Programmanweisungen ins Log-Fenster schreibt. SYMBOLGEN: Zeigt Makro-Referenzen an, z.B. ob eine Variable aufgelöst wurde und welchen Wert die Variable besitzt. Alle drei Optionen werden mit nomprint, nomlogic und nosymbolgen wieder zurückgesetzt.

Page 12: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

12

3. Die %Macro-Anweisung

3.1 Definition und Aufruf von SAS-Makros

Ein SAS-Makro ist ein Text zwischen einer %macro und einer %mend-Anweisung. Syntax: %macro name(parameter) / optionen; Makrotext;

%mend name;

Beispiel: %macro datum;Title "Heute ist &sysday, der &sysdate";

%mend datum;

Aufruf: %datum

Das Makro %datum erzeugt automatisch eine Überschrift mit dem aktuellen Datum. Die %macro-Anweisung

•�beginnt die Definition des Makros, • weist dem Makro einen Namen zu und • kann (optional) eine Parameterliste und Optionen übergeben.

3.2 Makro-Name

Der Name des Makros muß ein gültiger SAS-Name sein. Es gibt reservierte Worte, die nicht verwendet werden dürfen, etwa GO,RUN,OPEN usw.. Werden Sie trotzdem verwendet, erscheint folgende Fehlermeldung: ERROR: Macro NAME has been given a reserved name.ERROR: A dummy macro will be compiled.

3.3 Makro-Parameter

Makro-Parameter sind Makrovariablen, die mit dem Aufruf an das Makro übergeben werden. Dies ist, neben der %let-Anweisung, eine weitere Art, Makrovariablen zu bilden. Beispiel: %macro mittel (SDS);

Proc means data=&SDS;run;

%mend mittel; Aufruf: %mittel(co.blutbild) In Klammern steht der Wert, der an die Makrovariablen SDS übergeben wird. In diesem Beispiel bekommt der Parameter SDS den Wert co.blutbild zugewiesen. Die Parameter in der Makro-Definition

• sind in Klammern eingeschlossen, • werden durch Kommas getrennt, • können mit ihrer Position oder mit einem Schlüsselwort spezifiziert werden und

Page 13: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

13

• definieren lokale Makrovariablen, d.h. Variablen, die nur während der Ausführung des Makros gültig sind. (Im Gegensatz zu globalen Makrovariablen, siehe Kap. 4.) 3.3.1 Positions- und Schlüsselparameter

Makro-Parameter können entweder als Positionsparameter (posparm) oder Schlüssel-parameter (keyparm) übergeben werden. Der wesentliche Unterschied zwischen beiden besteht darin, daß das Makro Positionsparameter allein durch ihre Position beim Aufruf erkennt, und Schlüsselparameter mit Variablennamen und Gleichheitszeichen aufgelistet werden müssen. Beispiel für Positionsparameter: %macro name(posparm-1, posparm-2);Beispiel für Schlüsselparameter: %macro name(keyparm-1=wert1, keyparm-2=wert2);

Die Positionsparameter • erscheinen ohne Gleichheitszeichen, • müssen in der im Makro-Aufruf definierten Reihenfolge aufgelistet werden, • haben den Wert Null zum Zeitpunkt der Defintion und können diesen beibehalten, wenn ein

Komma als Platzhalter beim Aufruf eingesetzt wurde. Die Schlüsselparameter

• werden mit einem Gleichheitszeichen aufgelistet, • können in beliebiger Reihenfolge angegeben werden, • können mit Defaultwerten (auch Null) versehen werden und • brauchen beim Aufruf nicht genannt zu werden.

Positions- und Schlüsselparameter können auch gemeinsam in Makros auftreten, doch müssen die Positionsparameter zuerst aufgelistet werden. Beispiel 1: %macro print (var1,var2,var3,sds=_last_);

proc print data=&SDS;var &var1 &var2 &var3;run;

%mend print; Aufruf: %print(albumin,calcium,alter,SDS=co.blutbild); Die Positionsparameter Var1, Var2 und Var3 erhalten die Werte Albumin, Calcium undAlter. Der Schlüsselparameter SDS erhält den Wert co.blutbild. Der Defaultwert ist auf _last_ gesetzt; dies bedeutet, daß automatisch der zuletzt bearbeitete Datensatz verwendet wird, falls im Makroaufruf kein neuer Dateiname angegeben wird. Beispiel 2: %macro ttest (var1,var2,classvar,sds);

proc ttest data=&SDS;class &classvar;var &var1 &var2 ;

run;%mend ttest;

Aufruf 1: %ttest (calcium,albumin,pille, co.blutbild);Aufruf 2: %ttest (calcium,,pille, co.blutbild);

Im zweiten Beispiel werden die Positionsparameter var1, var2, classvar und sds verwendet. Beim zweiten Aufruf soll der T-Test nur für eine Variable berechnet werden. Um eine

Page 14: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

14

Fehlermeldung zu vermeiden, muß anstelle eines Wertes für var2 ein Komma angegeben werden. Durch das Komma überspringt der Makro-Prozessor diesen Wert, und erkennt die nachfolgenden Variablen richtig. Probieren Sie aus, was passiert, wenn sie bei Aufruf 2 das Komma weglassen. Übungsaufgaben

5. Welcher SAS-Code wird mit folgendem Makro erzeugt: %macro meintitl;

title "Heute ist &sysday, &sysdate";%mend meintitl;

Wie lautet der Aufruf dieses Makros? 6. Schreiben Sie ein Makro %sortier, das die Proc Sort aufruft. Übergeben Sie die Informationen über den zu bearbeitenden Datensatz und die by-Variable über Positionsparameter. 7. Fügen Sie in das Makro %Sortier folgende Ergänzungen ein: • die Prozedur Print zur Kontrolle und • eine Titel-Zeile mit dem aktuellen Datum. 8. Schreiben Sie ein Makro %Plotte, das die Prozedur Gplot aufruft. Das Makro sollte 3 Schlüsselparameter haben: • Name der zu verwendenden SAS-Datei, • Name der Variable, die auf der x-Achse aufgetragen wird und • Name der Variable, die auf der y-Achse aufgetragen wird, a. Ergänzen Sie das Makro um eine dritte Variable z, die als Gruppierungsvariable fungieren soll. (plot x*y=z). b. Bearbeiten Sie mit dem Makro den Beispieldatensatz IRIS, den sie im Verzeichnis 'N:\SASURZ\DATEN' finden. Plotten sie PL gegen PW, mit der Variable BLUME als Gruppierungsvariable. c. Fügen Sie eine where-Anweisung für die Variable z ein, und übergeben Sie die Einschränkungsbedingung als Positionsparameter. d. Fertigen Sie sich für jede der drei Blumenarten ein eigenes Schaubild an. 9. Schreiben Sie ein Makro KREUZTAB, das die Prozedur FREQ aufruft. Das Makro sollte drei

Parameter haben: Zwei Positionsparameter für die Variablen in den Zeilen und den Spalten und ein Schlüsselparameter für den Namen des SAS-Datensatzes.

Klassifizieren Sie die Variable SL so, daß vier etwa gleichgroße Gruppen entstehen. Dazu

müssen sie sich ein Format definieren. Erzeugen Sie danach eine temporäre Datei IRIS, in der sie das Format zuweisen. Rufen Sie das Makro für die temporäre Datei IRIS auf und tragen Sie die klassifizierte Variable SL gegen BLUME auf. (Tip: Quartil-Bildung mit PROC UNIVARIATE, Klassifizierung mit PROC FORMAT.)

Page 15: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

15

4. Lokale und globale Makrovariablen

Das SAS-System unterscheidet zwischen • globalen und • lokalen Makrovariablen.

Die globalen Makrovariablen gelten während der gesamten SAS-Sitzung und können an beliebiger Stelle verwendet werden, sobald sie definiert wurden. Globale Variablen sind z.B. die unter Kap. 2.1 beschriebenen automatischen Makrovariablen wie &sysdate oder &systime. Im Unterschied dazu gelten die lokalen Makrovariablen nur in der Umgebung, die während eines Makroaufrufs angelegt wird. Diese Variablen sind daher nur innerhalb des Makros oder innerhalb darin verschachtelter Makros verfügbar. Die Werte der Makrovariablen werden in Symboltabellenabgelegt: die Werte der globalen Variablen in einer einzigen globalen Tabelle, die Werte der lokalen Variablen in jeweils eigenen lokalen Symboltabellen. 4.1 Erzeugung von lokalen und globalen Makrovariablen

Makrovariablen können auf verschiedene Weise erzeugt werden: • vom SAS-System (automatische Variablen, Kap.2.1), • mit der Symput-Routine (siehe Kap. 7.1.2), • durch die Parameter beim Makro-Aufruf (siehe Kap. 3.3), • mit der %input-Anweisung (siehe Kap. 5.3), • mit der %let-Anweisung (siehe Kap. 2.2), • mit der %global-Anweisung (siehe Kap. 4.1.1), • mit der %local-Anweisung (siehe Kap. 4.1.2).

Die Stelle, an der die Variable erzeugt wird, entscheidet, ob die Variable global oder lokal ist: wie wo was automatisch beim SAS-Aufruf global (immer) %let-Anweisung außerhalb eines Makros global (aktuelle Sitzung) %let-Anweisung innerhalb eines Makros lokal Makro-Parameter Parameterliste beim Aufruf lokal %input-Anweisung innerhalb und außerhalb von

Makros global (aktuelle Sitzung)

symput-Routine innerhalb und außerhalb von Makros

global (aktuelle Sitzung)

%global-Anweisung innerhalb und außerhalb von Makros

global (aktuelle Sitzung)

%local-Anweisung innerhalb eines Makros lokal Beispiel: %let name=WILHELM;�

%macro chameleo;%let name=HANS;�%put &name;

%mend chameleo;

Page 16: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

16

%chameleo%put &name;�

Überprüfen Sie am Computer, was passiert. � Mit dieser %let-Anweisung wird die Makrovariable name global definiert. Falls Sie die erste %let-Anweisung weglassen, ist die Makrovariable name nur lokal definiert und die Variable wird nicht richtig aufgelöst, wenn Sie sie außerhalb des Makros � verwenden wollen. Sie erhalten folgende Mitteilung: WARNING: Apparent symbolic reference NAME not resolved.

� Ist die Variable global definiert, so trägt sie den Wert, den sie zuletzt zugewiesen bekommen hat. In diesem Beispiel nimmt die Variable name zuerst den Wert WILHELM � und dann HANS � an. 4.1.1 Die %Global-Anweisung Die %global-Anweisung erzeugt globale Makrovariablen, d.h. Variablen, die sowohl innerhalb als auch außerhalb von Makros benutzt werden können. Mit der %global-Anweisung bilden sie zunächst lediglich eine Variable, weisen ihr aber im Unterschied zur %let-Anweisung noch keinen Wert zu. Sie vereinbaren damit den Status der Makrovariablen, in diesem Fall global. Syntax: %global Makrovariablenname; Beispiel: %global Gfirst; Sie haben nun eine globale Makrovariable Gfirst angelegt, die aber bislang keinen Wert hat. Den weisen Sie ihr mit der %LET-Anweisung zu. Da Sie global vereinbarte Makrovariablen sowohl innerhalb als auch außerhalb eines Makros verwenden können, ist es möglich z.B. mittels globaler Makrovariablen Informationen eines Makros in ein anderes Makro zu transportieren. Beispiel: %let sds=co.blutbild;

%macro compute;%global monat;�%let monat=juli;proc means data=&sds;

Title "report für &month";run;

%mend compute;

%macro write;proc print data=&sds;

Title "report für &monat";run;

%mend write;Aufruf: %compute

%write Submittieren Sie dieses Programm zuerst ohne und dann mit der %global-Anweisung �, und achten Sie auf die Überschrift (title) im Output-Fenster. Wenn Sie die %global-Anweisung weglassen, erscheint im Log-Fenster für das Makro write folgende Mitteilung:

WARNING: Apparent symbolic reference MONAT not resolved.

Page 17: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

17

Dies bedeutet, daß der Makro-Prozessor die Makrovariable monat nicht auflösen kann, da diese nur lokal für das Makro compute vereinbart wurde. Fügen Sie jetzt die %global-Anweisung wieder hinzu, ist die Variable monat global vereinbart und kann überall verwendet werden. Ausnahme: Globale Makrovariablen können nicht innerhalb eines Makros verwendet werden, wenn die Makrovariablen dort bereits lokal verwendet werden. Die %global-Anweisung hat keine Auswirkung, wenn die Variable bereits global definiert wurde, z.B. mit einer %Let-Anweisung außerhalb eines Makros. 4.1.2 Die %Local-Anweisung

Syntax: %local Makrovariablenname; Beispiel: %local nummer; Die %local-Anweisung benennt Variablen, die nur innerhalb des aktuellen Makros Gültigkeit haben. Dies ist nur dann notwendig, wenn die Variable bereits außerhalb existiert. Dies kann z.B. zum Schutz von Indexvariablen sein, die nicht überschrieben werden sollen. Die %local-Anweisung kann nur innerhalb von Makros verwendet werden. Variablen, die mit einer %local-Anweisung definiert wurden, besitzen den Wert 0, solange ihnen kein anderer Wert mittels einer %let-Anweisung zugewiesen wurde. Dieser Wert gilt aber nur innerhalb des Makros. Variablen mit gleichem Namen, die bereits in der Umgebung definiert wurden, behalten ihren zuvor vereinbarten Wert. 4.2 Makros innerhalb von Makros

Wird in einem Makro ein anderes Makro aufgerufen, spricht man von verschachtelten (oder genesteten) Makros. Die globale äußere Umgebung wird als Niveau 0 bezeichnet. Je tiefer die Verschachtelung fortschreitet, desto höher wird das Niveau gezählt. Eine Makrovariable ist innerhalb der Umgebung, in der sie definiert wurde und in jeder höheren Umgebung referenzierbar (also in den verschachtelten Makros). Beispiel: %macro drei;

proc means data=&sds;NIVEAU 3 var &xvar &yvar;

run;%mend drei;

%macro zwei;proc gplot data=&SDS;

NIVEAU 2 plot &yvar*&xvar;run;%drei

%mend zwei;

%macro eins(SDS,yvar,xvar);proc print data=&SDS;

NIVEAU 1 var &yvar &xvar;run;

%zwei%mend eins;

Aufruf: %eins(co.blutbild,alter,albumin)

Page 18: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

18

In diesem Beispiel ruft das tiefste Makro eins, das höher verschachtelte Makro zwei auf, welches wiederum das Makro drei aufruft. Sowohl Makro zwei, als auch Makro drei verwenden die Makrovariablen sds, yvar und xvar, die im Makro eins definiert wurden. Übungsaufgaben

10. Beantworten Sie zu dem folgenden SAS-Makro untenstehende Frage: %let id=ssn;

%macro write(SDS=_last_);%let ort=NEW YORK;proc sort data=&SDS;

by &id;proc print;

title1 "Arbeiter im &ort Büro";title2 "aufgelistet nach &id";footnote "Stand: &sysdate";

run;%mend write;

Welche der folgenden Variablen sind lokal, welche global? Warum? id, SDS, ort, sysdate;

11. Welcher SAS-Code wird von dem Makro %let first=Text außerhalb des Makros definiert;%macro refs;%local first;%global second;%let first=Text innerhalb des Makros definiert;%let second=Zweite Textzeile;%let third=Dritte Textzeile;%put first;%put second;%put third;

%mend refs;

erzeugt, wenn nacheinander die Zeilen %refs%put &first;%put &second;%refs%put &first;%put &second;%put &third;

submittiert werden? 12. Schreiben Sie ein Makro %machdat, mit dem sie sich einen Datensatz erstellen können, der zwei zufällig normalverteilte Variablen besitzt (x und y) und eine Indexvariable i, die gleichzeitig die Anzahl der Beobachtungen sein soll. Übergeben Sie an das Makro außerdem einen Schlüsselparameter, der den Dateinamen enthält (Variable dateinam) (Tip: Verwenden Sie die rannor-Funktion und eine do-Anweisung). Schreiben Sie ein zweites Makro %prinsort, das Datensätze sortieren und ausgeben kann (Proc Sort und Proc Print). Verschachteln Sie dieses Makro im Makro %machdat, sodaß sie den soeben erstellten Datensatz damit bearbeiten können (Zusatz: Vereinbaren Sie die Variable, die den Dateinamen enthält als globale Makrovariable).

5. SAS-Makro-Programmanweisungen

Page 19: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

19

Makro-Programmanweisungen sind die Datenschritt-Anweisungen der Makro-Sprache. Sie unterscheiden sich oftmals nur dadurch, daß die Makro-Programmanweisungen mit einem "%" beginnen und dadurch den Makro-Prozessor ansprechen. Sie können alle Makro-Programmanweisungen innerhalb von Makros benutzen, manche zusätzlich auch außerhalb von Makros. Makro-Programmanweisungen und wo sie benutzt werden können:

Anweisungen, die überall benutzt werden können

Anweisungen, die nur innerhalb von Makros benutzt werden können

%* %MACRO %DO %IF-%THEN%DISPLAY %MEND %DO %UNTIL Iteratives %DO%GLOBAL %PUT %DO %WHILE %label%INPUT %SYSEXEC %END %LOCAL%KEYDEF %WINDOW %GOTO%LET

5.1 %*-Anweisung

Diese Anweisung dient der Kommentierung des Makros. Sie kann überall verwendet werden. Im Unterschied zu normalen Kommentarzeilen (*..;) erscheinen die Makro-Kommentare nicht im Log-Fenster. Wie gewohnt können Sie aber auch mit der Zeichenfolge /*......*/kommentieren. Syntax: %*Kommentar; Beispiel: %macro kommenta(sds,x);

%*Dieses Makro überprüft, ob versehentlich eineIdentifikationsnummer vergeben wurde, die

kleiner als 0 ist.;data _null_;%***Schreibe die Beobachtungen mit x<0 heraus;set &sds;if &x<0 then put 'Achtung: ID 'id':x<0';run;

%mend; 5.2 %Put-Anweisung

Die %put-Anweisung schreibt Text in das Log-Fenster. Sie kann innerhalb und außerhalb von Makros benutzt werden. Wenn der Text länger als die eingestellte Zeilenlänge (Linesize) ist, wird der Text umgebrochen und der restliche Text in die nächste Zeile geschrieben. Syntax: %PUT text; Die %put-Anweisung entfernt führende oder nachfolgende Leerzeichen. Sollen diese im Log-Fenster erscheinen, müssen sie eine der Makro-Quoting-Funktionen benutzen, z.B. %str (siehe Kap 6.3.2). Beispiel: %macro testput;

%put Makro TESTPUT beginnt die Ausführung ;�%put Makro TESTPUT beginnt am &sysday..;�%put %str(Semikolons(;) beenden SAS-Anweisungen.);�%put %str( );�%put %str(Fisher%'s exakter Test);�

Page 20: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

20

%mend testput;

%testput; Ergebnis: Makro TESTPUT beginnt die Ausführung

Makro TESTPUT beginnt am Friday.Semikolons(;) beenden SAS-Anweisungen.

Fisher's exakter Test

� Die erste %put-Anweisung schreibt eine einfache Textzeile. � Es müssen am Satzende zwei Punkte verwendet werden, da ein Punkt automatisch als

Begrenzungszeichen erkannt wird und erst der zweite Punkt den Satz beendet. � Um ein Semikolon als Textzeichen zu verwenden, muß die %str-Funktion verwendet werden,

die Sonderzeichen als Text behandelt. � Produziert eine Leerzeile; � Diese %put-Anweisung erzeugt ein offenes Anführungszeichen. Dies erkennt SAS nur dann als

Textzeichen, wenn das Prozentzeichen davor steht. Probieren Sie aus, was passiert, wenn Sie das Prozentzeichen weglassen.

5.3 %Input-Anweisung

Mit der %input-Anweisung ist es möglich, während des Ablaufs eines Makros Daten vom Benutzer zu erfragen. Diese können sogleich im Makro verwendet werden, indem der erfragte Wert einer Makrovariable zugewiesen wird. Die %input-Anweisung kann innerhalb und außerhalb von Makros verwendet werden, allerdings nur im interaktiven Modus. Werte mit Leerzeichen müssen in Anführungszeichen eingegeben werden, z.B. bei Vor- und Nachname. Syntax: %INPUT name1 name2...; Beispiel: %macro identi;

%put Nennen Sie Ihren Namen und Wohnort;%input Name Ort;%put Nennen Sie Ihr Alter;%input alter;%put &Name wohnt in &ort, und ist &alter alt.;

%mend identi;Aufruf: %identi; Wenn Sie das Makro %identi submittieren und aktivieren, erscheint der Text der %put-Anweisungen im Log-Fenster und verlangt die Eingabe ihrer Daten. Sie schreiben diese in den Programm Editor und submittieren anschließend. Mit Hilfe der %input-Anweisung erfasst der Makro-Prozesor nun den Wert ihrer Variable. Werden mehr Werte angegeben, als Variablen definiert sind, werden diese in der automatischen Variable SYSBUFFR gespeichert (siehe Seite 80 in "SAS Guide to Macro Processing"). Der einfachste Weg, einen aus mehreren Teilen bestehenden Wert aufzunehmen, ist der Umweg über die SYSBUFFR-Variable. Beispiel: %macro vornach;

%put Geben Sie ihren vollen Namen an;%input;�%let name=&sysbuffr;�

Page 21: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

21

%put &name;%mend vornach;

� Der Makro-Prozessor schreibt zunächst die Antwort auf die erste %put-Anweisung in die automatische Variable &SYSBUFFR.

� Danach wird mit der %let-Anweisung vereinbart, daß der Inhalt von SYSBUFFR in die Variable name geschrieben wird.

5.4 %If - %Then / %Else-Anweisung

Mit dieser Anweisung können Anweisungen bedingt ausgeführt werden. Die %if-%then/%else-Anweisung der Makro-Sprache funktioniert synonym zur if-then/else Anweisung im Datenschritt. Sie kann nur innerhalb von Makros verwendet werden. Syntax: %IF logischer Ausdruck %THEN SAS-Anweisung; %ELSE SAS-Anweisung; Die %else-Anweisung ist optional. Die SAS-Anweisungen, die %then und %else folgen, können

• Makro-Programmanweisungen, • konstanter Text und • logische Ausdrücke

sein. Beispiel: %if &i=1 and &j>5

%then %put Überprüfen Sie die Indexvariablen.;%else %put Alles Okay;

Wenn die Makrovariablen i gleich 1 und j größer als 5 sind, dann, und nur dann, soll ins Log-Fenster Überprüfen Sie die Indexvariablen geschrieben werden. Sonst (%else) soll im Log-Fenster Alles okay erscheinen. 5.5 %Do - %End-Anweisung

Sie können mit der %do und der %end-Anweisung eine Do-Gruppe definieren, die als Block ausgeführt wird. In Verbindung mit der %if-%then-Anweisung können Sie auf diese Weise mehrere SAS-Anweisungen ausführen. Die %do-%end-Anweisung kann nur innerhalb eines Makros verwendet werden. Syntax: %do; Text und Makro-Programmanweisungen %end; Beispiel: %macro frage(aaa,sds);

%if &aaa=1 %then �

%do;Proc Print data=&sds;run;

%end;%else �

%do;Proc contents data=&sds;

run;%end;

%mend frage;

Page 22: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

22

Aufruf: %frage(1, co.iris)� %frage(Unsinn, co.iris)� � Falls die Variable aaa den Wert 1 annimmt, wird die Prozedur Print verwendet. � Falls die Variable aaa einen anderen Wert als 1 zugewiesen bekommt, wird die Prozedur Contents ausgeführt. Übungsaufgabe

13. Erzeugen Sie ein Makro NUMMER, das zuerst abfragt, welchen Datensatz Sie bearbeiten wollen, und danach folgenden Text im Log-Fenster erzeugt: Wählen Sie eine der beiden Möglichkeiten:

Ausdruck (geben Sie eine 1 ein)Mittelwerte (geben Sie eine 2 ein).

Je nachdem, welche Entscheidung der Benutzer getroffen hat, soll nun entweder Proc

Print oder Proc Means ausgeführt werden. Kommentieren Sie das Makro entsprechend seinen Programmteilen. 5.6 %Do - %To - %End-Anweisung (Iterative %Do-Anweisung)

Die %Do-%To-%End-Anweisung führt bis zu einem definierten Endpunkt immer wieder die gleichen Programmteile aus. Man spricht von iterativen %Do-Schleifen (loops). Iterative %Do-Schleifen sind nicht mit %while und %until verknüpfbar. Syntax: %do Makrovariable=Start %to Stop <%by Inkrement>; Text und Makro-Programmanweisungen %end;

Makro-variable

Benennt eine Makrovariable, deren Wert die Anzahl der %Do-Schleifen regelt. Existiert diese Indexvariable noch nicht, wird sie vom Makro-Prozessor angelegt.

start Startpunkt der %Do-Schleifen, muß ganzzahlig sein. stop Endpunkt der %Do-Schleifen, muß ganzzahlig sein

Inkrement Mit der optionalen %by-Anweisung kann vereinbart werden, in welchen Schritten die %DO-Schleife ausgeführt wird (Standard=1).

Beispiel 1: %macro create;

%do i=1 %to 3;data monat&i;

infile in&i;input produkt kosten datum;

run;%end;

%mend create; Aufruf: %create;Ergebnis: data monat1;

infile in1;input produkt kosten datum;

run;data monat2;

Page 23: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

23

infile in2;input produkt kosten datum;

run;data monat3;

infile in3;input produkt kosten datum;

run; Die %do-Schleife wird 3 mal hintereinander ausgeführt. Die Indexvariable i wird in jedem Durchgang um das Inkrement 1 erhöht. Es ist auch möglich %Do-Schleifen zu verschachteln: Beispiel 2: %macro create2;

%do jahr=90 %to 92;%do mon=1 %to 12;

data dat_&jahr&mon;infile in&jahr&mon;input person umsatz zeit;

run;%end;

%end;%mend create2;

Aufruf: %create2;Die Schleife wird 36 mal(3*12) durchgeführt, und erzeugt für jeden Monat der Jahre 90 bis 92 einen Datenschritt (siehe Ergebnis des ersten Beispiels). 5.7 %Do - %Until - %End-Anweisung

Die %Do - %Until -Anweisung führt die %Do-Schleife so lange aus, bis eine zuvor vereinbarte Bedingung erfüllt ist. Syntax: %do %until (Ausdruck); Text und Makro-Programmanweisungen %end; Beispiel: %macro tue_bis(num);

%put Start Macro tue_bis: num ist &num;%do %until(&num>10);

%put ****&num****;%let num=%eval(&num+1);

%end;%put Ende Macro tue_bis: num ist &num;

%mend tue_bis; Aufruf: %tue_bis(-23) In unserem Beispiel soll die %do-%until-Schleife so lange ausgeführt werden, bis die Variable NUM größer als 10 ist. Nach jedem Durchgang bekommt die Variable NUM mit Hilfe der %eval-Funktion (siehe Kap. 6.2) zu ihrem Ausgangswert (im Beispiel -23) eine 1 aufaddiert, und erhält somit einen neuen Wert. In dem Moment, in dem dieser Wert größer als 10 (also bei 11) geworden ist, bricht das Makro ab und es erscheint die Meldung, daß das Makro beendet ist. 5.8 %Do - %While - %End-Anweisung

Page 24: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

24

Die %Do-%While-%End-Anweisung wiederholt Programmanweisungen, solange eine Bedingung erfüllt bleibt. Syntax: %Do %While(logischer Ausdruck); Text und Makro-Programmanweisungen; %End; Beispiele: %do %while(&a<&b);

%do %while(&date=31 and &month<12); Beispiel: %macro tu_solan(num);

%put Start Macro tu_solan: Wert von Num ist &num;%do %while(&num>5 and &num<=10);

%put ****&num****;%let num=%eval(&num+1);

%end;%put Ende Makro Tu_solan: Wert von Num ist &num;%mend tu_solan;

Aufruf: %tu_solan(7) Solange die Variable NUM größer als 5 und kleiner gleich 10 ist, wird die %do-%while-Schleife ausgeführt. Der Unterschied zwischen der %do-%while und der %do-%until-Anweisung liegt darin, daß die %do-%while-Anweisung die Schleife ausführt, solange die Bedingung erfüllt bleibt. Die %do-%until-Anweisung führt dagegen eine Schleife aus, bis eine Bedingung erfüllt wird. 5.9 %Goto label; %label-Anweisung

Mit der %Goto-Anweisung (oder %Go To) können Sie zu einer Sprungmarke, die durch das "label" gekennzeichnet ist, verzweigen. Syntax: %Goto | %Go to label; %label: Makrotext;

label An dieser Stelle wird die Sprungmarke vereinbart, auf die verwiesen werden soll. Dieses Label dient dem Makro-Prozessor in späteren Programmteilen als Hinweis, an welche Stelle im Makro gesprungen werden soll. Die %Goto und die %label-Anweisung müssen in derselben Umgebung auftauchen, d.h. sie sind nur lokal, d.h. innerhalb eines Makros, gültig.

Beispiele: %goto xxx;

%xxx: %put Die Sprungmarke heißt XXX; Beispiel: %macro info;

%put Wollen Sie eine ausführliche oder einekurze Zusammenfassung?;

%put 1=lang, 2=kurz;%input eingabe;%if &eingabe=2 %then %goto kurz;

proc contents;run;proc freq;tables _numeric_;

Page 25: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

25

run;%kurz: proc print data=_last_(obs=10);

run;%mend info;

Aufruf: %info Das Makro Info kann über den zuletzt benutzten Datensatz (data=_last_) optional kurz oder lang Auskunft geben. Wenn eine 2 eingegeben wird, springt der Makro-Prozessor automatisch zur Sprungmarke %kurz und führt die Prozedur Print für 10 Beobachtungen durch. 5.10 %Sysexec-Anweisung

Mit Hilfe der %sysexec-Anweisung können innerhalb und außerhalb von Makros Betriebs-systemkommandos ausgeführt werden. Syntax: %sysexec Kommando; Beispiel: %sysexec cd\;

%sysexec time;Beispiel: %macro makedir;

if %upcase(&sysscp)=WIN %then%do;%sysexec cd\;%sysexec md Aufgabe;

%end;%else %if %upcase(&sysscp)=RS6000 %then%do;%sysexec mkdir aufgabe;

%end;%mend makedir;

Aufruf: %makedir; Das Makro makedir erstellt auf Betriebssystemebene, wenn Sie unter SAS für Windows arbeiten, im Laufwerk D: das Verzeichnis aufgabe. Falls Sie unter AIX arbeiten, wird das Verzeichnis aufgabe in ihrem Home-Verzeichnis angelegt.

Page 26: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

26

5.11 %Keydef-Anweisung

Die %keydef-Anweisung ermöglicht die Definition und Abfrage von Funktionstastenbelegungen. Sie ist sowohl lokal als auch global verwendbar. Die Definition gilt nur für die aktuelle Sitzung oder solange, bis sie geändert wird. Sie können so z.B. Makros über Funktionstasten aufrufen. Syntax: %keydef key-name | 'key-name' | "keyname" <text>;

key-name ist der Name einer beliebigen Funktionstaste, z.B. F1. Die maximale Länge für keyname ist 8 Zeichen

text kann jeder beliebiger Text sein, die maximale Länge beträgt 80 Zeichen. Falls Sie Anführungszeichen, Semikola u.ä. verwenden wollen, müssen Sie den Text in Anführungszeichen setzen�.

Beispiele: %keydef f12 zoom;

%keydef f5 "clear log; clear output";�%keydef f11 %makedir;

Übungsaufgaben

14. Erzeugen Sie ein Makro MENUE, das folgenden Text im Log-Fenster erzeugt:

Sie haben folgende Möglichkeiten:

1. Patientenaufnahme2. Löschen eines Patienten3. Listenausdruck

mit Sortierreihenfolgea. Familiennameb. Wohnort

Treffen Sie Ihre Entscheidung: ___

(Tip: %input und %str.) 15. Schreiben Sie ein Makro PROMPT, das den Namen einer SAS-Prozedur und den Namen des SAS-Datensatzes erfragt und die gewünschte Prozedur ausführt (Hinweis: Dies ist nicht für alle Prozeduren möglich). 5.12 %Window-Anweisung

Die %Window-Anweisung erzeugt Fenster, die vom Makro-Prozessor gesteuert werden. Makro-Windows können Text darstellen und Eingabe aufnehmen. Sie haben verschiedene Gestaltungs-optionen, z.B. Farbe, Schriftpositionierung usw. Mit der %window-Anweisung definierte Fenster, können mit der %display-Anweisung (siehe 5.13) am Bildschirm anzeigt werden. Einmal definiert, gilt das Fenster bis zum Ende der aktuellen SAS-Sitzung. Der Name des Fensters erscheint in der Kopfzeile. Es kann sowohl über Kommando- als auch über Message-Zeilen verfügen. Anstatt der Kommandozeile kann man dem Fenster auch ein Pull-Down-Menü zuweisen, welches man zuvor mit der PMENU-Routine gebildet hat. Syntax: %window Fenstername <Fensteroptionen> Feld-Definition-1 <... Feld-Defintion-n>; %window Fenstername <Fensteroptionen> Gruppen-Definition-1 <...Gruppen-Feld-Definitionen-n>;

Page 27: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

27

Fenstername benennt das Fenster und muß angegeben werden. Es gelten die

üblichen SAS-Namenskonventionen. Fensteroptionen spezifizieren allgemeine Eigenschaften des Fensters. Felddefinitionen Felder verbinden Text oder Makrovariablen mit einer Position im

Fenster und dessen Eigenschaften Gruppen definiert eine Gruppe von Feldern, die gleichzeitig angezeigt

werden. Beispiel: %window fenster� color=black irow=5�

#10 @10 'Dies ist mein erstes Fenster'� color=white;Aufruf: %display fenster; �Fenstername �Fensteroptionen �Felddefinitionen 5.12.1 Fensteroptionen Es gibt folgende Optionen für die Fenstergestaltung, die Sie verwenden können: columns=Spaltenanzahl Hier bestimmen Sie die Anzahl der Spalten des Fensters, inklusive dem Rand. Wenn Sie

dies nicht ausdrücklich festlegen, wird die größtmöglichste Spaltenanzahl, die auf dem jeweiligen Monitor möglich ist, gewählt.

rows=Zeilenanzahl Anzahl der Zeilen des Fensters inkl. Rand, auf die das Fenster plaziert wird (Die Anzahl

der Zeilen ist abhängig vom verwendeten Monitor). icolumn=Spalte Steht für "Initial Column" (frei übersetzt "anfängliche Spalte"). Definiert die Spalte, auf die

das Fenster plaziert wird (Default=1, dies ist die linke obere Ecke des Fensters). irow=Zeile Steht für "Initial Row". Bestimmt die Zeile, auf die das Fenster plaziert wird (def.=1). color=Farbe Spezifiziert die Hintergrundfarbe des Fensters.Die Darstellung der Farben ist abhängig von

ihrem Bildschirm. Folgende Farben können Sie wählen: Black Gray (oder Grey) Pink Blue Green Red Brown Magenta White Cyan Orange Yellow

keys=<<libref.>catalog.>keys-entry Sie können an dieser Stelle bestimmen, in welchem Katalog ihre Funktionstastenbelegungen zu finden sind. Ohne Katalogangabe wird der von SAS angelegte Katalog sasuser.profile verwendet. menu=<<libref.>catalog.>pmenu-entry Falls Sie sich mit der Prozedur PMENU ein eigenes Pull-Down-Menü angelegt haben,

können sie an dieser Stelle den Katalog vereinbaren, in dem das PMENU abgelegt ist. Ohne Katalogangabe wird der von SAS angelegte Katalog SASuser.profile verwendet.

5.12.2 Felddefinitionen

Page 28: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

28

Feld-Definitionen verbinden konstanten Text oder Makrovariablen mit einer Position im Fenster und dessen Attributen. Konstanter Text muß in Anführungszeichen stehen. Felder dürfen sich nicht überlappen. Es können sonst Fehler auftauchen, wie z.B. die inkorrekte Zuweisung von Werten zu einer Makro-Variable, da diese an einer falschen Stelle vereinbart sind. Syntax einer Feld-Definition mit konstantem Text: <row column> 'Text' | "Text“ <Optionen> Syntax einer Feld-Definition mit Makrovariable: <row column> Makro-Variable <Feldlänge> <Optionen> row column bezeichnet die genaue Position einer Makro-Variable oder eines konstanten Textes im Fenster. Sie vereinbaren die Position mit Hilfe von Zeilen- bzw. Spaltenpointern:

Zeilenpointer (row): # und / (bewegt den Pointer in die nächste Zeile, auf Spalte 1) Spaltenpointer (column): @ und + (bewegt den Pointer in derselben Zeile, um eine von ihnen bestimmte Anzahl von Spalten weiter.)

Beispiel: #3 @5 "Geben Sie ihren Vornamen ein"; Der Text erscheint in der dritten Zeile, beginnend mit der fünften Spalte. 'Text' | "Text" An dieser Stelle können Sie einen konstanten Text darstellen. Der Text muß in Anführungszeichen geschrieben sein. Makro-Variable benennt eine Makro-Variable, deren Wert entweder erscheinen soll, oder die an dieser Stelle einen Wert erhalten soll. Feldlänge definiert, wie lang die Eingabe des Wertes der Makro-Variable sein soll. Dies beeinflußt allerdings nicht die vereinbarte Länge der Makro-Variable. Wenn Sie lediglich den Wert einer Makrovariablen darstellen wollen, wählt der Makro-Prozessor automatisch die ihrer Größe entsprechende Länge der Variablen. Optionen Es gibt folgende Optionen: ATTR=attribute (Abkürzung A=) Mit Hilfe dieser Option können Sie vereinbaren, wie ihr Feld aussehen soll. Es gibt folgende Möglichkeiten: BLINK (blinkendes Feld) HIGHLIGHT (hell leuchtendes Feld) REV_VIDEO UNDERLINE (Feld wird unterstrichen)

COLOR=color (Abk. C=) spezifiert die Farbe, in der ihr Feld erscheinen soll.

Page 29: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

29

PROTECT=YES|NO Falls Sie PROTECT=YES angeben, ist ihr Feld geschützt und kann nicht überschrieben werden. Dies ist nur dann sinnvoll, wenn Sie eine Makro-Variable in einem Feld darstellen wollen; konstanter Text ist automatisch geschützt. REQUIRED=YES|NO vereinbart, daß eine Eingabe ins Feld erfolgen muß, da der Makro-Prozessor sonst nicht zum nächsten Feld springt. DISPLAY=YES|NO bestimmt, ob die Eingabe am Bildschirm erscheint oder nicht, z.B. bei der Abfrage von Passwörtern. AUTOSKIP=YES |NO (Abkürzung Auto=) Kontrolliert, ob der Cursor automatisch auf das nächste Eingabefeld springt oder erst nach Drücken der Enter-Taste. Wenn Sie AUTOSKIP=YES angeben, springt der Cursor automatisch in das nächste ungeschützte Eingabefeld. 5.12.3 Gruppen-Definition Die Gruppendefinition definiert eine Gruppe von Feldern, die gleichzeitig in einem Fenster angezeigt werden. Syntax: GROUP=Gruppenname Der Gruppenname muß den üblichen SAS-Namenskonventionen entsprechen. Zum Aufruf ist dann sowohl der Name des Fensters, als auch der Gruppenname anzugeben

Beispiel: Fenster.monatDamit wird die Gruppe monat des Fensters Fenster aufgerufen.

5.12.4 Automatische Variablen Die %window-Anweisung generiert automatisch die beiden folgenden Variablen: SYSCMD, die den Text des letzten Fensterkommandos enthält und SYSMSG, die den Text enthält, der in der Message-Zeile (erscheint unter der Komanndozeile) ausgegeben werden kann. Der Wert der Variable SYSMSG kann z.B. über eine %let- Anweisung definiert werden. Beispiele Beispiel 1: Das erste Fenster soll nur drei Textzeilen anzeigen. %window grusswin color=white

#9 @32 'Guten Tag, hier ist ihr SAS System!'attr=highlight color=black#11 @35 "Heute ist &sysday, der &sysdate.." color=black#17 @28 'Drücken Sie die Enter-Taste um weiterzumachen.'color=blue;

%display grusswin;

Page 30: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

30

Das Fenster grusswin begrüßt den Benutzer und zeigt das aktuelle Datum (mit Hilfe der beiden automatischen Makrovariablen &sysday und &sysdate) an. Die Hintergrundfarbe ist Gelb, der Text erscheint Schwarz und Blau. Außerdem hat die erste Zeile das Attribut highlight. Um das Fenster am Bildschirm anzeigen zu lassen, ist folgende Makro-Programmanweisung nötig:

%display grusswin;

Folgendes Fenster erscheint auf dem Bildschirm:

Beispiel 2: Im zweiten Beispiel werden zwei Gruppen definiert, die wahlweise angezeigt werden sollen. %window eingabe color=whitegroup=lang

#3 @5 "Geben Sie in die folgenden Zeilen bitte die Daten ein." c=black#5 @5 "Bedenken Sie dabei, das Sie für das Geschlecht" c=black#7 @5 "folgende Codierung vornehmen müssen:" c=black

#9 @5 "Frauen=1, Männer=0" c=black

group=kurz#11 @8 "Name:" c=black @20 name 34 attr=underline required=yes c=black#13 @8 "Geschlecht:" c=black @20 sex 1 attr=underline required=yesc=black#15 @8 "Alter:" c=black @20 alter 2 attr=underline required=yes

c=black;

%macro DISP(typ);%if &typ=lang %then %display eingabe.lang noinput;%display eingabe.kurz;

%mend DISP; In dem Fenster EINGABE enthält die Gruppe LANG eine ausführliche Anleitung zur Dateneingabe, die Gruppe KURZ zeigt dagegen lediglich die Variablennamen an. Das Makro DISP zeigt entweder beide Gruppen des Fensters an oder nur die kürzere Version, je nachdem welchen Wert die Variable Typ besitzt. Der Aufruf %DISP(lang)führt dazu, daß beide Gruppen des Fensters angezeigt werden, wie in Bild 2 zu sehen ist.

Page 31: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

31

Bild 2: Makro DISP zeigt beide Gruppen des Fensters an.

Falls die Makrovariable TYP allerdings einen anderen Wert als "lang" zugewiesen bekommt, wird nur die kurze Version am Bildschirm präsentiert, z.B. %DISP(x).

Bild 3: Makro DISP zeigt nur die Gruppe "kurz" an.

5.13 %Display-Anweisung

Mit Hilfe der %Display-Anweisung können Makro-Windows angezeigt werden. Wenn ein Fenster mit geschützten Feldern (Protect=YES) angezeigt wird, kann die Anzeige durch Drücken der Enter-Taste beendet werden. Wenn das Fenster ungeschützte Felder enthält, müssen zuerst Werte in die Felder eingegeben werden, bevor das Fenster geschlossen werden kann. Syntax: %DISPLAY Fenster <.Gruppe> <NOINPUT> <BLANK> <BELL> <DELETE>;

Fenster benennt das Fenster, das angezeigt werden soll <.Gruppe> Falls das Fenster Gruppen enthält (siehe Bsp. 5.12), müssen an dieser

Stelle auch die Gruppen angegeben werden (müssen durch einen Punkt voneinander getrennt sein).

NOINPUT Verhindert, das Werte in ein Feld eingegeben werden können. Außerdem können Sie die NOINPUT-Option verwenden, wenn Sie mehrere Gruppen eines Fensters gleichzeitig anzeigen wollen. Durch die NOINPUT-Option bleibt die Gruppe sichtbar, auch wenn spätere Gruppen angezeigt werden.

Page 32: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

32

BLANK Löscht die Anzeige. Nur dann sinnvoll, wenn die %Display-Anweisung innerhalb eines Makros verwendet wird, da ansonsten die Anzeige automatisch nach Ausführung der %Display-Anweisung entfernt wird.

BELL Sobald die Anzeige erscheint, ertönt ein kurzer Klingelton. DELETE Löscht den Fensterinhalt, nach dem das Fenster verarbeitet wurde

(erst ab SAS-Version 6.10). Beispiel: %Display eingabe.kurz noinput bell;

Übungsaufgabe

16. Schreiben Sie ein Makro BEGINN, daß ein Fenster Anfang aufruft, das Sie am Anfang jeder SAS-Sitzung fragt, ob Sie folgende libname-Anweisungen setzen wollen:

libname b'B:\';libname a'A:\';libname co 'N:\sasurz\daten';

Falls die Abfrage mit JA (oder einer 1) beantwortet wird, sollen die Libname-Anweisungen gesetzt werden.

6. SAS-Makro-Funktionen

Makro-Funktionen verarbeiten Makroausdrücke, sogenannte Argumente, wie z.B. Variablen oder Zahlenketten, und erzeugen daraus ein Resultat, z.B. einen Buchstaben oder eine Zahl. Makro-Funktionen sind sowohl lokal als auch global zu verwenden. Beispiel: %put %eval(200+400); In diesem Beispiel wird mit Hilfe der %Eval-Funktion die Summe der beiden Argumente 200 und 400 berechnet. Mit Hilfe der %put-Anweisung wird das Resultat 600 ausgegeben. Die Makro-Funktionen lassen sich in vier Kategorien einteilen: 1. Bearbeitung von Zeichenketten 2. Auswertung von logischen und numerischen Ausdrücken 3. Behandlung von speziellen Zeichen 4. Interaktion mit Dateivariablen (siehe Kap. 7)

Page 33: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

33

6.1 Funktionen zur Bearbeitung von Zeichenketten

%index Findet das erste Auftreten einer Zeichenkette %length Bestimmt die Länge des Arguments %scan Sucht nach Worten %substr Erzeugt einen Substring %upcase Verwandelt Klein- in Großbuchstaben %qscan, %qsubstr%qupcase

analog zu oben, führen aber zusätzliche Quotierungen durch

6.1.1 %Index-Funktion

Die Funktion sieht nach, ob ein Argument in einer Zeichenkette (Quelle) vorhanden ist, und gibt die Position, an der sich das Argument zum ersten Mal in der Zeichenkette befindet, zurück. Ist das Argument nicht in der Quelle enthalten, wird eine 0 zurückgegeben. Syntax: %index(Quelle, Argument); Die Quelle und das Argument können

• konstanter Text, • referenzierte Makro-Variable • andere Makro-Funktion und • Makro-Aufruf

sein. Beispiel 1: %let a=ein sehr langer Wert;

%let b=%index(&a,n);%put I erscheint an Position &b;

Ergebnis: I erscheint an Position 3 Im Beispiel 2 wird die %index-Funktion dazu benutzt, zu bestimmen, ob ein Datensatz (dsn) permanent oder temporär ist. Es wird überprüft, ob das Argument &dsn einen Punkt enthält. Enthält das Argument keinen Punkt, so ist die If-Bedingung erfüllt, und der Datensatz wird als temporär erkannt. Beispiel 2: %macro check(dsn);

%global name;%if %index(&dsn,.)=0%then %put Der Name des temporären Datensatz ist work.&dsn;%else %put Der Name des permanenten Datensatz ist &dsn;

%mend check;

Der Aufruf %check(report) liefert den Satz Der Name des temporären Datensatz ist work.report. Der Aufruf %check(daten.report) liefert als Ergebnis den Satz Der Name des permanenten Datensatz ist &daten.report.

Page 34: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

34

6.1.2 %Length-Funktion

Diese Funktion ermittelt die Länge eines Arguments. Wenn das Argument einen Nullwert hat, gibt die Funktion 0 zurück. Syntax: %length(Argument) Das Argument kann

• konstanter Text, • referenzierte Makro-Variable • andere Makro-Funktion und • Makro-Aufruf

sein. Beispiel: %let a=Guten;

%let b=Tag;%put *%length(&a)* **%length(&b)** ***%length(&a&b)***;

Ergebnis: *5* **3** ***8*** 6.1.3 %Scan- und %Qscan-Funktion

Die Funktion %scan gibt das n-te Wort des argument zurück, wobei Worte Zeichenketten in argument sind, die durch Trennzeichen (delimiters) getrennt sind. Syntax: %scan(argument,n<,delimiters); Gibt es weniger als n Worte, wird ein Nullstring zurückgegeben. Folgende Trennzeichen sind Default-Delimiter: Leerzeichen(Blank), < ( + | & ! $ * ) ; - / , %. Diese Delimiter müssen deshalb nicht angegeben werden. Das argument kann

• konstanter Text, • referenzierte Makro-Variable • andere Makro-Funktion und • Makro-Aufruf

sein. n kann eine Zahl oder ein Makro-Ausdruck sein. Die Funktion %qscan ist identisch mit der %scan-Funktion, mit dem Unterschied, daß sie ein quotiertes Resultat liefert (zu Quoting siehe Kap. 6.3). Syntax: %qscan(argument,n<,delimiters); Beispiel Ergebnis %let x=%nrstr(%a*%b*%c);%put %qscan(&x,3,*) ; %c

%put %scan(&x,3,*) ;

WARNING: Apparent invocation ofmacro C not resolved.%c

Page 35: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

35

6.1.4 %Substr- und %Qsubstr-Funktion

Die Aufgabe der %substr-Funktion ist es, eine Zeichenkette argument ab der Position position einzulesen und ein unquotiertes Resultat zurückzugeben. Syntax: %substr (argument, position <,länge>) argument, position und länge können

• konstanter Text, • Makro-Variable, • andere Makro-Funktion und • Makro-Aufruf

sein, wobei sich position und länge zu einer Zahl auflösen müssen. Die länge und position können Ergebnisse von Makro-Ausdrücken sein. Wenn länge nicht angegeben wird, dann wird bis zum Ende gelesen. Ist länge größer als das argument erscheint eine Warnung. Beispiel Ergebnis %let Text=Lebe wild und gefährlich;%let resultat=%substr(&text,6);%put Das Ergebnis ist: &resultat;

Das Ergebnis ist: wild und gefährlich

%let resultat=%substr(&text,6,4);%put Das Ergebnis ist: &resultat; Das Ergebnis ist: wild

%let p=15;%let l=10;%let resultat=%substr(&text,&p,&l);%put Das Ergebnis ist: &resultat; Das Ergebnis ist: gefährlich

%let resultat=%substr(&text,%length(&text)-13);

%put Das Ergebnis ist: &resultat; Das Ergebnis ist: und gefährlich

Die Funktion %qsubstr ist identisch mit der %substr-Funktion, mit dem Unterschied, daß sie ein quotiertes Resultat liefert (zu Quoting siehe Kap. 6.3). Syntax: %substr (argument, position <,länge>) Beispiel: %let a=1;

%let abc=5;%let def=%nrstr(&abc);%put *&def* *%qsubstr(&def,1,2)* *%substr(&def,1,2)*;

Ergebnis: *&abc* *&a* *1* 6.1.5 %Upcase- und %Qupcase-Funktion

Diese Funktion %upcase transformiert alle kleinen Buchstaben, die im argument genannt sind, in Großbuchstaben. Die %upcase-Funktion liefert ein unquotiertes Resultat (vergl. Kap. 6.3). Nützlich ist die Funktion besonders bei Vergleichsoperationen, da der Makro-Prozessor nicht automatisch Kleinbuchstaben in Großbuchstaben verwandelt, wenn er Vergleiche ausführt. Dies kann dann zu Fehlermeldungen führen, da z.B. das Argument add nicht als ADD erkannt wird. Syntax: %upcase (argument)

Page 36: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

36

Beispiel 1: %macro Verglei;

%put Geben Sie ihr Geschlecht an (w für weiblich,m für männlich):;

%input sex;%if &sex =W %then %put weiblich;�%else %put männlich;

%mend verglei;Aufruf: %verglei Eingabe: wErgebnis: männlich � Wenn Sie für Geschlecht ein W eingeben, soll weiblich ausgegeben werden. In diesem Beispiel passiert dies allerdings nur, wenn sie ein großes W eingeben. Bei einem kleinen Buchstaben erscheint männlich. Beispiel 2: %macro Verglei;

%put Geben Sie ihr Geschlecht an (W für weiblich,M für männlich):;

%input sex;%if %upcase(&sex) =W %then %put weiblich;�%else %put männlich;

%mend verglei;Aufruf: %verglei Eingabe: wErgebnis: weiblich � Mit Hilfe der %upcase-Funktion wird auch das kleine w als weiblich erkannt. Die Funktion ist identisch mit der %upcase-Funktion, mit dem Unterschied, daß sie ein quotiertes Resultat liefert (zu Quoting siehe Kap. 6.3). Syntax: %qupcase(argument)

Beispiel: Ergebnis: %let x=%nrstr(%eval(5+23));%put *&x* *%qupcase(&x)*%upcase(&x)*;

*%eval(5+23)* *%EVAL(5+23) *28*

Übungsaufgabe

17. Verwenden Sie die Makro-Funktionen, um aus einem zweiteiligen SAS-Dateinamen den Libref und den eigentlichen Dateinamen herauszulesen. Vereinbaren Sie, daß als Default- Wert immer der zuletzt verwendete Datensatz verwendet wird (Tip: syslast).

Page 37: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

37

6.2 %Eval Funktion zur Auswertung von logischen und numerischen Ausdrücken

Zur Auswertung von logischen und numerischen Ausdrücken steht die %eval-Funktion zur Verfügung. Da der Makro-Prozessor buchstabenbasiert arbeitet, werden Zahlen normalerweise als Buchstaben behandelt. Beispiel: %let y=100+200; erzeugt nicht y=300, sondern y=100+200. %let %eval(100+200); erzeugt y=300.

6.2.1 %Eval-Funktion

Die Funktion %eval • wertet logische und numerische Ausdrücke aus • erlaubt nur ganzzahlige Arithmetik (keine nichtganzzahlige), • schneidet nichtganzzahlige Werte ohne Warnung ab (rundet somit immer ab), • erlaubt keine Verkettung (||,concatenation) und kein Minimum und Maximum (><, <>) und • gibt stets eine Zeichenkette als Ergebnis zurück.

Syntax: %eval(logischer oder numerischer Ausdruck); Der logische oder numerische Ausdruck kann

• konstanter Text, • referenzierte Makro-Variable, • andere Makro-Funktion und • Makro-Aufruf

sein. Folgende Operationen sind möglich: Operator Mnemonic Name Hierachie** Potenzieren 1 + positives Vorzeichen 2 - negatives Vorzeichen 2 ¬^~ NOT logisches Nicht1) 3 * Multiplikation 4 / Division 4 + Addition 5 - Subtraktion 5 < > LT, GT kleiner als, größer als 6 <= >= LE, GE kleiner gleich, größer gleich 6 ¬= ^= ~= NE ungleich1) 6 & AND logisches Und 7 | OR logisches Oder 8 1) Die Symbole hierfür sind tastaturabhängig. Mnemonic ist eine alternative Schreibweise.

Page 38: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

38

Beispiele: Ergebnisse: %let wert=%eval(50+60);%put Der wert ist:&wert; Der wert ist:110

%let x=50;%let y=60;%let wert=%eval(&x+&y);%put Der wert ist:&wert; Der wert ist:110

%let wert=%eval(&x+&y/11);%put Der wert ist:&wert;

Der wert ist:55

(sollte eigentlich 55,4545 sein, die %eval-Funktion rundet aber immer ab)

%let wert=%eval((&x+&y)/11);%put Der wert ist:&wert; Der wert ist:10

Übungsaufgaben

18. Lassen Sie sich mit Hilfe von Makrofunktionen ihren Namen in Großbuchstaben ausgeben und die Anzahl der Buchstaben. 19. Erstellen Sie ein Makro INTSUM, das die Zahlen von 1 bis N aufsummiert, wobei N als

Argument mitgegeben wird und das Makro nur das Ergebnis zurückgeben soll (Tip: Die Formel dazu lautet n(n+1)/2).

a) Rufen sie das Makro mit N=10 in einer %let-Anweisung und weisen Sie das Ergebnis der Variable TOTAL zu, die mit einem anschließenden %put ausgegeben wird.

b) Behandeln sie das Makro wie eine Funktion, indem Sie das Ergebnis in einem Datenschritt einer Variable SUM zuweisen und mit put (nicht %put) ausgegeben.

c) Schreiben Sie ein Makro GETSUM (ohne Parameter), das das Makro INTSUM als Funktion verwendet, indem INTSUM in einem Datenschritt für die Werte N=1, 2, 3, 4 und 5 aufgerufen wird. GETSUM soll den gesamten Datenschritt mitsamt PUT-Anweisungen zur Ausgabe der Ergebnisse erzeugen.

d) Erweitern Sie das Makro GETSUM durch Aufrufparameter, die das erste und letzte N angeben, für die die Summen gebildet werden sollen und eventuell die Zwischenschritte (Inkrements) (Tip: %Do-Schleife).

6.3 Funktionen zur Bearbeitung von speziellen Zeichen (Textfunktionen)

Da bestimmte Textzeichen, wie z.B. Prozentzeichen, Semikolon oder Anführungszeichen für den Makro-Prozessor eine andere Bedeutung haben, bzw. der Makro-Prozessor anders darauf reagiert, als im normalen SAS-System, bedarf es spezieller Funktionen, der Quoting-Funktionen, um deren "normale" Bedeutung innerhalb des Makrosystems zu erzielen, und sie als Teil des Textes zu interpretieren. Folgende Zeichen werden vom Makro-Prozessor nicht als Textzeichen interpretiert: Zeichen Bedeutung ; Ende einer Anweisung , Trennung von Argumenten einer Funktion/ eines Makros &, % Referenz auf Makro- Variablen und -Aufruf +,-,*,/, u.ä. werden als arithmetische und Vergleichsoperatoren erkannt LT, NE, u.ä. werden als logische Operatoren erkannt Leerzeichen nicht unterdrücken

Page 39: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

39

Übersicht über die Textfunktionen: Funktion Berücksichtigte Zeichen Beschreibung %str ; , + - * / ** <> | = LT

LE u.ä. quotiert konstanten Text zur Zeit der Kompilierung

%nrstr s.o., zusätzlich % und & s.o. %quote ; , + - * / ** <> | = LT

LE u.ä. quotiert konstanten Text zur Zeit der Makro-Ausführung

%bquote siehe %quote, zusätzlich offene Anführungszeichen & Klammern (unmatched)

s.o.

%nrquote siehe %quote, zusätzlich % und & s.o. %nrbquote vereinigt die Funktionen von

%bquote und %nrquote s.o.

%unquote löst Quotierungen wieder auf löst Quotierungen zur Zeit der Makro-Ausführung wieder auf

%superq & und % verhindert das Auflösen von Makroausdrücken bei der Auflösung von Makrovariablen.

6.3.1 %Quote-Funktion

Die %quote-Funktion quotiert während der Makro-Ausführung konstanten Text. Die Funktion entfernt allerdings nicht die Bedeutung von Hochkommata, Klammern oder Makrohinweiszeichen, wie % und &. Syntax: %quote(Argument) Beispiel: %macro dept1(bdl);

%if %quote(&bdl)=bw %then %put Bundesland BadenWürttemberg;

%else %put Bundesland;%mend dept1;

6.3.2 %Bquote-Funktion

Die Funktion verarbeitet Argumente, die besondere Zeichen enthalten, welche der Makro-prozessor normalerweise nicht als Textzeichen interpretieren würde, z.B. offene Anführungs-zeichen und Klammern. Syntax: %bquote(Argument) Beispiel: %macro bq;

%global platz;%put Geben Sie den Treffpunkt ein.;%input;%let platz=%bquote(&sysbuffr);%put &platz;

%mend bq;Aufruf: %bq

Eingabe: Rick's Café

Page 40: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

40

Der Makro-Prozessor würde ohne die %bquote-Funktion die Fehlermeldung ERROR: Literal contains unmatched quote. melden. Mit der %bquote-Funktion wird das Anführungszeichen als Teil des Texts erkannt und korrekt verarbeitet. 6.3.3 %Nrquote-Funktion

Diese Funktion ist analog zur %nrbquote-Funktion (siehe unten), kann allerdings keine Klammern und Anführungszeichen verarbeiten. 6.3.4 %Nrbquote-Funktion

Mit Hilfe dieser Funktion können Ampersands und Prozentzeichen, sowie Anführungszeichen und Klammern als Teile von Argumenten erkannt und verarbeitet werden. Syntax: %nrbquote(Argument) Beispiel : %macro nrbq;

%global platz;%put Geben Sie den Treffpunkt ein.;%input;%let platz=%nrbquote(&sysbuffr);%put &platz;

%mend nrbq;Aufruf: %nrbqEingabe: R&D in Rick's CafeErgebnis: WARNING: Apparent symbolic reference D not resolved.

R&D in Rick's Cafe Der Makro-Prozessor versucht zuerst, die vermeintliche Makrovariable &D aufzulösen. Diese Meldung taucht aber, dank der %nrbquote-Funktion, nur ein einziges Mal auf. Überprüfen Sie es mit: '%put &Platz;'. 6.3.5 %Unquote-Funktion

Die %unquote-Funktion löst die Quotierung wieder auf, d.h. Argumente erhalten ihre ursprüngliche Bedeutung zurück. Sonderzeichen werden wieder als solche erkannt. Die %unquote-Funktion kann in folgenden Situationen nötig sein:

• Wenn ein quotiertes Argument zu einem späteren Zeitpunkt der Makroausführung mit seinem ursprünglichen Wert benötigt wird.

• Wenn eine Quoting-Funktion die Bedeutung des Eingabe-Arguments verändert hat. Syntax: %unquote(Argument) Beispiel : %macro rechne(wert1,wert2,op=add);

%if %upcase(&op)=ADD %then %let op=%str(+);�%else%if %upcase(&op)=DIFF %then %let op=%str(-);%else%if %upcase(&op)=MAL %then %let op=%str(*);%else

%do;%put Der Operator &op ist nicht erlaubt;%goto ende;

Page 41: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

41

%end;%put Ergebnis: &wert1 &op &wert2 =%eval(&wert1 %unquote(&op)� &wert2);%ende:

%mend rechne;Aufruf: %rechne(18,25,op=ADD);

%rechne(18,25,op=diff);%rechne(18,25,op=mal);

� Wenn die Variable op den Wert ADD zugewiesen bekommt, wird sie in ein Pluszeichen (+) verwandelt. Durch die %str-Funktion wird das Pluszeichen von seiner Funktion als arithmetisches Operator enthoben. Es wird jetzt vom Makro-Prozessor als "normales" Textzeichen behandelt. � Durch die %unquote-Funktion wird dem Pluszeichen (+) seine ursprüngliche Bedeutung zurückgegeben, und es kann als arithmetischer Operator verwendet werden. Ohne Rück-Quotierung durch die %unquote-Funktion taucht folgende Fehlermeldung auf: ERROR:A character operand was found in the %EVAL function or %IF conditionwhere a numeric operand is required. 6.3.6 %Str-Funktion

Die %str-Funktion quotiert konstanten Text zur Zeit der Kompilierung (Konstruktion). Der Zeitpunkt der Quotierung ist der grundlegende Unterschied zur %quote-Funktion, die bei jeder Makro-Ausführung neu durchgeführt wird. Wenn es darum geht, einen Makro-Ausdruck aufzulösen, sollte die %quote-Funktion benutzt werden. Die %str-Funktion entfernt nicht die Bedeutung von Ampersands, Prozentzeichen und nicht-geschlossenen Hochkommata. Um nicht geschlossene Hochkommata zu quotieren, muß ein Prozentzeichen vor das Zeichen gesetzt werden: Beispiel: %let place=%str(Clinton%'s America); Die %str-Funktion sollte bei folgenden Gegebenheiten verwendet werden:

• Wenn ein Semikolon statt als Makroausdruck als Textzeichen verwendet werden soll. • Um ein Leerzeichen (Blank) bedeutsam zu machen. • Um ein nicht geschlossenes Hochkomma oder eine offene Klammer, die mit einem

Prozentzeichen versehen sind, zu benutzen. Syntax: %str(argument)Beispiele: %let p=%str(Proc Print; run;);

%put &p;

%let time=%str( now); 6.3.7 %Nrstr-Funktion

Die %nrstr-Funktion quotiert, zusätzlich zu den Funktionen der %str-Funktion, auch Prozentzeichen und Hochkommata. Beispiel: %let p=%nrstr(%rechne);

%put &p;

Page 42: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

42

6.3.8 %Superq-Funktion

Diese Funktion verhindert die Auflösung von Makro-Ausdrücken bei der Auflösung von Makrovariablen. Die %superq-Funktion ist in folgenden Fällen nützlich:

• Bei Benutzung einer Makrovariablen, die mit einer %Input- oder %Window- Anweisung definiert wurde und ein Ampersand oder Prozentzeichen enthält.

• Bei Benutzung einer Makrovariablen, die mit der SYMPUT-Routine geschaffen wurde und ein Ampersand oder Prozentzeichen enthält. Syntax: %superq(Makrovariable) Beispiel: %input x;

%testvariable&anton%put Der Inhalt der Variablen x ist: %superq(x).;

Ergebnis: Der Inhalt der Variablen x ist: %testvariable&anton Übungsaufgaben

20. Erzeugen Sie eine %put-Anweisung, die folgenden Text ins Log-Fenster schreibt: Der Wert von %sysdate ändert sich nicht innerhalb eines SAS Programms. 21. Geben Sie folgende Sätze mit Hilfe von %put-Anweisungen im Log-Fenster aus: Das ist der Schnupperhund von C&A.

Die Gewinner waren die Nummern 3;12;1 & 7So 'n Blödsinn!

22. Stellen Sie sich vor, Sie arbeiten in der Univerwaltung und sind für die Adreßkartei der Studenten zuständig. Schreiben Sie ein Makro, das Ihnen schnell summarische Informationen über die Studenten liefern kann. Das Makro soll in einem Fenster die Variablen darstellen, die erfragt werden können, etwa folgendermaßen:

Gruppierung nach1. Wohnort2. Semesterzahl3. Studienfach4. Abschlußart

(Tip: Prozedur Freq mit by-Anweisung.) 23a) Erstellen Sie ein Makro SASERROR, das es SAS-Benutzern ermöglicht, auftretende Fehlermeldungen in einer Datei abzulegen. Die Fehlermeldungen müssen dazu aus dem Log-Fenster in den Zwischenspeicher kopiert werden und dann über ein %input- Statement eingelesen werden. b) Vervollständigen Sie das Makro SASERROR, indem Sie es ermöglichen Erläuterungen (z.B.

Kontext und Situation) zu den Fehlermeldungen abzulegen. Verändern Sie das Makro dahingehend, das die Fehlermeldungen in eine permanente Datei STAMM hinzugefügt werden, in der die Fehlermeldungen gesammelt werden (Tip: Proc Append). Überprüfen Sie in dem Makro, ob die Datei STAMM bereits existiert; falls nicht, soll diese gebildet werden.

Page 43: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

43

7. Berührungspunkte zwischen Makro-Sprache und Datenschritt

7.1 Zugriff auf Daten in SAS-Makros

Das SAS-System stellt zwei Funktionen bereit, die den Austausch zwischen SAS-Datenschritt und Makro-Sprache erlauben: • symget: transferiert Inhalt einer Makro-Variable in den Datenschritt und • symput: transferiert Datenschritt-Informationen in eine Makro-Variable. Dieser Austausch ist notwendig, da die Variablen des SAS-Datenschritts und die Makro-Sprache in unterschiedlichen Speichern abgelegt werden. Die Datenschritt-Variablen werden in einen Speicher namens "Programm Data Vektor" geschrieben, die Makro-Sprache legt ihre Variablen in Symboltabellen ab (siehe Kap. 4). Um zwischen diesen Speichern Informationen auszutauschen, benötigen Sie die Funktionen symput und symget.

SAS-Data-SchrittProgramm DataVektor

Datenschrittvariablen

Makro-SpracheSymboltabellen

Makrovariablen

SYMGET

SYMPUT

Der verwendete Speicher hängt ab:

• von der Stelle, wo der Datenschritt aufgerufen wird, • von der Verschachtelung der Umgebungen und • von der Definition lokaler und globaler Variablen.

7.1.1 Symget-Funktion

Syntax: symget(argument) datenschritt-variable=symget(argument); Das argument kann

• eine in Anführungszeichen eingeschlossen Makrovariable, • eine Datenschritt-Zeichenkettenvariable oder • ein Datenschritt-Zeichenkettenausdruck

sein.

Page 44: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

44

Die Datenschritt-Variable • kann zuvor als Charakter- oder Numerische Variable definiert sein, • wird ansonsten als Charakter-Variable mit Länge 200 definiert, • wird - falls länger - auf 200 Zeichen gekürzt und • wird als Numerische-Variable definiert, falls die symget-Funktion in einen arithmetischen Ausdruck eingesetzt wird.

Beispiele 1. Das Argument ist eine Zeichenkette Beispiel: %let name=recklinghausen;

data loc;input land $;stadt=symget('name');cards;Deutschland;proc print;run;

Ergebnis: OBS LAND STADT1 Deutschl recklinghausen

Der Makrovariablenname muß in Anführungszeichen eingeschlossen sein. Beachtenswert ist, daß die durch die symget-Funktion referenzierte Datenschrittvariable einen Wert mit mehr als 8 Buchstaben (bis zu 200 Buchstaben, recklinghausen=14 Buchstaben) annehmen kann, wobei bei der Variablen land die Eingabe standardmäßig auf 8 Zeichen begrenzt ist. Dies ist durch die unterschiedlichen Speicher bedingt und kann Probleme mit der Speicherkapazität verursachen, da jede Makrovariable standardmäßig mit 200 Zeichen abgelegt wird, auch wenn diese nur 14 Zeichen hat. Durch Vereinbaren eines Input-Formats können sie dies begrenzen (siehe Beispiel 3). 2. Das Argument ist eine Datenschrittvariable Beispiel: %let fluss=arno;�

%let land=Italien;%let stadt=roma;data loc;input gebiet $ Zahl;name=symget(gebiet);�cards;stadt 12�land 34fluss 83gebirge 97�;proc print;run;

Ergebnis: OBS GEBIET ZAHL NAME

1 stadt 12 roma2 land 34 Italien3 fluss 83 arno4 gebirge 97

Page 45: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

45

Die Ausprägung der Variable muß ein gültiger SAS-Makrovariablenname sein. � Es werden 3 Makrovariablen gebildet. � Die 3 Makrovariablen werden als gebiet definiert. � Beim Einlesen dieser Beobachtung wird überprüft, ob eine Makrovariable mit dem Namen stadt existiert. Wenn dies der Fall ist, wird ihr Wert aus dem Makro-Speicher übernommen. � Da keine Makrovariable gebirge vereinbart wurde, bekommt die Variable name an dieser Stelle einen Nullwert. Außerdem erscheint folgende Mitteilung: NOTE: Invalid argument to function SYMGET at line 218 column 6.RULE:--+----1----+----2----+----3----+----4----+----5----+----6----+----7--220GebirgeGEBIET=Gebirge NAME= _ERROR_=1 _N_=1

3. Bildung von numerischen Variablen Beispiel: %let einheit=1.50;

data dollars;input dm;dollar=dm*input(symget('einheit'�),4.);cards;2.0013.5;proc print;run;

Ergebnis: OBS DM DOLLAR

1 2.0 3.02 13.5 20.25

� Hier wird die symget-Funktion dazu benutzt, einen numerischen Wert, der mit Hilfe der Makro-Sprache definiert wurde, in einem arithmetischen Ausdruck eines Datenschritts zu benutzen. Mit der Input-Funktion wird das Format 4. zugewiesen.

ERROR 85-322: Expecting a format name.

NOTE: The SAS System stopped processing this step because of errors.WARNING: The data set WORK.DOLLARS may be incomplete. When this step was

stopped there were 0 observations and 2 variables.WARNING: Data set WORK.DOLLARS was not replaced because this step was

stopped.

7.1.2 Symput-Funktion

Die symput-Funktion kann einen Wert aus einem SAS-Datenschritt an eine Makrovariable übergeben. Die symput-Funktion kann dazu benutzt werden, • Informationen einer Prozedurausgabe in eine Makrovariable zu transferieren, • Möglichkeiten des Datenschritts (z.B. Input) zur Bildung von Makrovariablen zu verwenden, • SAS-Datensatz-Informationen, z.B. label, Format, in Makros zu transportieren. Syntax: call symput(argument1, argument2) Die Funktion weist den Wert von argument2 der Makrovariablen argument1 zu. argument1 ist der Name der Makrovariablen. argument2 gibt den Wert an, der der Makrovariablen zugewiesen werden soll.

Page 46: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

46

Die argumente können • Zeichenketten sein, • Datenschritt-Zeichenkettenvariablen oder • Datenschritt-Zeichenkettenausdrücke

sein. Beispiele 1. Beide Argumente sind Zeichenketten Beispiel: data;

call symput ('stadt', 'London');run;%put Stadt=&stadt;

Ergebnis: Stadt=London Die Argumente müssen in Anführungszeichen eingeschlossen werden. 2. Beide Argumente sind Datenschrittvariablen Beispiel: data loc;

input gebiet $ name $;call symput(gebiet,name);

cards;stadt Londonland Englandfluss Themse;%put Stadt=&stadt Land=&land Fluss=&fluss;

Ergebnis: Stadt=London Land=England Fluss=Themse Die Argumente dürfen nicht in Anführungszeichen eingeschlossen sein und der Wert des 1. Argu-ments muß ein gültiger Makrovariablenname sein. Es werden 3 Makrovariablen hergestellt (alle Ausprägungen der unter die Variablen gebiet). Durch die symput-Funktion bekommen sie die Werte London England Themse zugewiesen. 3. Argument2 ist das Ergebnis einer Datenschritt-Funktion Beispiel: data;

call symput('datum', put(today(),ddmmyy8.));run;%put datum=&datum;

Ergebnis: datum=13/07/95 In diesem Beispiel wird das argument1 durch eine Put-Funktion referenziert. Die Makrovariable datum ist das Ergebnis der today-Funktion des Datenschritts (Die leere Klammer hinter der today-Funktion teilt SAS mit, daß es sich um eine Datenschrittfunktion handelt, und nicht um eine Variable). Mit Hilfe der %put-Anweisung wird dieser Wert raus-geschrieben.

Page 47: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

47

7.1.3 Resolve-Funktion

Diese Funktion weist einer Datensatz-Variablen einen Wert zu. Die Länge, der mit Hilfe der resolve-Funktion hergestellten Variablen, beträgt standardmäßig 200 Zeichen, was sich bei größeren Datenmengen auf die Rechengeschwindigkeit auswirken kann. Die resolve-Funktion ist erst ab SAS-Version 6.07 verfügbar. Syntax: resolve(Argument) argument ist ein Makro-Ausdruck:

• Textstring in Anführungszeichen (Die Anführungszeichen hindern den Makro-Prozessor an der Auflösung des Makroausdrucks während des Datenschritts.) name=resolve('%locate'); • Name einer Datensatz-Variable (Der Inhalt der Datensatz-Variablen sollte ein Makro- Ausdruck sein.) adresse='%identi'

Name=resolve(adresse) • Zeichenkette, die einen Makro-Ausdruck erzeugt. region=resolve('%land'||left(id))

Wenn Sie den Wert einer Variable mit resolve bilden, hängt dieser von der Ausführung des Datenschritts ab. Wird der Wert als Makro-Variable gebildet, bleibt er während des Datenschritts konstant. Im Unterschied zu symget erlaubt resolve zusätzliche Argumentformen und ist flexibler einsetzbar, allerdings auch Ressourcen-intensiver. Beispiel: %let event=lousisiana purchase;

%macro date;1803

%mend date;%let person1=Thomas Jefferson;

data _null_;length var1-var4 $20.;�YEAR='%date';var1=resolve('&event');�var2=resolve('%date');var3=resolve(year);�var4=resolve('&person'||left(_n_));�

put var1--var4;�run;

Ergebnis: lousisiana purchase 1803 1803 Thomas Jefferson � Die length-Anweisung definiert die Variablen var1-var4 mit einer Länge von 20 Zeichen. (Der Standard wäre 200 Zeichen.) � Die Variablen var1 und var2 werden zu Zeichenketten aufgelöst. var1 erhält den Wert louisiana purchase (Der Wert der Makrovariable event); var2 erhält durch die Auflösung des Makros date den Wert 1803. � var3 erhält den Wert der Datenschrittvariablen YEAR, der wiederum einen Makroaufruf beinhaltet, und löst sich somit ebenfalls zu 1803 auf. � var4 kombiniert die Zeichenkette &person und den Wert der automatischen Zählvariablen _N_, um die Makro-Variable &person1 zu referenzieren, und letztendlich zu Thomas Jeffersonaufzulösen. (Die left-Funktion schneidet die Leerzeichen ab die links von _N_ auftauchen.)

Page 48: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

48

� Die put-Anweisung schreibt das Ergebnis ins Log-Fenster. 7.2 %Sysprod-Funktion

Die %sysprod-Funktion erinnert in ihrer Funktionalität an die automatischen Makrovariablen, siehe Kap. 2.1. Sie überprüft, ob ein SAS-Modul in der installierten SAS-Version lizensiert ist oder nicht. Dies ist etwa dann interessant. wenn Sie mit einem Makro arbeiten wollen, daß das Modul SAS-IML verwendet, sie dieses Produkt aber nicht lizensiert haben. Die Funktion ist erst ab SAS-Version 6.07 realisiert. Syntax: %sysprod(argument) Das argument kann eine beliebige Zeichenkette sein. Sinnvoll sind aber nur die Namen von SAS-Modulen, wie z.B. ACCESS, AF, BASE, ETS,GRAPH, IML, QC,STAT. Die %sysprod-Funktion gibt nach der Überprüfung folgende Werte zurück: 1 das Produkt ist lizensiert, 0 das Produkt ist nicht lizensiert, -1 das Argument ist kein SAS-Produkt Beispiel Ergebnis %put sysprod(base); 1%put sysprod(QC); 0%put sysprod(Blödsinn); -1 Beispiel: %macro plotte(sds,x,y);

%if %sysprod(graph)=1 %then�%do;

title "dies ist ein hochauflösender Plot";proc gplot data=&sds;plot &x*&y;run;quit;

%end;%else%do;

title "SAS-Graph ist nicht lizensiert";proc plot data=&sds;plot &x*&y;run;quit;

%end;%mend plotte;

Aufruf: %plotte(sasuser.fitness,age, weight) � Wenn das Modul SAS-GRAPH lizensiert ist, gibt die %sysprod-Funktion den Wert 1 zurück, und es wird die Prozedur Gplot ausgeführt. Ist das Modul nicht lizensiert, wird stattdessen die Prozedur Plot verwendet. 7.3 Execute-Routine

Die execute-Routine kann innerhalb eines Datenschritts ein Makro aufrufen, das am Ende des Datenschritts ausgeführt wird. Diese Funktion ist erst ab SAS-Version 6.07 verfügbar.

Page 49: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

49

Syntax: call execute(argument); Das argument kann

• eine in einfache Anführungszeichen eingeschlossene Zeichenkette sein, (Die Anführungs- zeichen hindern den Makro-Prozessor am Auflösen des Makro-Ausdrucks während des Datenschritts.) call execute('%sales');• eine Datenschrittvariable sein, deren Wert ein Makro-Aufruf ist, findit='%finde';

call execute(findit); • eine Zeichenkette sein, die einen Makro-Ausdruck erzeugt. call execute('%sales('||month||')');

Beispiel: %macro mak1;

proc print data=neu;where ware=1;sum anzahl;title "Anzahl aller bestellten Mixer";

run;%mend mak1;

%macro mak2;proc print data=neu;

where ware=2;sum anzahl;title "Anzahl aller bestellten Waagen";

run;%mend mak2;

Data Bestell;input ware anzahl;datalines;1 122 243 832 0;

run;

Data neu;set bestell;if anzahl=0 then delete;if ware=1 then call execute('%mak1');�else if ware=2 then call execute('%mak2');

run;

� In diesem Beispiel wird mit Hilfe der execute-Routine das Makro mak1 aufgerufen, daß die Prozedur Print aufruft, und ausgibt, ob ware mit der Ausprägung 1 bestellt wurde. Für ware=2 wird das Makro mak2 aufgerufen.

Page 50: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

50

Übungsaufgaben

24. Erzeugen Sie ein Makro, das abhängig von ihren Daten Referenzlinien in einen Scatterplot einzeichnet. Die Referenzlinien sollen eingetragen werden für den Mittelwert und Mittelwert plus/minus einmal die Standardabweichung.

Verwenden Sie als Beispieldatensatz die Blutbilddaten, tragen Sie Cholesterin gegen Alter auf und zeichnen Sie die entsprechenden Referenzlinien ein.

25. Schreiben Sie ein Makro BUILDFMT, das die Informationen in einer SAS-Datei nutzt, ein Format mit PROC FORMAT zu erzeugen. Das Makro sollte folgende Schlüsselworte unterstützen:

•= Name des zu bildenden Formats •= SAS-Datei mit der Formatinformation •= Variable, die die Originalwerte enthält •= Variable, die die Formatwerte enthält

Für die Beispiel-Formatdatei: BSPFORM

Wert Formwert 0 gar nichts 1 wenig 2 etwas 3 viel 4 ganz viel

sollte mit dem Aufruf: %buildfmt(fname=tform,sds=bspform,

voriwert=wert,varform=formwert) etwa jener SAS-Code erzeugt werden: proc format;

value tform 0="gar nichts"1="wenig "2="etwas "3="viel "4="ganz viel "

;run;

(Tip: Option CNTLIN der Prozedur Format)

8. Aufruf von SAS-Makros

Es gibt drei Arten von SAS-Makros • Named styled Makros • Statement styled Makros und • Command styled Makros,

die sich in Definition, Aufruf und Funktion unterscheiden. Alle bisherigen Beispiele in diesem Skript waren "Named styled" Makros. Übersicht:

Art des Makros Aufruf Ort des Aufrufs Named styled Makro %makroname(makroparameter) Programm Editor Statement styled Makro makroname makroparameter Programm Editor Command styled Makro makroname makroparameter Kommando-Zeile

Page 51: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

51

8.1 Named styled Makros

"Named styled" Makros werden im Programm Editor aufgerufen. Sie beginnen immer mit einem Prozentzeichen. Ihre Parameter erscheinen in Klammern hinter dem Makronamen. "Named styled" Makros können nur im Programm Editor aufgerufen werden. Aufruf: %makroname(makroparameter) Beispiele: %print(albumin, calcium,alter, SDS=co.blutbild);

%makedir;%tu_solan(7);

8.2 Statement styled Makros

"Statement styled" Makros machen es möglich, Makroaufrufe wie gewöhnliche SAS-Anweisungen aussehen zu lassen. Der Aufruf beginnt mit dem Makronamen ohne Prozentzeichen, die Makroparameter erscheinen nicht in Klammern und sind jeweils durch ein Leerzeichen von-einander getrennt. Positionsparameter müssen deshalb in der Reihenfolge ihrer Definition angegeben werden. Der Aufruf muß mit einem Semikolon enden. Es ist nicht möglich ein "Statement styled" Makro in einer anderen SAS-Anweisung aufzurufen; der Aufruf muß allein in einer Zeile stehen. Um ein Makro als "Statement styled" zu definieren, ist die Option stmt in der Makrodefinition notwendig. Um ein "Statement styled" Makro zu verwenden, muß die Systemoption IMPLMAC gesetzt sein, da ansonsten der Makroname nicht als solcher erkannt wird. Definition: %macro makroname(makroparameter) / stmt; Makrotext; %mend makroname; Aufruf: makroname makroparameter; Beispiele: option implmac;�

%macro print (var1,var2,var3,sds=_last_) / stmt;�proc print data=&SDS;var &var1 &var2 &var3;run;

%mend print;

Aufruf: print albumin calcium alter SDS=co.blutbild; � Ohne die Systemoption implmac erscheint folgende Fehlermeldung:

ERROR 180-322: Statement is not valid or it is used out of properorder.

� Ohne die Option stmt wäre das Makro ein "Named styled" Makro und müßte mit %print(....); aufgerufen werden.

Page 52: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

52

8.3 Command styled Makros

"Command styled" Makros lassen sich wie SAS-Kommandos, nur in der Kommandozeile aufrufen. Makroparameter sind ohne Klammer, getrennt durch Leerzeichen, in der Reihenfolge ihrer Definition anzugeben. Um ein Makro als "Command styled" zu definieren, ist die Option cmd in der Makrodefinition erforderlich. Außerdem muß die Systemoption CMDMAC gesetzt sein. Das Makro sollte außerdem nur Display Manager Kommandos enthalten. "Command styled" Makros sind erst ab SAS-Version 6.07 möglich. Definition: %macro makroname(makroparameter) / cmd; Makrotext; %mend makroname; Aufruf: makroname makroparameter; Beispiele: options cmdmac;�

%macro colors(fenster)/cmd;�&fenster;color banner green;color source yellow;color warning cyan;color error red;

%mend colors;Aufruf in der Kommandozeile: colors log Das Makro colors führt Farbänderungen im jeweiligen Fenster durch. � Durch die Systemoption cmdmac werden "Command styled" Makros ermöglicht. � Durch die Option cmd wird das Makro colors als "Command styled" definiert.

9. Makro-Bibliotheken (Autocall-Facility)

SAS-Makros werden (temporär oder permanent) in Bibliotheken abgelegt und können automatisch zur Verfügung gestellt werden. Die Makros werden in SAS-Katalogen unter dem Makro-Namen abgespeichert. Die Makros können als

• Quelltext oder • kompiliertes Programm

abgespeichert werden. Quelltext-Makros müssen von SAS zunächst kompiliert werden, d.h. man lädt das Makro in den Programmeditor und submittiert es. 9.1 Automatischer Aufruf von Makros (Autocall Facility)

Es gibt verschiedene Systemoptionen, mit deren Hilfe Sie direkt auf ihre Makrobibliotheken zugreifen können, ohne sie als Quelltext in den Programm Editor zu laden. Den automatischen Makroaufruf nennt man 'Autocall'. Wo genau SAS nach Makros sucht, steht in der Datei config.sas.

Page 53: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

53

Systemoption Erklärung mautosource/nomautosource

Bestimmt, ob die automatische Makrosuche (Autocall Facility) eingeschaltet werden soll.

Sasautos=Makrobibliothek Definiert die Makro-Bibliothek. Es gibt drei Möglichkeiten auf ihre Makrobibliothek zu verweisen: • über Fileref, • über eine Filename-Anweisung • oder mit direktem Namen in Anführungszeichen.

mrecall/nomrecall Veranlasst den Makro-Prozessor nach Makrobibliotheken zu suchen, die nicht bei der ersten Suche gefunden wurden.

Die Default-Einstellungen sind unterstrichen. Der Makro-Prozessor sucht Makros sequentiell in den Makro-Bibliotheken. Er sucht immer zuerst im Katalog WORK.SASMACR, in die kompilierte Makros automatisch während einer Sitzung abgespeichert werden (Siehe Kap. 9.2). Beispiel: Ihre Makrobibliothek, in die Sie ihre Makros abgelegt haben, befindet sich im Verzeichnis 'C:\sas\makros'. Außerdem befinden sich einige Makros im Verzeichnis 'N:\sasurz\makros'.

filename urzmac 'n:\sasurz\makros'; filename mymac 'c:\sas\makros';

options sasautos=(mymac urzmac);oder: options sasautos=('c:\sas\makros' 'N:\sasurz\makros');

Sie können ihre Makros jetzt direkt aufrufen, indem sie den Makroaufruf im Programm-Editor submittieren. %ttest(calcium,,pille,co.blutbild);

%nobs(sasuser.crime);Der Makro-Prozessor sucht jetzt zunächst im Katalog WORK.SASMACR und erst danach in den Verzeichnissen c:\sas\makros und N:\sasurz\makros. SAS stellt selbst einige Makros bereit. Sie befinden sich im Verzeichnis 'SASROOT\core\sasmacro'. Um auf diese Makros zuzugreifen muß das obige Beispiel folgendermaßen ersetzt werden: (Das SASROOT-Verzeichnis ist im URZ N:\saswn610.)

optionssasautos=('N:\sasurz\makros' mymac

'N:\saswn610\core\sasmacro'); Die vollständige Liste aller von SAS zur Verfügung gestellten Makros finden Sie im 'SAS Guide for Macro Processing', Version 6, 2. Edition, Seiten 186-187. Folgende Fehlermeldung taucht auf, wenn Sie z.B. vergessen haben, die Filename-Anweisung für mymac zu setzen:

WARNING: No logical assign for filename MYMAC.WARNING: Source level autocall is not found or cannot be opened. Autocall has

been suspended and OPTION NOMAUTOSOURCE has been set. To use theautocall facility again, set OPTION MAUTOSOURCE.

WARNING: Apparent invocation of macro DATATYP not resolved.

Page 54: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

54

Sie beheben dies, in dem Sie die Filename-Anweisung richtig setzen, und außerdem die Systemoptions mautosource und mrecall bei der Options-Anweisung mitangeben (mautosource ist durch den Fehler ausgeschaltet worden). 9.2 Automatisches Speichern von kompilierten Makros

Standardmäßig werden alle Makros, die Sie während einer Sitzung kompilieren, im Katalog WORK.SASMACR abgespeichert. Sobald Sie die Sitzung verlassen, wird dieser Katalog gelöscht. Um kompilierte Makros in einem anderen Katalog (permanent) abzuspeichern, sind folgende System-Optionen notwendig: System-Option Erklärung mstored/nomstored Erlaubt die Speicherung von SAS-Makros, in einem mit

sasmstore vereinbarten Libref. sasmstore=libref Referenziert die SAS-Makro-Bibliothek, die die kompilierten

SAS-Makros speichert. Die Default-Einstellungen sind unterstrichen. Diese Optionen sind erst ab SAS Version 6.07 realisiert. Außerdem ist die %macro-Option store notwendig, ansonsten wird das kompilierte Makro im Katalog WORK.SASMACR gespeichert. Beispiel: Sie wollen das Makro Nichts als kompiliertes Makro in dem Verzeichnis 'D:\Makros' abspeichern. libname meinmak 'd:\makros';�

options mstored sasmstore=meinmak;�

%macro Nichts /store des='Nichts tut es';�%put Dieses Makro macht nichts;

%mend Nichts; � Sie referenzieren einen permanenten Makro-Katalog, in dem ihre kompilierten Makros gespeichert werden sollen. � Sie setzen die Optionen, und verweisen auf die vereinbarte Libref. � Sie geben mit der %macro-Option store an, daß dieses kompilierte Makro permanent als kompiliertes Makro abgspeichert werden soll. Außerdem können sie mit der Option des= eine bis zu 40 Zeichen lange Beschreibung des Makros mitspeichern, die im Katalog-Fenster erscheint. Tip! Wenn Sie ein Makro in kompilierter Form ablegen, können Sie es nicht mehr als Quelltext in den Programm Editor laden. Speichern sie es deshalb zusätzlich als Quelltext ab. Wollen Sie Makros aus dem permanenten Makro-Katalog bei der nächsten Sitzung verwenden, müssen sie erneut folgende Optionen setzen:

libname meinmak 'd:\makros';options mstored sasmstore=meinmak;

, sonst wird das Makro nicht gefunden. Sie können permanente Makros über das Katalog-Fenster (Kommandozeile catalog eingeben) oder über die Prozedur Catalog löschen.

Page 55: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

55

9.3 Allgemeine Systemoptionen

System-Option Erklärung macro/nomacro Entscheidet ob der Makro-Prozessor in der aktuellen Sitzung zur

Verfügung steht oder nicht. implmac/noimplmac Erlaubt das Arbeiten mit "Statement styled" Makros cmd/nocmd Erlaubt das Arbeiten mit "Command styled" Makros merror/nomerror Der Makro-Prozessor schreibt folgende Warnung ins Log-Fenster,

wenn er das Makro nicht finden kann: WARNING: Apparent invocation of macro X not resolved.

serror/noserror Der Makro-Prozessor schreibt folgende Warnung ins Log-Fenster, wenn er die Makro-Variable nicht finden kann: WARNING: Apparent symbolic reference X not resolved.

mprint/nomprint Zeigt SAS-Anweisungen im Log-Fenster an, die durch ein Makro generiert wurden.

mlogic/nomlogic Gibt Informationen über die Ausführung des Makros ins Log-Fenster.

symbolgen/nosymbolgen

Zeigt an, ob Makro-Variablen aufgelöst wurden oder nicht.

Die Default-Einstellungen sind unterstrichen.

Page 56: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

56

10. Fehlermeldungen und mögliche Ursachen

Hier finden Sie eine Auswahl von Fehlermeldungen, die bei der Makroprogrammierung auftauchen können. Die Auswahl ist aber nicht vollständig. ERROR: Macro NAME has been given a reserved name.ERROR: A dummy macro will be compiled. Es wurde ein von SAS reservierter Name für das Makro verwendet, z.B. go, run, open. Zur Fehlerbeseitigung einfach einen anderen Namen auswählen, z.B. durch Anhängen einer Ziffer oder eines Buchstaben. WARNING: Apparent symbolic reference XXXX not resolved.

Deutet darauf hin, daß der Makro-Prozessor eine Makrovariable nicht auflösen konnte. Mögliche Ursachen können sein: •= die Makrovariable ist nicht global definiert, wird aber außerhalb eines Makros verwendet (siehe Kap.4.1). •= es gibt keine Makrovariable mit diesem Namen. Ursache kann z.B. ein Schreibfehler sein. Beispiel: %let name=holger;

%put &nam;Die Makrovariable heißt name und nicht nam. ERROR: Literal contains unmatched quote Deutet auf die Anwesenheit von offenen Anführungszeichen hin, z.B. in Textzeilen wie Rick’sCafé. Lösung sind Quoting-Funktionen (siehe Kap.6.3). ERROR: A character operand was found in the %EVAL function or %IFcondition where a numeric operand is required. Deutet z.B. daraufhin, daß ein quotierter Wert in der %eval-Funktion auftaucht, der nicht als numerischer Operator erkannt wird (siehe Kap. 6.3.5). WARNING: Source level autocall is not found or cannot be opened. Autocall hasbeen suspended and OPTION NOMAUTOSOURCE has been set. To use the autocallfacility again, set OPTION MAUTOSOURCE.WARNING: Apparent invocation of macro DATATYP not resolved.

Das Makro wurde über die Autocall-Facility nicht gefunden. Die Option Mautosource wurde ausgeschaltet. Mögliche Fehlerquelle ist die Option sasautos. Kontrolle mit Proc Options; run;(siehe Kap. 8 und 9). WARNING: Apparent invocation of macro HOLGER not resolved.ERROR 180-322: Statement is not valid or it is used out of proper order.

Das Makro Holger wurde nicht gefunden. Dadurch wird der Makroaufruf nicht als solcher erkannt, und die Fehler-Meldung taucht auf. Mögliche Lösung: Nachsehen, wo das Makro sich befindet, gegebenfalls muß es noch kompiliert werden.

Page 57: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

57

Lösungvorschläge zu den Übungsaufgaben

Bei den unten vorgestellten Lösung handelt es sich lediglich um Lösungvorschläge. Es gibt sicherlich zu jeder Aufgabe mehrere Wege, die zum gleichen Weg führen. Bei den Aufgaben, wo die Lösung sehr leicht am Computer nachzuprüfen ist, wurde auf einen Lösungsvorschlag verzichtet. 2. %let lib=co.;

%let dat=iris;proc print data=&lib&dat;

title "Ausdruck der Datei &lib&dat";footnote "&sysdate, &systime";

run;

4. Es liegt an den einfachen Anführungszeichen, die durch doppelte ersetzt werden müssen. 5. Das Makro erzeugt eine Titelzeile. Sie müssen dazu das Makro innerhalb einer Prozedur aufrufen, z.B.: Proc print data=co.iris; %meintitl; run; . 6. Das Makro sollte so aussehen:

%macro sortier(sds,by);Proc sort data=&sds;by &by;run;

%mend sortier;

7. Mit den Ergänzungen sieht es so aus:

%macro sortier(sds,by);Proc sort data=&sds;by &by;run;Proc print data=&sds;run;title "Heute ist der &sysdate";

%mend sortier;

Sie könnten allerdings statt der title-Anweisung, einfach auch das Makro %meintitl aufrufen. 8. %macro plotte(sds=,y=,x=);

proc gplot data=&sds;plot &y*&x;run;

%mend plotte;

a. Das ergänzte Makro sieht so aus:

%macro plotte(sds=,y=,x=,z=);proc gplot data=&sds;plot &y*&x=&z;run;%mend plotte;

b. Der Makroaufruf lautet folgendermaßen: %plotte(sds=co.iris,y=pw,x=pl,z=blume);

c. Mit der where-Anweisung hat sich das Makro wie folgt verändert:

%macro plotte(bed,sds=,y=,x=,z=);proc gplot data=&sds;where &z=&bed;plot &y*&x=&z;run;

%mend plotte;

Die Positionsparameter müssen immer zuerst genannt werden, sonst erscheint folgende Fehler-meldung: ERROR: All positional parameters must precede keyword parameters.

Page 58: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

58

d. Sie benötigen 3 verschiedene Aufrufe: %plotte(1,sds=co.iris,y=pw,x=pl,z=blume);

%plotte(2,sds=co.iris,y=pw,x=pl,z=blume); %plotte(3,sds=co.iris,y=pw,x=pl,z=blume);

9. %macro kreuztab(zeile,spalte,sds=);proc freq data=&sds;

tables &zeile*&spalte;run;

%mend kreuztab; Für den zweiten Aufgabenteil benötigen Sie folgende Schritte:

proc format ;value sl

6.4-7.9='a'5.8-6.3='B'5.1-5.7='c'4.3-5.0='d'

;run;data iris;

set co.iris;format sl:sl.;

run;%kreuztab(sl,blume,sds=iris)

10. id=global %let-Anweisung außerhalb eines Makros

sds=lokal Makro-Schlüsselparameter ort=lokal %let-Anweisung innerhalb eines Makros sysdate=global automatische Makrovariable

12. %macro machdat(i,seedy,seedx,dateinam=);

%global SDS;%let sds=&dateinam;data &sds;

do i=1 to &i ;y=rannor(&seedy);x=rannor(&seedx);

output;end;

run;%prinsort;%mend machdat;

%macro prinsort;proc sort data=&sds;by x;proc print data=&sds;run;

%mend prinsort;

Sie müssen die Variable sds nicht global definieren, da SAS standardmäßig den zuletzt benutzten Datensatz bearbeitet, und das Makro %prinsort den richtigen Datensatz findet. 13. %macro nummer;

%*Dieses Makro fragt danach, welchen Datensatz sie entweder mit derProzedur Print oder Means bearbeiten wollen.;%put Welchen Datensatz wollen Sie bearbeiten?;%input sds;%put Wählen Sie eine der drei Möglichkeiten:

Ausdruck (geben sie eine 1 an)Mittelwerte ( geben sie eine 2 an);

%input a;%*Falls a=1 ist, dann wird die Prozedur Print ausgeführt.;%if &a=1 %then%Do;

Page 59: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

59

Proc print data=&sds;run;

%end;%* Falls a=2 ist, dann wird die Prozedur Means ausgeführt.;%else %do;

Proc means data=&sds;run;

%end;%mend nummer;

14. %macro menue;

%put Sie haben folgende Möglichkeiten:;%put;%put %str( 1. Patientenaufnahme);%put %str( 2. Löschen eines Patienten);%put %str( 3. Listenausdruck);%put %str( mit Sortierreihenfolge);%put %str( a. Familienname);%put %str( b. Wohnort);%put;%put %str( Treffen Sie Ihre Entscheidung: ___);%input entsch;

%mend menue;

15.%Macro prompt;

%put Geben Sie den Namen ihres Datensatzes an;%input sds;%put Welche Prozedur wollen Sie damit Ausführen?;%input proz;

Proc &Proz Data=&SDS;run;

%Mend prompt;%prompt ;

16. %window anfang color=white

#11 @23 'Hallo, hier ist ihr SAS-System' c=red#13 @23 'Falls Sie die folgenden Libname-Anweisungen gesetzt haben

wollen' c=red#15 @23 'geben Sie bitte eine 1 ein' color=red @53 wert 1 attr=underline

c=green#17 @27 'b=Laufwerk B'#18 @27 'a=Laufwerk A'#19 @27 'co=N:\sasurz\daten' ;

%macro beginn;%display anfang delete;%if &wert=1 %then%do;

libname b'B:\';libname a'A:\';libname co 'N:\sasurz\daten';

%end;%mend beginn;

17. %macro dateinam(sds=&syslast);

%put Die Libref heißt: %scan(&sds,1,.);%put Die eigentliche Datei hat den Namen: %scan(&sds,2,.);

%mend dateinam; 18. %let name=holger geißler;

%put Mein Name ist: %upcase(&name);%put Die Länge meines Namens ist %eval(%length(&name)-1) Buchstaben;

19. Das Makro intsum sieht folgendermaßen aus:

%macro intsum(n);%eval(&n*(&n+1)/2);

%mend intsum; a) %let total=%intsum(10);

Page 60: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

60

%put Das Ergebnis ist &total;

Das Ergebnis ist 55 b) data test;

sum=%intsum(10);put sum;

run;

c) %macro getsum;

data _null_;sum1=%intsum(1);sum2=%intsum(2);sum3=%intsum(3);sum4=%intsum(4);sum5=%intsum(5);put sum1--sum5;run;

%mend getsum;

d) %macro getsum(anfang=,ende=,by=1);

%do n=&anfang %to &ende %by &by;%put ****%intsum(&N)****;%end;

%mend getsum;

20. %input x;

%sysdate

%put Der Wert von %superq(x) ändert sich nicht innerhalb eines SASProgramms.;

21. %let x=%nrbquote(Das ist der Schnupperhund von C&A);

%put &x;

%put &x;(Erst beim zweiten Mal verschwindet die Warnung) %put %quote(Die Gewinner waren die Nummern 3;12;1 & 7);

%put %bquote(So 'n Blödsinn);

22. %macro verwalt;

%window verwalt#9 @32 'Gruppierung nach'#11 @35 '1. Wohnort'#12 @35 '2. Semesterzahl'#13 @35 '3. Studienfach'#14 @35 '4. Abschlußart'#16 @32 'Geben Sie die gewünschte Gruppierungsart ein' @77 sortart 1

attr=underline;%display verwalt;

%if &sortart =1 %then %let by=WOHNORT;%else %if &sortart=2 %then %let by=SEMZAHL;%else %if &sortart=3 %then %let by=STUDFACH;%else %if &sortart=4 %then %let by=ABSCHLUS;

%put &by;proc sort data=studi;

by &by;proc freq data=studi;

tables STUDFACH*ABSCHLUS*SEMZAHL*WOHNORT;by &by;

run;%mend verwalt;

23. Das Makro legt eine temporäre Datei Fehler an, in die die Fehlermeldungen abgelegt werden.

%macro saserror;

Page 61: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

61

%put Fügen sie die Fehlermeldung über den Zwischenspeicher in denProgrammeditor ein;

%input;%let Fehlmeld=%nrbquote(&sysbuffr);

data Fehler;fehler=symget('Fehlmeld');run;

%mend saserror;

b) Der zweite Teil der Lösung sieht folgendermaßen aus:

%macro exist(dsn);%global exist;

%if &dsn ne %then %str(data _null_;if 0 then set &dsn;stop;

run;);

%if &syserr=0 %then %let exist=yes;%else %let exist=no;%mend exist;

[Mit diesem Makro kann überprüft werden, ob ein Datensatz existiert oder nicht, siehe SAS Guide to Macro Processing, Seite 265)]

%macro saserror;%put Fügen Sie die Fehlermeldung über den Zwischenspeicher in denProgrammeditor ein;%input;%let Fehlmeld=%nrbquote(&sysbuffr);%put Sie können an dieser Stelle Erläuterungen hinzufügen;%input;%let erlauter=%nrbquote(&sysbuffr);

data Fehler;fehler=symget('Fehlmeld');erlauter=symget('erlauter');run;

%EXIST(STAMM);

%if &exist=no %then%do;

data stamm;set fehler;

%end;%else %do;

proc append base=stamm data=Fehler;run;

%end;%mend saserror;

24. %macro refline(sds=_last_,xvar=,yvar=);

%*Ausrechnen des Mittelwerts und der Standardabweichung;Proc means data=&sds mean std noprint;

var &xvar &yvar;output out=outdat mean=xmean ymean std=xstd ystd;

run;

%*Übergabe der Datenschrittvariablen in die Makro-Sprache;data aa;

set outdat;u_xstd=xmean-xstd;o_xstd=xmean+xstd;u_ystd=ymean-ystd;o_ystd=ymean+ystd;call symput('xmean',xmean);call symput('ymean',ymean);call symput('xstd', xstd);call symput('ystd', ystd);call symput('u_xstd',u_xstd);call symput('o_xstd',o_xstd);

Page 62: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

62

call symput('u_ystd',u_ystd);call symput('o_ystd',o_ystd);

run;

%*Jetzt wird der Plot ausgeführt;proc gplot data=&sds;plot &xvar*&yvar/ vref=&u_xstd &xmean &o_xstd href=&u_ystd &ymean

&o_ystd;run;%mend refline;

25. Zur Erläuterung der Option CNTLIN, siehe SAS Procedures Guide, Version 6, Auflage 3, Seite

310. %macro buildfmt(fname=,sds=, voriwert=, varform=);

%*Aufbereiten des Datensatzes für die Proc Format;data hhhhh (rename=(&voriwert=start &varform=label));

set &sds;fmtname=symget('fname');

%*Vereinbaren des Formates;proc format cntlin=hhhhh;run;

%mend buildfmt;

Zusätzliche Übungsaufgaben

Diese Aufgaben dienen der weiteren Vertiefung in die Makroprogrammierung. Es sind Aufgaben, die in den SAS-Makroprogrammierkursen verwendet wurden. Da sie den Übungsaufgaben des Skripts in Struktur und Inhalt ähneln, wurde darauf verzichtet, Lösungsvorschläge dafür zu geben. 1. Gegeben seien folgende %let-Anweisungen

%let a=romeo;%let &a=und;%let b=w;%let c=shake;%let d=speare;%let e=h;%let f=%str( );%let und=Julia;

Überlegen Sie, was die folgenden %put-Anweisungen erzeugen und Überprüfen Sie es:

%put b&romeo.st&romeo;%put &b&&&a;%put &f&e&romeo&c;%put &a &&&a &&&romeo;%put by &c&d, &b..;

2. Geben Sie die aktuellen Werte von SYSDATE, SYSDAY, SYSVER und SYSSCP aus. 3. Gegeben sei folgendes Makro:

libname co 'n:\sasurz\daten';%macro liste(art,sds=_last_);

data;set &sds;if blume=&art;

proc print;title "Iris-Art &abtnr - Liste der Meáergebnisse";

run;%mend liste;

Page 63: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

63

Welcher SAS-Code wird mit folgenden Aufrufen erzeugt?

%liste(2,sds=co.iris);%liste(3);%liste(,sds=co.iris);

4. Der Datensatz KLASSEN

Klasse Vorname Name Alter Sex1 Heribert Schuster 21 M2 Klaus Maier 20 M1 Friedel Schulze 21 M2 Gabi Maier 18 W2 Ursula Schmidt 22 W2 Ilse Bisen 20 W1 Friedel Schulze 21 M

soll mit einem Makro LISTE ausgegeben werden. Die Klassenlehrer wünschen sich Liste für die einzelnen Klassen, der Vertrauenslehrer hätte gerne eine Aufstellung getrennt nach dem Geschlecht.

Erstellen Sie das Makro, das die beiden Listen anfertigen kann. Erstellen Sie ein Makro FINDE, das alle Schüler mit einem bestimmten Nachnamen heraussucht. (Tip: Verwenden Sie die INDEX-Funktion.) Erstellen Sie ein Makro DOPPEL, das die Doppeleinträge in einer Klasse herausschreibt. Übergeben Sie die Klassennummer und den Dateinamen als Parameter. (Tip: Sortieren der Daten nach Name und Vorname und verwende FIRST.name und LAST.name.) 5. Welchen SAS-Code erzeugt das Makro

%let fname=Franklin;%let lname=Roosevelt;%macro first;

%global mname;%local fname lname;%let fname=Ted;%put A1: &fname &mname &lname;%middle;%put A2: &fname &mname &lname;%let mname=Delano;%put A3: &fname &mname &lname;

%mend first;

%macro middle;%local lname;%let mname=Fitzgerald;%put B1: &fname &mname &lname;%last;%put B2: &fname &mname &lname;

%mend middle;

%macro last;%local mname;%let fname=John;%let lname=Kennedy;%put C1: &fname &mname &lname;

%mend last;

wenn nacheinander die Zeilen

Page 64: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

64

%first%put D1: &fname &mname &lname;

aufgerufen werden. 6. Schreiben Sie ein Makro IRISART, das die Mittelwerte der Variable SL der drei Iris- Arten nacheinander ohne Sortiervorgang bestimmt. (Tip: %do - %to). Gegeben sei folgende %input-Anweisung: %input userid username telefon ort Bestimmen Sie die Belegung der Variablen USERID, USERNAME, TELEFON, ORT und SYSBUFFR, wenn folgende Zeilen eingegeben werden:

HTR123 SMITH 45321 HD JKD123 SMITH,JAMES 55216 MA-LU OIU222 LUDWIG,11116,KA,2 XYU233 HARRIG, J.R. 1886 MA-3 R-3 PSK238 'KRANICH, R.S.' '46890' 'HD-BOXBERG' 'KA'

7. Welcher SAS-Code wird von folgendem Makro erzeugt:

%macro prtall(n);%do i=1 %to &n;

data ort&i;set orte;if ort=&i;

proc print data=ort&i;title "Ausdruck der Ortschaft &i";

%end;run;

%mend prtall; wenn es mit %prtall(2) aufgerufen wird? 8. Schreibe ein Makro, das die Werte der automatischen Variablen SYSDATE, SYSDAY,

SYSENV, SYSSCP, SYSTIME und SYSVER ausgibt, jede Variable mit Name und Wert in getrennten Zeilen.

Rufen Sie das Makro auf. 9. Schreiben Sie ein Makro KOMBI, das zwei Dateien verknüpft (merge und set), abhängig von Aufrufparametern. Das Makro soll Schlüsselparameter erhalten für

• erste Eingabedatei (Default = letzte benutzte Datei) • zweite Eingabedatei (Default = Nullwert) • Ausgabedatei (Default = Nullwert) • Typ der Operation • BY-Variable, wenn notwendig

Eine Fehlermeldung soll einen ungültigen Aufruf anzeigen. 10. Schreiben Sie ein Makro ALTER, das Name und Geburtsdatum am Terminal erfragt und anschließend das aktuelle Alter errechnet und ausgibt.

Page 65: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

65

11. Schreiben Sie ein Makro PLOTTER, das mehrere Plot-Anweisungen ausführen kann.

So soll z.B. für die SAS-Datei BLUTBILD die Variablen Cholestr gegen Alter und Calcium gegen Gewicht dargestellt werden. Ändern Sie das Plotter-Makro ab, indem Sie die Overlay-Option optional zulassen. (Plotten Sie Cholesterin und Calcium gegen Alter für die Blutbild-Datei.)

Literaturliste:

SAS Guide to Macro Processing, Version 6, 2. Edition, Cary, NC:SAS Institute, 1990 SAS Views: SAS Macro Language Cary, NC:SAS Institute, 1986 SAS Language: Reference, Version 6, 1. Edition, Cary, NC:SAS Institute, 1990 SAS-Technical Report P-222, Changes and Enhancements to Base SAS Software, Release 6.07 Cary, NC:SAS Institute, 1991 SAS-Software, Changes and Enhancements, Release 6.10, Cary, NC:SAS Institute, 1994 SAS Procedures Guide, Version 6, 3. Edition, Cary, NC:SAS Institute, 1990 Ortseifen, C.(1993): „Einführung in die SAS-Makro-Programmierung“, Begleitskript zur Vorlesung Wintersemester 1993/1994, nicht veröffentlicht.

Page 66: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

66

Index

%

%bquote ............................... 39 %by ...................................... 22 %display............................... 31 %do - %end-......................... 21 %do - %to - %end ................ 22 %do - %until - %end ............ 23 %do - %while - %end........... 24 %eval..................24; 32; 37; 56 %global .......................... 15; 16 %goto ................................... 24 %if - %then/%else................ 21 %index ................................. 33 %input ............................ 15; 20 %keydef ............................... 26 %label .................................. 24 %length ................................ 34 %let ............................9; 15; 17 %local ............................ 15; 17 %macro .......................... 12; 54 %nrbquote ............................ 40 %nrquote .............................. 40 %nrstr ................................... 41 %put ............................... 19; 47 %qscan ................................. 34 %qsubstr............................... 35 %quote ................................. 39 %qupcase ....................... 35; 36 %scan ................................... 34 %str ................................ 20; 41 %substr................................. 35 %superq................................ 42 %sysexec.............................. 25 %sysprod.............................. 48 %unquote ............................. 40 %upcase ............................... 35 %window.............................. 26

_

_last_ .............................. 13; 25

A

Addition ............................... 37 Ampersands................7; 40; 41

Auflösen von ................... 10 Mehrfache........................ 10

Anführungszeichen................... .................20; 38; 40; 43; 44

doppelte ............................. 8 offene......................... 39; 56

Argumente...................... 32; 39 Aufruf von Makros............... 50 Ausgabe benutzerdefinierter

Makrovariablen ................. 9 Austausch zwischen Makro-

Sprache und Datenschritt. 43 Auswertung von logischen und

numerischen Ausdrücken......37 Autocall Facility ...................52 Autocall-Facility ...................56 Automatische Makrosuche....53 Automatische Makrovariablen.......................8 Automatische Variablen ................... 7; 15; 29 Automatisches Speichern von

kompilierten Makros........54

B

Benutzerdefinierte Makrovariablen..............7; 9

Betriebssystemkommandos...25 Bibliotheken .........................52 Blank ...........Siehe Leerzeichen buchstabenbasiert..................37

C

call execute .........Siehe execute call symput.......... Siehe symput Charakter-Variable ...............44 cmd .......................................52 cmd/nocmd ...........................55 CMDMAC............................52 Command styled Makros 50; 52 config.sas ..............................53

D

Datensatz-Variablen .............47 Datenschritt........ 43; 45; 47; 49 Datenschrittfunktion .............47 Datenschritt- variablen .................. 44; 48; 49 Datenschritt-Zeichenketten-

ausdruck.....................43; 46 Datenschritt-

Zeichenkettenvariable .......... ...................................43; 46 Default-Delimiter..................34 Defaultwerte ...................13; 53 delimiters .. Siehe Trennzeichen Display Manager Kommandos..........................52 Division ................................37

E

execute..................................49 Execute-Routine ...................49

F

Fehler................. 40; 41; 53; 56 Fehlersuche ......................11 reservierte Worte .............12 Ursachen von ...................56

Felddefinitionen..............27; 28 Felder

geschützte ........................31 Optionen ..........................28

Fenster

Anzeige von..................... 31 Fenstername .................... 27

Fensteroptionen.................... 27 Filename-Anweisung............ 53 Funktionen ........................... 43 Funktionstasten .................... 26 Funktionstastenbelegungen .. 26

G

ganzzahlige..................... 37; 38 Gestaltungsoptionen............. 26 Großbuchstaben ................... 35 Gruppen ............................... 27

Definition von ................. 29

H

Hochkommata ...................... 41

I

IMPLMAC........................... 51 implmac/noimplmac............. 55 Indexvariablen................ 17; 23 Indirekte Zuweisung von Werten

......................................... 10 Inkrement ............................. 23 Input-Format ........................ 44 Input-Funktion...................... 45 Iterative %do-Anweisung..... 22

K

Kataloge ............................... 52 automatische.................... 53 permanente Makro-Kataloge

.................................... 54 keyparm................................ 13 Klammern................. 39; 40; 41 Kleinbuchstaben................... 35 Kommentierung von Makros ................................. 19 kompilieren ............................ 6 kompiliertes Programm........ 52 Kompilierung ................. 39; 41

L

label...................................... 45 Länge eines Arguments ........ 33 Leerzeichen .......................... 41 length.................................... 47

M

macro/nomacro..................... 55 Makroaufruf ......................... 53

Nichterkennen ................. 56 Makroausdruck..................... 47 Makro-Bibliotheken ............. 52 Makro-Funktionen............ 7; 32 Makronamen ........................ 51 Makroparameter ............. 15; 51

Page 67: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

67

Makro- Programmanweisungen .... 7; 19 Makro-Prozessor ..6; 17; 47; 55 Makro-Quoting- Funktionen ..................... 20; 38 Makro-Routinen ..................... 7 Makros ........................... 50; 52

Aufruf von ....................... 12 automatischer Aufruf von 52 Definition von.................. 12 genestete .......................... 17 Kommentierung von ........ 19 kompilierte ...................... 53 Makroname...................... 12 Makro-Parameter............. 12 Makros innerhalb von Makros

.................................... 17 verschachtelte .................. 17 von SAS bereitgestellte ... 53

Makro-Sprache............... 19; 43 Makrovariablen ........................ .............7; 12; 15; 17; 28; 43

Auflösung von ........... 39; 56 automatische.............. 15; 48 globale .................15; 16; 43 Länge von........................ 44 lokale ...................13; 15; 43 Übergabe von Datenschritt informationen .................. 45 Verhindern von Auflösung ........................ 42 Warnung.......................... 55

mautosource ......................... 53 Maximum ............................. 37 merror/nomerror................... 55 Minimum.............................. 37 MLOGIC.............................. 11 mlogic/nomlogic................... 55 Module ................................. 48 MPRINT .............................. 11 mprint/nomprint ................... 55 mrecall/nomrecall................. 53 mstored/nomstored............... 54 Multiplikation....................... 37

N

Named styled Makros........... 50 nomlogic............................... 12 nomprint ............................... 12 nosymbolgen ........................ 12 Numerische Variablen.......... 44

O

Operationen ..........................37

P

Parameterliste .......................12 PMENU-Routine ..................26 Positionsparameter................13 posparm .....Siehe Positionsparameter Potenzieren ...........................37 Programm Data Vektor.........43 Prozedurausgabe...................45 Prozentzeichen.......................... ................ 19; 38; 40; 41; 51 Pull-Down-Menü ..................26 Put-Funktion .........................47

Q

Quelltext ...............................52 Quotiertes Resultat ...............35 Quotierung

Auflösung von..................40 Rück-................................41

Quoting-Funktionen..............56 Siehe Makro-Quoting-Funktionen

R

Reservierte Namen................56 Reservierte Worte .Siehe Fehler resolve-Funktion...................47

S

SAS für Windows .................25 SAS-Anweisungen................51 Sasautos ................................53 SAS-Makro...........................12 SAS-Makro-Sprache...............6 sasmstore ..............................54 SASROOT............................53 Schleifen ...............................22 Schlüsselparameter ...............13 Schlüsselzeichen.....................6 Sequentielle Makrosuche......53 serror/noserror ......................55 Spaltenpointer.......................28 Speicherkapazität..................44 Speichern ..............................43 Sprungmarke.........................24 Statement styled Makros.......50 stmt .......................................51 store ......................................54

Subtraktion........................... 37 SYMBOLGEN............... 11; 55 Symboltabellen............... 15; 43 symget ...................... 43; 44; 47 symput................15; 43; 45; 46 SYS ........................................ 8 SYSBUFFR.......................... 21 SYSDATE.............................. 8 SYSDAY................................ 8 SYSDEVIC............................ 8 SYSDSN ................................ 8 SYSENV................................ 8 SYSERR ................................ 8 SYSFILRC............................. 8 SYSINFO............................... 8 SYSLAST .............................. 8 SYSLIBRC ............................ 8 SYSMSG.............................. 29 SYSRC................................... 8 SYSSCP ................................. 8 SYSSCPL............................... 8 System-Optionen .................11; 51; 53; 54; 55 SYSTIME .............................. 8 SYSVER ................................ 8

T

Textzeichen .......................... 38 today-Funktion ..................... 47 Trennzeichen........................ 34

Ü

Überlappung von Feldern..... 28

U

Unquotiertes Resultat ........... 35

V

Verkettung............................ 37 Verkettung von Makros.......... 9 Verschachtelung................... 43 Vorzeichen ........................... 37

W

WORK.SASMACR ............. 53

Z

Zeichenketten .................33; 35; 44; 46; 49 Zeilenpointer ........................ 28

Page 68: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

������������ ��������������������� �� �!�#"%$'&�(�)�*,+-&�.�*/.�& 02143658789:1;3=<4<4>?<4<;>@<BA4A;C

DFE%GIH�JK'L'M�K GONPE%GRQIE/S2TOUPTWV�XZY\[ M E/]O^`_ M Yba L ScdE%S2e M�fWg S�Q K'Mih X6j

k'1l.,mn(o1qpr.�*,s,& mntu& (

v'w�x-y{z-|{x`}~z`����z`}~�W�O��|{��y��� 1l�?*,&�.���1`�4m?s-�b�����{�4�u���Ps/���`.�*��-�`)�.�s,&��`)�*/�nmn(o&��o14�,�;14�4&� �����{�4�u���2���ltu*%�'1l.�&4�o5�s,1;�4&�1l(o��7�& tu& .�&�(��-&�O& .�s/m?�`( ��¡{¢Wmn.�s,*�£O� m?*/m?�`(

¤-�~¥W|o��x-¦-§�y{z-¨�y{w�©�¥~�~w�¦4�;s/m?& �o&F�?&-*,+B*,&���& m?*,&

ª «­¬�®�¯�°±2²�³�± ®�´qµ'¶¸·¹¬;µ'º�¬;·¹»;·¼�½ ¼ ¾À¿IÁ�Â�ÃÅÄÇÆÉÈÇÊÅÁ�Ã�ËÇÊ Ã,Ì'¿OÁ�Ã,Í�Î=ÏÑÐ�ÒRÓ�rm?&ÇÔ~.��4�l.�1;3�3�+-&�mn�?& (Õ{Ö{×�ظ٠ÚoÛ~ÜÖ{Ý�Þ�Ý4ß Õ{Ö�Ù à{ßOÜá4â{ã�ä2å�æ�ç~èéç�å�çêä~è�ëRæPå4ë{ì~ÜØ4â{ã�í~èîç~èéï�ì~Üð â�Ù à{ñOò,á�ó`ô;Ø~Üõ4öbÙ-ßOÜ�nm?& tu&�.,(�m?3=pr)o*/��)o*/"%¢�& (os,*,& .`�÷ ä�Ö{×4ø{Þ ä�Ø�×�Û�Þ òùà�ö�ÚoÝ4Ö�Ù`Ø�óä å�æ çç å�ç äë æ å4ë

ú ä�Ö{×4ø{Þ æPØ�×�Û òùà�ö�ÚoÝ4Ö�Ù`Ø�óíçï

û ä�Ö{×4ø{Þ æPØ�×�Û òùà�ö�ÚoÝ4Ö�Ù`Ø�óäüç

¼�½Åý þ�ÈÇÆÿÆ��Ñ¿'Ê�Ê��OÂ�� ¿��ÇÊ��IÎ�8Í�Î ¼ZÐÇÃ����rm?&ÇÔ~.��4�l.�1;3�3�+-&�mn�?& (Õ{Ö{×�ظ٠ÚoÛ~ÜÞ4ß{á4Ö�ßêá ���4à òùàbó�ÜÙ-â�æ�ÜÞlö�Ú{â��~Ü�{×Pö�à{ß�Ù`Û~ò-Ù��là�ó�ÜÞlö�Ú{â{Þlö�Ú���Ù�ÜÙ-â�Ù���æ�ÜÝlà��OÜÖ{Ý4ß4ö{Ö4à ò,Þlö;Úbó�Ü� Ù àbÙ`Þ��êá ���4à Ü��â{á ���4à ò-æ���ó�ÜÕ{Ö�Ù à{ß��OÜõ4öbÙ-ßOÜ

�nm?& tu&�.,(�m?3­� p��r"/¢o& (�s,*,&�.`�æ Õ{Ö{×�ظ٠ÚoÛ~Ü����� � Ý�á ��!çä Þ4ß{á4Ö�ßêá ���4à òùàbó�Üë Ù-â�æ�Üü Þlö�Ú{â��~Ü" �{×Pö�à{ß�Ù`Û~ò-Ù�#�� #là�ó�Ü$ Þlö�Ú{â{Þlö�Ú���Ù�Üí Ù-â�Ù���æ�Üï Ýlà��OÜæ�� Ö{Ý4ß4ö{Ö4à ò,Þlö;Úbó�Üæ�æ � Ù àbÙ`Þ��êá ���4à Ü%�& '�(*)+� × �4öoÛ�Ý ÷�,�,�% �{Ý � Ù àoÝ �*-æ`çæ`ä ��â{á ���4à ò-æ���ó�Üæ-ë Õ{Ö�Ù à{ß��OÜæ üæ " õ4öbÙ-ßOÜ( ��Ù-ß�Ù à�. ����� -%�& '�(*)+' �oÝ / ��&4ú�(�, 0���(1����� öoÞ�Ý ��ä2-,í�ä2Þ�Ý�Ø�×là��{Þ2-){(��ém?3Ép�543rÔO553'"%¢�& (os,*,& .`�

6ü�ü

78 � 9�9;:=<�> � ���?>A@ ��B�C�D �@� D �

Page 69: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

E �'�����`�\��� �\�����P���î�\�����2�F G ±�³IH ·KJ ² L ³ILNMPO · ³ ¬;µr¬;· ³�± ®P´

� �u���dm?s,*�� m?&Ç�RQ{�2S)�.�+�)�(o�¹tTS){.�U mn({*,& .�14�B*/m?�4&�3�1;*/.,mWV¹�?1`(��`)�1;�4& U� �u��� �o14* S����({�nm?�,���#& m?*,& ( + ) ��& ( Ô~.��4�l.�1;3�3�m?& .�s/�{.�14�,�o& (�8ÔI�d){(o�X��1l)os,s->� ��m?&�$'&�(�)�*,+-&�.�3YS)�s,s,& (

Z �l.,){(����?&-�;& (��{&q� �!�#"\[�& ({({*/({m?s,s,&�)�(o�Z [�& ({({*/(�m?s,s,&�mn( ��1;*/.,mWV�1l�?�;&�Q�.�1

3�m?*]Q{.,mn(o�4& (b>� �8& .8£ mn(os,14*,+Ç�4�`(��ù���P�'mn.��é&B3���t��l�{�?& (dtTS)�.8��m?&

Z Ô .��;�l.�1;3�3�m?& .,){(��2s,*,1;*/m?s,*/m?s,�Å�o& .q�I&�.,tu1l�{.�& (b¡~� m?&é({m?�,�{*m?3=�����4" �_^�s,*,&B3Zm?3����?&B3�& ({*/m?& .�*Çs/mn(��é){(o�ét�S)�.Z ��14*/.,mWV��`��& .�14*/m?�`(�&�(~>

� �u���Ps,�l�n�?*,&a`cbed�fcg�&�mn(��;&-s,&-*,+-*��'&�.���& (b¡�� & (�(Z ��1;shU (��`.�3�1l�?&iU������¹+�)�3É�l�?& m?�,�o& (29�m?& �btTS){��.�& (��;1`(�(j +4> $�>{��14*,&�(�s,�,��.,m?*,*,&Ç)�(o�Y�r.�1l�{��mn���{.��4+B&-� ){.�& (?k����{& .Z ��1;s�Ô .���Q��?&-3É3�m?*�& mn(o&-36��1l��.�� �;& � S�4s,*��'& .��{& (q�41`(�(b>

l m LnO�³ ¬ H ·¹®o�½ ¼ p{¾rqNs�þ!Ë�Â�¿'Ót�u�IÊ��OÆv�OÎrÁw�

� �u������&�(�({*î�#�;1`�?1l.�&4¡O�O& �{*,�l.�& (�)�(o�P��14*/.,m?+B& (W¡O�;�l(21`�n���o1l"(�)o3�& .,m?s,�,��&B3 ){(���(�)o3�& .,m?s,�,�o& (X3�^4�b> j ��&-3�m?s,�,�{*,&-s'�r){tu*/.�& "*,& (ê�;�l(�(�)o3�& .,m?s,�,�o& (¸)�(o��1`�n���o1l(�)o3�& .,m?s,�,��& ( £~�?&-3�& ({*,& (m?s,*'({m?�Å�{*83XS�4�`�nm?�Å�b>xk� £~mn(Yy�z�{ |W{�}�m?s,*'&�mn(é&�mn(�& �?&B3�& ({*/m?�4&�. � & .�*->#�rm?&���&�~�({m?*/m?�l( & .,"tu�`�?�4* & mn({tu14�,�¸��){.��Å� 9�)o�l.���(�)�(o�23�m?* ��&-3��r�?&�m?�Å�{��&�m?*,s,+-& m?"�,��&�(W�á4â{ä~Ü ð â��4ä��bÜ Ø4â�� ð × ð �;Üh��â ð Ü

� £~mn(��c��z�g���}\m?s,*�& mn(o&�& mn(o+-& mn�nm?��& ��1;*/.,mWV�>9�& mn�?& ({�;& �{*,�l.`� á4â���æ�ç�ä2ë ü ��-�4��1`�?*,& ({�4&��{*,�l.`� ð â���æ�è ç~èéä~è ëOè ü �� ��m?&r£~�?&-3�&�({*,&r&�mn(�& .4�X{�g�}�bx�'�'& .��{& (Çmn( � )�(o� � & mn(��;&-s,�,���?�;s/"s,& (�){(o�d��)�.��,���W&-& .�+B& m?�Å�o& (��4&-*/.�&�(�({*->���m?& 9�& mn�?& (2�{& .���1`"*/.,mWV s/mn(o�d��)�.��,�X[��;3�3�1;*,1¹�;&-*/.�& ({({*->á4â��{æ�æ��êä2-/ë ü è çÑæPä2- $ ëOèqä æ¸æ�æ��bÜð â����%á���� ð �;è��%Ø��������\�WÜ

�ém?*Itu�`�?�4& (o��&�(��ù���\"%¢�){({�{*/m?�l(o& (é){(��qpr��&�.�14*,�l.�&�(é� S�l({(o& (��O& �{*,�l".�& (é){(o����14*/.,m?+-& ( &�.�+-& )o�4*�� & .���&�(W���(o��&TV4",pr�b> á4â�æ ) ëOÜ 9�&�mn�?& ({�4& �{*,�`.�3Çm?*F<8"'Cj �xk á4âOò-æ ) ë�ó�Ü �#�o1l�?*,& ({�;& �{*,�l.Ç3Çm?*�<�"OC� j ��m?3Nk á4â � ò " ó�Ü � V��l"%£~mn(��o& m?*,s,3�1;*/.,mWV� j (�+;¡ (os-¡ á4â��~ò ü è ü ó�Ü=� V � "%��1;*/.,mWVé3�m?*4�r){�n�?& (� � &�.�*��4k

á4â��~ò " è-æ�è-æ;ó�Ü �#�o1l�?*,& ({�;& �{*,�l. 3Çm?* �£ mn(os,& (�rm?1;� j �O& ��k �r)o14��.�14*/m?s,�,�o&���14*/.,mWVq3�m?*��I& �{*,�`.��'& .�*,& (1`)�tO�{& .4��1`)��o*,��m?14��>?¡�s,�l(os,*5��)��n�?&�(�rm?1;� j ��14*�k �r)o14��.�14*/m?s,�,�o&���14*/.,mWVq3�m?*��l�?& m?�,��&�.u��1l){�o*,� m?1;��>?¡s,�`(�s,*4�r){�n�?& (�I&B�-� m?1;� j ��1;*�k �O& �{*,�`.�3Çm?*r�{& ( � & .�*,& (i��& .�81l){��*,��m?14�{>�{& .��1;*/.,mWVo�½Åý �����ÇÊ��OÎu�h�����OÂ�Át���4¾ÀÃ���à Î����2¿'Ê�Èh�* �

� ¢�&����?& (o�{& � & .�*,&��'& .��{& (Pmn(�� �!���;�ù���¸1l�?sÇÔ~)�({�{*��;& ��&�(�({"+-&�m?�Å�{(�&B*-� á4â���æ¡-�ä��WÜ� £~�?&-3�& ({*%�'& m?s,&Çpr��&�.�14*/m?�l(o& (i1l){tWtu& �{�?& (o��&�( � & .�*,&�& .�+B& )��;& (�'m?&-�{& .�tu& �{�?& (o��& � & .�*,&4>��1;*/.,mWV��l��& .�1;*/m?�l(o& (2s/mn(o�:({m?�,�{*�& .,�?1`);Qo*->ð â�æ ) ä~Ü�Ø4â{á � ð Ü �nm?& tu&�.�*-� ò,ç�- " ó >

o�½]o p{Îh�ÇÃ�¢~Ã��OÂ\ÈÇÎ���rm?&Ç��(���m?+-&-s8& mn(�&�.���14*/.,mWV �'&�.���& (i3�m?*,*,& �?s8&-�Å��m?�;& .�[��?1;3�3�& .,(i1l({"�4&-�;&�Q�& (b��1�£ mu¡ ¤]¥tQ�&-+B& m?�Å�{(o&-*��{14s�£~�?&-3�& ({*8��& .���14*/.,mWVé1{¡{��1;s�mn(i��&�.mn"%*,& (�7�& mn�o&�){(��u¤/"%*,& ( �4��1`�?*,&�s,*,&��{*->1;£?<4¡ ¦§¥©¨5ª;«{s,&-*,+-*��{14s�£~�?&-3�& ({*81l){tO��& ( � & .�*Iª�>1;£?<4¡ ¥�¨�<i«{s,&-*,+-*�1l�n�?&Ç£ �?&B3�& ({*,&Ç��& .8& .�s,*,&�(��#�o1l�?*,&Ç1l){t�<4>1;£ ¦ ¡?<4� ¬�¥©¨�¦_«{s,&-*,+-*���m?&�&�.�s,*,& (���.�& m~£~�?&-3�&�({*,&��{& .­¦ >��#�o1l�?*,&Ç1l){t®¦ >¯t}]{�°���± � & �?�,��&Ç�r)os,�41�Q�& (��nm?& t�& .,( � m?&�tu�`�?�4& (o��&�(P��)�s,��.�S)��,��&³²1�¨ � <�<�<4¡w¦+¦+¦�¡;¬³¬+¬ � «�mn(o�c¨ � ¦´¬ � «;Qw¨�1;£ mn(���¡ mn(���¥]«

µ·¶¸µ·¶�¹ D�º/S�»¸S�GI[;Y M S ¼é_�S M Y�[ fbM S�GQt¨�1�£x½�¡ ¥\« �nm?&�tu& .�*���m?&Ç�4��1`�?*,& (�s/)o3�3�&�(W>Qt¨�1�£x½�¡ ½R¥\«:�nm?&�tu& .�*Z��m?&¾��&-s,143Ç*,s/)�3î3�&­1`�n�?& .É��14*/.,mWV�&��?&-3�& ({*,&4>j Qt¨�s/)o3 j 1¿k�«�m?s,*�1�Q�& .�&�0�& �{*/m?�4&�.`¡~��1qs,�Å�{(o& �n�?& .�){(���.�&-s,�`)�.��-&�(�s/�o1l".�& (o��& .`> k��¨�1;£ À+À¹¡ ¥\«4�nm?& tu& .�*8� m?&î�4��1`�?*,& (cÁ4)o14��.�1�*,s/)o3�3�& (b>�c¨�1�£@¡?� ¥]«4�nm?&�tu& .�*���m?&î9�&�mn�?& (�3Çm?*,*,& ��� & .�*,&4>µ·¶¸µ·¶¸Â c E/S�j f a�Y\[;S�V§Ã K G®Ä~[4E f G$Imn�?��)�(o�P�4�`(25r({*,&�.�3�& (o�4& (2��){.��Å�2��);Åî(��{& (ê��&�.Ç£ �?&-3î& ({*,&4¡O� m?&& mn(o& .��;&-�'m?s,s,& (Ñ$ &-� mn(o�l){(o���4&�(*S)o�4& (b>8£ .��;&�Q�({m?sém?s,* � m?& Ô~�4s/m?*/m?�`(��&�.��;& t�){(��{& (o& (�£ �?&-3î& ({*,&4>��14*/.,mWV�¦i¨��~p�k j ��14*/.,mWV�<§¨ � & .�*�k�«1�¨ � <u¦h¬�C � « Qt¨r�?��� j 1¿¨�¦ k�«�1�£ Q�¥�¨5ª�«1�¨ � <r<�<;¡x¦�>i¦ ¡T¬5¬I¬ � «-(��;*,3�m?s,s�¨r�?��� j 1�£@¡ ¦§¥?Æx¨�> k�«-(�&�)�1¿¨�1;£ (��;*,3�m?s,s-¡ ¥\«

78 � 9�9�:Ç<�> � ���?>A@ ��B�C�D �@� D �

Page 70: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

������������ ��������������������� ÈÉ Ê º¸· ³IL+OIËé³ ·¹®ÍÌ Î ± ® MXO ¬ Ë ®P· ® ± ®ÐÏ

Ñ ® O · ³ º ³IË ´ ³ILÓÒÔÒ ·�rm?& �4�l�n�?s,*�S1`(���m��4&Z��m?s,*,&Ñ1l�n�?&�.Rpr��&�.�14*,�l.�&�(=&-*,�;>+~�(o��&�( �#m?& m?3�����{�4�ù�����81l(o�_Q{)��,�¸m?3 �RQos,�Å�{(�m?*,* U �r){m?�Å�ê7�& tu& .�&�(��-&iU@¡���> C � �0~>

� £~�?&-3�&�({*/�'& m?s,&³�r.,){(���.�&-�,��& (o1l.�*,&�(W�Õ½�¡�"�¡�À¹¡o� ¡wÀ+À� ��1;*/.,mWV��l.,){(���.�&-�,��&�(�1`.�*,& (~�ÕÖ ¡tÖiÖ� ��mn.�& �{*,&-s8Ô .�����)��{*-�?×� �O& .,��( S)��{t�){(��{���4& .�*/mn�;1`�4ØÙØn¡4�o�l.,m?+-�`({*,1l���4�� á ð Þ "O�RQos,�l�n)o*]Q�&-*/.�14�� �{Ý4ß "O��&-*,& .�3Çmn(�1`({*,&�& mn(o& .���1;*/.,mWV� Ý�Ù�.{Ýlà "O£~m?�4& ({�'&�.�*,&��{& .8��14*/.,mWV� ào×4Ö4Úoá�Û "O(o�l.�3�1`�?�4& .�*,& mn�?*,&q9�){tu1l�n�?s,+-1`���� Õ{Ö{× ð ào×4Ö4Ú "*�8�l.�3�1`�?�4& .�*,&�mn�n)�(o��s/t�){(��{*/m��l(� .���Ö{á4ø "OÔ~�l�W^��;�l(� .4Õo×�Ù à{ß " Ô~)�({�{*,&Fmn( &�mn(�&-3É�rm?1;�l.�1;3�3��ÚTÚ�Ú

Û ÜYÝ�ÜXÞ·ß L+O ·¹¬;· ® ¬�®=ÜàÝáÜ1â³ãäm å�����{�4�ù�����o14*�¤ &-�'& mn�?s�(�)�.î& mn(o& ��14*,&�m'1`�?s���(��{)�*/"%�814*,& m'){(o�P& mn(o&��1;*,& m~1`�?s�pr)o*/��)o*/"%��1;*,& m~+ ){.��O& .,tTS)o�l){(o��>æ8½ ¼ çèêé Îh�OÎ�OÃ�Îh�OÂêëR¿IÁt�OÃ5���£~"/��({�'& m?s/){(��{���W&-s,&B+ )��`.,mn021l){tO& mn(o&ìQ�&-s,*,& �o& (��{&î� �!�#"%��1;*,& m5!� £ �nmxQ�.�& t > �{14*,& m � ��1;*,& mn"%�l�o*/m?�l(o& (�� � � �8£I7�£Q�&-� mn(o�l){(o�;��«5���£��;& . S1l(o�{& .�*r(�){.8� m?&î��({��)o*/"%��1;*,& mu¡\({m?�,�{*���m?&Çpr)�*/�{)�*/"%�814*,& mu>£O���í3'"%�r({� & m?s/)�(o���{�b&-s,& "W){(o�é���,��.�& mxQo+ )o�l.,mn021`)�tb& mn(o&RQ�&-s,*,& �o& (��{&�����4"/�814*,& m£O����3 �nmxQ�.�& t > �{14*,& m � ��1;*,& mn"%�l�o*/m?�l(o& (�� � � �8£I7�£Q�&-� mn(o�l){(o�;��«£O���í3 �4& .iS1`(��{& .�*Çs,�l� �l�{�'��m?& ��({�{)�*/"%��1;*,& mu¡~1`�?s�1l)o�Å�2��m?& pr)o*/��)o*/"��1;*,& mu>k'7�£I�*3�£ "%�r({� & m?s/)�(o��� £~.�+-& )o�l){(o�6& mn(�&�.¸(�& )o& ( � �!�#"%�814*,& m�mn(�ù���k'7�£O��3�£P�nmxQ�.�&�t,> �{14*,&�m � �~�87¸�l��& .�1`(��t��« ���{& .k'7�£O��3�£ �nmxQ�.�& t > �{14*,& m � ¢~7�p�� 3î14*/.,mWV� £ .T¨��4& �{*,�`.`<���¨��4&��{*,�l.T¦§¥Õ��«k'7�£I�*3�£�&�.�+-& )o�4*r(�){.8� m?&î��*/.,)��{*/){.`¡���& mn(o&Ç��14*,&�(W>

æ8½Åý �á�IÃ,Át�O � è ËN�OÂ�¿IÁ�Ã�ÍrÎu�OÎ7�£I�8�r"%�r({� & m?s/)�(o��� �nm?&-s,*R�I1`.,m?1�Q{�?& ( mn( �ù����"/�O& �{*,�`.�& (ÿ)�(o�="��14*/.,m?+B& ( & mn(7�£O��� � .�1l(o�4&i� � �~��7 �`��& .�1l(o�t� � � ��£O7�£j 1`)�s,��.,)o�Å��k��� ���538p (o143�& � £ +-& mn�?&�¨��`1l.,m?1�Q��?& s/�o1l�?*,&�¨�3î14*/.,mWV ¥\«.�1l(o�4&;�_Q�&-s,�Å�{.�& mxQo*���m?&���& (o�4&��{& .�$ &-��Qo14�,�{*/)�(o�4&�(W¡���m?&�& mn(o�4&��?&-s,& (�'& .��{& ( j 1l�n�u¡���)�.,.�& ({*-¡`(o&�V�*W(W¡;1lt�*,&4¡-���lmn({*O�l��& .�1l(o� j ���`mn({* � k ¡-���lmn({*� ¦ � <�ª � k >�~��7ÿ�`��& .�1l(o���ìQ�&-s,�Å�{.�& mxQo*P��m?&��O1l.,m?1�Q{�?& (b¡Ç� m?&2& mn(o�4& �?&Bs,& (6�'&�.,"�{& (W> � *,1`(��{1l.�����1`�n�?& (�)o3�& .,m?s,�,�o& (É�I1`.,m?1�Q{�?& (b¡ ���b� ¡ �85�� ¡k����87 >0�î ( Ø�×2- ð Ûlö{ß ð Ù`Û �~Ü��(�÷�, á�Û�Û Ù à{ß{× �OÜ��(�÷�, á�Û�Û�ñ{á4ÖêãlÕbÙ`Û�Û�ÝPØ��o×�Û�Ý�Þ4ß�Ö{ì�Ù à{ß{× !OÜ��(�÷�, Ü�Õ{Ö�Ù à{ß2á�Û ð ö�ÚbÙ à ÜàbÙ Ú�Ú{âOò-æ ) æ���ó�ïoæ��~Ü ��(�÷�, Õo×�Ù à{ßPàbÙ Ú�Ú Ù à{ß{× ðOÜ��ÔOÔO£��8�r"%�r({�'&�m?s/)�(o���43W. S14�;*é��1;*,& ( �4�`( �ù����"/��1;*/.,m?+-& ( )�(o�¸"�O& �{*,�l.�& (qmn(�� �!�#"%�814*,& m?& (�& mn(b>�8ÔIÔO£*��� � �~�87 �`��& .�1l(o�t��« ���{& .�8ÔIÔO£*��� � ¢~7�p��ÿ3�1;*/.,mWV � £ .T¨��;& �{*,�l.`<!��¨��4& �{*,�`.T¦§¥2��«�{p�723�"%��({�'& m?s/){(��{��s,�l.�*/m?& .�*8� m?&Ç��1;*,& mW(o14�,��& mn(o&-3�[�.,m?*,& .,mn)o3�{p�723 � �!�#"%��1;*,& mOp�5434¨�� �!�#"%��1;*,& m~$®ñÑ�`1l.,m?1�Q{�?&�í�8��£*òr"%�r({� & m?s/)�(o����&�.�+-& )o�4*�& mn(o& (2��(��{&�V�tTS){.8� m?&î��({��)o*/"%��1;*,& m�����8£�òÑ�`1`.,m?1�Q{�?& «

ó ô ± ´ ³ ¬�õ Lé± ¯6·uö O · ³ ®�·áÎ ¬�»;·îµ� m?&�m?3÷U (��`.�3�1l�?& (?Ub�����é&�V4m?s/m?& .�&�(P��m?&���({�'& m?s/){(��;& (b�

� ¢O�u�W£*���8��£� ����¢O�u�W£� ����ÔO553

)o361l){t2Q�&-s,*,& �o& (o��&��814*,& (i+ )o+ )��`.�& mntu& (b¡��������æ � Ù`Û�ÝlàoálÚoÝ�Ù à¾�%Ø )ùø �{á4ß{Ýlà ø Ù à;Õ�ö{ß2-]��á4ß���Ü��������ç¸Ù à � Ù`Û�Ý�Ù à�ÚbÙ`Þ�Þ�×4ñ{Ý4ÖOÜ��������ä¸Ù à�Õ�ö{ßdàoálÚoÝ�#¸Þ�Ý �êá�Û4ß{Ý4ÖOÜQo+-��>�)o36&�V�*,& .,(o&�¢Wmn�?&-s�+ )�&�.�+-& )o�4& (b�

� ¢O�u�W£� ¢O�u�W£êÔI78�í�43

��������æ � Ù`Û�ÝlàoálÚoÝd×lö{ß��%Ø )ùø �{á4ß{Ýlà ø ×-ö{ß4Õ4ö{ß2-]�{á`ß��`Ü��������ç � Ù`Û�Ý2×lö{ßOÜ��������ädÕ�ö{ßPàoálÚoÝ1#êÞ�Ý �¸á�Û4ß{Ý4ÖOÜ

78 � 9�9;:=<�> � ���?>A@ ��B�C�D �@� D �

Page 71: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

ú �'�����`�\��� �\�����P���î�\�����2�û ãäm åêÞ2ü ³IË ´ ³ILAÒÔÒ ¬;· ³�O ·+ý ² ®2¬ M · ®£Is�&�V4m?s,*/m?&�.�& (êS1`��({�nm?�,��&N3~&-�,��({mn��&�( ��m?&�m?3É����3~��" � �,��.,m?*,*-�

� Q�&B� mn(o�4*,& �r)os/tTS){��.,){(�� 3�m?* �{& (�u¢W"]3I�8£��!�l£O�~��£ "%�r({� & m?s/)�(o�4&�(� m?*,& .�1;*/m?�4&Ç�I&�.�1l.ùQ�& m?*/){(o�é3�m?*��{& ( �r({�'&�m?s/)�(o�4& (

Z ��pÑ����3~�u«Z ��pZ>?>;38pZ>?> � $®ñ ÚWÚ ��«Z ��p � �!�ù�b£1Q�&-��mn(o�l){(���«Z ��pÑ55�438�ù�XQ�&-��mn(��`)�(o�;«

� �4��.,){(o�41l({� & m?s/)�(o�4&�(Z ��p538p �?1�Q�&���«Z �~���5[ �?1�Q�& ��«j �ù3R5r({*,&�.�s,�Å�{m?&-�é+�)X��p538p���& �{.�*'� �í�5[�(o14�,��&�mn(�&-37�£�3�5�7I�Ñ�'m?&-�{& .!1l(���m?&Ç�r)os,�41l(o�4s,s,*,&��n�?&¹+�)�.¿S)o�Å��> k

� $'&B& (���m?�l){(o�é& mn(o& .���)�s/tTS)��{.,)�(o�Z Ô��r5!� £ � 3�& �?��)�(o�;��«Z �_38p�ÔI«Z ��$�p�723�«

� �u���\"��X��þ�ÿ�|W��s/mn(��N�r.,){�{��& (î�4�l( �ù����"%�r({�'& m?s/){(o�4& (b¡4��m?&'1`�?sÔ~.��4�`.�143�3�&��#�43��{mn�nm?& .�*Ç�'& .��{& (é� S�`(�(o& (b>

��1l(q)�({*,& .�s,�,�o& m?��&B*�+-�'& m �r.�*,& (i�4�l(i����� ){�?& (b���z�����z-|����������O}~��yî '�÷���' Úo× �4öoÛlàoálÚ{Ý��~ò,á4Ö�.4ö�ÚoÝlà#ß�æ�è�á4Ö�.4ö�ÚoÝlà{ß{çbèà-�--ó��~Ü����� å ÷ à{ø{Ý�ÙBÞlö4à�.{Ý�à Ü c��%c�iî�� Ü7'54�Ñ3�����)��n(o143î& � j 1l.��`)�3�&�({*-<4¡�1`.��l)o3�& ({*�¦�¡~>@> k���«

�W}~����x`w����W¦������'}��Çy{w�¦`}~�W��¦�������\�O}~�?yî '�÷���' Úo× �4öoÛlàoálÚ{Ý��~ò,á4Ö�.4ö�ÚoÝlà#ß�æ�è�á4Ö�.4ö�ÚoÝlà{ß{çbèà-�--ó��~Ü����� å ÷ à{ø{Ý�ÙBÞlö4à�.{Ý�à Ü��(�' 0���% Úoá4ß�Ö�Ù��OÜ c��%c�iî�� Ü3�1;*-<�¨�3�����){�n(�1;3�& � j 1l.��`)�3î& ({*-<4¡�1`.��l)o3�& ({*�¦ ¡b>@> k���«

��& .î& mn(o+ m?�4&��é��x-y{z-¦-©�¥~w�y��¸+-�'m?s,�,��& ( ��& (�Q�&�m?��& (ê��.�*,& ( Q�&-s,*,&��{*��1`.,mn(W¡{�{1 �Ç¢�){({�{*/m?�l(os/"/������){�?&�& mn(o& .���1;*/.,mWV�& mn(o& ( � &�.�*~+ ){�'& m?s,& (�?S�l({(�&�(d){(���1l�?s��r.��`)�3î& ({*r�#& mn(�&�){(��{&�~{(�m?&�.�*,& (ê��14*/.,m?+-& (�+ ){�?14s/"s,& (b>Ô .��;�l.�1;3�3�"%����� ){�?&�1`�{+-& �o*/m?& .�& ( ��14*/.,m?+B& ( 1l�?s �r.��l)o3�& ({*,&;¡�� m?&(�m?�,�{*�&TV4m?s,*/m?& .�& ( )�(o��& .�+-& )o�4&�( � m?&-s,&�Q�& m $'&-�{1l.,t,>

!Fy{w�¦#"~w�y{��y$�%'&)(#*#+#,.-/&)021#143�,65(798;:�<>=�?A@ , ?AB)+#B *C1�D�E�, <9?AB)FG@ <�HI?A:#, ?AB *#?ABCJ)?AK2<9?ABMLC%$$�%'N�K2O�+#FP?AB�<2?Q3 %�$$�%RFSE�<ATU34VWK2@ O�@ B�E�, FSEX<9K2@ Y %�$$�%RFSE�<;Z[34=�@ ?A, FSE�<2K2@ Y %�$$�%RFP@ 727U3#0\B *#@ 8XE�<2(�K�H;5+#KWHI?A:#, ?AB#*#?PJ)?AK2<2?�L�]�?^H\E�+#, <_3`L %�$$�% &)+#ab72D�?AcA@ dMcA@ ?AK2<Wef?AK2* ?ABML %�$$�% %�$72<^EXK9</K2FP@ 727AgIFSE�<AT�h FiE�<;Z h FP@ 727^j^k@ H�B#K2(�e>gIFP@ 727;j2l�mb<2:#?AB)FP@ 727;l�nMLpoXkq E�*#D�(7^lW, (#8�g6FiE�<ATXlWFP@ 727;j^kD#K2@ B�< q E�*#D�(�7Ak $�%'r`(�72@ <2@ (B ?AB)*#?AKWHI?A:#, ?AB#*#?AB)J)?AK2<2?S%�$q E�*#K2(�eslW8A?A@ ,Ig q E�*#D�(�7;$�B#8A(�,6gIFSE�<ATXj2j^kD#K2@ B�< q E�*#K2(Xe'k $�%G=�?A@ , ?AB)FG@ <�FP@ B *#?A72<2?AB#7'?A@ B ?AFtHI?A:#,6L�J)?AK9<>%$u ?A?AD#K9(Xe�lWK2?AFP(XvX?�g9T3 B#K2(�e>g6FiE�<ATXj^h q E�*#K2(�esj�kD#K2@ B�< u ?A?AD#K2(�e>k�$�%bT�3 B K2(Xe'gIFSE�<ATXjf?AK2cA?A+ O<�wx? u <2(�KW*#?AK�=MEX: , ?AByT q @ 7;%�$$%iN�B#cXE�:#,M*#?AK�=�?A@ , ?AB)@ B)FSE�<AT�L#]>E�B#Bzef?AK2*#?ABz*#@ ?{%�$$% q E�*#K2(Xe�|}=�?A@ , ?AB~?AB�<�HI?AK2B�<AL %�$FSEX<^ZlWFSE�<ATX� u ?A?AD#K2(�ef��kD#K2@ B�<�FiE�<;Z kdMB#@ 72:MkY#l�nMTSL`TbTh ZPZSZSZ h#�S�P�)L h��S�P�S�Mo�kK2+ B)K2FP@ 727_gIY�h ��h FP@ 7;7^j^k

$�%'&)(#*#+#,.w`N�-W0�3 q ?AK2?A8^:#B#?A<W*#@ ?>wfE�K2@pEXB c>D#K2(z1�D�E�, <9? %�$$�%'N�K2O�+#FP?AB�</FSE�<ATS3�VWK2@ O�@ B�EX, FSE�<2K2@ Y %�$$�% %�$72<^EXK9</vXE�K2@6gIFSE�<ATXj^k7972�#lWFiE�<ATX� �P�Sh ��k $%P�W+�E�*#K^EX<972+#FPFP?/�2?A* ?AKs1�D�EX, <2?S%�$D K2@ B�<b� �W+�E�*#K^EX<972+#FPFP?�� hM7272��kvXE�K2@plW7272�#$ gIB#K9(Xe'gIFSEX<_T_j\|;TXj^kD K2@ B�<b� wfE�K2@pEXB cA?ABM� h�vXE�K2@IkK9?A<2+#K2B�gIvXE�K2@pj^kdMB#@ 72:Mk+#79?>8A(�L q , +#< q @ , *MkK9?XEX*)E�, ,.@ B�<2(bY�T�k8A, (�72?>8A(�L q , +#< q @ , *�kv�Y�TXlWvXEXK9@IgIY�TXj^kD#K9@ B�<�v�Y�Tk

78 � 9�9�:Ç<�> � ���?>A@ ��B�C�D �@� D �

Page 72: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

������������ ��������������������� �� Ê�Í�Ð�¿ Ê�� È�Îu� Ê Í�Ì'¿ Ê��Zþ~�ÇÆ­Ð Í�Ê s4�é¿'ÐN�OÊ Ê��~Î � þ4sM�ê��r)`��&�.,��1`�xQP& mn(o&-s8����� ){�?s���1;*�3�1l(:9o)o�l.,mn0 1l){tO� m?&Ç�l�?��Q�1`�?& �#"\3�>£~mn(P������)��O�`��(o&Ç�r.��l)o3�& ({*8�l.�& mnt�*�&�Q�&�(�tu1`�n�?s�1l){t'��m?&Ç�l�?��Qo1l�?&q�4"\3+ )b>O��14*/.,m?+-& (b¡'��m?&émn({(�& .,�o1l�xQ �{&-s�������)��?sq& .�+-& )o�4*�� & .���&�(W¡Os/mn(o��l�?��Q�1`�u>¢ S){.�������)��?& 3�m?*é��.��l)o3�& ({*,& ( �'mn.��¸*,&-3Ç���l. S1`.�& mn(o&:�?�`�;1l�?&2�4"\31l(o�4&��?&-�4*->�O& .�s,�Å�o14�,�{*,& �?*,& ������)��?& �?S�l({(�& ( 1l){t���m?&��?�l�;1l�?&q��3R��&-sÇ�{1l.¿S)�Q�& .,"�nm?&-�;& (��{& (2������){�?s�+ )o�l.�& mnt�& (W>á4â�æ��~Ü ð â{ç��~Ü�Ø4â{ä��~Ü���ô�á~è ð èéØ ) .{Û�× ð á�ÛPôM�Þ4ß{á4Ö�ßPÚo× �4öoÛ�æ�ÜÕ{â{á � ð Ü ��ô Õ ) .{Û�× ð á�ÛPôM�Ø4â�ë��~Ü ��ô�Ø ) .{Û�× ð á�ÛPôM�� Ù àbÙ`Þ�� ÜÖ4ö�à�Úo× �4öoÛ�æ�ÜÕ{Ö�Ù à{ßêá ð Ø Õ Ü ��ô�Ø Ù`Þ4ß�ñ{Ý4Öf�álà��{Ý4Ö�ß ôM�Þ4ß{á4Ö�ßPÚo× �4öoÛ�ç~ò,á~è ð ó�ÜÕ{â{ç�ô~ò,á � ð óoÜ ��ô Õ ) Û�× �oá�Û ôM�ð â ü �~Ü ��ô ð ) Û�× �oá�Û ôM�� Ù àbÙ`Þ�� ÜÖ4ö�à�Úo× �4öoÛ�ç~ò,ábè,Ø�ó�ÜÕ{Ö�Ù à{ßêá ð Ø Õ Ü ��ô�Ø Ù`Þ4ß�ñ{Ý4Öf�álà��{Ý4Ö�ßOèÇôM�

��ô ð è�Õ ð Û�Ý�Ù ð Ýlà ôM�

� � ³IL�� M ¬�® ÜàÝáÜ1â³ãäm å�����{�4�ù����Q{m?&-*,&-*Ç& mn({m?�4&Y�r.�1�~���t�){({�{*/m?�l(o& (W¡ 3�m?*Ç��& (o& (23î1l(2& mn({"tu1;�Å�o&�+-�'& m?��m?3�& (os/m?�l(o14�?& Ô �?�;*,s�& .�+B& )��;& (��;1l({(W�

� ���87�� �� ��Ô p��í�43� ��Ô p���ñ

S�r�{({�nm?�Å��+ )o36������� j ��1;*,1 � *,&��Y�r.�1l�{�{m?�-sÇ��({*,& .,t�14�-&�kI�?S�`(�(o& ( ��m?&��*,*/.,mxQ�)o*,&Ç��& .!& mn(o+-& �n(o& (2Ô~�?�4*,& �?&-3î& ({*,&4¡b� m?&�Ô~�?14+�m?& .,)�(o�é){(�� �4�;1l"�nm?& .,){(��{¡'�8�Å�os,& (P){(���3~&�V�*Ç�4&�.iS1l(o��& .�*î�'& .��{& (2)�(o�P��m?&X�r.�1�~{��&�(mn(Y[�14*,1`�?�4�;& ( �4& .�� 1l�?*,&-*8�'& .��{& (W>Õ{Ö{×�ظ٠ÚoÛ~ÜØ�á�Û�Û .{Þ4ß{á4Ö�ßOÜ� ð × ��âOòù�êæ���� æ���� ��ó�Ü! ð × ��âOòù�Ð� æ����¸æ�����ó�Üß{á .�â��{×~òù�~è�æ��~è/ç�óoÜÕ{Ö{Ý�Ù`Þ4â{ã�æ�è%ç~è,äWè ü è $ è/ï�ìWÜØ�á�Û�Û .{×lÕoÝlà ÜØ�á�Û�Û .4ÕoÛ�× !Oò]� ð ×��Oè]! ð ×���ó�ÜØ�á�Û�Û .4Õo×�Ù à{ßOò/ß{á�.OèùÕ�Ö{Ý�Ù`Þ�óoÜØ�á�Û�Û .{Þ��o×4øOÜõ4öbÙ-ßOÜ

� Ü º¸·¹¬iý ² · ³ ® � Ë ® m Ë Ï ± »;·¹® ± ®ÐÏm L+O�³ ¬ H ·¹®

��14*/.,m?+B& ( ){(o� ���43Ç��mn�nm?& .�*,& �ù���\"%������)��?& �?S�l({(�& ( mn( �����4"[�14*,1`�?�4�;& (P�;&-s/��& m?�,�o& .�*��'&�.���& (b>��&�.���*,1l(o�{1l.����41;*,1l�?�;��¡'mn(¸�{& ( �ù���\"%£~�?&-3�& ({*,&�1�Q��;& �?&-�;*é�'& .��{& (b¡m?s,*��{& .!�����4"][�1;*,1l�?�;�é������5���£O7F> �ù��� �_38p�7�>7�£ � £*3R��38p�7r�4��£®¨r�nmxQ�.�&�t,> �B14*,1l�?�;�;« s/��&-+�mx~�+ m?&�.�*��{& ( �4&¿S�l0�(o& "*,& (Ó[�14*,1l�?�;��>����p � ��3�p�7��4��£I« �nm?s,*,&B*��{& (���({��1`�?*��{&-sI[�14*,1`�?�4�4s->��38p�7�£ � ��14*/.,m?+B& (�� � � p��85��b£�¨ j ������)��?&§k���« s/��&�m?�Å�o& .�*���m?&��14*/.,m?+B& (�)�(o��������)��?&�m?3 [�1;*,1l�?�;�¹1�QW>Þ4ß{×4Ö{Ý2á ð Ø~ÜÞ4ß{×4Ö{ÝdÚo× �4öoÛ�Ý4â4Úo×��4öoÛ{æ�ÜÞ4ß{×4Ö{ÝdÚo× �4öoÛ�Ý4âOòùÚ{× �4ö Û�æ Úo× �4öoÛ�ç�ó�ÜÞ4ß{×4Ö{Ý~Ü� pr�8� � ��14*/.,m?+-&�(�� � 3�����){�?&�¨ j ����� )o�?&�k���« �\S14�{*���m?&���14*/.,m?+-&�(){(���������)��?&Çmn(��{& ( 1l�{*/m?�;& ( �r.ùQ�&�m?*,s]Q�& .�& m?�,�W>7�£O� pr�8£ � ��14*/.,m?+B& (�� � 3î��� ){�?&�¨ j ������){��&§k���« �\S�;s,�Å�{*���14*/.,mn"+-& (q)�(o��������)��?&�1`)�s��{&-3�[�14*,1l�?�;��>

ª�� � ·¹¬ O · ³ · m °Ë ´:»�¬iý ² M ·¹¬ O ·¹®��� mn(��{�`��sr){(��� ��m?s/���?1�^

tTS){.'��m?&���1;*,& (�&�mn(��;1�Q�&XS)�Q�& .���1;s/��& (³Q�+-��>�&�mn(�& (q3�&�(*S)o�4&-s,*,&�)�& .�*,&�(Ô~.��4�l.�1;3�3�1�Q��?1`)�t j S1`��({�nm?�,�P�'m?&�mn(������4"/��1`��.��4s�k >ªéª Ü º¸·¹¬iý ² · ³ �i· ³P� L » O8± ®�´�����{�4�ù��� m?s,* .�&B�Å�{* s/��& m?�,�o& .,mn({*,& (os/m����8¢5S)�.u¤,&B��&-s £~�?&-3�& ({*q& mn(o& .��14*/.,mWV�� & .���&�(��¹$®^�*,&-sr.�&-s,&�.��4m?& .�*-> j � ª ª $'&-��Q�1;�Å�{*/){(o�4& (23Çm?*�<�ª�O1l.,m?1�Q{�?& (YQ�& (ÕS�4*/m?�;& (dmn( ��1;*/.,mWV4tu�l.�3ÉC ª{> ªiª ª�$®^�*,&-s->xk

78 � 9�9;:=<�> � ���?>A@ ��B�C�D �@� D �

Page 73: SAS-Makro-Programmierung - Universitaetsrechenzentrum · 6 1. Einführung 1.1 Was ist ein SAS-Makro? Ein SAS-Makro ist ein in der SAS-Makro-Sprache geschriebenes Programm, welches

� �'�����`�\��� �\�����P���î�\�����2�ã'® ²ÐL » O µ'��· ³IH ·¹¬iý ² ®2¬;µ ¢¡ wu��£#¤}~¥~z`}~�W��¦#¥~y{w�¦#"~w�y{�@y  <4>?< ��14*/.,mWV�3�){�?*/mn���?mn��1;*/m?�l(ê�RQw¨�� Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú <<4> ¦ �4)�3�3î&�1l�n�?& .î9�1l�{�?& (��4�`(P<5Q{m?s5� Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú <¦¨§ }~z�¨�y�©î¥W|�z-|x��xBy{zlw�¦`w�y{z`}~�W� ¦ª � |�x�zlw�¨�y{� ¦¬�>?< �ù����" �#�{.�14�,��&��?&-3�& ({*,& Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¦¬�> ¦ ¢�& �{�?& (o��& � & .�*,& j �ém?s,s/mn(o�é�O1l�n)o&-s�k Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¦¬�> ¬ ��(o��m?+ m?& .,){(�� Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¦¬�> ¬�>?< £ �?&B3�& ({*,1l.�&îpr��& .�1;*,�l.�& ( Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¦¬�> ¬�> ¦ �rm?&Ç�W���-1;*,& "%¢�){(��{*/m?�`( Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¦«­¬ "~y{z-|�x��z-y{�'®S�W}~����x`w����Wy{�2}~�W�¯�é�\xBy{z "~z�����z�|x���dy ª°¨±W²³± �´ |�xBy{w�y{�êwu� ±W²µ± ��¤��Ñv ª� >?< Spr0�(o& ( & mn(o& .��814*,& m Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¬� > ¦ � & m?*,& .�&îpr��& .�14*/m?�`(�&�( Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú4Ú�Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú�Ú�Ú�Ú5Ú�Ú�Ú�Ú ¬

¶ �'}W��z`w6· |�}�£!yM¸\xBy{zl�Wy���wu��y�¦ ª¹ ¤��Ñvº���z�����z-|x���Pw�y{z-x-y�©�¥~�~w2��y{� «» ��z�|M¼G��wu� ±W²µ± ��¤��Ñv °½¨± " y{w�©�¥Wy{z`�P§����¾���\�O}~��y{�2}~�W�{� |{x`z`w�¨�y{� ° 4¿³À y{w�x-y{z-y��Á¤�o���uw�©#¥���y{w�x-y{� ° x Â± " y{w�©�¥Wy{z-§�y{z��Ç|���x`}~�W� °

78 � 9�9�:Ç<�> � ���?>A@ ��B�C�D �@� D �