我在一个SAS项目中有几个程序,即程序A - >程序B - > ....我想使用宏变量在程序之间建立依赖关系。
程序A将处理少量数据步骤和过程。如果程序A中的 ANY 过程执行时出错,我想运行程序C.否则运行程序B.
这似乎很棘手,因为Activity1.onCreate()
在每个步边界重置。如果程序A中的第一个数据步骤执行错误而其余步骤没有执行,那么在程序A结束时,syserr
仍然是syserr
。一旦发生错误,我需要宏变量值为0以外的值,并且值可以保持到程序结束。
如果程序依赖性基于其他条件(比如值),则用户定义的宏变量可以处理它。对于与系统错误相关的事情,我认为SAS已经有了可以解决的问题。但除了0
之外我无法找到其他任何东西,这似乎没什么帮助。
注意:我找到了SAS stop on first error。但基本上是在每个数据步骤后检查错误状态。如果程序A包含50多个数据步骤,这听起来很疯狂。
答案 0 :(得分:5)
简单 - 只需使用syscc
!
SYSCC是一个读/写自动宏变量,可让您使用 重置作业条件代码并从条件中恢复 防止后续步骤运行。
请参阅documentation,但我想您会找到类似的内容:
%if &syscc > 4 %then %do;
%inc "/mypath/pgmB.sas";
%end;
%else %do;
%inc "/mypath/pgmA.sas";
%end;
syscc
的最高值是跨步边界保留,始终使用整数来表示错误级别。示例值:
SYSCC的值为:
请注意,有一些事情无法捕捉,但为了提高效果,您可以使用:
options errorcheck=strict;
最后 - 你提到“sas项目”,如果这意味着你使用的是Enterprise Guide,那么请注意usage note中的建议。
答案 1 :(得分:2)
您可以定义一个跟踪错误状态的宏,并在每个步骤后运行它。宏看起来像这样:
%macro track_err;
%global err_status;
%let err_status = %sysfunc(max(&err_status, &syserr ne 0));
%mend;
下面的用法示例。首先初始化值以跟踪整体错误状态。第一个datastep将失败,第二个将成功运行,err_status
的最终值将为1.
%let err_status = 0;
data oops;
set sashelp.doesnt_exist;
run;
%track_err;
data yay;
set sashelp.class;
run;
%track_err;
%put &=err_status;
最终输出:
ERR_STATUS=1
在每个步骤之后检查状态听起来很疯狂......好吧SAS并没有提供满足您的确切要求的东西,所以唯一的方法是字面意思在每一步之后检查一下。
编辑:更正 - 看起来像RawFocus中提到的syscc
方法的答案实际上表明在SAS中存在这样做的事情。
如果您希望支票混合在'更多的代码,然后考虑用执行运行/退出的宏替换您的run
和quit
语句,然后检查状态为一体。这将导致代码略微清晰。像这样:
%macro run_quit_track;
run;quit;
%global err_status;
%let err_status = %sysfunc(max(&err_status, &syserr ne 0));
%mend;
%let err_status = 0;
data oops;
set sashelp.doesnt_exist;
%run_quit_track;
data yay;
set sashelp.class;
%run_quit_track;
%put &=err_status;
答案 2 :(得分:-1)
使用一个宏,称之为runquitA。在每个proc sql或proc数据的末尾调用这个宏在quit的位置;并运行;
示例:
/*Program A*/
%macro runquitA;
; run; quit;
%if &syserr. ne 0 %then %do;
/*Call Program C*/
%end;
%mend runquitA;
proc sql;
create table class1 as
select * from sashelp.class;
%runquitA;
data class2;
set sashelp.class;
%runquitA;
/*Call Program B*/
/*end of Program A*/