前のページ|次のページ

ポータブルマクロの作成

%SYSFUNCでポータブルSAS言語関数を使用する

コードを2つの異なる環境で実行できるようにすると、原則的に、開発作業の価値は2倍になります。ただし、ポータブルアプリケーションを開発する場合、前もって計画が必要になります。SASのホスト固有の機能の詳細については、使用しているホスト環境に関するSASドキュメントを参照してください。
%SYSFUNCマクロ関数を使用してSAS言語関数にアクセスし、ファイルを開いたり削除したりするなどの、ほとんどのホスト固有の操作を実行できます。詳細については、%SYSFUNC関数と%QSYSFUNC関数を参照してください。
%SYSFUNCを使用してポータブルSAS言語関数にアクセスすると、多くのマクロコードを省くことができます。これによってポータブルになるだけでなく、効率も向上します。次の表に、一般的なホスト固有のタスクと、それらのタスクを実行する関数を示します。
ポータブルSAS言語関数とその用途
タスク
SAS言語関数
ファイル参照名と物理ファイルの割り当ておよび存在の確認
FILENAME、FILEREF、PATHNAME
ファイルを開く
FOPEN、MOPEN
ファイルの存在の確認
FEXIST、FILEEXIST
ファイルに関する情報の取得
FINFO、FOPTNAME、FOPTNUM
ファイルへのデータの書き込み
FAPPEND、FWRITE
ファイルの読み込み
FPOINT、FREAD、FREWIND、FRLEN
ファイルを閉じる
FCLOSE
ファイルの削除
FDELETE
ディレクトリを開く
DOPEN
ディレクトリに関する情報を返す
DINFO、DNUM、DOPTNAME、DOPTNUM、DREAD
ディレクトリを閉じる
DCLOSE
ホスト固有のオプションの読み込み
GETOPTION
ファイルデータバッファ(FDB)の操作
FCOL、FGET、FNOTE、FPOS、FPUT、FSEP
ライブラリ参照名の割り当ておよび確認
LIBNAME、LIBREF、PATHNAME
実行されたホスト環境のコマンドに関する情報の取得
SYSRC
注: もちろん、%SYSFUNCを使用して、ABS、MAX、TRANWRDなどの他の関数を使用することもできます。ただし、いくつかのSAS言語関数は、%SYSFUNCでは使用できません。詳細については、 %SYSFUNC関数と%QSYSFUNC関数を参照してください。

%SYSFUNCの使用例

次のプログラムでは、ファイル参照名MYFILEで指定されたファイルを削除しています。
%macro testfile(filrf);
   %let
rc=%sysfunc(filename(filrf,physical-filename));
   %if &rc = 0 and %sysfunc(fexist(&filrf)) %then
      %let rc=%sysfunc(fdelete(&filrf));
   %let rc=%sysfunc(filename(filrf));
%mend testfile;

%testfile(myfile)

ホスト固有の値を持つ自動変数の使用

タスク別のマクロ変数

すべてのホスト環境で自動マクロ変数を使用できますが、それらの値は各ホストによって決められます。次の表に、タスク別のマクロ変数を示します。"タイプ"列は、変数が変更可能(読み込みおよび書き込み)か、それとも参照可能(読み込み専用)かを示しています。
ホスト固有の値を持つ自動マクロ変数
タスク
自動マクロ変数
タイプ
DEVICE=で設定した現在のグラフィックデバイスの名前を表示します。
SYSDEVIC
読み込みおよび書き込み
実行モード(FOREまたはBACK)を表示します。一部のホスト環境では、1つのモード(FORE)のみが可能です。
SYSENV
読み込み専用
現実行しているバッチジョブの名前、ユーザーID、またはプロセスIDを表示します。たとえば、UNIXの場合、SYSJOBIDの値はプロセスIDになります。
SYSJOBID
読み込み専用
ホスト環境によって最後に生成されたリターンコードを表示します。この値は、オープンコード内のXステートメント、 SASウィンドウ環境でのXコマンド、または%SYSEXEC (あるいは%TSOや%CMS)マクロステートメントを使用して実行されたコマンドに基づきます。
デフォルト値は、0です。
SYSRC
読み込みおよび書き込み
使用しているホスト環境の省略形を表示します。
SYSSCP
読み込み専用
使用しているホスト環境の詳細な省略形を表示します。
SYSSCPL
読み込み専用
SYSPARM=システムオプションによってSASに渡された文字列を取得します。
SYSPARM
読み込みおよび書き込み
TIMEZONEオプションに基づいたタイムゾーン名
SYSTIMEZONE
読み込み専用
TIMEZONEオプションに基づいたタイムゾーンID
SYSTIMEZONEIDENT
読み込み専用
TIMEZONEオプションに基づいた現在のタイムゾーンのオフセット
SYSTIMEZONEOFFSET
読み込み専用

