マクロ内のマクロ変数の解決に問題があります。私はこの問題が言語であり、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内で解決されませんか?.....マクロで使用されるすべての変数をパラメータリストで参照する必要がありますか?
この数回を読んだ後、私は問題を理解し、どのようにそれを解決します。私がしたのは、Rsubmit内の 'PROC SQL SELECT COUNT(*)'ステートメントで、 '%SYSRPUT'を使用してリモートサーバーの値をローカルサーバーの値に割り当ててから、'%IF%THEN'ステートメントを処理しましたローカルに。私は一つの質問がありますが、 '%let mvar = Local;'の目的は何ですか?それを '%put LOCAL &=mvar;'のように参照していますか?私は 'LOCAL &=mvar;'について混乱しています。 '&=';はどういう意味ですか?私はこのような方法で構築されたものを見たことがありません... – DukeLuke
'%put&= mvar'は'%put MVAR =&mvar'の新しい短い手です。余分なテキストLOCALとREMOTEを%putに追加して、どのステートメントがログに行を生成したかを知ることができました。 – Tom