Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
New Contributor
Beiträge: 2
Automatisierte Berechnung der Monatsmitte (Makrovariable)

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!

SAS Super FREQ
Beiträge: 703
Betreff: Automatisierte Berechnung der Monatsmitte (Makrovariable)

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

New Contributor
Beiträge: 2
Betreff: Automatisierte Berechnung der Monatsmitte (Makrovariable)
Super, vielen lieben Dank!!!
Super User
Beiträge: 7.409
Betreff: Automatisierte Berechnung der Monatsmitte (Makrovariable)
[ Bearbeitet ]

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

 

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers