Makro-Programmanweisungen

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Einleitung

Makro-Programmanweisungen sind die Datenschritt-Anweisungen der Makro-Sprache. Sie unterscheiden sich oftmals nur dadurch, dass 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, die überall benutzt werden können:

 %*  %DISPLAY  %GLOBAL  %INPUT
 %LET  %MACRO  %MEND  %PUT
 %SYMDEL  %SYSCALL  %SYSEXEC  %WINDOW

Makro-Programmanweisungen, die nur innerhalb von Makros benutzt werden können:

 %DO  %DO %UNTIL  %DO %WHILE  %END
 %GOTO  %IF-%THEN Iteratives %DO  %LABEL
 %LOCAL  %RETURN

%*-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 kommentar(sds,x);
  %*Dieses Makro überprüft, ob versehentlich eine Identifikationsnummer 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;

%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.
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 Makro-Funktionen).

Syntax:  %PUT text;
Beispiel:
%Macro testput;
  %Put Makro TESTPUT beginnt die Ausführung ; 1)
  %Put Makro TESTPUT beginnt am &sysday..; 2)
  %Put %Str(Semikolons(;) beenden SAS-Anweisungen.); 3)
  %Put %Str( ); 4)
  %Put %Str(Fisher%'s exakter Test); 5)
%Mend testput;
%testput;
Ergebnis:
Makro TESTPUT beginnt die Ausführung
Makro TESTPUT beginnt am Friday.
Semikolons(;) beenden SAS-Anweisungen.
Fisher's exakter Test

1) Die erste %Put-Anweisung schreibt eine einfache Textzeile.

2) Es müssen am Satzende zwei Punkte verwendet werden, da ein Punkt automatisch als Begrenzungszeichen für die Makrovariable erkannt wird und erst der zweite Punkt den Satz beendet.

3) Um ein Semikolon als Textzeichen zu verwenden, muss die %Str-Funktion verwendet werden, die Sonderzeichen als Text behandelt.

4) Produziert eine Leerzeile;

5) 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.

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

Hinweis: Die %Input-Anweisung kann nur im Programm-Editor verwendet werden. Sie funktioniert nicht im Enhanced-Editor, der ab SAS Version 8.2 verfügbar ist. Ansonsten kommt eine Fehlermeldung:

ERROR: Requested function is not supported.
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 Variablen.

Werden mehr Werte angegeben, als Variablen definiert sind, werden diese in der automatischen Variable SYSBUFFR gespeichert.

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; 1)
  %Let name=&SYSBUFFR; 2)
  %Put &name;
%Mend vornach;

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

2) Danach wird mit der %Let-Anweisung vereinbart, dass der Inhalt von SYSBUFFR in die Variable name geschrieben wird.

%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 Integer-Ausdruck %THEN SAS-Anweisung;
                     %ELSE SAS-Anweisung;

Die %Else-Anweisung ist optional.

Der Integer-Ausdruck kann jeder Makro-Ausdruck sein, der einen Integer-Wert zurückliefert. Dies können auch logische Ausdrücke wie Vergleichsoperationen sein, die dann als 0 interpretiert werden, wenn die Bedingung nicht erfüllt ist. Die SAS-Anweisung nach %THEN wird ausgeführt, wenn der Integer-Ausdruck nicht den Wert 0 liefert. Anderenfalls wird, falls angegeben, die SAS-Anweisung nach %ELSE ausgeführt. Logische Ausdrücke, die Kommazahlen oder Nicht-Integer-Arithmetik enthalten, müssen in eine %SYSEVALF-Funktion eingeschlossen werden. Zum Beispiel zeigt %if 9.5 < 10 %then ... %else ... nicht das intuitiv erwartete Verhalten: Die Auswertung der Bedingung 9.5 < 10 liefert den Wert 0 und daher wird die Anweisung nach %else ausgeführt. Das hier wahrscheinlich eher erwartete Resultat erhält man, wenn man %if %SYSEVALF(9.5 < 10) %then ... %else ... schreibt. Insofern besteht keine vollständige Analogie zur if-then/else-Anweisung im Datenschritt.

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 der Text „Überprüfen Sie die Indexvariablen“ ins Log-Fenster geschrieben werden. Sonst (%Else) soll im Log-Fenster „Alles okay“ erscheinen.

