只有在没有导致日志错误(内部宏)SAS的情况下才执行proc步骤

时间:2017-10-24 05:34:04

标签: sas sas-macro

我试图用Proc Mixed测试宏内部的不同协方差结构。

%macro cov(type);
proc mixed data=tmp order=data;
class sub trt visit;
model var = trt visit trt*visit / S cl;
repeated visit  /subject=sub type=&type.; 
FitStatistics=min_var_&type.;   
run;
%mend;

我需要在模型中拟合的一些协方差结构会导致错误,并且我试图找到一种方法来执行此proc混合语句,如果它不会导致错误的值为& type 。

我一直在使用%sysfunc,但尚未能解决此问题。

%IF %SYSFUNC(EXIST(min_var_&type.)) %THEN %DO;
data help_&type.;
set min_var_&type.;
run;
%end;

这会正确生成这些数据集,但是对于那些无法拟合的宏变量,日志中仍然存在日志错误。

1 个答案:

答案 0 :(得分:1)

您可以将日志重定向到如下文件:

filename logfile "\\SERVER\LOG\mylog.log";

    proc printto log=logfile new;
    run;

然后当你的PROC MIXED完成后,你可以在日志文件中过滤字符串" ERROR" :

....YOUR PROC MIXED...

/*come back to normal log*/
    proc printto;
    run;

/*check the log file*/
    DATA CHECKLOG;
            LENGTH ROWS $200;
            LABEL ROWS = 'Messages from LOG';
            INFILE "\\SERVER\LOG\mylog.log" TRUNCOVER;
            INPUT ROWS &;
            LINE = _N_;

            IF SUBSTR(ROWS,1,5)='ERROR' /*OR SUBSTR(ROWS,1,7)='WARNING'*/ THEN

            OUTPUT;
    RUN;

数据集中将包含所有ERROR和(或警告,如果需要)。

然后你必须检查表是否为空。 如果是,您可以继续编写脚本。

你可以通过这种方法

来做到这一点
proc sql;
select * from checklog;
run;
%put n=&sqlobs;

如果sqlobs大于0,则表示您有错误。 你可以通过像这样的宏函数来检查sqlobs:

%macro checklog;
    proc sql;
    select * from checklog;
    run;

%if (&sqlobs>0) %then ...
%else ...

%mend checklog;