さて、それはちょっと置いておいて。
SASプログラムAをバッチ実行
↓
EXCELに戻る アンド 何らかの作業
↓
SASプログラムBをバッチ実行
みたいな際にAを実行したときのオプションやマクロ変数、WORKの中身をBに引き継ぎたいという場合、どうするか?
AとBは別セッションで、連続しないとします。
まあ、色々方法はあると思いますが、9.4からのpresenvプロシジャを使えば
グローバルステートメントの定義内容、つまり
optionやgopition、filenameやtitleなどの定義
および、マクロ変数、マクロ、WORKのデータセットを復元するプログラムを作成することができます。
復元プログラムをincludeしてから、新しいプログラムを実行することで、あたかも連続したセッションで実行しているような環境の引継ぎができるわけですね
もともとSAS Enterprise Guide のグリッド?で使いやすくするために開発されたみたいだけど
普通に便利
例えば、以下のような適当なプログラムを実行
data a;
x=1;
run;
options msglevel=i;
proc format;
value fm 1="A";
run;
%macro test;
XXXXX
%mend test;
%let YYYYY=AAA;
%let YYYYY=ZZZZ;
title "タイトル";
そして以下のコードを実行して、
libname lib1 "任意のフォルダ。ここにデータセットやカタログが保存される";
options presenv;
proc presenv
permdir=lib1
sascode="任意のパス\hukugen.sas";
run;
作成されたhukugen.sasの中身をみると
【以下が生成されたプログラム】
OPTIONS msglevel=i;
TITLE "タイトル";
LIBNAME LIB1 "任意のフォルダ。ここにデータセットやカタログが保存される";
OPTIONS presenv;
%let saved_options=options %sysfunc(getoption(source))
%sysfunc(getoption(notes)) %sysfunc(getoption(obs,keyword))
%sysfunc(getoption(firstobs,keyword));
options obs=max firstobs=1;
options nosource nonotes;
%macro dummy_macro_for_presenv; %mend;
data _null_; rc=filename('presenvf',' ','temp'); run;
proc printto log=presenvf new; run;
proc sql;
create table _data_ as select distinct memname
from dictionary.catalogs
where libname='LIB1' and memtype='CATALOG';
quit;
data _null_; set;
call execute(
cats('proc catalog force c=LIB1.',memname,
'; copy out=work.',memname,'; quit;')
);
run;
proc delete; run;
proc copy in=LIB1 out=work mt=data; quit;
proc printto; run;
data _null_; rc=filename('presenvf'); run;
data _null_;
call symput('YYYYY','ZZZZ' );
call symput('AFDSID','0' );
call symput('AFDSNAME',TRIMN(' '));
call symput('AFLIB',TRIMN(' '));
call symput('AFSTR1',TRIMN(' '));
call symput('AFSTR2',TRIMN(' '));
call symput('FSPBDV',TRIMN(' '));
run;
options _last_=WORK.A;
&saved_options;
一回SASを閉じた後、これを実行すると、閉じる前と全く同じ状況になっていることがわかる。
俺の屍をこえてゆけ みたいな。ゲームやったことないけど