Hello,
I have a huge piece of code which contains multiple data steps, macros, proc sqls, loops etc. such that this entire piece of code needs to run only if a certain condition is met.
data _null_;
now=today();
d=day(now);
put d;
if d in (30,31,1,2,3,4) then call symput ('run','N');
else call symput ('run','Y');
run;
%put &run.;
%macro selection;
[entire code: data steps, macros, proc sqls, loops etc. ]
%mend;
data _null_;
%if &run.='Y' %then %do;
%selection;
end;This is the error that I get:
975 data _null_;
976 %if &run.='Y' %then %do;
ERROR: Nesting of %IF statements in open code is not supported. %IF ignored.
ERROR: Skipping to next %END statement.
977 %selection;
MLOGIC(SELECTION): Beginning execution.
Would there be a way to conditionally execute a huge piece of code?
Appreciate the help!
You don't need macro. Put your required code in a separate SAS program file then use %INCLUDE:
data _null_;
if <condition is true> then do;
call execute('%include "MyLargeProgram.sas";');
end;
run;
Separate your steps. Put all the code that needs to be run in a separate program.
Create your condition and only execute it if the condition was met. You can use %INCLUDE to run a program.
data _null_;
now=today();
d=day(now);
put d;
if d in (30,31,1,2,3,4) then call execute ('%include "path to sas program.sas" / lrecl=500');
run;
The program with the data set becomes your control program that executes the remaining code if necessary.
You can make this more convoluted if you'd like, look at macro logic:
UCLA introductory tutorial on macro variables and macros
https://stats.idre.ucla.edu/sas/seminars/sas-macros-introduction/
Tutorial on converting a working program to a macro
This method is pretty robust and helps prevent errors and makes it much easier to debug your code. Obviously biased, because I wrote it 🙂 https://github.com/statgeek/SAS-Tutorials/blob/master/Turning%20a%20program%20into%20a%20macro.md
Examples of common macro usage
https://communities.sas.com/t5/SAS-Communities-Library/SAS-9-4-Macro-Language-Reference-Has-a-New-Ap...
@AJ_Brien wrote:
Hello,
I have a huge piece of code which contains multiple data steps, macros, proc sqls, loops etc. such that this entire piece of code needs to run only if a certain condition is met.
data _null_; now=today(); d=day(now); put d; if d in (30,31,1,2,3,4) then call symput ('run','N'); else call symput ('run','Y'); run; %put &run.;
%macro selection;
[entire code: data steps, macros, proc sqls, loops etc. ]
%mend;
data _null_;
%if &run.='Y' %then %do;
%selection;
end;This is the error that I get:
975 data _null_;
976 %if &run.='Y' %then %do;
ERROR: Nesting of %IF statements in open code is not supported. %IF ignored.
ERROR: Skipping to next %END statement.
977 %selection;
MLOGIC(SELECTION): Beginning execution.
Would there be a way to conditionally execute a huge piece of code?
Appreciate the help!
You don't need macro. Put your required code in a separate SAS program file then use %INCLUDE:
data _null_;
if <condition is true> then do;
call execute('%include "MyLargeProgram.sas";');
end;
run;
976 %if &run.='Y' %then %do;
Typically, the value of macro variables are not enclosed in quotes, and the way you are creating the macro variable &RUN via CALL SYMPUT, the value created for macro variable &RUN is Y (or N), which is not enclosed in quotes. Thus you are testing to see if the one-letter text string Y (the value of &RUN) is equal to the hard coded text string 'Y', and these are never equal.
Thus, you want
%if &run.=Y %then %do;
Also:
ERROR: Nesting of %IF statements in open code is not supported. %IF ignored.
You need to do this inside a macro or via CALL EXECUTE.
Thank you, moving to a seperate location worked 🙂
@AJ_Brien wrote:
Thank you, moving to a seperate location worked 🙂
I'm not sure anyone recommended "moving to a seperate location", so it's not clear what you are saying.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
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.
Ready to level-up your skills? Choose your own adventure.