Sie vorbei eigentlich nicht Dinge richtig hier - Sie mischen zwei verschiedene Dinge, die Ihr Problem verursacht.
Sie können entweder die Ergebnisse dieser Funktionen in Ihren Makrovariablen auflösen ODER Sie können die Funktionsaufrufe speichern und behandeln, als ob Sie die Funktionen in den Datenschritt eingegeben hätten - verwenden Sie also CATS oder etwas, um sie zu kombinieren.
Wie es ist, enden Sie mit einem Dateinamen wie "\\path\to\COMPRESS(INTNX(MONTH..."
, nicht mit den Ergebnissen dieser Funktionen, daher Ihr Problem.
So eine Option:
DATAFILE= cats("...Files_Submitted\",&yrmm.,"\Reconcile\",&quarter.,"Principal balances.xls";
, dass die Funktionen liefern ihre Werte lassen würde, wie Sie es erwarten.
Die andere Option ist %SYSFUNC
zu verwenden, um die Werte zu fragen, in den Makrovariablen gelöst werden. Dies ist der gebräuchlichere Weg, obwohl sicherlich keiner wirklich wirklich besser für alle Zwecke ist.
%LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.));
Und ähnlich für die anderen beiden. Beachten Sie, dass ich die Anführungszeichen um MONAT zu entfernen, da Anführungszeichen nicht in %SYSFUNC
Anrufe verwendet werden (es sei denn, Sie wollen sich Anführungszeichen verwenden, aber nicht als String-Trennzeichen).
%LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.);
Beachten Sie hier, ich habe das Format in den Aufruf von SYSFUNC direkt; Beachten Sie auch, dass wir keine Verkettungszeichen in Makrovariablen verwenden (sie erzeugen nur Text) und normalerweise müssen Sie COMPRESS nicht verwenden (wenn auch nicht immer).
%LET qtr = %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3)));
Hier verwenden wir %SYSEVALF
die Mathematik zu tun (in der Regel nicht nicht ganzzahligen Mathematik in der Makro-Syntax haben kann). Wir entfernen auch Zitate aus Q und platzieren sie einfach in einer Zeile.
setzen sie alle zusammen:
%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
Natürlich leichter könnten Formate für yrmm/qtr zu verwenden gewesen ...
%let yrmm = %sysfunc(putn(&eolm.,yymmn6.));
%let qtr = %sysfunc(putn(&eolm.,yyq6.));
%put &=yrmm &=qtr;
Oder auch (und das ist vielleicht ein bisschen niedlich bekommen) Entfernen des %SYSFUNC
von &EOLM
und lassen die %SYSFUNC
Formatoption übernehmen die Formatierung. Hinweis hier EOLM
speichert keine Nummer, aber speichert den Text, den Sie auf dem Bildschirm sehen, und die Nummer wird nicht aufgelöst, bis YRMM
oder QTR
definiert ist.
%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.);
%let yrmm = %sysfunc(&eolm.,yymmn6.);
%let qtr = %sysfunc(&eolm.,yyq6.);
%put &=yrmm &=qtr;
Konnte die 'CATS (...)' Lösung nicht funktionieren, aber% sysfunc funktioniert wie ein Zauber. Danke für Ihre schnelle und detaillierte Antwort! –