Macro Loop

Accepted Solution Solved
Reply
Contributor
Posts: 33
Accepted Solution

Macro Loop

Hey all,

 

I have a macro that I want to loop through a couple of variables (&CP_ID and &REP) and pass them to the program.  It works fine for the 1st iteration but never starts the 2nd etc...  What is my code missing?  Thanks!

 

proc sql noprint;
 select  CP_ID, REP into :CP_ID separated by ' ', :REP separated by ' '
   from crep2.crep_attributes;
quit;

 

%macro crep_rs;
 %let i = 1;
 %let YrMo = &YrMo;
 %let CP_ID = %scan(&CP_ID, &i);
 %let REP = %scan(&REP, &i);
 %do %until (&CP_ID=);
 
  A BUNCH OF VALID SAS CODE
  
  %let i = %eval(&i+1);
 %let CP_ID = %scan(&CP_ID,&i);
 %let REP = %scan(&REP,&i);
 %end;
 %mend;
%crep_rs;


Accepted Solutions
Solution
‎10-23-2015 02:11 PM
Contributor ndp
Contributor
Posts: 61

Re: Macro Loop

You are changing values for &CP_ID and &REP in the macro with statements:

%let CP_ID = %scan(&CP_ID, &i);
%let REP = %scan(&REP, &i);

 

create new macro variables:

 

%let _CP_ID = %scan(&CP_ID, &i);
%let _REP = %scan(&REP, &i); 

 

don't forget to change references eleswhere within the code.

View solution in original post


All Replies
Solution
‎10-23-2015 02:11 PM
Contributor ndp
Contributor
Posts: 61

Re: Macro Loop

You are changing values for &CP_ID and &REP in the macro with statements:

%let CP_ID = %scan(&CP_ID, &i);
%let REP = %scan(&REP, &i);

 

create new macro variables:

 

%let _CP_ID = %scan(&CP_ID, &i);
%let _REP = %scan(&REP, &i); 

 

don't forget to change references eleswhere within the code.

Contributor
Posts: 33

Re: Macro Loop

Thanks guys!  I really apreciate it.  have a good weekend...

 

Steve

Respected Advisor
Posts: 4,969

Re: Macro Loop

You're right, it won't work.  Here's the problem.

 

Consider this statement before the loop begins:

 

%let CP_ID = %scan(&CPI_ID, &i);

 

Before this statement, &CP_ID contained two words.  After the statement, it only contains one word.  So inside the %do %until loop, when you increment &i to 2, there is no longer a second word for %SCAN to locate within &CP_ID.

 

The solution is simple ... don't replace the two-word version of &CP_ID.  Assign each word to a new macro variable.

 

Good luck.

☑ This topic is SOLVED.

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

Discussion stats
  • 3 replies
  • 294 views
  • 0 likes
  • 3 in conversation