Sas 无法解析call symput中的宏

Sas 无法解析call symput中的宏,sas,sas-macro,Sas,Sas Macro,我在数据步骤中调用用户定义的宏。宏包含一个do循环,我想将do循环的I计数器的值分配给我正在使用调用symput的宏变量。请在下面找到我的代码。你能告诉我哪里出了问题吗 %let RedressStartYear=2007; %let RedressEndDate= '31OCT2017'D; *Yearly Interest Rate; %let int_rt_2007= '0.0421'; %let int_rt_2008= '0.0421'; %let int_rt_2009= '0.0

我在数据步骤中调用用户定义的宏。宏包含一个do循环,我想将do循环的I计数器的值分配给我正在使用调用symput的宏变量。请在下面找到我的代码。你能告诉我哪里出了问题吗

%let RedressStartYear=2007;
%let RedressEndDate= '31OCT2017'D;

*Yearly Interest Rate;
%let int_rt_2007= '0.0421';
%let int_rt_2008= '0.0421';
%let int_rt_2009= '0.0421';
%let int_rt_2010= '0.0421';
%let int_rt_2011= '0.0421';
%let int_rt_2012= '0.0419';
%let int_rt_2013= '0.0429';
%let int_rt_2014= '0.0430';
%let int_rt_2015= '0.0401';
%let int_rt_2016= '0.0378';
%let int_rt_2017= '0.0358';


Data Redress_Data;
format BilledMonth date9.;
BilledMonth='01MAR2013'D;
BilledYear=Year(BilledMonth);
Customer='ABC Ltd.';
OverChargeAmt=34.6656;
run;

%macro Calculate_CI(billmon, Amt,Payday);

CI_AMT=0;

do i=&RedressStartYear. to year(&payday.) by 1;

*The value of i not getting resolved and getting assigned to the macro variable yr;
Call symput ('yr',i);

    if i<year(&billmon.) then CI_AMT= CI_AMT+0;

    if i=Year(&billmon.) then do;

        No_days_Int_&yr.=intck('day',&billmon.,MDY(12,31,i))+1;
        Days_in_Year_&yr.=intck('day',MDY(01,01,i),MDY(12,31,i))+1;
        CI_AMT= CI_AMT+ (&&int_rt_&yr.* No_days_Int_&yr. * &Amt.)/Days_in_Year_&yr.; end;

    if i>Year(&billmon.) and Year(&billmon.)< Year(&Payday.) then CI_AMT=CI_AMT + (&&int_rt_&yr. * &Amt.);

    if i=Year(&Payday.) then do;
        No_days_Int_&yr.=intck('day',MDY(01,01,i),&Payday.)+1;
        Days_in_Year_&yr.=intck('day',MDY(01,01,i),MDY(12,31,i))+1;
        CI_AMT=CI_AMT+ (&&int_rt_&yr. * No_days_Int_&yr. * &Amt.)/Days_in_Year_&yr. ; end;

end;

%mend Calculate_CI;

Data Redress_Data_CI;
set Redress_Data;
    %Calculate_CI(BilledMonth, OverChargeAmt,&RedressEndDate.);
run;

您正在混合使用宏代码和数据步骤代码。宏变量引用(如&yr.和&int\u rt\uyr.)的值在编译数据步骤之前以及在DO循环运行之前很久进行计算

如果要在数据步骤中创建一组变量,请使用数组。然后可以使用I索引到数组中


要创建宏,您需要从使用SAS代码开始。然后,您可以尝试创建一个宏,该宏将为您生成该代码的不同版本。

如果您确实希望输出数据集包含23个新变量,如中所示

2007年无工作日 2007年的天数 ... 2017年无工作日 2017年的天数 CI_金额 若不想使用数组,请将宏代码更改为在宏中循环,而不是在数据步骤中循环。所以

do i=
将成为

%do i=
并将原始匹配端更改为%end

此更改后,宏将生成一些“墙纸”数据步骤源代码,用于执行公式

代码结构很好,没有经验的程序员可能会尝试在宏变量i中处理年份,就好像它是一个数据步变量一样


建议始终能够首先在普通数据步骤中编写解决方案,然后可以通过抽象和参数化普通代码中的显著特征和模式来对概念进行宏化。

查找调用执行,这是从数据步骤调用宏的方式。