Hallo, ich versuche, die DeclareMacros-Option von SAS Submit anzuwenden. Es soll die Übertragung von Variablenwerten an Makros im SAS-Job ermöglichen. Ich habe diesen winzigen Ausschnitt gemacht (er wird zwar ausgeführt, schlägt aber fehl):
a = "test1";
b = "test2";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS Submit("
data test;
x = &a;
y = &b;
run;
",
declaremacros(a,b),GetSASLog(true));
SAS-Protokoll sagt:
768 %let a=%NRBQUOTE(test1);
769 %let b=%NRBQUOTE(test2);
770
771 data test;
772 x = &a;
773 y = &b;
774 run;
NOTE: Variable test1 is uninitialized.
NOTE: Variable test2 is uninitialized.
NOTE: The data set WORK.TEST has 1 observations and 4 variables.
und der Datensatztest enthält:

Ich verstehe nicht, was ich falsch mache.
Freundliche Grüße
Poul Ravn Sørensen
Sie verwenden die Makrovariablen falsch.
Wenn Sie sie auf der rechten Seite einer Zuordnung im Datenschritt verwenden möchten, müssen Sie sie zitieren.
a = "test1";
b = "test2";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS Submit("
data test;
x = \!"&a\!";
y = \!"&b\!";
run;
proc print;
run;
",
declaremacros(a,b),GetSASLog(true));
Prüfen Makrovariablen verwenden für mehr Informationen.
Hallo nochmal, was Jeff vorgeschlagen hat funktioniert. Vielen Dank.
Ich bin immer noch Auseinandersetzung mit Datum / Uhrzeit-Variablen. Siehe Code. Die Frage ist: Wie bekomme ich d_num den Wert der datetime Variable zugewiesen? (Führen Sie eine Neuanpassung durch, aber es handelt sich immer noch um denselben Code. Nur die Übermittlungszeichenfolge wird vor der SAS-Übermittlungsanweisung erstellt.)
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS_sbmt_str =
"data test;
x = \!"&a\!";
y = \!"&b\!";
d = \!"&c\!";
d_num = ???;
run;
proc print; run;";
SAS Submit(SAS_sbmt_str, declaremacros(a,b,c),GetSASLog(true));
Viele Grüße Poul RS
Der Umgang mit SAS-Makrovariablen und deren Auflösung kann verwirrend sein, insbesondere wenn es darum geht, Makrovariablen mit Anführungszeichen zu zitieren. Es gibt einen ganzen Abschnitt der SAS-Dokumentation Macro Quoting .
Lassen Sie mich zunächst sagen, dass ich genug über dieses Thema weiß, um Ihnen den Einstieg zu erleichtern und Ihnen etwas zu geben, das funktioniert, aber nicht genug, um alle Details zu erklären. Du solltest wahrscheinlich anfangen, das zu besuchen SAS-Programmierung Verpflegung in der SAS-Support-Communities um eine gründlichere Erklärung und Erklärung zu bekommen.
Am besten finden Sie heraus, was Sie allein in SAS benötigen und wie Sie JSL dazu bringen, dies an SAS weiterzugeben.
Hier ist die SAS-Syntax für das, was Sie versuchen, zu tun.
%let a = test1;
%let b = test2;
%let c = '15may2019 00:00'dt;
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
Beachten Sie, dass & a und & b in doppelten Anführungszeichen stehen müssen (Makrovariablen werden nur in doppelten Anführungszeichen aufgelöst), da Sie ihre Werte als Zeichenfolgenliterale verwenden möchten und ihre Werte keine Anführungszeichen enthalten.
Auf der anderen Seite haben Sie Ihren Datums- / Uhrzeitwert als Datums- / Uhrzeitkonstante mit einfachen Anführungszeichen und angegeben dt um anzuzeigen, dass es sich um eine Datums- / Uhrzeitkonstante handelt. Da dieser Makro-Wert bereits einfache Anführungszeichen enthält, müssen Sie ihn nicht auf der rechten Seite einer Zuweisung in Anführungszeichen setzen.
So weit, so gut, aber es gibt eine Falte. Um den Wert Ihrer JSL-Variablen in Makrovariablen umzuwandeln, verwendet JMP die % NRBQUOTE Funktion, um sie zu definieren. Wenn Sie sich das SAS-Protokoll von einem SAS-Submit (..., Declare Macros (...)) ansehen, sehen Sie Folgendes:
103 %let a=%NRBQUOTE(test1);
104 %let b=%NRBQUOTE(test2);
105 %let c=%NRBQUOTE('15may2019 00:00'dt);
Dies liegt daran, dass JMP nicht weiß, ob Ihre JSL-Variable eines der Sonderzeichen enthält ( '"() + - * / <> = ¬ ^ ~;, # leer UND ODER NICHT EQ NE LE LT GE GT IN ), die in SAS maskiert werden müssen.
Wenn wir dasselbe in SAS tun und diesen Code übermitteln:
%let a=%NRBQUOTE(test1);
%let b=%NRBQUOTE(test2);
%let c=%NRBQUOTE('15may2019 00:00'dt);
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
Wir werden dies im SAS-Protokoll sehen:
150 %let a=%NRBQUOTE(test1);
151 %let b=%NRBQUOTE(test2);
152 %let c=%NRBQUOTE('15may2019 00:00'dt);
153
154 data test;
155 x = "&a";
156 y = "&b";
157 d = &c;
NOTE: Line generated by the macro variable "C".
157 '15may2019 00:00'dt
_
386
_
76
ERROR 386-185: Expecting an arithmetic expression.
ERROR 76-322: Syntax error, statement will be ignored.
158 run;
NOTE: The SAS System stopped processing this step because of errors.
[Dies ist der Punkt, an dem mein Verständnis zusammenbricht. Ich kann es dir sagen Was Sie müssen tun, um eine Makrovariable mit maskierten Zeichen, aber nicht mehr zu verwenden Warum das musst du machen. Gehen Sie noch einmal zum SAS-Programmierung Board, um weitere Informationen zu erhalten.]
Da die SAS-Makrovariable von JMP mit der Funktion% NRBQUOTE definiert wird und die einzelnen Anführungszeichen nicht maskiert werden sollen, müssen Sie die Funktion% UNQUOTE verwenden, um sie abzurufen.
In JSL sieht das also so aus:
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
SAS_sbmt_str =
"data test;
x = \!"&a\!";
y = \!"&b\!";
d = %UNQUOTE(&c);
run;
proc print; run;";
SAS Submit( SAS_sbmt_str, declaremacros( a, b, c ), GetSASLog( true ) );
Andere möchten vielleicht wissen, was Sie über dieses Problem bei Ihrer Erkundung und Verwendung von erfahren SAS-Support-Communities . Veröffentlichen Sie also Links zu Diskussions-Threads, die Sie nützlich finden.
Vielen Dank für die Erklärung und Bereitstellung einer alternativen Lösung mit 'Eval Insert' von JSL. Ich denke für meinen Zweck, dass es ausreichen wird, die letztere Lösung zu verwenden, da alles, was ich erreichen möchte, darin besteht, einige Benutzeroptionen in den SAS-Code zu übertragen. Und man braucht den DeclareMacros-Aufruf überhaupt nicht. Ohne das geht es nicht.
Freundliche Grüße
Poul Ravn Sørensen
Ich sollte auch darauf hinweisen, dass die Beispiele, die Sie veröffentlicht haben, nicht wirklich die Leistung von Makrovariablen auf der SAS-Seite benötigen. Eher mit Eval Insert () Das Erstellen Ihrer SAS_sbmt_str kann nützlich sein, wenn Ihr tatsächlicher Fall ähnlich einfach ist.
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
SAS_sbmt_str = Eval Insert( "data test;
x = '^a^';
y = '^b^';
d = ^c^;
run;
proc print; run;" );
SAS Submit( SAS_sbmt_str, GetSASLog( true ) );