Sas 将字符动态传递给宏

Sas 将字符动态传递给宏,sas,ssas,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

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


有什么建议可以解决这个问题吗?谢谢你的帮助

您要做的是为名为
Result
的数据步长变量赋值。名称
Result
并不表示该数据步骤上下文之外的任何内容,因此在调用宏时不会解析为任何内容。相反,您要做的是告诉宏您的输出文件应称为“结果”

您可以通过将
Result=
行替换为
call-symput('Result',put(当前月份,周一)| name)来解决这个问题,它有效地创建了一个名为“Result”的宏变量,然后像这样调用您的sales宏:``%sales(Outdata=&Result,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.)");

宏真的需要DT参数值中的单引号吗?如果你用双引号代替,它会起作用吗?比如:
%销售额(outdata=Oct17_销售额,dt=“2017-10-01”)这更容易生成。