2017-03-09 66 views
0

這裏是我的代碼我如何通過變量的值傳遞給宏在SAS

%macro redemptions1(startdate, enddate, sd, ed, sunday1, sunday2); 
data _null_; 
%put &startdate; 
run; 

%mend redemptions1; 
data _null_; 
format tday date9.; 
format sd date9.; 
format ed date9.; 
tday=today(); 
if weekday(tday) = 1 then do; ed = intnx('day',tday,-9); sd = intnx('day',tday,-15);end; 
if weekday(tday) = 2 then do; ed = intnx('day',tday,-3); sd = intnx('day',tday,-9);end; 
if weekday(tday) = 3 then do; ed = intnx('day',tday,-4); sd = intnx('day',tday,-10);end; 
if weekday(tday) = 4 then do; ed = intnx('day',tday,-5); sd = intnx('day',tday,-11);end; 
if weekday(tday) = 5 then do; ed = intnx('day',tday,-6); sd = intnx('day',tday,-12);end; 
if weekday(tday) = 6 then do; ed = intnx('day',tday,-7); sd = intnx('day',tday,-13);end; 
if weekday(tday) = 7 then do; ed = intnx('day',tday,-8); sd = intnx('day',tday,-14);end; 
startdate = (year(sd) - 1900) * 10000 + month(sd) * 100 + day(sd); 
enddate = (year(ed) - 1900) * 10000 + month(ed) * 100 + day(ed); 
sunday1 = year(intnx('day',sd,-6))*10000+month(intnx('day',sd,-6))*100+day(intnx('day',sd,-6)); 
sunday2 = year(intnx('day',sd,1))*10000+month(intnx('day',sd,1))*100+day(intnx('day',sd,1)); 
%redemptions1(startdate,enddate,sd,ed,sunday1,sunday2); 
run; 

如果我通過傳遞變量值起始日期,結束日期等,該redemeptions1宏只是打印「開始日期」,而不是實際印刷startdate的值。我如何獲得它打印變量(s)中包含的值?

謝謝!

回答

0

您需要構建一個到宏的調用作爲文本字符串,然後告訴SAS使用CALL EXECUTEDOSUBL函數執行它。

宏調用中的參數需要是文本文本,以提供所需的值。您在數據步驟中的呼叫開始%redemptions1(startdate,...,因此第一個參數是文字文本startdate,這就是宏的打印內容。相反,你可以這樣做:

myCall = '%redemptions1(' || startdate || ')'; 
call execute(myCall); 

此構造所需的呼叫 - 像%redemptions1(09MAR2017) - 然後執行它。你當然可以做到這一點:

call execute('%redemptions1(' || startdate || ')'); 

當然,你需要填寫其他參數的值。

您的日期計算看起來有點粗略,順便說一句 - startdateenddate可能不包含您認爲他們所做的值。請查閱dhms函數,看看是否有幫助。你今天創建的數字是'1170309' - 100萬,17萬,3百和9。年值非常奇怪 - 你真的想要117(2017 - 1900)嗎?如果您要求SAS將該價值作爲日期來處理,那麼它會將其視爲自1919年1月1日以來的幾天,這將是未來的某種日期方式。

+0

感謝您的迴應克里斯。我確實嘗試了上面提到的方法,它說變量未初始化。我試圖通過執行調用來將PUT中的startdate放入宏中,但它向我拋出了錯誤「變量未初始化」。 W.r.t的日期,是的,我正在尋找特定的格式,因爲我的數據集要求它。 – bhavya

+0

什麼說「變量未初始化」?確保CALL EXECUTE是數據步驟的一部分,即在最終'運行'之前。在宏中,您可以刪除'data _null_;'和'跑';只是保留'%put'語句,但我不希望有任何其他消息。嘗試CALL EXECUTE的兩行版本並添加'put myCall =;'以確認正在執行的內容。設置選項MPRINT SYMBOLGEN也可能有助於診斷問題。 –

+0

謝謝克里斯,它現在工作。 – bhavya