30
1 Einführung in die SAS Makro Sprache Zur Person Grischa Pfister iCASUS GmbH Vangerowstraße 2 69115 Heidelberg [email protected] Arbeitsfelder Anwendungsentwicklung AF, IntrNet, Java Data Warehouse Balanced Scorecard Schulungen im Bereich BASE, AF, Java

Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

  • Upload
    lethien

  • View
    227

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

1

Einführung in die SAS Makro Sprache

Zur Person

Grischa PfisteriCASUS GmbHVangerowstraße 269115 [email protected]

ArbeitsfelderAnwendungsentwicklungAF, IntrNet, JavaData WarehouseBalanced ScorecardSchulungen im Bereich BASE, AF, Java

Page 2: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

2

Ablauf des Tutoriums

Zeitrahmen09:15 – 12:00 UhrPausen und Übungen auf Zuruf

AblaufVortragAnwendungsbeispiele

FragenImmer und jederzeit

UnterlagenProgramme & PPT

Agenda

EinleitungMakrovariablenMakrosMakro-StatementsMakro-FunktionenInteraktion mit dem Data StepDebuggingDeployment

Page 3: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

3

Einleitung

Warum eine Makro Sprache?Vereinfachung des Codes

Leichtere PflegeBessere Lesbarkeit

WiederverwendungDurch KollegenSAS community

StandardisierungDefinierte Analyseverfahren

Einleitung

Was sind Makros?Automatisierte Programme

ParametrisierungModularisierungKonditionelle Ausführung von Programmteilen

Fokus bei Entwicklung liegt auf Effizienz der Programmierung, nicht auf inhaltlicher Fragestellung

Page 4: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

4

Einleitung

Wie funktionieren Makros?Platzhalter-Prinzip

In einem Programm werden Platzhalter referenziertBeim Verarbeiten werden Platzhalter ersetzt

Grundprinzip ist die Textersetzung

Makros sind Code-GeneratorenErgebnis ist SAS/BASE Programm (bzw. ein Teil davon)

Einleitung

Die SAS Macro Facility besteht ausMacro Language

Programmiersprache in SAS/BASEVariablenStatementsMakro-FunktionenGlobale Optionen

Macro ProcessorInterpreter

Standards für die Bereitstellung

Page 5: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

5

Vom Programm zum Makro

Vom Programm zum Makro

Wie werden Makros entwickelt?SAS/BASE Programm schreibenAllgemein verwendbare Teile identifizieren (modularisieren)Variable Teile identifizierenProgramm in ein Makro übersetzen

Page 6: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

6

Vom Programm zum Makro

BeispielProc Print data=Sashelp.Class;Run;

Wie SAS ein Makro verarbeitet

Page 7: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

7

Wie SAS ein Makro verarbeitet

KompilierungsphaseSAS verarbeitet CodeWenn Fehler auftritt Fehlermeldung od. dummy macroKompiliertes Makro in Work.Sasmacr gespeichert

Aufruf des MakrosSAS lädt MakroMakrovariablen werden aufgelöstLogik des Makros wird verarbeitetResultierendes BASE-Programm wird von SAS abgearbeitet

Wie SAS ein Makro verarbeitet

1. Word Scanner ließt tokenaus Input Stack

2. Word Scanner erkennt Makro-Trigger [%,&]

3. Kompiliertes Makro wird geöffnet

4. Lokale Symbol-Tabellewird angelegt

5. Wert für Table wird gespeichert

6. Makro Processor ließt Tokens aus kompiliertem Makro und schreibt Ergebnis in Input Stackzurück

7. Word Scanner ließt tokenaus Input Stack

Input Stack

%PrintTable(Sashelp.Class)

Macro ProcessorCompiler

Word Scanner

Symbol Table(s)

Kompiliertes Makro

%Macro PrintTable(table);Proc Print data=&table;Run;

%Mend;

Page 8: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

