Nicht trivial: Makrovariablen - global oder lokal

Werbung
WEBINAR@LUNCHTIME
NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
EINSTIEGSFRAGE
FRAGE
Antworten
Wie werden die Makrovariablen durch Call Symput erstellt
Global, lokal, teils-teils oder gar nicht?
%macro testfrage;
data _null_;
call symput ('test_1', 'Was bin ich?');
run;
proc sql noprint;
create table new as select name from sashelp.class;
quit;
data _null_;
call symput ('Test_2', 'Global oder Lokal?');
run;
%put _local_ ;
%put _user_ ;
%mend testfrage;
%testfrage
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
P1_Frage.sas
FRAGE
WIE WERDEN DIE MAKROVARIABLEN DURCH CALL
SYMPUT ERSTELLT?
•
Antworten
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
A.
• B.
• C.
• D.
Beide sind global
Beide sind lokal
Teils-teils: Eine global, die andere lokal
Sie werden nicht erstellt, es gibt eine
Fehlermeldung
ERKLÄRUNG ZUR
TESTFRAGE
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
LOGAUSGABE
WARUM DIE UNTERSCHEIDUNG GLOBALE UND LOKALE
SYMBOLTABELLEN
EINFÜHRUNG
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
•
Makrovariablen werden in den Arbeitsspeicher
geschrieben. Sind diese lokal angelegt, werden sie
nach Makroausführung automatisch gelöscht und der
Speicherplatz wieder frei gegeben
•
Globale Makrovariablen sind für Ihre gesamte SAS
Sitzung zur Verfügung
•
Es kann zu unerwünschten Ergebnissen führen, wenn
Sie einen Makrovariablen-Namen sowohl global als
auch lokal anlegen
MAKROVARIABLEN:
GLOBAL VS LOKAL
GLOBALE SYMBOLTABELLEN
•
Die globale Symboltabelle wird
•
beim Start der SAS-Sitzung erzeugt
• mit automatischen Makrovariablen initialisiert
• am Ende der Sitzung gelöscht
Syntax zur
Erstellung der
globalen
Makrovariablen
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
•
Globale Makrovariablen können erstellt werden:
•
mit %LET-Anweisung
• im Data Step mit SYMPUTX-Routine
• in einer PROC-SQL-SELECT-Anweisung mit INTO-Klausel
• mit %GLOBAL-Anweisung
LOKALE SYMBOLTABELLEN
•
Eine lokale Symboltabelle wird angelegt:
•
Syntax zur
Erstellung lokaler
Makrovariablen
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
wenn ein Makro mit Parameterliste aufgerufen wird,
• wenn während der Makroausführung eine Makrovariable
erzeugt wird.
• durch PROC SQL Code!! (SQL benutzt immer die lokale
Symboltabelle)
• Die lokale Symboltabelle wird am Ende der Makroausführung
gelöscht.
•
Lokale Makrovariablen können erstellt werden:

mit %LET-Anweisung

Im Data Step mit SYMPUTX-Routine

in einer PROC-SQL-SELECT-Anweisung mit INTO-Klausel

