SAS宏功能与数据步骤功能

时间:2017-02-22 21:44:44

标签: macros sas sas-macro

我在解决宏中的宏变量时遇到问题。我认为问题在于语言,以及SAS如何将我的语句发送到宏处理器与编译器。

这是我的代码的主旨:

 ....some import statements...
%MACRO FCERR(date=);

%LET REMHOST=MainFrame PORT;
SIGNON REMHOST USER=&SYSUSERID. PASSWORD= _PROMPT_;

    %SYSLPUT date=&yymm. ;

RSUBMIT;

            FILENAME FIN "MY.FILE.QUALIFIERS" DISP = shr;

            ......some datasteps......

                LIBNAME METRO "My.File.Qualifiers" DISP=shr;
/********************************************************************

                        *******   *********
                        **        **     **
                        *******   **  *  **
                        **        **   * ** 
                        *******   *********
                                          *
/*******************************************************************/

%IF %SYSFUNC(EXIST(work.EQ_&date._FIN)) %THEN %DO;

            PROC UPLOAD Data = work.EQ_&date._FIN
                        OUT = work.EQ_&date._FIN;

..........a bunch of data steps.................. 

PROC SQL NOPRINT ;
        select count(*) as EQB format=10.0 INTO :EQBEF from EQ_1701_FIN ;
        select count(*) as EQA format=10.0 INTO :EQAFTER from trunc_fin_eq ;
QUIT ;

%PUT &EQBEF;
%PUT &EQAFTER;

%IF %SYSFUNC(STRIP(&EQBEF.)) ~= %SYSFUNC(STRIP(&EQAFTER.)) %THEN %DO;

options emailhost= MYEMAILHOST.ORG ;
filename mail email ' '
to= (&recip.)
subject = "EQ Error QA/QC";

DATA _NULL_;
file mail ;
put "There were potential errors processing the Equifax Error file.";
put "The input dataset contains %SYSFUNC(STRIP(&EQBEF.)) observations.";
put "The output dataset contains %SYSFUNC(STRIP(&EQAFTER.)) observations.";
put "Please check the SAS log for additional details.";
RUN;

%END;

%END;

%ENDRSUBMIT;
%SIGNOFF;

%MEND;

%FCERR(date=&yymm.);

我一直收到一条错误,导致宏停止处理。就是这样:

>         SYMBOLGEN:  Macro variable EQBEF resolves to      24707
>         24707
>         MLOGIC(FCERR):  %PUT &EQAFTER
>         WARNING: Apparent symbolic reference EQAFTER not resolved.
>          &EQAFTER
>          SYMBOLGEN:  Macro variable EQBEF resolves to      24707
>          WARNING: Apparent symbolic reference EQAFTER not resolved.
>          WARNING: Apparent symbolic reference EQAFTER not resolved.
>          ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
>                 operand is required. The condition was: %SYSFUNC(STRIP(&EQBEF.)) ~=
>                 %SYSFUNC(STRIP(&EQAFTER.))
>          ERROR: The macro FCERR will stop executing.

问题:在编译并执行上面的数据步骤%IF %SYSFUNC(STRIP(&EQBEF.)) ~= %SYSFUNC(STRIP(&EQAFTER.)) %THEN %DO;之前,SAS是否尝试处理我的第二个(即内部)%IF%THEN语句我可以从日志中看到SAS之前发出的错误它正在从我的datasteps创建数据集,我相信&EQBEF正在解决的原因是因为它是使用PROC UPLOAD;

创建的

如果是这样,我怎样才能阻止SAS执行第二个%IF%THEN,直到处理完datastep,因为select中的第二个proc sql;语句取决于执行的datasteps。

另外,我无法在proc sql中解析我的日期变量;

E.G。

    PROC SQL NOPRINT ;
        select count(*) as EQB format=10.0 INTO :EQBEF from EQ_1701_FIN ;
        select count(*) as EQA format=10.0 INTO :EQAFTER from trunc_fin_eq ;
QUIT ;

理想情况是:

    PROC SQL NOPRINT ;
        select count(*) as EQB format=10.0 INTO :EQBEF from EQ_&DATE._FIN ;
        select count(*) as EQA format=10.0 INTO :EQAFTER from trunc_fin_eq ;
QUIT ;

但是& DATE。将不会在proc sql语句中解析,但在我的所有libname语句中解析完全正确等等。对于为什么和日期有一些意外情况。将无法在PROC SQL中解析?.....我是否需要在参数列表中引用我的宏中使用的每个变量?

2 个答案:

答案 0 :(得分:1)

您的宏正在本地SAS会话上运行,但由于RSUBMIT;ENDRSUBMIT;语句,生成宏变量的SQL代码正在远程SAS会话上运行,但宏语句是引用本地宏变量。

例如,尝试这个创建本地和远程宏变量的简单程序,并尝试显示值。

signon rr sascmd='!sascmd';
%let mvar=Local ;
%syslput mvar=Remote ;
%put LOCAL &=mvar;
rsubmit rr;
%put REMOTE &=mvar ;
endrsubmit;
signoff rr;

如果在open SAS中运行它,%PUT语句将分别显示MVAR等于LOCAL和REMOTE。

但你把它包装在一个宏中运行它

%macro xx;
signon rr sascmd='!sascmd';
%let mvar=Local ;
%syslput mvar=Remote ;
%put LOCAL &=mvar;
rsubmit rr;
%put REMOTE &=mvar ;
endrsubmit;
signoff rr;
%mend xx;
options mprint;
%xx;

您将看到两个%PUT语句都在本地服务器中运行,并显示本地宏变量的值。

答案 1 :(得分:0)

检查日志中的第二个选择

select count(*) as EQA format=10.0 INTO :EQAFTER from trunc_fin_eq ;

如果该数据集不存在,则不会创建宏变量。

您可以将其设置为0以初始化它:

%let EQAFTER=0;