2009-05-27 122 views
2

我有一个宏创建一个时间戳(追加到输出文件名)。然而,我并不需要记住宏指定哪个宏变量,我宁愿为宏的结果指定一个宏变量(如果该宏不够圆)。如何将宏函数的结果分配给SAS中的宏变量?

%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 ; 

感谢您抽出宝贵时间....

回答

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**; 

作为另一建议,可以通过使用的%扫描功能压缩功能INSEAD这样

%sysfunc(compress(_&tms_date.&tms_time,"-:")); 
稍微简化代码