SAS SubmitのDeclareMacrosオプション:正しく転送できませんか?こんにちは、私はSAS SubmitのDeclareMacrosオプションを適用しようとしています。SASジョブでマクロへの変数値の転送を許可することになっています。私はこの小さな断片を作成しました(それは実行されますが失敗します):
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ログは言う:
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.
そしてデータセットテストは以下を含みます。

私は見ていない、私が間違っていること。
宜しくお願いします
ポール・ラヴン・ソレンセン
再:SASのDeclareMacrosオプション送信:正しく転送に失敗した?マクロ変数を間違って使用しています。
データステップの代入の右側でそれらを使用したい場合は、それらを引用符で囲む必要があります。
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));
チェックマクロ変数の使用詳細については。
再:SASのDeclareMacrosオプション送信:正しく転送に失敗した?こんにちは、ジェフが提案したことはまた働きます。ありがとう。
私はまだ日時変数を使って取り組んでいます。コードを見てください。質問:d_numにdatetime変数の値を代入するにはどうすればいいですか?(少々並べ替えますが、それでも同じコードです。SASmitステートメントの前に送信文字列だけが作成されます)
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));
敬具ポールRS
再:SASのDeclareMacrosオプション送信:正しく転送に失敗した?SASマクロ変数とその解決方法を扱うことは、特に引用符が含まれているマクロ変数を引用することに関しては、混乱を招く可能性があります。SASのドキュメントには以下のセクションがあります。マクロ引用 。
このトピックについて私があなたを始めてうまくいく何かを与えるのに十分知っているが、すべての詳細を説明するのに十分ではないということから始めましょう。あなたはおそらく頻繁に始めるべきです SASプログラミングボードイン SASサポートコミュニティより徹底的な説明とアンダーサンディングを得るために。
SASだけで何が必要なのかを理解してから、JSLでそれをSASに渡す方法を理解するのが最善です。
これがあなたがやろうとしていることのSAS構文です。
%let a = test1;
%let b = test2;
%let c = '15may2019 00:00'dt;
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
&aと&bは二重引用符で囲む必要があることに注意してください(マクロ変数は二重引用符でのみ解決されます)ので、それらの値を文字列リテラルとして使用し、それらの値に引用符は入れません。
一方、datetimeの値は一重引用符と dt 日時定数であることを示します。そのマクロ値にはすでに単一引用符が含まれているので、代入の右側に引用符を入れる必要はありません。
これまでのところ、とても良い、しかししわがあります。JSL変数の値をマクロ変数に変換するために、JMPは %NRBQUOTE それらを定義する関数 SAS Submit(...、Declare Macros(...))からのSASログを見ると:
103 %let a=%NRBQUOTE(test1);
104 %let b=%NRBQUOTE(test2);
105 %let c=%NRBQUOTE('15may2019 00:00'dt);
これは、JMPがJSL変数に特殊文字が含まれているかどうかを認識していないためです( '"()+ - * / <> =¬^〜;、#空白、または等しくないかどうか SASでマスクする必要があります。
SASで同じことをして、このコードを送信すると:
%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;
SAS Logでこれを確認します。
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.
[これが私の理解が崩れるところです。教えられるよ何あなたは、隠された文字でマクロ変数を使うためにする必要がありますなぜあなたはそれをする必要があります。繰り返しますが、 SASプログラミングより多くの情報を得るためにボード。
そのため、SASマクロ変数は%NRBQUOTE関数を使用してJMPによって定義されているため、単一引用符をマスクしたくないため、それらを取得するには%UNQUOTE関数を使用する必要があります。
つまり、JSLでは次のようになります。
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 ) );
他の人たちは、あなたがこの問題についてあなたの探求と使い方の中でさらに学ぶことを知りたいと思うかもしれません。 SASサポートコミュニティ 。だから、あなたが役に立つと思うディスカッションスレッドへのリンクを投稿してください。
再:SASのDeclareMacrosオプション送信:正しく転送に失敗した?JSLの 'Eval Insert'を使用して代替ソリューションを説明し提供してくれてありがとう。私の目的のためには、後者の解決策を使用すれば十分であろうと思います。私が達成したいのは、いくつかのユーザー選択をSASコードに移すことだけであるからです。そして、DeclareMacros呼び出しはまったく必要ありません。それなしでもうまくいきます。
宜しくお願いします
ポール・ラヴン・ソレンセン
再:SASのDeclareMacrosオプション送信:正しく転送に失敗した?あなたが投稿した例は、SAS側のマクロ変数の力を実際に必要としないということも指摘しておくべきです。というよりは評価挿入() あなたの実際のケースが同様に単純であるなら、あなたのSAS_sbmt_strを構築することは役に立つかもしれません。
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 ) );