Laura
Laura

Reputation: 45

Execute proc step only if it doesn't cause log error (inside macro) SAS

I'm trying to test different covariance structures inside macro with 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;

Some of the covariance structures I need to fit in model causes errors and I'm trying to find a way to execute this proc mixed statement only, if it doesn't cause error with value of &type.

I have been working with %sysfunc and but haven't been able to resolve this yet.

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

This produces these datasets correctly, but still log errors exists in log for those macro variables that can not be fitted.

Upvotes: 1

Views: 123

Answers (1)

Thogerar
Thogerar

Reputation: 339

You can redirect the log to a file like that :

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

    proc printto log=logfile new;
    run;

And then when your PROC MIXED is finished, you can filter on the log file for the string "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;

You will have all the ERROR and (or WARNING if needed) in a dataset.

Then you have to check if the table is empty. If YES, you can continue your script.

You can do it via this method

proc sql;
select * from checklog;
run;
%put n=&sqlobs;

If sqlobs is greater than 0, then you have errors. You can check the sqlobs via a macro function like this :

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

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

%mend checklog;

Upvotes: 1

Related Questions