Probleme mit Macro-Variable SYSMACRONAME
Hallo Forum,
eben wollte ich (in SAS-V82) die automatische System-Macro-Variable SYSVARNAME verwenden und wurde herb enttäuscht, denn sie hält nicht das was man sie verspricht.
Hintergrund:
Ich will den Namen des "äusseren" Macros (ein SSI-DWH-Auswerte-Baustein) nach "innen" durchreichen, damit dieser Aufruf des Auswerte-Bausteins in einer Log-Datei protokolliert wird.
Damit der Aufruf des Log-Protokoll-Bausteins (hier mal "innen" genannt) schön per Copy+Paste 1000-fach eingefügt werden kann, wollte ich in dem Aufruf des innen-Bausteins den SYSMACRONAME verwenden, also so:
%put INFO: aussen, Start, SYSMACRONAME=&SYSMACRONAME.;
%put INFO: Macro aufruf im Macro aussen: innen(mname=&SYSMACRONAME.);
%innen(mname=&SYSMACRONAME.);
%put INFO: aussen, Ende;
%mend aussen;
Der Log-Protokoll-Bausteins (hier mal "innen" genannt) sieht z.B. so aus:
%put INFO: innen, Start, SYSMACRONAME=&SYSMACRONAME.;
%put INFO: innen, mname=&mname. (Fehler! Hier MUSS 'aussen' ausgegeben werden!!);
%put INFO: innen, Ende;
%mend innen;
Wenn man den Auswerte-Baustein aufruft:
ergibt das folgenden LOG
INFO: Macro aufruf im Macro aussen: innen(mname=AUSSEN)
INFO: innen, Start, SYSMACRONAME=INNEN
INFO: innen, mname=INNEN (Fehler! Hier MUSS 'aussen' ausgegeben werden!!)
INFO: innen, Ende
MPRINT(AUSSEN): ;
INFO: aussen, Ende
Ich habe die SAS HotLine auch schon auf das Problem "gehetzt", aber ich fürchte von da kommt keine Lösung bzw. keine Erklärung ...
Hat jemand aus dem Forum ähnliche/gleiche Probleme mit SYSMACRONAME???
Gibt es eine einleuchtende/logische Erklärung für obiges (fehlerhaftes) Verhalten???
Oder habe ich einen (Denk-) Fehler gemacht???
Gruß
Hans Kneilmann, Schäfer Shop
- Anmelden oder Registrieren um Kommentare zu schreiben

SYSMACRONAME
Hallo Herr Kneilmann,
die Macorvariable SYSMACRONAME ist laut Doku eine automatische Macrovariable, die read-only ist. Zumindest steht das so in der Online-Doc von SAS 9. Ich vermute, dass das unter SAS 8 auch schon so war. Demnach zeigt diese Variable immer den Inhalt des momentan "laufenden" Macros an, ohne verändert werden zu können.
Gruß
Wolfgang Hornung
Mißverständnis?
Hallo Herr Hornung,
ich glaube da ist ein Mißverständnis.
Ich will den
SYSMACRONAMEnur durchreichen, keinesfalls will ich ihn überschreiben!Siehe den Aufruf:
Der
%putdavor gibt auch alles korrekt wieder:Aber leider nur der
%putim äusseren Macro.Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
Nette Sache
Hi,
ich tippe mal auf folgendes:
a.) es gibt natürlich nur eine Instanz von SYSMACRONAME und die enthält immer das aktuell bearbeitete Macro.
b.) ich führe im Marco %aussen die Zeile
aus.
Mit dem Erreichen von %innen wechselt der Macrointerpreter zu %innen. Dabei werden natürlich alles Systemvariablen neu gesetzt.
Lösung: den Inhalt von &SYSMACRONAME in einer andern Variablen speichern und dann %innen mit dieser Varibale aufrufen. Dann geht es.
Gruß Guido
Super Idee, es klappt!
Hallo Guido,
die Idee ist super! Es klappt so. Ist zwar im Code etwas unhandlich (ist eine Zeile mehr beim copy+paste +paste +paste +....), aber damit kann ich leben. Hauptsache die "vergessen anzupasen"-Falle ist weg!
Von dem SAS-Macrointerpreter bin ich enttäuscht (damit kann wiederum SAS gut leben), denn ich dachte, es wäre logisch, dass zuerst im Aufruf die Variablen-Substitution erfolgen würde, also das aus
die neue (interne) Zeile
erzeugt werden würde
und diese würde dann weiter bearbeitet, dann wäre es auch kein Problem wenn
SYSMACRONAMEden neuen Wert "innen" annehmen würde ...Ist aber scheinbar nicht so. Ist für mich unlogisch, aber es ist halt so, kann man nix machen.
Danke für's mitdenken!!!!!
Gruß Hans