2017-02-22 20 views
0

マクロ内のマクロ変数の解決に問題があります。私はこの問題が言語であり、SASが私のステートメントをMacro Processor vs. Compilerにどのように送っているのかと思います。SASマクロ関数とデータステップ関数

は、ここに私のコードのJISTだ:私は、処理からの私のマクロを停止してエラーを得続ける

....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からデータセットを作成している、と私はそれがもしそうならPROC UPLOAD;

を使用して作成されているため&EQBEFが解決される理由があると信じて前に、どのようにしてまで、THEN%第2のIF%を実行してからSASを防ぐことができますproc sql;の私の第二のselectのステートメントは実行中のデータストアに依存しているので、データ・ステップが処理されます。

また、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内で解決されませんか?.....マクロで使用されるすべての変数をパラメータリストで参照する必要がありますか?

答えて

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; 

オープンSASで実行すると、%PUTステートメントは、MVARがそれぞれローカルおよびリモートと等しいことを示します。

しかし、それは、あなたはそれはあなたが両方%のPUT文は、ローカルサーバーで実行され、ローカルマクロ変数の値を表示していることがわかりますマクロ内

%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; 

を実行をラップします。

+0

この数回を読んだ後、私は問題を理解し、どのようにそれを解決します。私がしたのは、Rsubmit内の 'PROC SQL SELECT COUNT(*)'ステートメントで、 '%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; 
関連する問題