- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I am having an issue trying to write a %do macro code that will break when meeting a certain condition. Here is the part of the code I am trying to fix:
if arrival >= min_exit then do;
wait_time = 0;
%let success = 0;
%let e = 1;
%let nplus1 = %eval(&nbr_svr + 1);
%do %until (&e = &nplus1);
if min_exit = exit&e then do;
exit&e = arrival + time_service_exp;
%let e = &nplus1;
end;
else do;
%let e = %eval(&e + 1);
end;
%end;
end;
output;
The end goal is to have the following table (in blue is the data I have before starting the loops
arrival + time_service_exp | exit1 | exit2 | exit3 | min_exit |
1 | 1 | 0 | 0 | 0 |
2 | 1 | 2 - this number is changing because it is the first exit variable equals to min_exit | 0 | 0 |
3 | 1 | 2 | 3- this number is changing because it is the first exit variable equals to min_exit | 0 |
4 | 4 | 2 | 3 | 1 |
5 | 4 | 5 | 3 | 2 |
6 | 4 | 5 | 6 | 3 |
When running, log is showing an infinite loop is being create as it looks like it is still going through the loop for e = n + 1, and then it never ends because it is never true.
Thank you in advance for your help!
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
You could try %GOTO statement.
%macro x;
%do i=1 %to 10;
%put &=i.;
%if &i.=8 %then %goto exit;
%end;
%exit:
%put DONE.;
%mend;
%x
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Since data step statements are not part of macro code, your macro loop is this:
%do %until (&e = &nplus1);
%let e = &nplus1;
%let e = %eval(&e + 1);
%end;
and so the exit condition is never met, as &e will always be &nplus + 1.
Do not mix macro and Base SAS code like this.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for your insight.
I tried using only "do" instead of "%do" (do e = 1 to &nbr_svr;), but it wasn't letting me use the "e" as part of the name of a variable (for example, exit&e).
Would you have any advice on how I could approach this problem in order to find a solution?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Use an ARRAY statement to specify your set of EXIT variables, then use a DO statement to set through them like so:
array exits (*) exit1 - exit10;
do i=1 to dim(exits);
exits(i) = <logic>;
end;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
To get answers that contain working and tested code you normally need to provide sample HAVE data, show the desired WANT result and explain the logic how to get from have to want.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
You could try %GOTO statement.
%macro x;
%do i=1 %to 10;
%put &=i.;
%if &i.=8 %then %goto exit;
%end;
%exit:
%put DONE.;
%mend;
%x