我有一个创建时间戳的宏(附加到输出文件名)。但是,我不想记住宏赋值的宏变量,而是希望将宏变量分配给宏的结果(如果它不够圆)。
%let tms= %tms();
这是当前的宏....
%macro tms ;
%* Create a Timestamp ;
%let tms_date= %sysfunc(date(),yymmdd10.) ; %* Todays date ;
%let tms_time= %sysfunc(time(),time.) ; %* Current Time ;
%* Format mmddyyhhmmss ;
%let tms=_%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:) ;
%mend ;
你如何引用它以使其有效? 另外,我只是从宏中删除“%let tms =”吗?
此外,相同的引用是否适用于以下ODS分配声明?
ods Tagsets.excelxp file="&outname.&tms..xml" style= Styles.XLsansPrinter ;
感谢您抽出宝贵时间....
答案 0 :(得分:6)
具有返回值的宏通常称为宏函数。在修复声明之前,如果你输入一个没有分号的表达式/值,它会将值返回给调用者。如果返回值在if-else块中,则;是必要的。
基本上,您可以按照建议进行操作,并从宏内删除%let tms =。是的,我相信它可以与ods赋值声明一起使用。
%macro tms ;
%* Create a Timestamp ;
%let tms_date= %sysfunc(date(),yymmdd10.) ; %* Todays date ;
%let tms_time= %sysfunc(time(),time.) ; %* Current Time ;
%* Format mmddyyhhmmss ;
_%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:)
%mend;
%let tms=%tms;
%put **&tms**;
作为另一个建议,您可以通过使用%scan函数的压缩函数insead来简化代码,如下所示
%sysfunc(compress(_&tms_date.&tms_time,"-:"));