Macro Execution

Accepted Solution Solved
Reply
Contributor
Posts: 34
Accepted Solution

Macro Execution

Hello,

 

I am trying to execute the below code but the execution stops unexpectedly. For reference, the min_date is 15Feb1993 and the max_date is 15Dec2013. At the bottom of the macro I have also pasted macro variable resolution from the log. Any help is greatly appreciated. Thanks

 

%macro run_all;

proc sql noprint;

select max(datepart(current_date)) format=date9., min(datepart(current_date)) format=date9.

into :max_date, :min_date

from edf;

quit;

%do %until ("&min_date."d ge "&max_date."d);

%let var_2= %sysfunc(inputn(&min_date,date9.),monyy5.);

%cohort(&min_date,&var_2);

%let min_date=%sysfunc(intnx(month,"&min_date."d,3,same),date9.);

%put &min_date.;

%end;

%mend run_all;

 

SYMBOLGEN: Macro variable MIN_DATE resolves to 15FEB1993

MLOGIC(RUN_ALL): %PUT &min_date.

SYMBOLGEN: Macro variable MIN_DATE resolves to 15MAY1993

15MAY1993

SYMBOLGEN: Macro variable MIN_DATE resolves to 15MAY1993

SYMBOLGEN: Macro variable MAX_DATE resolves to 15DEC2013

MLOGIC(RUN_ALL): %DO %UNTIL() condition is TRUE; loop will not iterate again.

 


Accepted Solutions
Solution
‎05-16-2016 12:32 PM
Trusted Advisor
Posts: 1,116

Re: Macro Execution

Hello @sai_ch,

 

To fix the issue pointed out by Astounding, simply apply %SYSEVALF to the %UNTIL condition:

%do %until(%sysevalf("&min_date."d ge "&max_date."d));

The %SYSEVALF function helps the macro processor to understand SAS dates (and more).

View solution in original post


All Replies
Super User
Posts: 5,367

Re: Macro Execution

Macro language does not understand SAS dates.  It thinks that %DO %UNTIl is comparing two character strings.  So the first time through the loop, the %UNTIL condition is true and the loop ends. because "15M is greater than "15D. 

 

Lucky for you that it stopped.  With a few changes to the dates, you might have constructed an infinite loop.

Solution
‎05-16-2016 12:32 PM
Trusted Advisor
Posts: 1,116

Re: Macro Execution

Hello @sai_ch,

 

To fix the issue pointed out by Astounding, simply apply %SYSEVALF to the %UNTIL condition:

%do %until(%sysevalf("&min_date."d ge "&max_date."d));

The %SYSEVALF function helps the macro processor to understand SAS dates (and more).

☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 2 replies
  • 270 views
  • 4 likes
  • 3 in conversation