将字符动态传递给宏

时间:2017-11-07 16:53:33

标签: sas ssas

我试图将文件名传递给宏。宏每月运行一次,因此,我尝试使用月前缀存储输出文件。在当前的代码中,每个月都必须手动提供文件名(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传递给宏但它也失败了。

有任何建议如何解决这个问题?谢谢你的帮助!!

1 个答案:

答案 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.)");