У меня проблема с разрешением макропеременных в макросе. Я думаю, что проблема - это язык, и как SAS отправляет мои инструкции в Macro Processor vs. Compiler.Функции макросов 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.
Вопрос: SAS пытается обработать мой второй (т.е. внутри)% IF% THEN оператор, прежде чем он компилирует и выполняет шаги, приведенные выше данные %IF %SYSFUNC(STRIP(&EQBEF.)) ~= %SYSFUNC(STRIP(&EQAFTER.)) %THEN %DO;
я могу видеть из журнала, что SAS вливает из ошибки, прежде чем он создает наборы данных из моих datasteps, и я считаю, что причина &EQBEF
в решении, потому что он создает с помощью PROC UPLOAD;
Если да, то как я могу предотвратить SAS от выполнения второго% IF% ТОГДА до обрабатываются данные, так как мой второй оператор select
в proc sql;
зависит от выполняемых данных.
Кроме того, у меня возникают проблемы с получением переменной даты в 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 ;
но & ДАТА. не будет разрешаться в этом proc sql-заявлении, но полностью прекратится во всех моих операторах libname и т. д. Есть ли какая-то непредвиденная причина, почему & дата. не будет разрешаться в PROC SQL? ..... Нужно ли мне иметь каждую переменную, используемую в моем макросе, указанном в списке параметров?
После прочтения это несколько раз, я понимаю проблему и способы ее решения. То, что я сделал, это мой 'PROC SQL SELECT COUNT (*)' Заявления в Rsubmit, используемый '% SYSRPUT', чтобы присвоить значение на удаленном сервере значению на локальном сервере, а затем обработал мой оператор'% IF% THEN' на местном уровне. У меня есть один вопрос: Какова цель '% let mvar = Local; ', а затем ссылаться на него как'% put LOCAL &=mvar; '? Я смущен насчет 'LOCAL &=mvar;'. Что означает '&=';? Я никогда не видел ничего построенного таким образом ... – DukeLuke
'% put & = mvar' - новая короткая рука для'% put MVAR = & mvar'. Я добавил дополнительный текст LOCAL и REMOTE для% put, чтобы вы могли указать, какой оператор сгенерировал строку в журнале. – Tom