尝试编写宏以按 yyyymmdd 读取 24 个月的数据

Trying to write macro to read 24 months of data by yyyymmdd

我正在尝试编写一个宏来替换一些当前代码。现在的代码是这样的:

data _null_;
 call symput('as_of_date_nbr1', put(intnx('month', today(),-1, 'E'), yymmddn.));
run;
%put &as_of_date_nbr1 yields 20210831

每个 30 个月都有一个 data_null。然后在语句

的数据步骤中使用该变量
where date = &as_of_date_nbr1

我想编写一个宏,其中变量 as_of_date_nbr 将采用 1-30 的宏变量,而 intnx 函数也将采用 1-30 的宏变量 所以如果可能的话,像这样循环

data _null_;
call symput('as_of_date_nbr.&macvar, put(intnx('month,today(),-&macvar, 'E'), yyyymmddn.))

到目前为止我运气不好,任何想法将不胜感激。

首先尝试创建一个包含 30 个所需日期的数据集。

data demo;
    do i=1 to 30;
        var_name=catt('month', put(i, z2. -l));
        var_value=intnx('month', today(), -1*i, 'e');
        format var_value yymmddn8.;
        output;
    end;
run;

确定正确后,您可以添加 CALL SYMPTUX 行来创建宏变量。

    call symputx(var_name, put(var_value, yymmddn8.), 'g');

根据您的总体情况,您可能想要探索 CALL EXECUTE。例如,如果您使用这些值循环宏而不是调用 symputx,则可以使用 CALL EXECUTE() 直接使用这些值调用宏。

因此,如果您有这样一个名为 %filter 的宏:

%macro filter(date_param);
   sas code
%mend;

您可以这样称呼它:

 call execute(catt('%filter_data(', put(var_value, yymmddn8.), ');'));

总的来说应该是这样的:

data demo;
    do i=1 to 30;
        var_name=catt('month', put(i, z2. -l));
        var_value=intnx('month', today(), -1*i, 'e');
        format var_value yymmddn8.;
        call symputx(var_name, put(var_value, yymmddn8.), 'g');
        *call execute(catt('%filter_data(', put(var_value, yymmddn8.), ');'));
        output;
    end;
run;

*check macro variables created properly;
%put &month01.;
%put &month15.;
%put &month30.;