SYSERR自动宏变量

时间:2016-11-30 03:36:09

标签: sas

我在一个SAS项目中有几个程序,即程序A - >程序B - > ....我想使用宏变量在程序之间建立依赖关系。

程序A将处理少量数据步骤和过程。如果程序A中的 ANY 过程执行时出错,我想运行程序C.否则运行程序B.

这似乎很棘手,因为Activity1.onCreate()在每个步边界重置。如果程序A中的第一个数据步骤执行错误而其余步骤没有执行,那么在程序A结束时,syserr仍然是syserr。一旦发生错误,我需要宏变量值为0以外的值,并且值可以保持到程序结束。

如果程序依赖性基于其他条件(比如值),则用户定义的宏变量可以处理它。对于与系统错误相关的事情,我认为SAS已经有了可以解决的问题。但除了0之外我无法找到其他任何东西,这似乎没什么帮助。

注意:我找到了SAS stop on first error。但基本上是在每个数据步骤后检查错误状态。如果程序A包含50多个数据步骤,这听起来很疯狂。

3 个答案:

答案 0 :(得分:5)

简单 - 只需使用syscc

  

SYSCC是一个读/写自动宏变量,可让您使用   重置作业条件代码并从条件中恢复   防止后续步骤运行。

请参阅documentation,但我想您会找到类似的内容:

%if &syscc > 4 %then %do;
  %inc "/mypath/pgmB.sas";
%end;
%else %do;
  %inc "/mypath/pgmA.sas";
%end;

syscc的最高值是跨步边界保留,始终使用整数来表示错误级别。示例值:

SYSCC的值为:

  • 0没有错误没有警告
  • 4是警告
  • 大于4表示发生错误

请注意,有一些事情无法捕捉,但为了提高效果,您可以使用:

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中存在这样做的事情。

如果您希望支票混合在'更多的代码,然后考虑用执行运行/退出的宏替换您的runquit语句,然后检查状态为一体。这将导致代码略微清晰。像这样:

%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*/