前のページ|次のページ

SASコンポーネント言語とのインターフェイス

SCLプログラムの使用

SASマクロ機能を使用して、SCLプログラムのマクロおよびマクロ変数を定義できます。その後、マクロとSCLプログラムの他の部分との間で、パラメータを渡すことができます。また、自動呼び出しマクロ機能とコンパイル済みマクロ機能を使用することで、マクロを複数のSCLプログラムで使用できます。
注: マクロモジュールは、シンボルとマクロのクォーティングが必要になる場合があるため、プログラムセグメントよりも管理が複雑になることがあります。さらに、モジュールをマクロとして実装しても、コンパイル済みSCLコードのサイズは減少しません。マクロによって生成されたプログラムステートメントは、コンパイル済みコードに追加されます。これは、それらの行をプログラム内のその場所に記述するのと同じことです。
次の表に、SCLマクロ機能インターフェイスを示します。
マクロ機能とのSCLインターフェイス
カテゴリ
ツール
説明
読み込みまたは書き込み
SYMGET
SCLの実行中に、グローバルマクロ変数の値を返します。
SYMGETN
グローバルマクロ変数の値を数値として返します。
CALL SYMPUT
SCLで生成された値をグローバルマクロ変数に割り当てます。
CALL SYMPUTN
数値をグローバルマクロ変数に割り当てます。
注: SYMPUTNを使用して割り当てられていない値を、SYMGETNを使用して取り出すのは効率的ではありません。CALL SYMPUTNを使用して作成されたマクロ変数を、&を使用して参照することも効率的ではありません。代わりに、SYMGETNを使用してください。さらに、SYMGETNおよびCALL SYMPUTNを、数値以外の値で使用することも効率的ではありません。
これらの要素の詳細については、マクロのDATAステップCALLルーチンマクロのDATAステップ関数を参照してください。

マクロ参照のSCLによる置換

マクロ機能をSCLで使用する場合に覚えておくべき重要な点は、SCLプログラム内のマクロ参照とマクロ変数参照が、アプリケーションの実行時ではなく、SCLプログラムのコンパイル時に置換されるということです。マクロとマクロ変数の割り当ておよび置換をさらに細かく制御するには、次の手法を適用します。
  • SCLプログラムの実行時にマクロ変数に値を割り当て、それを取り出す場合、SCLプログラム内でCALL SYMPUTおよびCALL SYMPUTNを使用します。
  • SCLプログラムの実行時にマクロ呼び出しまたはマクロ変数参照を置換する場合、SCLプログラム内でSYMGETおよびSYMGETNを使用します。

サブミットブロックのマクロ変数参照

SCLでは、マクロ変数参照は、サブミットブロックに含まれていなければ、コンパイル時に置換されます。SCLは、アンパサンド(&)の接頭語が付いた名前をサブミットブロック内で検出すると、アンパサンドの後ろの名前がSCL変数名であるかどうかをチェックします。SCL変数名である場合、SCLは、サブミットブロックの内のその変数参照を、対応する変数の値に置換します。アンパサンドの後ろの名前がどのSCL変数名とも一致しない場合、その名前がそのまま(アンパサンドを含め)サブミットされるステートメントに含まれて渡されます。SASは、ステートメントを処理するときに、その名前をマクロ変数参照として置換しようとします。
サブミットされるステートメント内の名前がマクロ変数参照として渡されることを保証するには、名前の前にアンパサンドを2つ付けます(たとえば、&&DSNAME)。同じ名前のマクロ変数とSCL変数がある場合、参照に1つのアンパサンドを付けるとSCL変数として置換されます。強制的にマクロ変数として置換するには、アンパサンドを2つ(&&)付けて参照します。

SCLプログラム間でのマクロの共有の考慮事項

SCLプログラム間でマクロを共有すると役に立ちますが、構成管理上の問題が発生する可能性もあります。マクロを複数のプログラムで使用する場合、マクロを更新したときにそれらすべてを再コンパイルできるようにするために、そのマクロを使用するすべてのプログラムを把握しておく必要があります。SCLがコンパイルされるため、マクロを更新した場合、そのマクロを呼び出している各SCLプログラムを必ず再コンパイルする必要があります。
注意:
SCLプログラムを再コンパイルしてください。
マクロを更新したときにSCLプログラムを再コンパイルしなかった場合、コンパイル済みSCLとソースが一致しなくなる危険があります。

SCLプログラムのマクロ使用例

このSCLプログラムは、BORROWED、INTEREST、およびPAYMENTの各フィールドを使用するアプリケーションの例です。このプログラムは、マクロCKAMOUNTおよびCKRATEを使用して、ユーザーが各フィールドに入力した値を検証します。このプログラムは、入力された金利(INTEREST)と合計金額(BORROWED)の値を使用して、支払額を計算します。
/* Display an error message if AMOUNT */
   /* is less than zero or larger than 1000. */
%macro ckamount(amount);
   if (&amount < 0) or (&amount > 1000) then
      do;
         erroron borrowed;
         _msg_='Amount must be between $0 and $1,000.';
         stop;
      end;
   else erroroff borrowed;
%mend ckamount;

   /* Display an error message if RATE */
   /* is less than 0 or greater than 1.5 */
%macro ckrate(rate);
   if (&rate < 0) or (&rate > 1) then
      do;
         erroron interest;
         _msg_='Rate must be between 0 and 1.5';
         stop;
      end;
   else erroroff interest;
%mend ckrate;

   /*  Open the window with BORROWED at 0 and INTEREST at .5.  */
INIT:
   control error;
   borrowed=0;
   interest=.5;
return;

MAIN:
      /*  Run the macro CKAMOUNT to validate  */
      /*  the value of BORROWED.              */
   %ckamount(borrowed)
      /*  Run the macro CKRATE to validate  */
      /* the value of INTEREST.             */
   %ckrate(interest)
      /*  Calculate payment.  */
   payment=borrowed*interest;
return;

TERM:
return;
前のページ|次のページ|ページの先頭へ