BookmarkSubscribeRSS Feed
edilts
Calcite | Level 5
%macro RunMP;
%do RunMP = 1 %to 5;
%let p1=%eval(&RunMP);
%let p2=%eval(&RunMP+1);
%let p3=%eval(&RunMP+2);
%put &p1 &p2 &p3;
%end;
%mend; %RunMP *;

I've tried everything I can think of... I need distinct sets of three consecutive numbers, so the log output should be
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15

Any thoughts would be appreciated.
6 REPLIES 6
RickM
Fluorite | Level 6
Try this (not tested)

%macro RunMP;
%let p1=1;
%do RunMP = 1 %to 5;
%let p2=%eval(&p1+1);
%let p3=%eval(&p2+1);
%put &p1 &p2 &p3;
%let p1=%eval(&p3+1);
%end;
%mend; %RunMP *;
Cynthia_sas
SAS Super FREQ
Hi:
My question is WHERE do you need to have distinct sets of three consecutive numbers??? What good will the numbers in the log do??? Is this part of a bigger program or a different problem???

At any rate, there's nothing wrong with changing the value of &RUNMP inside the %DO loop. So if you changed the ending value to 15
[pre]
%do RunMP = 1 %to 15;
[/pre]

...Since, there's nothing wrong with "resetting" the value of &RUNMP -- and, since the %DO loop will automatically increment by 1...the simplest thing to do after your %PUT is to reset the value of &RUNMP to be equal to the value of &P3:
[pre]
%put &p1 &p2 &p3;
%let RunMP = &p3;
[/pre]

cynthia
Florent
Quartz | Level 8
Hello,

You should use the %by option of the %do loop. Your macro becomes:

%macro RunMP;
%do RunMP = 1 %to 5 %by 3;
%let p1=%eval(&RunMP);
%let p2=%eval(&RunMP+1);
%let p3=%eval(&RunMP+2);
%put &p1 &p2 &p3;
%end;
%mend; %RunMP *;


You should also keep in mind that if you have a number of elements to display which is not a multiple of 3, you could see unresolved macro-variables displayed (text '&p1', '&p2' or '&p3' ) in your log... So you should check that each macro-variable you want to display exists prior including its reference in the %put statement.

I hope it helps.

Regards,
Florent
Peter_C
Rhodochrosite | Level 12
the %gen() macro and variants has been posted before
Objective is to generate a pattern, subject to cycling numbers, so can simply be 1 2 3 or generate 10 11 12 .

What is confusing me here is the break in groups of 3.
%put NOTE- 1 2 3;
%put note- 4 5 6;
%put note- 7 8 9 ;
demonstrates one way to place text in the log with NOTE coloring, but without the NOTE: prefix.
Was that what "edilts" wanted?

More effective is a data step, like[pre]data _null_ ;
put 'NOTE- 1 2 3';
put 'NOTE- 4 5 6';
put 'NOTE- 7 8 9' ;
run;[/pre]which produces the log[pre]113 data _null_ ;
114 put 'NOTE- 1 2 3';
115 put 'NOTE- 4 5 6';
116 put 'NOTE- 7 8 9' ;
117 run;

1 2 3
4 5 6
7 8 9
NOTE: DATA statement used (Total process time):[/pre]

ymmv
peterC
data_null__
Jade | Level 19
I always like an opportunity to use PROC PLAN. Perhaps a bit of overkill but it may pique your interest in this very useful procedure.

[pre]
%let p=3;
%let r=15;

proc plan ordered;
ods output plan=plan;
factors r=&r p=&p of %sysevalF(&r*&p,I) cyclic(1 to &p)&p;
run;
quit;

data _null_;
set plan;
if _n_ eq 1
then putlog 'NOTE: ' @;
else putlog 'NOTE- ' @;
put (p:) (+1 3.);
run;

NOTE: 1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
22 23 24
25 26 27
28 29 30
31 32 33
34 35 36
37 38 39
40 41 42
43 44 45


[/pre]
edilts
Calcite | Level 5
Thank you for the assistance - I used the method described by Florent and it worked perfectly.

My code was just an example; I didn't actually need the numbers in the log, I needed them to plug into another macro loop which was nested inside that one.

Regards,
Erik Message was edited by: edilts

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 1352 views
  • 0 likes
  • 6 in conversation