8

Makro-Statements I

Makro-Statements I

Makro Definition%Macro Name;...%Mend <Name>;Positional Parameter

%Macro Name(parameter1<, parameter2, ...>)Keyword Parameter

%Macro Name(para=defaultwert<, para=defaultwert, ...>)

Page 9: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

9

Makro-Statements I

%Let-StatementLegt eine MVAR anOrdnet MVAR einen Wert zu

%Let x = 5;%Let text = Dies ist ein Text;%Let x = Variable Y hat den Wert "&text";%Let z =;

Makro-Statements I

Kommentare%* Makro-Kommentar-Text ;

Kommentar bis zum nächsten SemikolonAbschalten einer Zeile / eines Statements

/* Normaler Kommentar-Textkommentiert auch enthaltene Makro-Aufrufe und Makrovariablen */

* BASE-Kommentar-Text ;Makro-Aufrufe, -Statements sind nicht auskommentiert!Problem wenn vor %ElseVorteil: werden in LOG ausgegeben wenn Option MPRINT gesetzt ist

Page 10: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

10

Makrovariablen I

Makrovariablen I

Automatische MVARsDictionary.Macros / Sashelp.VmacroMVARs besitzen scope:

Automatic / global / local

Benutzerdefinierte MVARsAls Parameter bei Makro-AufrufDefiniert mit %Let-Statement%Let mvar = wert;Auflösung nur in „…“, nicht ‚…‘Fehlermeldung wenn nicht deklariert

Page 11: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

11

Vom Programm zum Makro

Bestehendes Programm erweiternGlobaler Schalter für Ausgabe in HTML

Überprüfung ob Variable existiertAbbruch wenn nichtWenn gesetzt ODS Statements erzeugen

Makrovariablen II

Page 12: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

12

Makrovariablen II

Definition%Let mvar = wert;

Überprüfen der Existenz%Symexist(mvar) [ab V9]Dictionary.Macros (für globale mvars)

Löschen [ab V8]%Symdel mvar <mvar ...>;[Call Symdel("mvar <mvar ...>");]

Makrovariablen II

SQLNach SQL-Step werden automatisch globale MVARsgesetzt

SQLOBS Anzahl der gefundenen SätzeSQLRC Return Code des StepsSQLOOPS Anzahl der Schleifenläufe

Nachzulesen inSQL: Dictionary.MacrosSashelp.Vmacro

ScopeAutomatic / global / local

Page 13: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

13

Makro-Statements II

Makro-Statements II

AblaufsteuerungVerzweigung mit

%If - %Then - %Else%Do ... %EndAnalog zum Data Step

Sprungmarken%Goto label;…%label: <macro statement>;

Abbruch des Makros%Return; [ab V9]%Goto%Abort (setzt Fehlercode)

Page 14: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

14

Makro-Statements II

Schleifen%Do %While ( bedingung );...

%End;%Do %Until ( bedingung );...

%End;%Do i=1 %To n <%By step>;…

%End;i wird automatisch als MVAR angelegt (!)

Impliziter Aufruf von %EvalEs gibt keine LEAVE Anweisung

vorzeitiges Verlassen der Schleife nur mit %Goto

Makro Statements II

OperatorenTeilmenge der SAS/BASE OperatorenArithmetisch

**, +, -, *, /, <, > <=, >=, =, ^=LT, LE, EQ, NE, GT, GE

Logisch^, &, |NOT, AND, OR

NichtMin, max, :

Auswertung arithmetischer AusdrückeErfolgt ganzzahlig!

Page 15: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

15

Makro-Statements II

%Put-StatementSchreibt Text in das LOG-FensterFehlersuche bei EntwicklungKontrollierte (Fehler-)Meldungen

Neues Beispiel

Für alle Tabellen einer LibraryVariablenliste ausgeben

Proc ContentsOds SelectSchleife über alle Tabellen

