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