如何通过变量将值传递给sas中的宏

时间:2017-03-09 09:55:46

标签: sas sas-macro

这是我的代码

%macro redemptions1(startdate, enddate, sd, ed, sunday1, sunday2);
data _null_;
%put &startdate;
run;

%mend redemptions1;
data _null_;
format tday date9.;
format sd date9.;
format ed date9.;
tday=today();
if weekday(tday) = 1 then do; ed = intnx('day',tday,-9); sd = intnx('day',tday,-15);end;
if weekday(tday) = 2 then do; ed = intnx('day',tday,-3); sd = intnx('day',tday,-9);end;
if weekday(tday) = 3 then do; ed = intnx('day',tday,-4); sd = intnx('day',tday,-10);end;
if weekday(tday) = 4 then do; ed = intnx('day',tday,-5); sd = intnx('day',tday,-11);end;
if weekday(tday) = 5 then do; ed = intnx('day',tday,-6); sd = intnx('day',tday,-12);end;
if weekday(tday) = 6 then do; ed = intnx('day',tday,-7); sd = intnx('day',tday,-13);end;
if weekday(tday) = 7 then do; ed = intnx('day',tday,-8); sd = intnx('day',tday,-14);end;
startdate = (year(sd) - 1900) * 10000 + month(sd) * 100 + day(sd);
enddate = (year(ed) - 1900) * 10000 + month(ed) * 100 + day(ed);
sunday1 = year(intnx('day',sd,-6))*10000+month(intnx('day',sd,-6))*100+day(intnx('day',sd,-6));
sunday2 = year(intnx('day',sd,1))*10000+month(intnx('day',sd,1))*100+day(intnx('day',sd,1));
%redemptions1(startdate,enddate,sd,ed,sunday1,sunday2); 
run;

如果我通过变量startdate,enddate等传递值,则redemeptions1宏只打印'startdate'而不是实际打印startdate的值。如何让它打印变量中包含的值?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要构建一个对宏的调用作为文本字符串,然后告诉SAS使用 cboPlanName.value=pname cboPlanName=pname cboPlanName.text=pname CALL EXECUTE函数执行它。

宏调用上的参数需要是文字文本,给出您想要的值。您在数据步骤中的调用开始DOSUBL,因此第一个参数是文字文本%redemptions1(startdate,...以及宏打印的内容。相反,你可以做类似的事情:

startdate

这构造了必要的调用 - 类似于myCall = '%redemptions1(' || startdate || ')'; call execute(myCall); - 然后执行它。你当然可以在一行中做到这一点:

%redemptions1(09MAR2017)

当然,您需要填写其他参数的值。

顺便说一句,您的日期计算看起来有点粗略 - call execute('%redemptions1(' || startdate || ')'); startdate可能不包含您认为他们所做的值。请查看enddate功能,看看是否有帮助。您正在创建一个类似于 1170309'对于今天的日期--100万,17万,3和9年。年份值很奇怪 - 你真的想要117(2017 - 1900)吗?如果您要求SAS将该值作为日期处理,它将把它视为自01JAN1960以来的一些天,这将是未来的某种日期。