Guten Tag Community,
folgendes Programm versucht eine Tabelle in einer Bibliothek abzulegen (1. Zeile des Makros). Jedoch wird der Delimiter "." von &destbib übersehen.
Fügt man vor und nach dem "." je ein Leerzeichen ein, klappts. Warum, verstehe ich nicht? Weiß jemand Rat?
---------------8<---------------
libname daten "K:\Daten\unterjaehrige_QRTs\daten";
%let G_std_lib_daten=daten;
%macro get_and_sort(destbib=&G_std_lib_daten,shortid=);
data &destbib..&shortid;
set dataset;
run;
%mend get_and_sort;
data dataset;
format A_12_1 $5. B_12_3 $5. A_12_3 $5. B_12_1 $5.;
INPUT A_12_1 $ B_12_3 $ A_12_3 $ B_12_1 $;
datalines;
A 5 3 100
A 5 4 110
run;
%get_and_sort(shortid=test);
--------------->8---------------
Der Makroprozessor löst in diesem Beispiel mehrfach Makrovariablen auf. Hier sind die Zwischenergebnisse der einzelnen Verarbeitungsschritte:
&destbib..&shortid;
&G_std_lib_daten.test
datentest
Es wird somit das Dataset work.datentest erzeugt. Die kürzeste Lösung wäre also noch einen weiteren Punkt einzufügen:
data &destbib...&shortid;
Mit dieser Konstellation klappt das Beispiel, allerdings werden Fehler auftreten, wenn in dem Parameter destbib keine Makrovariablen verwendet werden.
Besser wäre daher das Makro so umzubauen:
%global G_std_lib_daten;
%let G_std_lib_daten=daten;
%macro get_and_sort(destbib=,shortid=);
%if (%length(&destbib.) eq 0) %then %do;
%let destbib = &G_std_lib_daten.;
%end;
data &destbib..&shortid;
set dataset;
run;
%mend get_and_sort;
Viele Grüße,
Andreas
Es sieht so aus, als ob auch folgendes möglich ist:
...
%macro get_and_sort(destbib=&G_std_lib_daten.,shortid=);
...
data &destbib..&shortid;
...
Das passiert übrigens nur, wenn man eine Makrovariable als Defaultwert angibt. Ist der Defaultwert ein Literal, passiert es nicht.
Auch wenn man
%get_and_sort(destbib=&G_std_lib_daten,shortid=test);
macht, funktioniert's.
Besten Dank für die schnellen hilfreichen Antworten!
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.