DATA Step, Macro, Functions and more

ERROR: Open code statement recursion detected

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 15
Accepted Solution

ERROR: Open code statement recursion detected

In the following code, I pass in a string "1990" and build another string "01jan1990".  I now need to convert this string to a date.  The first two LET statements work fine:


%LET yyyy=&sysparm;
%PUT &yyyy;

%LET lwrs = 01jan&yyyy;
%PUT &lwrs;

%LET lwrd = %INPUT(&lwrs, date9.);
%PUT &lwrd;


but the final LET statement gives rise to "ERROR: Open code statement recursion detected."  How can this conversion be correctly performed?  Thank you!

 

P.S.  I examined

https://communities.sas.com/t5/Base-SAS-Programming/ERROR-Open-code-statement-recursion-detected/td-...

https://communities.sas.com/t5/SAS-Procedures/intnx-macro-variable/td-p/217078

but still cannot find a workaround.  Apologies if this is an FAQ.

 


Accepted Solutions
Solution
‎10-26-2017 10:36 AM
Super User
Posts: 13,304

Re: ERROR: Open code statement recursion detected

The %input is not the same as the datastep input function.

And the macro language doesn't like "input" it wants the specific INPUTN or INPUTC

 

Try:

%LET lwrd = %sysfunc(INPUTn(&lwrs,date9.));

 

You will have the numeric value for the date such as 10958 result for 01Jan1990.

View solution in original post


All Replies
Occasional Contributor
Posts: 8

Re: ERROR: Open code statement recursion detected

[ Edited ]

the %INPUT statement is for textual input.

 

To convert characters and numeric within a macro function I always tend to use %sysfunc() around a SAS function. You can either use PUTN or INPUTN like below depending on the outcome you wish.

 

%LET lwrd = %sysfunc(putn("&lwrs."d, date9.));

 

 

Solution
‎10-26-2017 10:36 AM
Super User
Posts: 13,304

Re: ERROR: Open code statement recursion detected

The %input is not the same as the datastep input function.

And the macro language doesn't like "input" it wants the specific INPUTN or INPUTC

 

Try:

%LET lwrd = %sysfunc(INPUTn(&lwrs,date9.));

 

You will have the numeric value for the date such as 10958 result for 01Jan1990.

☑ This topic is solved.

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

Discussion stats
  • 2 replies
  • 739 views
  • 0 likes
  • 3 in conversation