mit %LOCAL-Anweisung
LOKALE
SYMBOLTABELLE
WIRD IMMER EINE LOKALE SYMBOLTABELLE ERSTELLT?
Nein, nicht, bevor es unbedingt notwendig ist.
Keine der folgenden Bedingungen ist ausreichend,
dass auf jeden Fall eine lokale Symboltabelle erstellt
wird:
• Ein Makro erstellen (Makrodefinition)
• Ausführen eines Makros, das nur globale
Makrovariablen enthält
• CALL Symput(x) ausführen
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
ERZEUGEN EINER
LOKALEN
SYMBOLTABELLE
Frage:
Führen beide %PUT
Anweisungen zu
Ausgaben im Log?
NEIN
%LOCAL-ANWEISUNG
Führen Sie folgendes Programm aus und beachten Sie
die Frage links:
%macro test;
%put _local_;
%local abc;
%put _local_;
%mend test;
%test
P2_local.sas
Die erste %PUT Anweisung erzeugt keine Ausgabe, weil
es noch keine lokale Symboltabelle gibt.
Die zweite %PUT Anweisung ist jedoch erfolgreich, weil
%local abc; eine lokale Symboltabelle erzeugt hat.
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
%LOCAL
ANWEISUNG
%LOCAL ANWEISUNG: FUNKTIONSWEISE
%local mv1;
Wenn die Makrovariable mv1 in der lokalen
Symboltabelle vorhanden ist, dann passiert nichts weiter
Ist sie nicht vorhanden, wird sie mit einem NULL-Wert
angelegt
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
%GLOBAL UND
%LOCAL FÜR
MAKROVARIABLE
MIT GLEICHEM
NAMEN!
Reihenfolge der
Anweisungen ist
entscheidend!
P3_global_vs_local.sas
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
ACHTUNG FALLE!
Was passiert, wenn Sie eine Makrovariable mv_hugo
sowohl mit einer %global als auch %local Anweisung
schreiben?
%macro zuerstglobal;
Kein Problem:
Das Makro erstellt zuerst in
%global mv_hugo;
die globale Symboltabelle
%local mv_hugo;
die Makrovariabel mv_hugo
und dann in die lokale
%mend zuerstglobal;
Symboltabelle
%macro zuerstlokal;
%local mv_hugo1;
%global mv_hugo1;
%mend zuerstlokal;
FEHLER:
Auch wenn kein Fehler
angezeigt wird, es
funktioniert nicht!
Erläuterung: nächste Folie
WARUM
FUNKTIONIERT ES
NICHT, WENN
ZUERST %LOCAL
STEHT?
Merksatz
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
%GLOBAL UND %LOCAL ANWEISUNGEN:
FÜR EINE MAKROVARIABLE MIT GLEICHEM NAMEN
•
Wenn Sie zuerst %local schreiben, dann denkt SAS ,
dass Sie mit der nachfolgenden %global Anweisung,
die Makrovariable in eine globale Symboltabelle
verschieben wollen. SAS „interpretiert“ dies als
Nichtwissen von lokalen und globalen Makrovariablen
und will Sie so vor einem Fehler schützen.
•
Erstellen Sie keine GLOBALE Makrovariable
(%global), wenn es den gleichen Namen schon für
eine lokale Makrovariable gibt!
WÄHREND DER
MAKROAUSFÜHRUNG
So arbeitet der
Makroprozessor
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
VARIABLEN ERZEUGEN UND AKTUALISIEREN MIT %LET
WÄHREND DER
MAKROAUSFÜHRUNG
So arbeitet der
Makroprozessor
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
VARIABLEN AUFLÖSEN MIT &
MAKROVARIABLEN
ERSTELLEN UND
AUSLESEN
MAKROVARIABLEN ERSTELLEN UND AUSLESEN:
Funktioniert das Erstellen und
Auslesen der Makrovariablen immer
nach der gleichen Regel?
Nein.
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
WICHTIGES ZUR
CALL SYMPUT(X)
CALL SYMPUT(X) VERARBEITUNG
•
Bei Call Symput sind 2 Regeln wichtig zu wissen:
•
1. Sucht nach einer bestehenden Makrovariablen, mit
gleichem Namen. Wenn sie existiert, wird diese
benutzt – egal ob lokal oder global.
•
2. Wenn die Zielvariable nicht existiert, wird eine
erstellt, aber es wird keine Symboltabelle erstellt.
Stattdessen wird sie in die nächstverfügbare
(closest existing) Symboltabelle erstellt.
2 wichtige Regeln
für Call Symput(x)
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
CODE-ERKLÄRUNG
CODE DER EINSTIEGSFRAGE
%macro testfrage;
data _null_;
call symput ('test_1','Was bin ich?');
run;
Zu diesem Zeitpunkt existiert
nur die globale Symboltabelle
vom Systemstart, daher wird
test_1 in dieser angelegt.
Call Symput(x) erstellt keine
SYMBOLTABELLE!
proc sql noprint;
create table new as select name from sashelp.class;
quit;
SQL benutzt bzw. erstellt immer
eine LOKALE Symboltabelle
P1_frage.sas
data _null_;
call symput ('Test_2','Global oder Lokal?');
run;
Da durch SQL eine lokale Tabelle nun vorhanden
ist, schreibt Call Symput(x) in die „closest existing“
%put _local_ ;
Symboltabelle: innerhalb eines Makros ist das die
%put _user_ ;
LOKALE Symboltabelle!
%mend testfrage;
%testfrage
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
ERLÄUTERUNGEN
ZU CALL
SYMPUTX
(AB VERSION
SAS 9)
Steuerung der
Makrovariablen zu
GLOBAL bzw.
LOKAL
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
CALL SYMPUTX ROUTINE: OPTIONALE PARAMETER
•
In der CALL SYMPUTX Routine kann als dritter
Parameter mitgegeben werden: F oder L oder G.
Call Symputx(‘Makvarname’, ‘Wert’, ‘L’ ) ;
‘G’
• F: Die Software versucht eine existierende
Makrovariable mit dem entsprechenden Namen zu
finden (wie Call Symput). Standardeinstellung
• G: Keine Suche nach einer existierenden
Makrovariablen. Makrovariable wird in der Globalen
Symboltabelle gespeichert.
• L: Die Software nutzt die am nächsten verfügbare
locale Symboltabelle.
MEHRERE LOKALE
SYMBOLTABELLEN
VERWENDETE SYMBOLTABELLEN FÜR DIE
PROGRAMMAUSFÜHRUNG ZEIGEN: WIE VIELE WEITERE
SYMBOLTABELLEN WERDEN ERSTELLT?
Erste
Symboltabelle:
Global
Jede %LOCAL
Anweisung erzeugt
eine lokale
Symboltabelle
P4_outer_inner.sas
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
VERSCHACHTELTE
MAKROS
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
MEHRERE LOKALE
SYMBOLTABELLEN
Löschreihenfolge
der lokalen
Symboltabellen:
Vom innersten zum
äußersten Makro
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
SYNTAX
Es werden nur die
Werte 0
(nicht vorhanden)
oder
1 (ist vorhanden)
ausgegeben
SO KÖNNEN SIE PRÜFEN, OB DIE MAKROVARIABLEN
VORHANDEN SIND
•
Fügen Sie die %If-Anweisungen in Ihr Makro ein:
•
Auszug aus dem Log
P5_existierenMacVar.sas
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
FRAGE
Syntax
ABSCHLUSSFRAGE
%let x=100;
%macro test;
Proc sql;
Select * from sashelp.class;
Quit;
Data_null_ ;
Call symput (‘x‘ , 200);
Run;
%put _user_ ;
%mend test;
•
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
%test
Wie ist der Wert von
X und in welcher
Tabelle (global oder
lokal)?
A. X= global, 100
B. X= global, 200
C. X=lokal, 100
D.X=lokal, 200
P6_Schlussfrage.sas
FRAGE
ANTWORTEN
•
•
Richtige Antwort
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
Wie ist der Wert von X und in welcher Tabelle (global
oder lokal)?
A. X= global, 100
• B. X= global, 200
• C. X=lokal, 100
• D.X=lokal, 200
FRAGEN?
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
WEBINAR@LUNCHTIME VIELEN DANK FÜR IHRE TEILNAHME
Interesse an weiterem Austausch?
•
Diskutieren Sie mit uns in der XING-Gruppe
Business Analytics mit SAS
•
Sprechen Sie uns direkt an:
[email protected]
Es gibt
neue Zertifizierungspakete Stellen Sie Ihr Wissen unter Beweis!
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
WEBINAR@LUNCHTIME WEITERE INFORMATIONEN UND KURSE ZU DIESEM THEMA…
SAS® Makrosprache 1: Grundlagen
06.02. - 08.02.2017 München
20.02. - 22.02.2017 Heidelberg
06.03. - 08.03.2017 Köln
22.03. - 24.03.2017 Wien
SAS® Makrosprache 2: Praxis für Fortgeschrittene
27.02. - 28.02.2017 Heidelberg
10.04. - 11.04.2017 Heidelberg
Strategien für die Entwicklung von Makro-basierten Anwendungen
27.02. - 01.03.2017 Heidelberg
08.05. - 10.05.2017 Heidelberg
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
NÄCHSTES WEBINAR@LUNCHTIME:
22. FEBRUAR 2017
PERL REGULAR EXPRESSIONS IN BASE SAS
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
FOLIEN ZUM DOWNLOAD UNTER
WWW.SAS.DE/LUNCHTIME
WIE HAT IHNEN UNSER WEBINAR GEFALLEN?
C op yr i g h t © 2 0 1 2 , S A S I n s t i t u t e I n c . A l l r i g h t s r es er v e d .
www.SAS.com
Herunterladen