2016-10-06 32 views
0

宏變量包含日期我目前正在使用:減少步驟

data _null_; 
    do i = 1 to 5; 
     temp = -10 * i; 
     %let minimum_date = %sysfunc(intnx(day,%sysfunc(today()),temp),date9.); 
     PUT temp; 
    end; 
run; 

這給了我一個錯誤:

ERROR: Argument 3 to function INTNX referenced by the %SYSFUNC or %QSYSFUNC macro function is not a number. 

任何想法如何解決這個好嗎?

PS:

最終目的表示爲僞代碼雜交:

data _null_; 
    do i = 1 to 5; 
     * set minimum_date to today - i*-10; 
     minimum_date = intnx('day',today(),i*-10); 
     * assign minimum_date to macro variable min_date; 
    call symput(min_date,minimum_date); 
    * invoke programs that use macro variable; 
    %include '/Bla/ChildProgram1.sas'; 
    %include '/Bla/ChildProgram2.sas'; 
    end; 
run; 
+0

爲什麼你在DATA步驟中有宏語句?它將在數據步驟運行之前運行。將其移到DATA步驟之前,以避免混淆自己。然後重新思考你正在嘗試做什麼。 – Tom

+0

原因是我有一個驅動程序,它使用include來運行子程序A和B,後者又使用宏變量。我打算做的是在驅動程序中有一個循環,用於在更改宏變量的同時運行子程序。希望這是有道理的。 – cs0815

+0

@Tom我試圖表達我之前提到的'僞代碼' - 請參閱PS。 – cs0815

回答

3

你問SAS評估字符串TEMP,如果它是一個數字。您應該刪除宏代碼並使用正常代碼。

data _null_; 
    do i = 1 to 5; 
    minimum_date = intnx('day',today(),i*-10); 
    format mininum_date date9.; 
    put i= minimum_date=; 
    call execute(cats('%nrstr(%let) minimum_date=',put(minimum_date,date9),';')); 
    call execute("%include '/Bla/ChildProgram1.sas';"); 
    call execute("%include '/Bla/ChildProgram2.sas';"); 
    end; 
run; 

或者您可以編寫一個宏,以便您可以使用%DO循環。

%macro runall ; 
    %let start=%sysfunc(today()); 
    %do i=1 %to 5; 
    %let minimum_date=%sysfunc(intnx(day,&start,-10*&i),date9); 
    %include '/Bla/ChildProgram1.sas'; 
    %include '/Bla/ChildProgram2.sas'; 
    %end; 
%mend runall; 
%runall; 
+0

驚人 - 謝謝! – cs0815