前のページ|次のページ

DATAステップインターフェイス

DATAステップ実行時にマクロ機能と相互作用する

DATAステップインターフェイスは、DATAステップの実行中にプログラムとマクロ機能との相互作用を可能にする、8つのツールから成ります。DATAステップの実行が開始される前にマクロ機能が処理されるため、DATAステップの実行時には、マクロステートメントによって提供される情報の処理がすでに完了しています。DATAステップインターフェイスのいずれかを使用すると、DATAステップの実行中にマクロ機能を操作できます。DATAステップインターフェイスを使用して、次のことを実行できます。
  • DATAステップからSASプログラムのその後のステップに、情報を渡せます。
  • DATAステップの実行時にのみ利用可能な情報に基づいてマクロを呼び出せます。
  • DATAステップの実行中にマクロ変数を置換できます。
  • マクロ変数を削除できます。
  • マクロ機能からDATAステップに、マクロ変数に関する情報を渡せます。
次の表に、カテゴリ別のDATAステップインターフェイスと、それらの用途を示します。
マクロ機能とのDATAステップインターフェイス
カテゴリ
ツール
説明
実行
CALL EXECUTEルーチン
渡された引数を置換し、置換した値を次のステップ境界で実行するか(値がSASステートメントの場合)、即座に実行します(値がマクロ言語要素の場合)。
置換
RESOLVE関数
DATAステップの実行中に、テキスト式の値を置換します。
削除
CALL SYMDELルーチン
引数で指定されたマクロ変数を削除します。
情報
SYMEXIST関数
マクロ変数が存在するかどうかを示す値を返します。
読み込みまたは書き込み
SYMGET関数
DATAステップの実行時にマクロ変数の値を返します。
情報
SYMGLOBL関数
マクロ変数のスコープがグローバルかどうかを示す値を返します。
情報
SYMLOCAL関数
マクロ変数のスコープがローカルかどうかを示す値を返します。
読み込みまたは書き込み
CALL SYMPUTルーチン
DATAステップで生成された値を、マクロ変数に割り当てます。

CALL EXECUTEルーチンのタイミングの詳細

CALL EXECUTEは、マクロを条件付きで実行する場合に役立ちます。ただし、CALL EXECUTEによってマクロ言語要素が生成された場合、それらの要素が即座に実行されるということを覚えておく必要があります。CALL EXECUTEによってSAS言語ステートメントが生成された場合、またはマクロ言語要素によってSAS言語ステートメントが生成された場合、それらのステートメントは、DATAステップの実行終了後に実行されます。
注: マクロ参照は即座に実行されますが、SASステートメントはステップ境界に達するまで実行されません。あるマクロにマクロ変数参照が含まれていて、そのマクロ変数が同じマクロ内でCALL SYMPUTによって作成されたものである場合、CALL EXECUTEを使用してそのマクロを呼び出すことはできません。

CALL EXECUTEの誤った使用例

次の例では、CALL EXECUTEルーチンの使用方法が間違っています。
data prices;  /* ID for price category and actual price */
   input code amount;
   datalines;
56 300
99 10000
24 225
;

%macro items;
   %global special;
   %let special=football;
%mend items;

data sales;    /* incorrect usage */
   set prices;
   length saleitem $ 20;
   call execute('%items');
   saleitem="&special";
run;
DATA SALESステップ内の、SALEITEMに値を割り当てるステートメントでは、DATAステップのコンパイル時のマクロ変数SPECIALの値が必要です。CALL EXECUTEは、DATAステップが実行されるまで、この値を生成しません。そのため、マクロ変数が置換されなかったことを示すメッセージが表示され、SALEITEMには&specialという値が割り当てられます。
この例の場合、マクロ定義を除去するか(%LETマクロステートメントは、オープンコードでも有効です)、DATA SALESステップをマクロITEM内に移動することが望まれます。いずれの場合も、CALL EXECUTEは必要なく、有効でもありません。次に、このプログラムが動作する例を示します。
data prices;   /* ID for price category and actual price */
   input code amount;
   datalines;
56 300
99 10000
24 225
;

%let special=football;  /* correct usage */

data sales;
   set prices;
   length saleitem $ 20;
   saleitem="&special";
run;
このバージョンでは、%GLOBALステートメントは不要です。%LETステートメントがオープンコード内で実行されるため、グローバルマクロ変数が自動的に作成されます。(マクロ変数のスコープの詳細については、 マクロ変数のスコープを参照してください。)

CALL EXECUTEによくある問題の例

次の例は、エラーを引き起こす、よくあるパターンを示しています。
/* This version of the example shows the problem. */

data prices;        /* ID for price category and actual price */
   input code amount;
   cards;
56 300
99 10000
24 225
;
data names;     /* name of sales department and item sold */
   input dept $ item $;
   datalines;
BB  Boat
SK  Skates
;

%macro items(codevar=);  /* create macro variable if needed */
   %global special;
   data _null_;
      set names;
      if &codevar=99 and dept='BB' then call symput('special', item);
   run;
%mend items;

data sales;  /* attempt to reference macro variable fails */
   set prices;
   length saleitem $ 20;
   if amount > 500 then
      call execute('%items(codevar=' || code || ')' );
   saleitem="&special";
run;
この例でも、DATA SALESステップは、コンパイル時のSPECIALの値を必要としています。この例の場合、条件付きIFステートメントがあるため、CALL EXECUTEルーチンは有効です。しかし、最初の例と同じく、CALL EXECUTEは、コンパイル時ではなくDATAステップの実行中にマクロITEMSを呼び出しています。マクロITEMSは、DATA SALESステップの実行終了後に実行されるDATA _NULL_ステップを生成します。DATA _NULL_ステップはSPECIALを作成しますが、SPECIALの値は、_NULL_ステップの実行終了後、つまり、この値が必要とされるときよりもずっと後に使用可能になります。
次に示す例では、この問題を修正しています。
/* This version solves the problem. */

data prices;     /* ID for price category and actual price */
   input code amount;
   datalines;
56 300
99 10000
24 225
;

data names;     /* name of sales department and item sold */
   input dept $ item $;
   cards;
BB  Boat
SK  Ski
;
%macro items(codevar=);   /* create macro variable if needed */
   %global special;
   data _null_;
      set names;
      if &codevar=99 and dept='BB' then
         call symput('special', item);
   run;
%mend items;

data _null_;   /* call the macro in this step */
   set prices;
   if amount > 500 then
      call execute('%items(codevar=' || code || ')' );
run;

data sales;    /* use the value created by the macro in this step */
   set prices;
   length saleitem $ 20;
   saleitem="&special";
run;
このバージョンでは、1つのDATA _NULL_ステップを使用してマクロITEMSを呼び出しています。このステップの実行終了後、ITEMSによって生成されたDATA _NULL_ステップが実行されて、マクロ変数SPECIALを作成します。その後、DATA SALESステップが、通常どおりSPECIALの値を参照します。
前のページ|次のページ|ページの先頭へ