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:

%macro aussen;  /* Platzhalter für irgendein SSI-DWH-Auswerte-Baustein */
  
%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:

%macro innen(mname=);
  
%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:

%aussen;

ergibt das folgenden LOG

INFO: aussen, Start, SYSMACRONAME=AUSSEN
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

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 SYSMACRONAME nur durchreichen, keinesfalls will ich ihn überschreiben!
Siehe den Aufruf:

%innen(mname=&SYSMACRONAME.);

Der %put davor gibt auch alles korrekt wieder:

INFO: Macro aufruf im Macro aussen: innen(mname=AUSSEN)

Aber leider nur der %put im ä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

%innen(mnane=&SYSMACRONAME.)

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

%innen(mname=&SYSMACRONAME.);

die neue (interne) Zeile

%innen(mname=aussen);

erzeugt werden würde
und diese würde dann weiter bearbeitet, dann wäre es auch kein Problem wenn SYSMACRONAME den 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