Einführung in die SAS Makro Sprache - public.urz.uni ... · zKompiliertes Makro in Work.Sasmacr...

Preview:

Citation preview

1

Einführung in die SAS Makro Sprache

Zur Person

Grischa PfisteriCASUS GmbHVangerowstraße 269115 Heidelbergg.pfister@icasus.de

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

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

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

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

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

6

Vom Programm zum Makro

BeispielProc Print data=Sashelp.Class;Run;

Wie SAS ein Makro verarbeitet

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;

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

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

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

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

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

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)

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!

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?

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)…

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

18

Zurück zum Beispiel

Die elegante VarianteTabellen-Namen und -Anzahl aus Steuerdatei lesen

Per SQLMit Hilfe des Data Step

Makrovariablen III

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

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

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

22

Neues Beispiel

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

Makrovariablen V

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)

24

Makrovariablen V

Alle Funktionen maskierenOperatorenLeerzeichenSemikolonKomma

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

Debugging

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

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

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

28

Deployment

Deployment

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

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“

30

Literatur

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

Fragen ?

Fragen !

Recommended