Upload
lethien
View
227
Download
0
Embed Size (px)
Citation preview
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
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(¶1 * &faktor);
%b(¶2);
%Mend;
%Macro b(para1);
%Put in B: para1 = ¶1;
%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 !