在Do Loop Concepts中遇到一些问题。我有一个用 -
定义的静态日期(可以是任何日期)%LET DATE = %SYSFUNC(TODAY());
%PUT &DATE;
我需要创建一系列宏变量来保存该日期(& DATE)的值增加10天,所以我使用了一个简单的数据步骤来实现这一点 -
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是最有效的执行方法,我无法理解循环如何"创建"循环中的新宏var(例如& Date150)。假设下面的语法是正确的,我不确定下一个/正确的步骤是什么:
DATA _NULL_;
DO I=10 TO 150 BY 10;
CALL SYMPUT('DATE10',&DATE);
END;
RUN;
我将如何增加"在执行基于10天增量的宏变量创建时循环中宏var(& DATE10,& Date20 ...& Date150)的实际名称?
答案 0 :(得分:2)
使用I变量作为变量名的一部分,通过连接函数,cats()可能是合适的。此外,个人偏好,但我更喜欢Call SymputX,因为它删除了任何额外的空格。
DATA _NULL_;
DO I=10 TO 150 BY 10;
CALL SYMPUTX(cats('DATE', i), &DATE+i);
END;
RUN;
答案 1 :(得分: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;
答案 2 :(得分:0)
足够简单 - 将变量作为第一个参数传递给call symput
,其中包含您要创建的宏变量的名称。