我试图将文件名传递给宏。宏每月运行一次,因此,我尝试使用月前缀存储输出文件。在当前的代码中,每个月都必须手动提供文件名(Sep17_Sales,Oct17_Sales等)。我想自动执行此操作,以便SAS生成带有数据文件前缀的月份名称的文件。
宏:
%macro sales (outdata = , dt =);
当前代码
%Sales(Outdata = Sep17_Sales, dt = '2017-09-01');
%Sales(Outdata =Oct17_Sales, dt ='2017-10-01');
我的方法:
data _null_;
current_date = today();
current_month = intnx('month', current_date, 0, "Begginning");
Name = "_Sales";
Result = put(current_month, monyy7.) || name;
run;
%Sales(Outdata=Result, dt='2017-10-01');
当我尝试传递参数时,它会抛出错误。我尝试将结果更改为%Let Result
并将引用&Result
传递给宏但它也失败了。
有任何建议如何解决这个问题?谢谢你的帮助!!
答案 0 :(得分:1)
您正在做的是为名为Result
的数据步变量赋值。名称Result
并不代表该datastep上下文之外的任何内容,因此在您调用宏时不会解析任何内容。你正在做的是告诉你的宏你的输出文件应该被称为“结果”。
您可以通过将Result=
行替换为call symput('Result',put(current_month, monyy7.) || name);
来解决这个问题,这会有效地创建一个名为“Result”的宏变量,然后像这样调用您的销售宏:``%Sales(Outdata =& amp; ;结果,dt ='2017-10-01');
或,您可以抓住所有这些,只需像这样调用您的宏:
%sales(outdata=%sysfunc(today(),monyy7.)_Sales, dt='2017-10-01');
更进一步,假设第二个参数(dt
)总是意味着是月份的第一天格式化为yyyy-mm-dd
并用单引号括起来(尽管如果是这样的话我看到的很少用于将其指定为宏的参数),您可以使调用更加动态:
%sales(outdata=%sysfunc(today(),monyy7.)_Sales, dt=%str(%')%sysfunc(intnx(month,%sysfunc(today()),0,B),E8601DA.)%str(%'));
如果该日期可以用双引号括起来,可以简化为:
%sales(outdata=%sysfunc(today(),monyy7.)_Sales, dt="%sysfunc(intnx(month,%sysfunc(today()),0,B),E8601DA.)");