Como você atribuir o resultado de uma função macro a uma variável macro no SAS?
Pergunta
Eu tenho uma macro que cria um timestamp (para acrescentar nomes de arquivo de saída). No entanto, ao invés de ter que lembrar o que variável macro os cessionários macro o valor para, eu preferiria para atribuir uma variável de macro para o resultado da macro (se isso não for suficiente circular).
%let tms= %tms();
Esta é a macro atual ....
%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 ;
Como você citar isso para fazê-lo funcionar? Além disso, seria eu apenas remover o "% deixar TMS =" do macro?
Além disso, faria o mesmo trabalho citando para a seguinte declaração ODS tarefa?
ods Tagsets.excelxp file="&outname.&tms..xml" style= Styles.XLsansPrinter ;
Obrigado por tomar o tempo ....
Solução
A macro com um valor de retorno é geralmente chamado de uma função macro. Antes da statment melhorando, se você colocar uma expressão / valor sem um ponto e vírgula, ele irá retornar o valor para o chamador. Se o valor de retorno é em um bloco de if-else, a; seria necessário.
Basicamente, você pode fazer como você sugere e remover o% deixar TMS = de dentro do macro. E sim, eu acredito que ele iria trabalhar com o statment ods atribuição.
%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**;
Como outra sugestão, você pode simplificar o código um pouco usando a função compressa insead das funções de digitalização% como esta ??p>
%sysfunc(compress(_&tms_date.&tms_time,"-:"));