Woher kommen die Namen der Tabellen?Wieviele Tabellen gibt es?

Page 16: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

16

Makro-Funktionen I

Makro-Funktionen I

%Let mvar = %Funktion(para1<,para2,…>);

Alphanumerisch%Index(mvar,text)%Length(mvar)%Scan(mvar,n<,delimiter>)%Substr(mvar,start<,end>)%Upcase(mvar)…

Page 17: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

17

Makro-Funktionen I

NumerischBei Statements implizite KonvertierungGrundsätzlich ganzzahlig [-264 - 1,264 - 1]%Eval( ausdruck )%Sysevalf( ausdruck ) für Fließkommadarstellung

Ergebnis ist aber immer eine Zeichenkette!

Schnittstelle zu allen Data-Step Funktionen%Sysfunc()

Makro-Funktionen I

Eigene Makro-FunktionenMakro mit Rückgabewert

%Macro name;...&mvar

%Mend;Darf nur Makro-Statements enthaltenSAS Autocall Macros z.B. %Left

Page 18: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

18

Zurück zum Beispiel

Die elegante VarianteTabellen-Namen und -Anzahl aus Steuerdatei lesen

Per SQLMit Hilfe des Data Step

Makrovariablen III

Page 19: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

19

Makrovariablen aus SQL erstellen

Select Into :mvar Separated By „ “Erzeugt Liste aller WerteTrennzeichen frei vergebbar

Mvar SQLOBSEnthält Anzahl der gefundenen Sätze

Makro-Schleife über &sqlObs, mit %Scan den jeweiligen Wert lesen

Makrovariablen dem Data Step erstellen

End = eof setzenUm am Ende Anzahl der Sätze zu schreiben

Call Symput(„mvar“,“wert“);Für jeden gelesenen Wert wird eine Variable erstellt

Makro-Schleife über die Anzahl SätzeAuflösung der Makrovariable erfolgt von links nach rechts &&table&i

Nach erster Auflösung &table1Nach zweiter Auflösung Class

Page 20: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

20

Makrovariablen IV

Global

faktor = 5

Makrovariablen IV

Scope von VariablenIm Open Code immer GlobalSchachtel-Prinzip

Jedes Makro hat lokale Symbol-TabelleJedes Makro kann die Symbol-Tabelle der umgebenden Makros sehen (und schreiben)

Makro a

para1 = 11

para2 = 55

%Let faktor = 5;

%Macro a(para1);

%Let para2 = %Eval(&para1 * &faktor);

%b(&para2);

%Mend;

%Macro b(para1);

%Put in B: para1 = &para1;

%Mend;

%a(11);

Makro b

para1 = 55

Page 21: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

21

Makrovariablen IV

Probleme mit nicht explizit deklarierten MVARsSAS durchsucht alle umgebenden Symbol-Tabellen

Wenn MVAR vorhanden wird dort ersetzt (z.B. Schleifenzähler &i !!)

Gleichnamige Variablen müssen mit explizit definiert werden

Als Übergabeparameter%Local-Statement

Wenn in globale MVAR geschrieben werden soll %Global-Statement

Wenn in die existierende MVAR aus einem umgebenden Makro geschrieben werden soll

Weder %Local noch %GlobalSonderfall Call Symput()

Makrovariablen IV

Bei UnsicherheitDas %Put Statement

Vordefinierte Listen von Makrovariablen_global_ alle globalen MVARs_local_ alle lokalen MVARs_user_ alle benutzerdefinierten MVARS

%Symglobl(mvar) [V9]Testet ob MVAR global ist

%Symlocal(mvar) [V9]Testet ob MVAR local ist

%Symexist(mvar) [V9]Testet ob MVAR existiert

Page 22: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

22

Neues Beispiel

Makros die ODS-Kanal öffnen und schließen%OdsOpen%OdsClose

Makrovariablen V

Page 23: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

23

Makrovariablen V

