2017年11月20日月曜日

共有マクロを作る【MSTORED, SASMSTORE編】



以前、共有マクロについて、以下の記事を書きました。
共有マクロをつくって、プログラミングを効率的にする1


上の記事では、「sasautos=」を使ってマクロプログラムを呼び出す方法を紹介しました。
今回は、「sasmstore=」を使ってコンパイル済みのマクロを呼び出す方法を紹介します。





コンパイルしたマクロを保存する構文

options mstored sasmstore=コンパイルしたマクロを格納するライブラリ;

%macro マクロ名 / store;
  マクロの中身;
%mend;


store」をつけたマクロは、「sasmstore=」に指定したライブラリに保存されます。






libname mymac "C:\MyMacro";
options mstored sasmstore=mymac;

%macro test1 / store;
  data aa;
  run;
%mend;

%macro test2 / store;
  data bb;
  run;
%mend;

C:\MyMacro の中に、コンパイルしたマクロ test1, test2 を格納しています。
(マクロの中身は適当)



ではここで、一旦SASを再起動します。
普通はSASを閉じるとマクロも消えてしまいますが、上のように保存したマクロは mstored・sasmstore=オプションを指定するだけで、また使えるようになります。

libname mymac "C:\MyMacro";
options mstored sasmstore=mymac;

%test1;




注意①


以下の例をご覧ください。

libname mymac2 "C:\MyMacro";
options mstored sasmstore=mymac2;

%macro test1;
   %put ----- macro (1) ----;
%mend;

%macro test1 / store;
   %put ----- macro (2) ----;
%mend;

%test1;

ログ
----- macro (1) ----

同名のマクロ test1 を2つ作っています。
1つ目はライブラリ work に、2つ目はライブラリ mymac2 に作っています。

この状況下で「%test1;」でマクロを呼び出すと、work のほうのマクロが実行されてしまいました。
内部でマクロを検索する順番が決まっていて、今回は work のほうが優先されてしまったわけですね。
他にもSAS側で用意しているマクロや、ユーザー側で設定した自動呼出しマクロとかの名前と被るようなマクロを作ってしまうと、優先的に実行されるマクロがどれなのか分からん!ってなってしまうので、ご注意ください。



注意②


注意①のプログラムを実行した後、以下を実行したらERRORが出てしまいました。

libname mymac2 "C:\MyMacro";

ログ
ERROR: ライブラリMYMAC2は使用中のため、クリアまたは再割り当てはできません。 ERROR: LIBNAMEステートメントのエラーです。

これは注意①で「sasmstore=」に指定したライブラリ mymac2 内のコンパイル済マクロカタログが開いた状態になっているため。


これを以下で閉じる事が出来ます。

%sysmstoreclear;


ただし、閉じるだけで「sasmstore=」の設定が消されるわけではありません。
引き続き「sasmstore=」に指定したライブラリにマクロを保存したり、呼び出すことが可能です(保存・呼び出し時にまたマクロカタログが開く)



0 件のコメント:

コメントを投稿