BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
chennupriya
Quartz | Level 8

Hi ,

I have a dataset which looks like below . Here k_cnt = 3 and here I am unable to resolve this &&c_&&k_cnt&i.._pls . So is that something error in the way I have written ?

 

c_apple_cols c_orange_cols c_berry_cols
34 45 0

%macro test2;

 

data _null_;

set test;

call symputx('k_lst'||left(_n_),_NAME_);

if last then call symput('k_cnt',_n_);

 

run;

 

proc sql;

select

%do i=1 %to &k_cnt;

c_&&k_lst&i.._cols,

 

total_items

%end;

 

into

%do i=1 %to &k_cnt.;

:c_&&k_lst&i.._pls,

%end;

 

:total_pls

from testg;

quit;

%do i=1 %to &k_cnt

%If &&c_&&k_lst&i.._pls > 0 %then %do;

%let u = 'Amazing';

%end;

%else %do;

%let u = 'Super';

%end;

%end;

%mend;

 

%test2;

 

 Can anyone please help

 

1 ACCEPTED SOLUTION

Accepted Solutions
Astounding
PROC Star

This expression is incorrect:

 

&&c_&&k_cnt&i.._pls

 

Because you need double-resolution inside the string (&&k_cnt&i..), you need triple resolution for the entire string.  So you will need four ampersands:

 

&&&&c_&&k_cnt&i.._pls

View solution in original post

6 REPLIES 6
Tom
Super User Tom
Super User

You haven't defined any macro variables that would map 1 to APPLE.

 

Why not just skip the macro and use a data step to generate the macro variables?

data _null_;
  set have ;
  array x _numeric_;
  do i=1 to dim(x);
    call symputx(vname(x(i)),x(i));
  end;
run;

Results:

80   %Put &=c_apple_cols &=c_orange_cols &=c_berry_cols &=total_items ;
C_APPLE_COLS=34 C_ORANGE_COLS=45 C_BERRY_COLS=0 TOTAL_ITEMS=79
chennupriya
Quartz | Level 8

Hi Tom,

 

I have replied the code I have used to create the macro variables

 

 

Thank you

Astounding
PROC Star

This expression is incorrect:

 

&&c_&&k_cnt&i.._pls

 

Because you need double-resolution inside the string (&&k_cnt&i..), you need triple resolution for the entire string.  So you will need four ampersands:

 

&&&&c_&&k_cnt&i.._pls

chennupriya
Quartz | Level 8

Hi ,

 

Thank you so much for all your help .thanks a lot . This one worked

 

 

Thank you

Tom
Super User Tom
Super User

There are usually much better ways to generate code than using macro "arrays".
I think your macro variables are getting generated but perhaps you don't know how to reference them?

%let i=1 ;
%let k_lst1 = Apple ;
%put c_&&k_lst&i.._cols ;

%let c_Apple_cols = 65 ;

%put &&&&c_&&k_lst&i.._cols ;
212  options symbolgen;
213  %put &&&&c_&&k_lst&i.._cols ;
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  Macro variable I resolves to 1
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  Macro variable K_LST1 resolves to Apple
SYMBOLGEN:  Macro variable C_APPLE_COLS resolves to 65
65
214  options nosymbolgen;

I find that it is usually a lot easier to build up the result in pieces instead of generating such a complex expression to resolve a macro variable.

215  %let name = c_&&k_lst&i ;
216  %let name = &name._cols ;
217  %let value=&&&name ;
218  %put &=name &=value;
NAME=c_Apple_cols VALUE=65

 

chennupriya
Quartz | Level 8

Hi ,

 

Thanks a lot for all your help .  This really helped me

 

 

Thank you so much

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 1242 views
  • 3 likes
  • 3 in conversation