2015-09-25 93 views
2

我有一个SAS存储过程,它通过webout执行一些html输出。 在某些情况下(例如没有数据可用),我想放置一个自定义的错误消息,并停止进一步执行。正确结束SAS存储过程

我有一个万客隆的解决方案,它迄今运行良好:

%if &varnobs = 0 %then %do; 
data _null_; 
    file _webout; 
    put " &text1"; 
    put " &text2"; 
    put " &text3"; 
run; 
ENDSAS; 
%end; 

但现在我被告知,使用ENDSAS是不是我们公司内部允许的,因为它可以有各种副作用,也不仅可以停止进程,还可以停止完成会话。

现在我正在寻找替代品,我也尝试了几个选项的中止语句,但有一个问题是,中止放在日志中的错误消息,以便不显示我的自定义消息,但萨斯错误信息。同样在中止文档中指出(abort),即放弃不仅停止进程,而且会话。

我知道有像if-else或goto这样的编程方式替代方法,而不是停止进程,但这不适用于我的特定问题。

所以,问题是:

执行过程中如何停止存储过程,而不停止会议,没有其他副作用,并没有一个SAS错误消息?

回答

0

这是一个有趣的,棘手的地区。在某些设置中,设置系统选项:

options obs=0 noreplace; 

可能充当代理。

0

您可以尝试%return以安静地退出宏,但可能必须设置用于调用宏的处理程序(如果有)。

0

你可以做,如果其他的方法来防止运行额外的代码和打印自定义错误消息作为

%if &data ne "" %then; 
    *your code; 

%else 
    data _null_; 
    file _webout; 
    put 'html code of custom message'; 
    run; 
0

SAS是可怕的错误处理,所以我的建议是,以避免错误尽可能;-)

除了和 %abort cancel之外,还有一些有限的选项:

笑话不谈,

您可以尝试将支票签字后的所有代码移入有条件执行的%include语句。喜欢的东西:

%macro conditional_execute; 
    %if &some_condition %then %do; 
    %include "rest_of_logic_to_perform.sas"; 
    %end; 
    %else %do; 
    %put ERROR: CUSTOM ERROR MESSAGE HERE; 
    %end; 
%mend; 

原因的包括,而不是把所有的代码宏的内部是,我假设仍有待执行的处理的大量。如果它是一个短的代码,那么是的,你可以把它放在%if的条件之内。