这是我的代码
%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的值。如何让它打印变量中包含的值?
谢谢!
答案 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以来的一些天,这将是未来的某种日期。