2014年9月15日月曜日

共有マクロをつくって、プログラミングを効率的にする2




前回の続き。SASのバージョンによって挙動が変わるかもしれないけど、
SASAUTOSオプションを使った時に、以下のようなエラーが出て困ったなという事はないでしょうか?

ERROR: ファイル参照名 TEST に関連付けたファイルの中に、現在使用されているファイルがあります。
ERROR: FILENAME ステートメントのエラーです。



まず、このエラーを再現してみましょう。


①前回と同様に共有マクロを作る。

C:\SAS_MACROS\mac_SORT.sas
*** SORTマクロ ;
%macro  mac_SORT( DS1, DS2, BYVAR );

    proc sort data=&DS1 out=&DS2;
        by &BYVAR ;
    run;

%mend;


②上で作った共有マクロを使えるようにするのですが、
前回と違って、以下のようにファイル参照名をSASAUTOSオプションに設定します。

filename TEST "C:\SAS_MACROS";
options sasautos = ( SASAUTOS  TEST ) ;

data DT1;
  do A=10 to 1 by -1;
    output;
  end;
run;

%mac_SORT(DT1, OUT1, A);

このプログラムを2回実行してみましょう。
1回目は普通に動くけど、2回目はエラーが出てしまうはずです!



原因


SASAUTOSオプションで使われたファイル参照名は、SASAUTOSオプションに守られるようになります。
よって、そのファイル参照名を消そうとしたり、再定義しようとすると、SASAUTOSオプションに守られてるので、突っぱねられてエラーが出てしまうのです。


今回の例では、1回目の実行で、ファイル参照TESTがSASAUTOSオプションに守られることになる。
よって2回目実行したとき、

filename TEST "C:\SAS_MACROS";

の部分で「ファイル参照TESTを再定義しようとしてるな!」と目をつけられてエラーになるというわけです。

このエラーを手っ取り早く回避するには、ファイル参照名ではなく直接パスを入れてやります。

options sasautos = ( SASAUTOS  "C:\SAS_MACROS" ) ;



0 件のコメント:

コメントを投稿