Hello guys,
Could you help me out with the macro bellow? I’m trying to check the variable CPT code within a range, but it’s being done within a macro. Note how I have added MINOPERATOR MINDELIMITER = ',' in my options statement. Note the statement “%let list1 = '59400','59510','59610';”. I know I have these CPT codes in my CPT variable, therefore the line of code: if cpt in ('59400','59510','59610') then….; should work. But since things get a bit hairy within a macro I am not getting the same results, and as you can see bellow from the log the condition is FALSE.
So my question to you is, what am I missing here? Also note that the code works outside the macro, that is, if I were check each condition individually outside the macro things go fine.
Your input would be greatly appreciated. Thank you,
Alex
/*******************************************/
Bellow are the first 2 passes of the macro for values 1 and 2 coming from the log:
1254 %carve_out (1);
MLOGIC(CARVE_OUT): Beginning execution.
MLOGIC(CARVE_OUT): Parameter A has value 1
SYMBOLGEN: && resolves to &.
SYMBOLGEN: Macro variable A resolves to 1
SYMBOLGEN: Macro variable CPT_CARVE_OUT1 resolves to YES
MLOGIC(CARVE_OUT): %IF condition %upcase(&&cpt_carve_out&a..) = YES is TRUE
SYMBOLGEN: && resolves to &.
SYMBOLGEN: Macro variable A resolves to 1
SYMBOLGEN: Macro variable LIST1 resolves to '59400','59510','59610'
MLOGIC(CARVE_OUT): %IF condition %eval(cpt in (&&list&a..)) is FALSE
SYMBOLGEN: Macro variable A resolves to 1
MPRINT(CARVE_OUT): flag_cpt1 = '0';
MLOGIC(CARVE_OUT): Ending execution.
1255 %carve_out (2);
MLOGIC(CARVE_OUT): Beginning execution.
MLOGIC(CARVE_OUT): Parameter A has value 2
SYMBOLGEN: && resolves to &.
SYMBOLGEN: Macro variable A resolves to 2
SYMBOLGEN: Macro variable CPT_CARVE_OUT2 resolves to YES
MLOGIC(CARVE_OUT): %IF condition %upcase(&&cpt_carve_out&a..) = YES is TRUE
SYMBOLGEN: && resolves to &.
SYMBOLGEN: Macro variable A resolves to 2
SYMBOLGEN: Macro variable LIST2 resolves to 'J7302'
MLOGIC(CARVE_OUT): %IF condition %eval(cpt in (&&list&a..)) is FALSE
SYMBOLGEN: Macro variable A resolves to 2
MPRINT(CARVE_OUT): flag_cpt2 = '0';
MLOGIC(CARVE_OUT): Ending execution.
etc...
/*******************************************/
And here is the actual code I’m working on:
/*******************************************/
options nocenter mprint mlogic MINOPERATOR MINDELIMITER = ',' symbolgen linesize=80 pagesize=60;
/*Is there a list of carve-out cpts and rates?*/;
%let cpt_carve_out1 = YES;
%let list1 = '59400','59510','59610';
%let rate1 = 2250;
%let cpt_carve_out2 = YES;
%let list2 = 'J7302';
%let rate2 = 770;
%let cpt_carve_out3 = NO;
%let list3 = '76815';
%let rate3 = 770;
%let cpt_carve_out4 = NO;
%let list4 = '76802','76805','76811';
%let rate4 = 2250;
Data temp1;
Set temp2;
/*there’s some code here in the middle… */
%macro carve_out (a);
%if %upcase(&&cpt_carve_out&a..) = YES %then %do;
%if %eval(cpt in (&&list&a..)) %then %do;
flag_cpt&a. = cpt;
%end;
%else %do;
flag_cpt&a. = '0';
%end;
%end;
%else %do;
flag_cpt&a. = '0';
%end;
%mend;
%carve_out (1);
%carve_out (2);
%carve_out (3);
%carve_out (4);
/* the code bellow works individually, i.e. outside the macro*/
/*1st set of codes*/
if %eval(%upcase(&cpt_carve_out1.) = YES) then do;
if cpt in(&list1.) then do;
flag_cpt1 = cpt;
end;
else do;
flag_cpt1 = '0';
end;
end;
else do;
flag_cpt1 = '0';
end;
**************************************************;
/*2nd set of codes*/
/*if %eval(%upcase(&cpt_carve_out2.) = YES) then do;
if cpt in(&list2.) then do;
flag_cpt2 = cpt;
end;
else do;
flag_cpt2 = '0';
end;
end;
else do;
flag_cpt2 = '0';
end;
/*etc…*/
Run;
/*******************************************/
Agree with Art. From the code you posted, it looks like you may be confusing the macro language and the data step language.
Assuming that CPT and FLAG_CPT& are data step variables, then this macro would need to be called inside a data step.
If that is the case, then I woulde expect you probably want an IF/THEN statement (to test a condition using data step variables), rather than %IF/%THEN (which cannot test values of data step variables).
%macro carve_out (a); %if %upcase(&&cpt_carve_out&a..) = YES %then %do; if cpt in (&&list&a..)) then do; flag_cpt&a. = cpt; end; else do; flag_cpt&a. = '0'; end; %end; %else %do; flag_cpt&a. = '0'; %end; %mend;
It would help if you provided a testable example. The example you provided refers to a datastep variable, ctp, but in a context where such a variable doesn't/can't exist.
Agree with Art. From the code you posted, it looks like you may be confusing the macro language and the data step language.
Assuming that CPT and FLAG_CPT& are data step variables, then this macro would need to be called inside a data step.
If that is the case, then I woulde expect you probably want an IF/THEN statement (to test a condition using data step variables), rather than %IF/%THEN (which cannot test values of data step variables).
%macro carve_out (a); %if %upcase(&&cpt_carve_out&a..) = YES %then %do; if cpt in (&&list&a..)) then do; flag_cpt&a. = cpt; end; else do; flag_cpt&a. = '0'; end; %end; %else %do; flag_cpt&a. = '0'; %end; %mend;
That did it, Quentin. I was about to send you guys some test data, because that does help, but once I tried your suggestion, I saw that it does what I want.
Again, thank you for your help. This community is great!
Alex
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.