2017-02-22 11 views
0

У меня проблема с разрешением макропеременных в макросе. Я думаю, что проблема - это язык, и как 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? ..... Нужно ли мне иметь каждую переменную, используемую в моем макросе, указанном в списке параметров?

ответ

1

Ваш макрос работает на вашем локальном сеансе SAS, но из-за операторов ваш SQL-код, который генерирует макро переменную, запущен на удаленном сеансе SAS, но операторы макросов ссылаются на локальную макроперемену.

Например, попробуйте эту простую программу, которая создает локальную и удаленную макропеременные и пытается показать значения.

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

Если вы запустите его в открытом SAS заявления PUT% покажет, что MVAR равно к локальным и удаленным, соответственно.

Но вы заключаете внутри макроса перспективы это

%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 работать в локальном сервере и отобразить значение локальной макропеременной.

+0

После прочтения это несколько раз, я понимаю проблему и способы ее решения. То, что я сделал, это мой 'PROC SQL SELECT COUNT (*)' Заявления в Rsubmit, используемый '% SYSRPUT', чтобы присвоить значение на удаленном сервере значению на локальном сервере, а затем обработал мой оператор'% IF% THEN' на местном уровне. У меня есть один вопрос: Какова цель '% let mvar = Local; ', а затем ссылаться на него как'% put LOCAL &=mvar; '? Я смущен насчет 'LOCAL &=mvar;'. Что означает '&=';? Я никогда не видел ничего построенного таким образом ... – DukeLuke

+1

'% put & = mvar' - новая короткая рука для'% put MVAR = & mvar'. Я добавил дополнительный текст LOCAL и REMOTE для% put, чтобы вы могли указать, какой оператор сгенерировал строку в журнале. – Tom

0

Проверьте журнал для второго выбора

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

Если набор данных не существует, переменная макрос не будет создан.

Вы можете установить его в 0, чтобы инициализировать его:

%let EQAFTER=0; 
Смежные вопросы