%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 1)
    %Do;
      Proc Print Data=&sds;
      Run;
    %End;
  %Else 2)
    %Do;
      Proc Contents Data=&sds;
      run;
    %End;
%Mend frage;
Aufruf:
%frage(1, sashelp.class) 1)
%frage(unsinn, sashelp.class) 2)

1) Falls die Variable aaa den Wert 1 annimmt, wird die Prozedur Print verwendet.

2) Falls die Variable aaa einen anderen Wert als 1 zugewiesen bekommt, wird die Prozedur Contents ausgeführt.

%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;
Makrovariable 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, muss ganzzahlig sein.
stop Endpunkt der %Do-Schleifen, muss ganzzahlig sein.
Inkrement Mit der optionalen %By-Anweisung kann vereinbart werden, in welchen Schritten die %DO-Schleife ausgeführt wird (Standard=1).
Beispiel:
%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;
  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:
%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).

%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 (logischer 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 Makro-Funktionen) 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 geworden ist (also bei 11), bricht das Makro ab und es erscheint die Meldung, dass das Makro beendet ist.

%Do - %While - %End-Anweisung

Die %Do-%While-%End-Anweisung wiederholt Programmanweisungen, solange eine Bedingung erfüllt bleibt.

Syntax:
%Do %While(logischer Ausdruck);
  Text und Makro-Programmanweisungen
%End;
Beispiel:
 %Do %While(&a<&b);
 %Do %While(&date=31 and &month<12);
Beispiel-

programm:

%Macro tu_solang(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_solang(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.

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

Beispiel:
%Goto xxx;
%xxx: %Put Die Sprungmarke heißt XXX;
Beispiel-

programm:

%Macro info;
  %Put Wollen Sie eine ausführliche oder eine kurze Zusammenfassung?;
  %Put 1=lang, 2=kurz;
  %Input eingabe;
  %If &eingabe=2 %Then %Goto kurz;
    Proc Contents;
    Run;
    Proc Freq;
      Tables _numeric_;
    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.

%Sysexec-Anweisung

Mit Hilfe der %Sysexec-Anweisung können innerhalb und außerhalb von Makros Betriebssystemkommandos ausgeführt werden.

Syntax:
%Sysexec Kommando;
Beispiel:
%Sysexec cd\;
%Sysexec time;
Beispiel-

programm:

%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 aktuellen Laufwerk das Verzeichnis aufgabe. Falls Sie unter AIX arbeiten, wird das Verzeichnis aufgabe in ihrem Home-Verzeichnis angelegt.

%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 Gestaltungsoptionen, z.B. Farbe, Schriftpositionierung usw. Mit der %window-Anweisung definierte Fenster, können mit der %display-Anweisung (siehe unten) 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.

Hinweis: Die %Window -Anweisung kann nur im Programm-Editor verwendet werden. Sie funktioniert nicht im Enhanced-Editor, der ab SAS Version 8.2 verfügbar ist. Ansonsten kommt eine Fehlermeldung:

ERROR: Requested function is not supported.
Syntax:
%Window Fenstername <Fensteroptionen> Feld-Definition-1
                    <... Feld-Defintion-n>;
%Window Fenstername <Fensteroptionen> Gruppen-Definition-1
                    <...Gruppen-Definitionen-n>;
Fenstername benennt das Fenster und muss 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 1) Color=black Irow=5 2)
#10 @10 'Dies ist mein erstes Fenster' 3)
Color=White;

Aufruf:
%Display fenster;

1) Fenstername

2) Fensteroptionen

3) Felddefinitionen

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ögliche 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 platziert 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.

Felddefinitionen

Feld-Definitionen verbinden konstanten Text oder Makrovariablen mit einer Position im Fenster und dessen Attributen. Konstanter Text muss 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>

Erläuterung:

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";
Auswirkung: 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 muss 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 beeinflusst 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:
Option Beschreibung
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ürzung C=)

spezifiert die Farbe, in der ihr Feld erscheinen soll.
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, dass eine Eingabe ins Feld erfolgen muss, 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.

Gruppen-Definition

Die Gruppendefinition definiert eine Gruppe von Feldern, die gleichzeitig in einem Fenster angezeigt werden.

Syntax: GROUP=Gruppenname

