我在解决宏中的宏变量时遇到问题。我认为问题在于语言,以及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中解析?.....我是否需要在参数列表中引用我的宏中使用的每个变量?
答案 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;