使用CALL SYMPUT执行循环

时间:2015-12-04 19:58:45

标签: sas sas-macro

在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)的实际名称?

3 个答案:

答案 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,其中包含您要创建的宏变量的名称。