SYSSCPとSYSSCPLの使用例

次に示すマクロDELFILEは、SYSSCPの値を使用して、SASを実行しているプラットフォームを決定し、TMPファイルを削除します。FILEREFは、ファイル名が格納されたマクロパラメータです。ファイル名は、ホスト固有です。そのため、ファイル名をマクロパラメータにすることにより、ホスト環境に必要なファイル名構文はすべて、マクロが使用できるになります。
%macro delfile(fileref);
    /* Unix */
   %if &sysscp=HP 800 or &sysscp=HP 300 %then %do;
         X “rm &fileref..TMP”;
   %end;

      /* DOS-LIKE platforms */
   %else %if &sysscp=OS2 or &sysscp=WIN %then %do;
             X “DEL &fileref..TMP”;
   %end;
    /* CMS */
   %else %if &sysscp=CMS %then %do;
            X “ERASE &fileref  TMP A”;
   %end;
%mend delfile;
PC環境でのマクロDELFILEの呼び出しを、次に示します。ここでは、C:\SAS\SASUSER\Doc1.TMPという名前のファイルを削除しています。
%delfile(c:\sas\Sasuser\Doc1)
このプログラムでは、ポータブルな%SYSEXECステートメントを使用して、ホスト固有のオペレーティングシステムのコマンドを実行していることに注意してください。
ここで、いずれかのバージョンのMicrosoft Windows上でマクロアプリケーションが実行されるということが、わかっているとします。SYSSCPL自動マクロ変数は、SYSSCP自動マクロ変数と同様に、ホスト環境の名前に関する情報を提供します。ただし、SYSSCPLのほうが詳細な情報を提供するため、それによってマクロコードを細かく調整できます。

SYSPARMの使用例

SYSPARM=システムオプションに都市名を設定する場合を考えます。つまり、SYSPARM自動変数に、その都市名が設定されます。この値を使用してデータセットをサブセット化し、この値に固有のコードを生成できます。SASを呼び出すコマンド(またはSAS構成ファイル)に対してわずかな変更を行うだけで、SASジョブは別のタスクを実行します。
/* Create a data set, based on the value of the */
/* SYSPARM automatic variable. */
/* An example data set name could be MYLIB.BOSTON. */
data mylib.&sysparm;
   set mylib.alltowns;
      /* Use the SYSPARM SAS language function to */
      /* compare the value (city name) */
      /* of SYSPARM to a data set variable. */
   if town=sysparm();
run;
このプログラムを実行すると、対象となる都市のデータのみを含むデータセットが得られます。生成するデータセットを変更し、その後、SASジョブ開始できます。
ここで、やはりSYSPARMの値を使用して、ジョブが使用するプロシジャを制御したいとします。次のマクロは、それを実行しています。
%macro select;
   %if %upcase(&sysparm) eq BOSTON %then
      %do;
         proc report ... more SAS code;
            title "Report on &sysparm";
         run;
      %end;

   %if %upcase(&sysparm) eq CHICAGO %then
      %do;
         proc chart ... more SAS code;
            title "Growth Values for &sysparm";
         run;
      %end;
   .
   .  /* more macro code */
   .
%mend select;

SYSPARMの詳細

SYSPARM自動マクロ変数の値は、SYSPARM=システムオプションの値と同じであり、SAS言語関数SYSPARMの戻り値と等価です。デフォルト値はnullです。SASの起動時にSYSPARM=システムオプションを使用できるため、SYSPARM自動マクロ変数の値を設定してからSASセッションを開始できます。

SYSRCの詳細

SYSRC自動マクロ変数には、ホスト環境によって生成された最後のリターンコードが格納されます。返されるコードは次にあげる実行コマンドに基づきます。
  • オープンコード内のXステートメント
  • ウィンドウ環境のXコマンド
  • %SYSEXECマクロステートメント(および非ポータブルの%TSOと%CMSマクロステートメント)
ホスト環境のコマンドが成功したかどうかをテストする場合、このSYSRC自動マクロ変数を使用します。
注: SASログにエラーメッセージは生成されませんが、SYSRC自動マクロ変数をすべてのホスト環境で使用できるわけではありません。たとえば、一部のホスト環境では、ホスト環境のコマンドが成功したかどうかにかかわらず、この変数の値は常に99になります。ホスト環境でSYSRC自動マクロ変数を使用できるかどうかを確認するには、使用しているホスト環境に関するSASドキュメントを調べてください。

システム依存のマクロ言語要素

次に示すような、いくつかのマクロ言語要素は、ホスト固有です。
並べ替えシーケンスに依存する言語要素
そのような式の例には、%DO、%DO %UNTIL、%DO %WHILE、%IF-%THEN、%EVALなどがあります。
たとえば、次のプログラムについて考えます。
%macro testsort(var);
    %if &var < a %then %put *** &var is less than a ***;
    %else %put *** &var is greater than a ***;
