2 Folien pro Seite

Werbung
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
Herunterladen