LesezeichenAbonnierenRSS-Feed abonnieren
Berlebeck22
Returning User | Level 2

Hallo, ich habe folgendes Problem:

 

Aus einer Makrovariable (=201604) würde ich gerne eine weitere Makrovariable generieren, die automatisch den Tag der Monatsmitte berechnet. Leider komm ich da momentan (trotz einigen Versuchen) nicht weiter, hat vielleicht hier jemand eine Idee dazu?!?

 

Hier mein entsprechender Code:


%let mon = 201604;

%let Monatsmitte = intnx('month', input(put(&mon.,6.), yymmn6.), 0,'m');
%put &monatsmitte.;

 

 

Danke schonmal vorab und schöne Grüße!

3 ANTWORTEN 3
BrunoMueller
SAS Super FREQ

Guten Morgen

 

Damit man DATA Step Funktionen in der Makrosprache verwenden kann braucht es die %SYSFUNC Makro Funktion. Da die Makrosprache keine Variablentypen kennt, braucht es keine Hochkomma um Characterkonstanten. Die PUT und INPUT Funktionen werden nicht in %SYSFUNC unterstützt, aber es gibt die entsprechenden PUTC/N und INPUTC/N Funktionen.

 

Das Programm kann so aussehen:

 

%let mon = 201604;

%let Monatsmitte = %sysfunc(intnx(month, %sysfunc(inputn(&mon.,yymmn6.)), 0, M));
%put NOTE: SAS Datumswert als Zahl=&monatsmitte.;
%put NOTE: formattiert=%sysfunc(putn(&Monatsmitte, date9.));

Bruno

Berlebeck22
Returning User | Level 2
Super, vielen lieben Dank!!!
Kurt_Bremser
Super User

Wenn man in einem %let eine Base SAS Funktion verwendet, dann wird die Teil des Textes in der Makrovariablen; sie wird NICHT ausgeführt.

Erst wenn man die Makrovariable in einem DATA Step verwendet, kommt es nach der Code-Ersetzung und dem Compile des DATA Step zur Ausführung der Funktion.

Um eine Base SAS Funktion in einem %let sinnvoll zu verwenden, muss man sie in %sysfunc "einpacken". Da das oft unübersichtlich wird, ist man mM besser dran, einen DATA _NULL_ mit CALL SYMPUT zu verwenden:

%let mon=201604;

data _null_;
monatsmitte = intnx('month',input("&mon.01",yymmdd8.),0,'m');
call symput('monatsmitte',put(monatsmitte,yymmddn8.));
run;

%put &monatsmitte.;