前のページ|次のページ

CALL EXECUTEルーチン

引数を解決し、実行用に解決された値を次のステップの境界で発行します。

種類: DATAステップCALLルーチン

構文

CALL EXECUTE (argument);

必須引数

argument

次のいずれかの種類が表示されます。

  • 引用符で囲まれた文字列。一重引用符で囲んだ引数は、プログラムの実行時に置換されます。二重引用符で囲んだ引数は、DATAステップが作成される際に置換されます。たとえば、マクロSALESを呼び出すには、次のコードを使用します。
    call execute('%sales');
  • 生成されるテキスト式またはSASステートメントの値を持つ、DATAステップ文字変数の名前。DATAステップの変数は引用符で囲まないでください。たとえば、SASステートメントまたはテキスト式が格納されたDATAステップ変数FINDOBSの値を使用するには、次のコードを使用します。
    call execute(findobs);
  • DATAステップによってマクロテキスト式またはSASステートメントに置換される文字式。たとえば、変数MONTHの値をパラメータとして渡すマクロ呼び出しを生成するには、次のコードを使用します。
    call execute('%sales('||month||')');

詳細

EXECUTEルーチンの引数がマクロ呼び出しまたはマクロ呼び出しへの置換である場合、即座にマクロが実行されます。マクロの実行によって生成されたSASステートメントは、ステップ境界に達するまで実行されません。マクロ変数参照などのSASマクロステートメントは、即座に実行されます。
注: ステップ境界に達するまでSASステートメントが実行されないため、SASマクロステートメント内の、SASステートメントによって作成または更新されるマクロ変数への参照は、正しく置換されません。
注: マクロ参照は即座に実行されますが、SASステートメントはステップ境界に達するまで実行されません。あるマクロにマクロ変数参照が含まれていて、そのマクロ変数が同じマクロ内でCALL SYMPUTによって作成されたものである場合、CALL EXECUTEを使用してそのマクロを呼び出すことはできません。これを回避する方法については、次のヒントを参照してください。
ヒント
次の例では、%NRSTRマクロクォーティング関数を使用してマクロステートメントをマスクしています。この関数は、マクロステートメントの実行を、ステップ境界に達するまで遅らせます。
call execute('%nrstr(%sales('||month||'))');

比較

マクロ機能の他の要素とは異なり、CALL EXECUTEステートメントは、SASシステムオプションMACROまたはNOMACROの設定とは無関係に使用できます。どちらに設定しても、EXECUTEは、引数の値をプログラムスタックに配置します。ただし、NOMACROに設定すると、引数に含まれるマクロ呼び出しまたはマクロ関数は置換されません。

例1: マクロの条件付き実行

次のDATAステップでは、CALL EXECUTEを使用してマクロを実行しています。このマクロは、DATAステップが少なくとも1つのオブザベーションを一時データセットに書き込む場合にのみ実行されます。
%macro overdue;
   proc print data=late;
      title "Overdue Accounts As of &sysdate";
   run;
%mend overdue;
data late;
   set Sasuser.Billed end=final;
   if datedue<=today()-30 then
      do;
         n+1;
         output;
      end;
   if final and n then call execute('%overdue');
run;

例2: パラメータリストにDATAステップ値を渡す

CALL EXECUTEを使用して、DATESデータセットのDATE変数の値をマクロREPTのDATパラメータに渡し、REPTDATAデータセットのVAR1変数の値をAパラメータに渡し、REPTDATAをDSNパラメータに渡しています。DATA _NULL_ステップの終了後、DATESデータセット内の3つの日付に対応する、3つのPROC GCHARTステートメントがサブミットされます。
data dates;
   input date $;
datalines;
10nov11
11nov11
12nov11
;
data reptdata;
   input date $ var1 var2;
datalines;
10nov11 25 10
10nov11 50 11
11nov11 23 10
11nov11 30 29
12nov11 33 44
12nov11 75 86
;
%macro rept(dat,a,dsn);
   proc chart data=&dsn;
       title "Chart for &dat";
       where(date="&dat");
       vbar &a;
   run;
%mend rept;
data _null_;
   set dates;
   call execute('%rept('||date||','||'var1,reptdata)');
run;
前のページ|次のページ|ページの先頭へ