Hello,
I have the following piece of code, where I want the macro variable &ultimo to have a date value at the end. However, after running the code once, the value of &ulitmo is still missing, but after a second run, the value appears. My question is, what am I doing wrong with respect to making the code work doing its first run? Kind regards.
%let year = 2012;
%let month = 06;
%macro ultimodato;
%if %eval(&month) < 9 %then %do;
%let ultimo = 01/0%eval(&month.+1)/&year.;
%end;
%else %if &month = 9 %then %do;
%let ultimo = 01/10/&year.;
%end;
%else %if 9 < &month and &month < 12 %then %do;
%let ultimo = 01/%eval(&month.+1)/&year.;
%end;
%else %if &month = 12 %then %do;
%let ultimo = 01/01/%eval(&year+1);
%end;
%mend ultimodato;
%ultimodato;
data _null_;
call symput('ultimo',put(input("&ultimo",DDMMYY10.),date9.));
run;
%put &ultimo;
Hi,
This is because your 'ultimo' macro-variable isn't declared as global, and it is created within the macro 'ultimodato'. By declaring it as global (%global ultimo;), you will make it available to your call symput.
Kind regards,
Florent
Hi,
This is because your 'ultimo' macro-variable isn't declared as global, and it is created within the macro 'ultimodato'. By declaring it as global (%global ultimo;), you will make it available to your call symput.
Kind regards,
Florent
Thank you. It works.
That's the right answer to your original question. But you should also consider whether or not you want to write a macro for this purpose. The DATA step already has functions that will do the work for you. For example:
data _null_;
call symput('ultimo', put( intnx('month', mdy(&month, 1, &year), +1), date9.));
run;
Good luck.
Astounding, I didn't know you could do that! Thanks.
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.