-2

SAS 9.1.3 で AIX 6.1 を使用し
ています PC SAS 9.1 でプログラムを実行しています
プログラムは unix に再送信されます。
ここで、プログラムを完全に AIX 6.1 で実行できるように変換します
。プログラムは非常に奇妙に失敗します。
調査の結果、%sysrput が原因であることがわかりまし
た。プログラムの簡略版を以下に示します。

options mPrint mLogic symbolGen ; 
%macro combine( startdate= , fullprefix= );
  data _null_ ;   
       call symput( 'plength',compress(length(compress("&fullprefix."))));
  run;  
  data _null_ ;   
       length balance 8. ;  
              balance= 1 + &plength.; 
  run;  
%mEnd;  
data _null_ ;
     call symput( 'refdate', put(today(),date9.));   
run;
%put &refdate.;   
* -- If I forget to comment out the sysrput, the plength cannot be resolved -- ;
%sysrput refdate=&refdate.; 
%put &refdate.;   
%combine( startdate= "&refdate."d, fullprefix=a_filename_prefix );   

(言い回しが意味をなさず申し訳ありません。デモを行いたいだけです。)

実際、AIX では %sysrput
を使用しないでください。コメントアウトするのを忘れているだけです。
しかし、これを忘れるとbalance=文のplengthマクロ変数にエラーが発生します。これは非常に奇妙です。

解決するには、%sysrput をコメントアウトするだけで問題ありません。

しかし、 %sysrput がマクロ内のマクロ変数で失敗する理由を知っている人はいますか?

アルヴィン・シウ

4

2 に答える 2

3

質問の簡略化されたバージョンからはわかりにくいですが、マクロの実行後にマクロ変数が存在しない理由を尋ねている場合は、マクロコード自体でグローバルplengthとして定義する必要があるためです。言い換えると:

%macro combine( startdate= , fullprefix= );
%global plength;
...
%mend;

%SYSRPUTSAS/CONNECT の制御下にない SAS セッションからコマンドを使用すると、SAS ERROR が発生します。また、SAS エラーが発生すると、非対話型セッションが「構文チェック」モードになり、プログラム内の残りのステートメントが完全に実行されなくなります。

この最後のビットは、コードを SAS/CONNECT 環境から「単純な古い SAS」に変換する際によくある誤解です。SAS/CONNECT を使用する場合、接続の「サーバー」側は「-NOSYNTAXCHECK」オプションで開始されます。

于 2012-10-30T17:29:32.480 に答える
-1

いくつかの小さなテストで調査した後。多分これが答えです。

実際には、すべてのバッチ SAS プログラムで OPTIONS ERRORABEND を使用して、エラーが発生した場合に SAS を停止します。これは多くのエラーに対して機能し、完全に機能します。

%SYSRPUT ステートメントは、... options DMR ... というエラー メッセージを出しますが
、プログラムはここで異常終了しません。
... OBS=0 ... というメッセージは表示されません
。したがって、これは LIBNAME が存在しないディレクトリのような小さなエラーであり、SAS は「正常に」続行されると「思います」。
(ところで、SYSRPUT エラーは、通知もヒントもなしに、サイレントに SYNTAX CHECK モードをオンにしたと思います。)

次の %PUT ステートメントは正常で、前のものと同じ値です。
これにより、プログラムが正常に実行されていると誤解されます。

次のステートメントも正常です。多くの SYMBOLGEN、MPRINT、および MLOGIC メッセージがあります。
したがって、これにより、プログラムが非常に正常に実行されているとさらに誤解されます。

call symput plength ステートメントの後に、「注: 数値が変換されました...」というメッセージがあります。
これにより、プログラムが正常に実行されているという誤解がさらに生じます。

これまで (非常に多くの通常のメッセージのように見えた後)、SAS set option OBS=0 ... という NOTE があります
(おそらく、この NOTE は RUN ステートメントの後にのみ表示されます)。

この OBS=0 メッセージは、実際には、SAS が SYNTAX CHECK モードを使用していることを示すヒントです。
この OBS=0 は、SYSRPUT エラーが原因である可能性があります。しかし、SYSRPUT エラーの後に通常のメッセージのように見えるメッセージが非常に多いため、この OBS=0 メッセージを見落としてしまいます。
実際、呼び出しの構文は非常に単純で、エラーは発生しません。
これは状況をさらに複雑にするだけです。

SAS は SYNTAX CHECK モードであるため、balance ステートメントの plength 変数で似たようなエラーが発生するのはこのためです。

これが全体の話です。

とにかく、この複雑で誤解を招くような状況に陥らないようにするために、%SYSRPUT が行うすべてのことをコメントアウトすることを忘れないでください。

于 2012-10-31T13:24:48.430 に答える