2017-06-22 70 views
-1

我有下面的宏PARAMETERS,它將值賦給五個變量並創建表MD_WRK.SUB_ID。我的問題是宏中的代碼工作正常,直到我把它放在宏中。現在變量沒有被填充,並且用於表創建的PROC SQL沒有被執行。當我刪除「%MACRO」時,PROC SQL顏色會發生變化以表明它是正確的,但是當它們在宏中時,它們會變灰。我不明白爲什麼宏中的代碼被無效。PROC被忽略的SQL宏/宏中的SQL /變量

%MACRO PARAMETERS; 
%GLOBAL FDMVAR1 FDMVAR2 UPBOUND LOBOUND GROUPVAR; 
    %LET FDMVAR1 ='31Mar2017:0:0:0'dt; /* Start Date */ 
    %LET FDMVAR2 = '30Apr2017:0:0:0'dt; /* End Date */ 
    %LET UPBOUND = .01; 
    %LET LOBOUND = -.01; 
    %LET GROUPVAR = 1; 

    PROC SQL; 
     CREATE TABLE MD_WRK.SUB_ID 
      (SUBSYS_ID char(6)); 
     INSERT INTO MD_WRK.SUB_ID 
      VALUES('CBS') 
      VALUES('CDS') 
      VALUES('DDA') 
      VALUES('IMCOR') 
      VALUES('ODL') 
      VALUES('OEC') 
      VALUES('OEC2') 
      VALUES('SAV') 
      VALUES('PWRCDS') 
      VALUES('SMARTY') 
      VALUES('MRKTLN') 
     ; 
     QUIT; 
%MEND PARAMETERS; 
+0

您不要在代碼中的任何地方使用宏變量。我不明白這裏的問題是什麼,你沒有明確說明。請注意,當您像這樣在宏中創建宏變量時,它們使用本地SCOPE創建,因此它們不存在於宏之外。如果您需要在宏外使用它們,則需要將它們定義爲全局宏變量。 – Reeza

+0

謝謝你Reeza。這是問題。我定義了局部變量而不是全局變量。我遇到的問題有兩個: 1)由於我只有本地變量,我的代碼引用宏失敗。由於該代碼失敗,它也不會輸出作爲該進程一部分的表MD_WRK.SUB_ID。這就是爲什麼看起來好像這個宏完全失敗了。它確實只是局部變量具有較大的下游影響。無論如何,謝謝你的幫助。我發佈了更新後的代碼。 –

+0

很高興你的工作。但是對於您發佈的代碼,應該創建MD_WRK.SUB_ID,無論是否使用'%GLOBAL'語句。 – Quentin

回答

0

當你說「PROC SQL顏色改變」如果你指的是代碼的顏色,如圖企業指南或一些其他的客戶端,進行自動的語法着色你在,我就不理着色。在語法着色中有一些小故障,但請注意,這些顏色不是代碼的一部分,所以即使代碼着色表明某些東西可能是錯誤的,只要語法正確,它就可以正常執行。

如果您打開options mprint;並調用您的宏,日誌應該顯示創建了數據集MD_WRK.SUB_ID(或者給出錯誤消息,解釋爲什麼它沒有創建)。

正如@Reeza所提到的,您創建的宏變量可能被創建爲本地宏變量,因此它們不會存在於宏之外。如果要在宏內聲明它們爲%global,則它們將存在於宏的外部,因爲它們將存儲在全局符號表中。但通常有更好的方法,然後依靠全球宏觀變量。

+0

謝謝。我剛剛更新了代碼以使用%GLOBAL。我還將探索其他選項。 –