2

SAS でファイルをエクスポートしようとしましたが、「Open コード ステートメントの再帰が検出されました」というメッセージが表示されます。エラー。プロンプトの日付に基づいてマクロ変数として定義した日付に応じて複数のファイルをエクスポートするため、この変数でエクスポートするファイルに名前を付けたいのですが、機能しません。誰かが私を助けてくれれば、本当に感謝しています。

rep_date = 30APR2015:00:00:00
 Outfile = work.A042015.sas7

%let var = CATS("A",MONTH(DATEPART(&rep_date)),YEAR(DATEPART(&rep_date)));
data WORK.&var(compress=yes); 
set WORK.have;
run; 
4

2 に答える 2

2

より広範な問題として、OPEN STATEMENT RECURSION DETECTEDマクロ変数をそれ自体に割り当てる場合を指します。

%let &mvar = &mvar;

もちろん、これは通常、意図的に行われるわけではありません (と思う人もいるでしょう)。そうなった場合、通常は 2 つのクラスの間違いのいずれかの兆候です。

  1. %letセミコロン、終了括弧、終了引用符、またはステートメントの末尾にあるセミコロンが SAS で認識されない原因となるその他のものが欠落しています。次に、次のステートメントがマクロ コンテキストでマクロ変数を使用すると、SAS はそれを%letステートメントの一部として認識し、このエラー メッセージが表示されます。
  2. 何かがどこかで間違ってて、その何かが意味をなさないエラーをさらに下に伝播するという問題があります。一致しない引用符を持つことは、この典型的な例です%mend

1 は、次のような単純なケースで発生する可能性があります。

%let mvar=mydataset
%put &mvar;

おっとっと。それほど単純な場合は、セミコロンをオンにするだけで問題ありません。ただし、括弧や引用符の不一致など、より重要な原因が原因である可能性があります。この場合、SAS セッションの再起動が必要になる場合があります。magic string( のバリエーションである を送信すると%*;*;*';*";%*%mend;*);、問題が解決する場合もありますが、そうでない場合もあります。SAS を再起動することは、それを解決するための信頼できる方法です)。

上記の 2 についても同様です。マジック ストリングで問題が解決しない場合は、単に SAS セッションを再起動する必要があるかもしれません。もちろん、一致しない引用符/括弧/などを見つける必要がありますが、最初にSASを最初からやり直して、それを理解できるようにする必要があります.

于 2015-11-02T16:16:34.340 に答える
2

マクロ変数は単なる文字列です。したがって、マクロ コードで関数を実行する場合は、関数を %SYSFUNC() マクロ関数内にラップする必要があります。

%let rep_date='01JAN2015:01:23'dt ;
%let dsname = A%sysfunc(datepart(&rep_date),monyy6);
data &dsname(compress=yes);
  set have;
run;
于 2015-11-02T12:38:34.007 に答える