你实际上并没有以正确的方式传递信息 - 你混合了两个不同的东西,这导致了你的问题。
您可以在宏变量中解析这些函数的结果,或者您可以存储函数调用并将其视为您将函数键入数据步骤 - 因此请使用CATS或其他东西来组合它们。 / p>
实际上,你最终会得到像"\\path\to\COMPRESS(INTNX(MONTH..."这样的文件名,而不是这些函数的结果,因此就是你的问题。
所以,一个选择:
DATAFILE= cats("...Files_Submitted\",&yrmm.,"\Reconcile\",&quarter.,"Principal balances.xls";
这会让函数按预期提供它们的值。
另一个选项是使用%SYSFUNC来询问要在宏变量中解析的值。这是更常见的方式,但当然,对于所有目的来说,两者都没有特别好。
%LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.));
与其他两个相似。请注意,我删除MONTH周围的引号,因为%SYSFUNC调用中没有使用引号(除非您想使用引号字符本身,而不是字符串分隔符)。
%LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.);
请注意,我将格式直接放在SYSFUNC调用中;另请注意,我们不在宏变量中使用连接字符(它们只生成文本),通常您不需要使用COMPRESS(尽管并非总是如此)。
%LET qtr = %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3)));
这里我们使用%SYSEVALF进行数学运算(通常你不能在宏语法中使用非整数数学)。我们也会从Q中删除引号,然后将其排成一行。
全部放在一起:
%let monthsAgo = 3;
%LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.));
%put &=EOLM;
EOLM=20789
%LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.);
%put &=yrmm;
YRMM=201612
%LET qtr = %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3)));
%put &=qtr;
QTR=2016Q4
当然,使用yrmm / qtr的格式更容易......
%let yrmm = %sysfunc(putn(&eolm.,yymmn6.));
%let qtr = %sysfunc(putn(&eolm.,yyq6.));
%put &=yrmm &=qtr;
或者甚至(这可能会有点可爱)从%SYSFUNC中移除&EOLM并让%SYSFUNC格式选项处理格式化。请注意,此处EOLM不存储数字,但会存储您在屏幕上看到的文字,并且在定义YRMM或QTR之前,该数字无法解析。
%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.);
%let yrmm = %sysfunc(&eolm.,yymmn6.);
%let qtr = %sysfunc(&eolm.,yyq6.);
%put &=yrmm &=qtr;