Der Gruppenname muss den üblichen SAS-Namenskonventionen entsprechen. Zum Aufruf ist dann sowohl der Name des Fensters, als auch der Gruppenname anzugeben

Beispiel: Fenster.monat

Damit wird die Gruppe monat des Fensters Fenster aufgerufen.

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.

%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, 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.
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.
Beispiel:  %Display eingabe.kurz noinput bell;

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;

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:
MacroProg PG1.jpg

Beispiel 2: Im zweiten Beispiel werden zwei Gruppen definiert, die wahlweise angezeigt werden sollen.

%Window eingabe Color=White
  Group=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=yes c=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, dass beide Gruppen des Fensters angezeigt werden, wie in Bild 2 zu sehen ist.
MacroProg PG2.jpg

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).
MacroProg PG3.jpg

Makro DISP zeigt nur die Gruppe "kurz" an.

%Return-Anweisung

Mit dieser Anweisung kann ein gerade laufendes Makro beendet werden.

Syntax:  %RETURN;
Beispiel:
%Macro Machwas(err);
  %If &err = 1 %Then %Do;
    %Put Das Makro Machwas muss abgebrochen werden!;
    %Return;
  %End;
  %Put Das Makro Machwas kann weiterlaufen!;
%Mend Machwas;
Aufruf:
%Machwas(0);
%Machwas(1);

Falls die Variable err einen anderen Wert als 1 zugewiesen bekommt, wird das Makro Machwas ausgeführt. Falls die Variable err den Wert 1 annimmt, wird das Makro Machwas abgebrochen.

%Symdel-Anweisung

Mit dieser Anweisung können benutzerdefinierte globale Makrovariablen aus der Symboltabelle entfernt werden.

Syntax:  %Symdel makrovar1 <makrovar2 ...> </option>;
Beispiel: Einzelne benutzerdefinierte globale Makrovariablen löschen
* Globale Makrovariablen definieren;
  %Let siteNummer=&SYSSITE;
  %Let userid=&SYSUSERID;
  %Let betriebssystem=&SYSSCPL;
  %Let sasversion=&SYSVLONG;
  %Put _user_;
* Einzelne globale Makrovariablen löschen;
  %Symdel sitenummer userid;
  %Put;
  %Put _user_;
Beispiel: Makrovariable als Argument von Symdel verwenden
%Let hilf=betriebssystem sasversion;
%Symdel &hilf;
%Put;
%Put _user_;
Beispiel:
%Symdel hilf; 1)
%Symdel hilf / NOWARN; 2)

1) Die Makrovariable hilf wird aus der Symboltabelle gelöscht.

2) Die Makrovariable hilf soll aus der Symboltabelle gelöscht werden. Falls hilf in der Symboltabelle nicht vorhanden sein sollte, kommt folgende Meldung im Logfenster:

WARNING: Attempt to delete macro variable HILF failed. Variable not found.

Diese Meldung wird durch die Option NOWARN unterdrückt.

%Syscall-Anweisung

Wenn die %Syscal-Anweisung eine SAS- oder benutzerdefinierte "call routine" aufruft, dann wird die SAS Makrovariable an die call routine übergeben; siehe Beispiel unten.

Syntax:  %Syscall call-routine<(call-routine-argument(s))>;
call-routine is a SAS System or user-written CALL routine created with SAS/TOOLKIT. All SAS call routines are accessible with %SYSCALL except LABEL, VNAME, SYMPUT, and EXECUTE.
call-routine
argument(s)
is one or more macro variable names (with no leading ampersands), separated by commas. You can use a text expression to generate part or all of the CALL routine arguments.

Im folgenden Beispiel ruft die Makro-Anweisung "%SYSCALL RANUNI(A,B)" die SAS call routine RANUNI auf.

Hinweis: Syntax von RANUNI lautet: RANUNI(seed,x).

Beispiel: Verwendung Ranuni call routine mit %Syscall
%Let seed = 123456;
%Let x = 0;
%Syscall Ranuni(seed, x);
%Put &seed, &x;
Ergebnis: 1587033266 0.73901995398989

Siehe auch

Literatur

  • Ortseifen, C.(1993): Einführung in die SAS-Makro-Programmierung - Begleitskript zur Vorlesung Wintersemester 1993/1994 - nicht veröffentlicht.
  • SAS 9.3 Macro Language – Reference.