2017-06-13 15 views
0

我是一個相對的新手來處理宏變量,似乎已經卡住了。符號參考 - 掃描功能在DO LOOP

我有一個宏可以打開一個表並生成一個宏變量& 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傳遞給其他宏?

編輯: 當我修改%執行()從它的工作原理遠程服務器運行全部 - 但我還是不概念性理解爲什麼...

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塊中聲明一個宏時,整個宏將被提交併遠程定義。