2015-12-04 74 views
0

Do Loop Concepts存在一些問題。我有一個靜態日期與自定義(可以是任何爲此事日期) -Do Loop使用呼叫SYMPUT

%LET DATE = %SYSFUNC(TODAY()); 
%PUT &DATE; 

我需要建立一系列的持有10天遞增該日(& DATE)的值宏變量,所以我用一個簡單的數據步驟實現這一 -

DATA _NULL_; 
CALL SYMPUT('DATE10',&DATE+10); 
CALL SYMPUT('DATE20',&DATE+20); 
CALL SYMPUT('DATE30',&DATE+30); 
RUN; 

該方法對於& DATE的初始值後的10至30天的增量確定。我現在的任務是將報告的執行時間延長至距日期& DATE的250天(增加10天)。假設DO LOOP是最有效的執行方法,我無法理解循環如何在循環內「創建」一個新的宏變量(例如& Date150)。假設下面的語法是正確的,我不知道下一個/正確的步驟是:

DATA _NULL_; 
DO I=10 TO 150 BY 10; 
CALL SYMPUT('DATE10',&DATE); 
END; 
RUN; 

我將如何「增量」宏VAR(& DATE10,& Date20 ...... &的實際名稱Date150),同時執行基於10天增量創建宏變量?

+0

爲什麼你需要所有這些宏變量?爲什麼不把值列表傳遞給一個宏變量。簡單得多。 – Tom

+0

有一系列查詢爲每個日期條件執行彙總,所以我想我只是將查詢調出每個日期以創建每個日期的彙總值/子集表。說實話,這是我當時最好的方法。你的建議......我不知道我可以這麼做(在一個變量中創建一個「列表」值)。當我將人蔘考列表看作是:進入價值時,「select into:」是如何工作的?也許你可以指引我參考正確的方向?非常開放,以改善我的方法.... – SMW

+0

假設你有三個日期。所以你做'日期= 1 2 3'。然後,如果您想按照日期生成報告,則只需執行「處理報告」; (&日期)中的日期;按日期; .... run;'在一個更復雜的報告中,您只需向%sysfunc(countw(&日期))添加'%do i = 1%; %let date =%scan(&date,&i); ... where date = &date; ...%end;' – Tom

回答

2

通過串聯函數使用I變量作爲變量名的一部分,cats()可能是合適的。此外,個人喜好,但我更喜歡呼叫SymputX,因爲它刪除任何額外的空間。

DATA _NULL_; 
DO I=10 TO 150 BY 10; 
CALL SYMPUTX(cats('DATE', i), &DATE+i); 
END; 
RUN; 
+0

CALL SYMPUTX(cats('DATE',i),&DATE + i); maybe? –

+0

SYMBOLGEN:宏變量DATE10解析爲20426 SYMBOLGEN:宏變量DATE20解析爲20426 SYMBOLGEN:宏變量DATE150解析爲20426,不知道我解釋是否正確或是否存在需要包含的隱含步驟。 – SMW

+0

@Haikuo Bian - 工作!不知道我可以連接CAT功能中的「I」。因爲他引用了同樣的概念(或者我相信),所以應該爲Reeza和User667 +1。 – SMW

1

足夠簡單 - 傳入一個變量作爲call symput的第一個參數,其中包含要創建的宏變量的名稱。

1

考慮將值放入單個宏變量中。只要列表不超過宏變量的最大長度。

DATA _NULL_; 
    length dates $32767 ; 
    date=today(); 
    DO I=10 TO 150 BY 10; 
    dates=catx(' ',dates,date+i); 
    end; 
    CALL SYMPUTx('dates',dates); 
RUN; 

然後在您的報告代碼中,您可以使用日期列表。

proc report ; 
    where date in (&dates); 
... 
run; 

或者,如果你有宏,您可以使用一個%DO循環。

%do i=1 %to %sysfunc(countw(&dates)); 
    %let date=%scan(&dates,&i); 
    proc report; 
    where date=&date; 
    .... 
%end;