%mend testsort;
%testsort(1)
      /* Invoke the macro with the number 1 as the parameter. */
z/OSなどのEBCDICシステムやVSEでは、このプログラムによって、次のメッセージがSASログに書き込まれます。
*** 1 is greater than a ***
ところが、UNIXやWindowsなどのASCIIシステムでは、次のメッセージがSASログに書き込まれます。
*** 1 is less than a ***
MSYMTABMAX=
このシステムオプションは、マクロ変数のシンボルテーブルで使用可能な最大メモリ量を指定します。シンボルテーブルは、この値を超えるとディスク上のWORKファイルに保存されます。
MVARSIZE=
このシステムオプションは、メモリに格納される任意のマクロ変数の最大バイト数を指定します。マクロ変数は、この値を超えるとディスク上のWORKファイルに保存されます。
%SCANと%QSCAN
%SCAN関数と%QSCAN関数によって文字列内のワードの検索に使用されるデフォルトの区切り文字は、ASCIIシステムとEBCDICシステムとでは異なります。デフォルトの区切り文字は次のとおりです。
ASCIIシステム
空白 。< ( + & !$ * ) ; ^ − / , % |
EBCDICシステム
空白 。< ( + | & !$ * ) ; ¬ − / , % ¦ ¢
%SYSEXEC、%TSO、および%CMS
%SYSEXEC、%TSO、%CMSのいずれかのマクロステートメントを使用して、ホスト環境のコマンドを実行できます。
%SYSGET
一部のホスト環境では、%SYSGET関数によって、ホスト環境変数の値およびシンボルが返されます。
SYSPARM=
このシステムオプションによって、SASの起動時にSYSPARM自動マクロ変数の値を指定できます。これは、プロダクションジョブのカスタマイズに役立ちます。たとえば、非対話型の実行の一部として都市に基いたタイトルを作成するため、プロダクションプログラムにSYSPARM=システムオプションを含める場合があります。または、SAS構成ファイルかSASの起動コマンドに含めることもできます。SYSPARM=システムオプションとSYSPARM自動マクロ変数を併用する例については、SYSPARMの詳細 を参照してください。
SASMSTORE=
このシステムオプションは、コンパイル済みマクロの場所を指定します。
SASAUTOS=
このシステムオプションは、自動呼び出しマクロの場所を指定します。

ホスト固有のマクロ変数

一部のホスト環境では、固有のマクロ変数が作成されます。それらのマクロ変数は、自動マクロ変数ではありません。次の表に、一般的に使用されるホスト固有のマクロ変数の一部を示します。今後のリリースで、使用可能なホスト固有のマクロ変数が追加される可能性があります。詳細については、SASドキュメントを参照してください。
z/OSのホスト固有のマクロ変数
変数名
説明
SYS99ERR
SVC99のエラー理由コード
SYS99INF
SVC99の情報理由コード
SYS99MSG
SVCのエラー理由コードまたは情報理由コードに対応するYSC99のテキストメッセージ
SYS99R15
SVC99のリターンコード
SYSJCTID
JCT制御ブロック内のJCTUSERフィールドの値
SYSJMRID
JCT制御ブロック内のJMRUSEIDフィールドの値
SYSUID
SASセッションに関連付けられたTSOユーザーIDS documentation for your operating environment. 詳細については、

自動呼び出し機能で使用するマクロと外部ファイルに名前を付ける

自動呼び出しライブラリに保存するマクロに名前を付ける場合、使用しているホスト環境によって異なる制限があります。それらの制限の一部を次に示します。
  • すべてのホスト環境には、ファイル命名規則があります。ホスト環境でファイル拡張子が使用されている場合、マクロファイルの拡張子として、.sasを使用します。
  • SAS名にはアンダースコアを含めることができますが、一部のホスト環境では、外部ファイルの名前にアンダースコアを含めることができません。アンダースコアが使用されない一部のホスト環境ではシャープ記号(#)が使用されますが、マクロを使用するときに#が自動的にアンダースコアに置換される場合があります。
  • 一部のホスト環境には、CONやNULLなどの予約語があります。自動呼び出しマクロや外部ファイルに名前を付けるときに、予約語を使用しないでください。
  • 一部のホストには、ホスト固有の自動呼び出しマクロがあります。これらの自動呼び出しマクロと同じ名前でマクロを定義しないでください。
  • マクロカタログは、ポータブルではありません。マクロソースコードを、忘れずに、必ず安全な場所に保存するようにしてください。
  • UNIXシステムの場合、自動呼び出しマクロを保存するファイルの名前を、すべて小文字にする必要があります。
前のページ|次のページ|ページの先頭へ