Einführung in die SAS Makro Sprache Zur Person z Grischa Pfister z z z iCASUS GmbH Vangerowstraße 2 69115 Heidelberg [email protected] Arbeitsfelder z z z z Anwendungsentwicklung AF, IntrNet, Java Data Warehouse Balanced Scorecard Schulungen im Bereich BASE, AF, Java 1 Ablauf des Tutoriums z Zeitrahmen z z z Ablauf z z z Vortrag Anwendungsbeispiele Fragen z z 09:15 – 12:00 Uhr Pausen und Übungen auf Zuruf Immer und jederzeit Unterlagen z Programme & PPT Agenda z z z z z z z z Einleitung Makrovariablen Makros Makro-Statements Makro-Funktionen Interaktion mit dem Data Step Debugging Deployment 2 Einleitung z Warum eine Makro Sprache? z Vereinfachung des Codes z z z Wiederverwendung z z z Leichtere Pflege Bessere Lesbarkeit Durch Kollegen SAS community Standardisierung z Definierte Analyseverfahren Einleitung z Was sind Makros? z Automatisierte Programme z z z z Parametrisierung Modularisierung Konditionelle Ausführung von Programmteilen Fokus bei Entwicklung liegt auf Effizienz der Programmierung, nicht auf inhaltlicher Fragestellung 3 Einleitung z Wie funktionieren Makros? z Platzhalter-Prinzip z z z z In einem Programm werden Platzhalter referenziert Beim Verarbeiten werden Platzhalter ersetzt Grundprinzip ist die Textersetzung Æ Makros sind Code-Generatoren z Ergebnis ist SAS/BASE Programm (bzw. ein Teil davon) Einleitung z Die SAS Macro Facility besteht aus z Macro Language z Programmiersprache in SAS/BASE z z z z z Macro Processor z z Variablen Statements Makro-Funktionen Globale Optionen Interpreter Standards für die Bereitstellung 4 Vom Programm zum Makro Vom Programm zum Makro z Wie werden Makros entwickelt? z z z z SAS/BASE Programm schreiben Allgemein verwendbare Teile identifizieren (modularisieren) Variable Teile identifizieren Programm in ein Makro übersetzen 5 Vom Programm zum Makro z Beispiel z Proc Print data=Sashelp.Class; Run; Wie SAS ein Makro verarbeitet 6 Wie SAS ein Makro verarbeitet z Kompilierungsphase z z z z SAS verarbeitet Code Wenn Fehler auftritt Æ Fehlermeldung od. dummy macro Kompiliertes Makro in Work.Sasmacr gespeichert Aufruf des Makros z z z z SAS lädt Makro Makrovariablen werden aufgelöst Logik des Makros wird verarbeitet Resultierendes BASE-Programm wird von SAS abgearbeitet Wie SAS ein Makro verarbeitet 1. 2. 3. 4. 5. 6. 7. Word Scanner ließt token aus Input Stack Word Scanner erkennt Makro-Trigger [%,&] Kompiliertes Makro wird geöffnet Lokale Symbol-Tabelle wird angelegt Wert für Table wird gespeichert Makro Processor ließt Tokens aus kompiliertem Makro und schreibt Ergebnis in Input Stack zurück Word Scanner ließt token aus Input Stack Compiler Macro Processor Symbol Table(s) Word Scanner Input Stack %PrintTable(Sashelp.Class) Kompiliertes Makro %Macro PrintTable(table); Proc Print data=&table; Run; %Mend; 7 Makro-Statements I Makro-Statements I z Makro Definition z %Macro Name; ... %Mend <Name>; z Positional Parameter z z %Macro Name(parameter1<, parameter2, ...>) Keyword Parameter z %Macro Name(para=defaultwert<, para=defaultwert, ...>) 8 Makro-Statements I z %Let-Statement z z z Legt eine MVAR an Ordnet MVAR einen Wert zu %Let %Let %Let %Let x = 5; text = Dies ist ein Text; x = Variable Y hat den Wert "&text"; z =; Makro-Statements I z Kommentare z %* Makro-Kommentar-Text ; z z Kommentar bis zum nächsten Semikolon Abschalten einer Zeile / eines Statements z /* Normaler Kommentar-Text kommentiert auch enthaltene MakroAufrufe und Makrovariablen */ z * BASE-Kommentar-Text ; z z z Makro-Aufrufe, -Statements sind nicht auskommentiert! Problem wenn vor %Else Vorteil: werden in LOG ausgegeben wenn Option MPRINT gesetzt ist 9 Makrovariablen I Makrovariablen I z Automatische MVARs z z Dictionary.Macros / Sashelp.Vmacro MVARs besitzen scope: z z Automatic / global / local Benutzerdefinierte MVARs z z z z Als Parameter bei Makro-Aufruf Definiert mit %Let-Statement %Let mvar = wert; Auflösung nur in „…“, nicht ‚…‘ Fehlermeldung wenn nicht deklariert 10 Vom Programm zum Makro z Bestehendes Programm erweitern z Globaler Schalter für Ausgabe in HTML z z z Überprüfung ob Variable existiert Abbruch wenn nicht Wenn gesetzt ODS Statements erzeugen Makrovariablen II 11 Makrovariablen II z Definition z z z %Let mvar = wert; Überprüfen der Existenz z %Symexist(mvar) [ab V9] z Dictionary.Macros (für globale mvars) Löschen [ab V8] z z %Symdel mvar <mvar ...>; [Call Symdel("mvar <mvar ...>");] Makrovariablen II z SQL z Nach SQL-Step werden automatisch globale MVARs gesetzt z z z z Anzahl der gefundenen Sätze Return Code des Steps Anzahl der Schleifenläufe Nachzulesen in z z z SQLOBS SQLRC SQLOOPS SQL: Dictionary.Macros Sashelp.Vmacro Scope z Automatic / global / local 12 Makro-Statements II Makro-Statements II z Ablaufsteuerung z Verzweigung mit z z z z Sprungmarken z z %If - %Then - %Else %Do ... %End Analog zum Data Step %Goto label; … %label: <macro statement>; Abbruch des Makros z z z %Return; [ab V9] %Goto %Abort (setzt Fehlercode) 13 Makro-Statements II z Schleifen z z z %Do %While ( bedingung ); ... %End; %Do %Until ( bedingung ); ... %End; %Do i=1 %To n <%By step>; … %End; z z z i wird automatisch als MVAR angelegt (!) Impliziter Aufruf von %Eval Es gibt keine LEAVE Anweisung z Æ vorzeitiges Verlassen der Schleife nur mit %Goto Makro Statements II z Operatoren z z Teilmenge der SAS/BASE Operatoren Arithmetisch z z z Logisch z z z ^, &, | NOT, AND, OR Nicht z z **, +, -, *, /, <, > <=, >=, =, ^= LT, LE, EQ, NE, GT, GE Min, max, : Auswertung arithmetischer Ausdrücke z Erfolgt ganzzahlig! 14 Makro-Statements II z %Put-Statement z z z Schreibt Text in das LOG-Fenster Fehlersuche bei Entwicklung Kontrollierte (Fehler-)Meldungen Neues Beispiel z Für alle Tabellen einer Library z Variablenliste ausgeben z z z Proc Contents Ods Select Schleife über alle Tabellen z z Woher kommen die Namen der Tabellen? Wieviele Tabellen gibt es? 15 Makro-Funktionen I Makro-Funktionen I z %Let mvar = %Funktion(para1<,para2,…>); z Alphanumerisch z z z z z z %Index(mvar,text) %Length(mvar) %Scan(mvar,n<,delimiter>) %Substr(mvar,start<,end>) %Upcase(mvar) … 16 Makro-Funktionen I z Numerisch z Bei Statements implizite Konvertierung Grundsätzlich ganzzahlig [-264 - 1,264 - 1] %Eval( ausdruck ) %Sysevalf( ausdruck ) für Fließkommadarstellung z Ergebnis ist aber immer eine Zeichenkette! z z z z Schnittstelle zu allen Data-Step Funktionen z %Sysfunc() Makro-Funktionen I z Eigene Makro-Funktionen z Makro mit Rückgabewert z %Macro name; ... &mvar %Mend; z Darf nur Makro-Statements enthalten SAS Autocall Macros z.B. %Left z 17 Zurück zum Beispiel z Die elegante Variante z Tabellen-Namen und -Anzahl aus Steuerdatei lesen z z Per SQL Mit Hilfe des Data Step Makrovariablen III 18 Makrovariablen aus SQL erstellen z Select Into :mvar Separated By „ “ z z z Mvar SQLOBS z z Erzeugt Liste aller Werte Trennzeichen frei vergebbar Enthält Anzahl der gefundenen Sätze Æ Makro-Schleife über &sqlObs, mit %Scan den jeweiligen Wert lesen Makrovariablen dem Data Step erstellen z End = eof setzen z z Call Symput(„mvar“,“wert“); z z Um am Ende Anzahl der Sätze zu schreiben Für jeden gelesenen Wert wird eine Variable erstellt Æ Makro-Schleife über die Anzahl Sätze z z Auflösung der Makrovariable erfolgt von links nach rechts &&table&i z z Nach erster Auflösung Æ &table1 Nach zweiter Auflösung Æ Class 19 Makrovariablen IV Makrovariablen IV z Scope von Variablen z z Im Open Code immer Global Schachtel-Prinzip z z Jedes Makro hat lokale Symbol-Tabelle Jedes Makro kann die Symbol-Tabelle der umgebenden Makros sehen (und schreiben) %Let faktor = 5; %Macro a(para1); Global faktor = 5 %Let para2 = %Eval(&para1 * &faktor); %b(&para2); Makro a %Mend; para1 = 11 %Macro b(para1); para2 = 55 %Put in B: para1 = &para1; %Mend; Makro b para1 = 55 %a(11); 20 Makrovariablen IV z Probleme mit nicht explizit deklarierten MVARs z SAS durchsucht alle umgebenden Symbol-Tabellen z z Wenn MVAR vorhanden wird dort ersetzt (z.B. Schleifenzähler &i !!) Gleichnamige Variablen müssen mit explizit definiert werden z z Als Übergabeparameter %Local-Statement z Wenn in globale MVAR geschrieben werden soll z Wenn in die existierende MVAR aus einem umgebenden Makro geschrieben werden soll z z z %Global-Statement Weder %Local noch %Global Sonderfall Call Symput() Makrovariablen IV z Bei Unsicherheit z Das %Put Statement z Vordefinierte Listen von Makrovariablen z z z _global_ _local_ _user_ z %Symglobl(mvar) [V9] z %Symlocal(mvar) [V9] z %Symexist(mvar) [V9] z z z alle globalen MVARs alle lokalen MVARs alle benutzerdefinierten MVARS Testet ob MVAR global ist Testet ob MVAR local ist Testet ob MVAR existiert 21 Neues Beispiel z Makros die ODS-Kanal öffnen und schließen z z %OdsOpen %OdsClose Makrovariablen V 22 Makrovariablen V z Sonderzeichen in Makrovariablen z Werden als Teil der Makro-Sprache interpretiert z z z Alle Operatoren Leerzeichen, Komma &, % z Müssen maskiert werden Compile time z Execution time z z z Wenn MVAR befüllt oder übergeben wird Wenn MVAR in einem Makro aufgelöst wird Makrovariablen V z %Str und %NrStr z %Bquote und %NrBquote z %Superq z z NR z Bedeutet not resolved z By itself (für normalerweise paarweise auftretende tokens wie Anführungszeichen oder Klammern) B 23 Makrovariablen V z Alle Funktionen maskieren z z z z z Operatoren Leerzeichen Semikolon Komma Sonderzeichen ‘ “ ( ) z z Alle „B“ Funktionen und %superq maskieren automatisch Bei den anderen muss % vor dem Sonderzeichen stehen Debugging 24 Good Programming Practice z Standards schaffen und einhalten z z z z z z Ein Makro je Datei Dokumentations-Header und Kommentare Einrückung von Blöcken (zwei Zeichen) Namenskonventionen (Variablen, Makronamen,…) Schreibweisen (Groß-/Kleinschreibung) Modular arbeiten z z z Reduktion von Komplexität Module einzeln testen Weiteres Makro bündelt die Aufrufe Bad Programming Practice z Makros bei der Definition schachteln z z z Unperformant Unübersichtlich Makrovariablen z Nicht sauber zwischen globalen und lokalen Variablen trennen 25 Debugging z Das %Put Statement z Gibt Zeichenkette in LOG aus z z z %Put mvar = &mvar; %Put mvar = „&mvar“; Vordefinierte Listen von Makrovariablen z z z z _global_ _local_ _automatic_ _user_ alle globalen MVARs alle lokalen MVARs alle automatischen MVARs alle benutzerdefinierten MVARS Debugging z Globale SAS Optionen z [No]mprint z [No]mlogic z z z Zeigt Programmfluss des Makros [No]symbolgen z z Zeigt den von Makros generierten BASE Code Zeigt die aufgelösten Makrovariablen [No]source und [No]source2 26 Debugging z Eigene Logging-Mechanismen z z z In externe Datei schreiben Eigene Meldungen ausgeben Fehlerdatenbank aufbauen Debugging z Wenn SAS nicht mehr reagiert z Makro Compiler hat %Mend nicht gelesen z z z Einzelnes Anführungszeichen (o.ä.) ist durchgerutscht z z z Æ Aller weiterer Input wird als zum Makro gehörig interpretiert %Mend solange absetzen bis zugehörige Fehlermeldung kommt (s.u.) *‘; *“;*);*/; %Mend; run; Æ String solange absetzen, bis zugehörige Fehlermeldung kommt (s.u.) Fehlermeldung z ERROR: No matching %MACRO statement for this %MEND statement. z Æ Jetzt ist der Makro Compiler wieder zurückgesetzt 27 Deployment Deployment z Autocall Facility z z z Option sasautos sasautos = (fileref <fileref ...> sasautos) Option mautosource Filename gpMacro "d:\temp"; Options sasautos=(gpMacro sasautos); 28 Deployment z Stored Compiled Macro Facility z Optionen store und source bei Makro-Definition %Macro test / store source des="text"; ... %End; z Option sasmstore = libref setzen Option mstored setzen z Literatur z Offizielle SAS-Dokumentation z z z Online-Hilfe Online-Doc Download von support.sas.com z z base_macro_6997.pdf Online verfügbare Tutorien z z SAS Anwender Handbuch im Netz „googeln“ 29 Literatur z Books By Users z z Michele M. Burlew SAS Macro Programming Made Easy Art Carpenter Carpenter's Complete Guide to the SAS Macro Language, Second Edition Fragen ? Fragen ! 30