2013-12-23 57 views
0

我有這樣的數據, 我想用更新某個表宏數據_NULL_內運行宏

DATA WORK.t1; 
    LENGTH 
     POLICY_RK   8 
     POLICY_VERSION  8 
     TREATMENT_IND  8 ; 
    FORMAT 
     POLICY_RK  BEST12. 
     POLICY_VERSION BEST12. 
     TREATMENT_IND BEST12. ; 
    INFORMAT 
     POLICY_RK  BEST12. 
     POLICY_VERSION BEST12. 
     TREATMENT_IND BEST12. ; 
    INFILE DATALINES4 
     DLM='7F'x 
     MISSOVER 
     DSD ; 
    INPUT 
     POLICY_RK  : BEST32. 
     POLICY_VERSION : BEST32. 
     TREATMENT_IND : BEST32. ; 
DATALINES4; 
105000002 
114000005 
123000007 
132000001 
141000007 
1508 
;;;; 

我試圖運行下面的代碼:

 %macro storno (pol_rk , pol_ver); 
     PROC SQL; 
      UPDATE t1 
      SET POLICY_VERSION=POLICY_VERSION*3.1113 
      where POLICY_RK=&pol_rk and policy_Version = &pol_ver; 
     QUIT; 
%mend ; 





data _null_; 
     set t1 ; 

     IF input(TREATMENT_IND,best12.) eq 1 THEN do; 
      call symputx("a",policy_rk); 
      call symputx("b",pol_ver); 
      end; 
      %storno(&a, &b); 



     %put a=&a; 
     %put b=&b; 
run; 

但得到一個警告消息:

警告:表觀符號引用一個沒有解決。 警告:明顯的符號引用B未解決。 注意:數字值已在以下位置轉換爲字符值:(行):(列)。 19:21
注意:從數據集WORK.T1中讀取了6個觀察值。 注:DATA語句使用(總處理時間): 實時0.00秒 CPU時間0.00秒

注:沒有行中WORK.T1進行了更新。

我究竟做錯了什麼......?

回答

3

另一個很好的解決了這個運行 - 往往更好,國際海事組織,因爲有CALL的一些怪異的後果EXECUTE會影響宏從它所謂的工作方式與調用明碼 - 是SELECT INTO。

proc sql; 
select cats('%storno(',policy_rk,',',pol_ver,')') into :calllist separated by ' ' 
from t1 
where input(TREATMENT_IND,best12.) eq 1 
; 
quit; 

&calllist; 

,拉電話接入宏變量(&呼叫清單)的列表,然後運行它們在開放的文本,就好像你分開運行。

你也應該解開的PROC SQL如果可能的話;它會添加一些額外的開銷,以便多次打開/關閉PROC SQL。

取出PROC SQL和宏退出,然後調用它像這樣:

proc sql; 
&calllist; 
quit; 
5

CALL SYMPUTX值分配給宏變量,但這些宏觀變量是不可用,直到在他們中分配的數據步驟結束之後。

這是因爲宏語言數據步驟的結果之前編譯。因此SAS在處理DATA步驟以分配宏變量&a&b之前,會看到您致電%storno(&a, &b)

請參閱「問題嘗試引用......」這一環節款更多:https://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000210266.htm

這就是爲什麼你看到有關的符號引用未解決的警告 - 他們根本沒有你的時候存在正在嘗試使用它們。

+1

謝謝!使用呼叫執行代替:) – user2518751

+1

另請注意,您的宏調用PROC SQL將結束數據步驟。如果沒有在所有DATA步驟處理結束時運行的調用EXECUTE,或者在9.2及更高版本的FCMP例程內可用的RUNMACRO(我認爲這是名稱),則不能在數據步驟內調用PROC。 – DomPazz

+1

'FCMP'函數中的'RUN_MACRO',或'DOSUBL'在9.4+的數據步驟中工作。 – Joe