2009-05-27 6 views
2

Ich habe ein Makro, das einen Zeitstempel erstellt (an Ausgabedateinamen anhängen). Anstatt sich jedoch daran zu erinnern, welcher Makrovariablen der Makro den Wert zuweist, würde ich lieber eine Makrovariable dem Ergebnis des Makros zuweisen (wenn das nicht kreisförmig genug ist).Wie weisen Sie das Ergebnis einer Makrofunktion einer Makrovariablen in SAS zu?

%let tms= %tms(); 

Dies ist das aktuelle Makro ....

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

Wie zitieren Sie diese es funktioniert? Würde ich auch nur "% let tms =" aus dem Makro entfernen?

Würde das gleiche Zitat auch für die folgende ODS-Zuweisungsanweisung funktionieren?

ods Tagsets.excelxp file="&outname.&tms..xml" style= Styles.XLsansPrinter ; 

Vielen Dank für die Zeit nehmen ....

Antwort

6

Ein Makro mit einem Rückgabewert wird in der Regel eine Makro-Funktion aufgerufen. Wenn Sie einen Ausdruck/Wert ohne Semikolon eingeben, wird der Wert vor dem Mend-Statement an den Aufrufer zurückgegeben. Wenn der Rückgabewert in einem If-Else-Block ist, wird der; wäre notwendig.

Grundsätzlich können Sie tun, was Sie vorschlagen und entfernen Sie die% Let tms = aus dem Makro. Und ja, ich glaube, es würde mit der ods-Zuweisung funktionieren.

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

Als weiterer Vorschlag, können Sie den Code ein wenig, indem Sie die Kompresse Funktion insead der% Scanfunktionen wie dieses

%sysfunc(compress(_&tms_date.&tms_time,"-:")); 
vereinfachen