Sonderzeichen in MakrovariablenWerden als Teil der Makro-Sprache interpretiert

Alle OperatorenLeerzeichen, Komma&, %

Müssen maskiert werdenCompile time

Wenn MVAR befüllt oder übergeben wirdExecution time

Wenn MVAR in einem Makro aufgelöst wird

Makrovariablen V

%Str und %NrStr%Bquote und %NrBquote%Superq

NRBedeutet not resolved

BBy itself (für normalerweise paarweise auftretende tokens wie Anführungszeichen oder Klammern)

Page 24: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

24

Makrovariablen V

Alle Funktionen maskierenOperatorenLeerzeichenSemikolonKomma

Sonderzeichen ‘ “ ( )Alle „B“ Funktionen und %superq maskieren automatischBei den anderen muss % vor dem Sonderzeichen stehen

Debugging

Page 25: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

25

Good Programming Practice

Standards schaffen und einhaltenEin Makro je DateiDokumentations-Header und KommentareEinrückung von Blöcken (zwei Zeichen)Namenskonventionen (Variablen, Makronamen,…)Schreibweisen (Groß-/Kleinschreibung)

Modular arbeitenReduktion von KomplexitätModule einzeln testenWeiteres Makro bündelt die Aufrufe

Bad Programming Practice

Makros bei der Definition schachtelnUnperformantUnübersichtlich

MakrovariablenNicht sauber zwischen globalen und lokalen Variablen trennen

Page 26: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

26

Debugging

Das %Put StatementGibt Zeichenkette in LOG aus

%Put mvar = &mvar;%Put mvar = „&mvar“;

Vordefinierte Listen von Makrovariablen_global_ alle globalen MVARs_local_ alle lokalen MVARs_automatic_ alle automatischen MVARs_user_ alle benutzerdefinierten MVARS

Debugging

Globale SAS Optionen[No]mprint

Zeigt den von Makros generierten BASE Code[No]mlogic

Zeigt Programmfluss des Makros[No]symbolgen

Zeigt die aufgelösten Makrovariablen

[No]source und [No]source2

Page 27: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

27

Debugging

Eigene Logging-MechanismenIn externe Datei schreibenEigene Meldungen ausgebenFehlerdatenbank aufbauen

Debugging

Wenn SAS nicht mehr reagiertMakro Compiler hat %Mend nicht gelesen

Aller weiterer Input wird als zum Makro gehörig interpretiert%Mend solange absetzen bis zugehörige Fehlermeldung kommt (s.u.)

Einzelnes Anführungszeichen (o.ä.) ist durchgerutscht*‘; *“;*);*/; %Mend; run;

String solange absetzen, bis zugehörige Fehlermeldung kommt (s.u.)

FehlermeldungERROR: No matching %MACRO statement forthis %MEND statement.

Jetzt ist der Makro Compiler wieder zurückgesetzt

Page 28: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

28

Deployment

Deployment

Autocall FacilityOption sasautossasautos = (fileref <fileref ...> sasautos)Option mautosourceFilename gpMacro "d:\temp";Options sasautos=(gpMacro sasautos);

Page 29: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

29

Deployment

Stored Compiled Macro FacilityOptionen store und source bei Makro-Definition%Macro test / store source des="text";...%End;Option sasmstore = libref setzenOption mstored setzen

Literatur

Offizielle SAS-DokumentationOnline-HilfeOnline-DocDownload von support.sas.com

base_macro_6997.pdf

Online verfügbare TutorienSAS Anwender Handbuch im Netz„googeln“

Page 30: Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr gespeichert zAufruf des Makros zSAS lädt Makro zMakrovariablen werden aufgelöst

30

Literatur

Books By UsersMichele M. BurlewSAS Macro Programming Made EasyArt CarpenterCarpenter's Complete Guide to the SAS MacroLanguage, Second Edition

Fragen ?

Fragen !