2017-03-29 3 views
1

I Makrovariablen zu nutzen, ich versuche (via% LET zugewiesen) für PROC IMPORT aber es verursacht der Dateiname 201 Zeichen nicht überschreiten. (FEHLER: Dateiname überschreitet die maximale Länge von 201 Zeichen)SAS Makrovariable themen- ‚Dateiname Wert überschreitet die maximale Länge‘

Gibt es eine andere Möglichkeit, Variablen so zu definieren, dass sie als Werte anstelle von Funktionen übergeben werden?

Meine alte Daten-Datei Zeichenfolge endet DATAF = "... Files_Submitted \ 201612 \ Abgleichen \ Q42016 Haupt balances.xls"

Ich habe es DATAF geändert =“... Files_Submitted \ & yrmm. \ aussöhnen \ & Quartal. Haupt balances.xls“

die folgenden Variablen verwenden.

%LET EOLM= INTNX('MONTH',today(),-&MonthsAgo.); 
%LET yrmm= COMPRESS(year(&EOLM.)||PUT(month(&EOLM.),z2.)); 
%LET qtr = COMPRESS(year(&EOLM.)||COMPRESS('Q'||CEIL(month(&EOLM.)/3))); 

Vielen Dank im Voraus für jede/alle Unterstützung.

Antwort

3

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; 
+0

Konnte die 'CATS (...)' Lösung nicht funktionieren, aber% sysfunc funktioniert wie ein Zauber. Danke für Ihre schnelle und detaillierte Antwort! –

Verwandte Themen