2017-06-13 10 views
0

私はマクロ変数を使って作業することは比較的初心者ですが、スタックしているようです。シンボル参照 - DO LOOP内のSCAN関数

テーブルを開き、マクロ変数& TBL_DIMを生成するマクロがあります。 PROC SQL select intoを使用します。

%macro CREATE_DIM_VAR(tbl, var); %macro _; %mend _; 

%syslput tbl = &tbl./remote=gidwsas; 
%syslput var = &var./remote=gidwsas; 

rsubmit; 
     PROC SQL NOPRINT; 

      *Create SELECT statement for columns we want; 
      SELECT ALL_DIM INTO: TBL_DIM SEPARATED BY ', ' 
      FROM ALLDIM_LIST 
      WHERE TBL = "&TBL." AND VAR = "&VAR." 
      ; 
     QUIT; 
endrsubmit; 
%mend; 

%CREATE_DIM_VAR(A、GENDER);

私は次のようにします。

rsubmit; 
    %put &TBL_DIM.; 
endrsubmit; 

それは正常に動作します。

しかし、今、私は別のマクロ内で呼び出すしようとすると:

%macro Execute(); %macro _; %mend _; 

rsubmit; 
%do n = 1 %to 10; 
    %let THIS_VAR = %scan(&TBL_DIM., &n.)); 
    %put &THIS_VAR.; 
%end; 
endrsubmit; 

%mend; 

%は(実行)。

エラーが発生します。 警告:見た目のシンボリックリファレンスTBL_DIMは解決されません。

他のマクロにTBL_DIMを渡すにはどうすればよいですか?

EDIT: 私はそれが動作するリモートサーバーから完全に実行するために)(実行%を変更する - なぜ私は私の最後のコメントを追加しているが、私はまだ...概念的

rsubmit; 
%macro Execute(); %macro _; %mend _; 

    %do n = 1 %to 10; 
     %let THIS_VAR = %scan(&TBL_DIM., &n.)); 
     %put &THIS_VAR.; 
    %end; 

%mend; 
endrsubmit; 

rsubmit; 
    %Execute(); 
endrsubmit; 
+0

最初のマクロはTBL_DIMを作成するので、VAR_DIMが定義されていないことは驚くことではありません。これがちょうどタイプミスであると仮定すると、マクロバールのグローバルスコープとローカルスコープの問題が原因と考えられます。 '%global tbl_dim;'を追加してみてください。両方のマクロの始めに... –

+0

@ChrisLongはい、それは誤植でした! – Wolfspirit

+0

@ChrisLong%GLOBALを追加するとマクロ変数が解決されるようですが、それらは空白として表示されます – Wolfspirit

答えて

1

を理解していません答えとして、以下の参考文献がOPの観察された挙動の決定的理由を示しているので、あなたの非作業場合

計算サービスとマクロ処理の間の相互作用

http://support.sas.com/documentation/cdl/en/connref/61908/HTML/default/viewer.htm#a001584568.htm

、ローカルマクロプロセッサに処理されたブロックを送信する前にrsubmit/endrsubmitブロック内のコードを処理していますリモートサーバー。ただし、rsubmit/endrsubmitブロック内でマクロを宣言すると、マクロ全体が送信され、リモートで定義されます。