help with macro problem

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 14
Accepted Solution

help with macro problem

%macro v3(datain,flaga,flagb);
%if &flaga = LT %then
%do;
%put &flaga;
%end;
%else
%do;
%put &flagb;
%end;
%mend v3;

%v3(aa,LT,error);

I always get error instead of LT in this case. Why?


Accepted Solutions
Solution
‎08-27-2012 05:38 PM
PROC Star
Posts: 7,492

Re: help with macro problem

Try it with quotes.  i.e.,

%macro v3(datain,flaga,flagb);

%if "&flaga" = "LT" %then

%do;

%put &flaga;

%end;

%else

%do;

%put &flagb;

%end;

%mend v3;

%v3(aa,LT,error)

and, since you're probably going to ask "why?", I think it is because LT is being considered an operator.  I'd call this a bug, but I'm sure that someone else will say it is a feature.

You will get the desired results by not using an operator as the value.  e.g.:

%macro v3(datain,flaga,flagb);

%if &flaga. = TT %then

%do;

%put &flaga;

%end;

%else

%do;

%put &flagb;

%end;

%mend v3;

%v3(aa,TT,error)

View solution in original post


All Replies
Solution
‎08-27-2012 05:38 PM
PROC Star
Posts: 7,492

Re: help with macro problem

Try it with quotes.  i.e.,

%macro v3(datain,flaga,flagb);

%if "&flaga" = "LT" %then

%do;

%put &flaga;

%end;

%else

%do;

%put &flagb;

%end;

%mend v3;

%v3(aa,LT,error)

and, since you're probably going to ask "why?", I think it is because LT is being considered an operator.  I'd call this a bug, but I'm sure that someone else will say it is a feature.

You will get the desired results by not using an operator as the value.  e.g.:

%macro v3(datain,flaga,flagb);

%if &flaga. = TT %then

%do;

%put &flaga;

%end;

%else

%do;

%put &flagb;

%end;

%mend v3;

%v3(aa,TT,error)

Super User
Posts: 5,518

Re: help with macro problem

Yes, that's right.  Within a %IF condition, LT = "less than".

Macro language makes comparisons from left to right.  The first comparison within:

%if &flaga = LT

compares &flaga to the null value before "LT" to see if they are equal.  Macro language finds that they are not equal, so the comparison is false.  False comparisons generate a 0, while true comaprisons generate a 1.  So the second comparison compares 0 to see if it is less than the null value following "LT".  That comparison is also false, so the %ELSE statement kicks in.  To verify that this is happening, try using the same parameters, but modifying the %IF statement:

%if &flaga = LT 2 %then %do;

Regardless of the value of &flaga, this comparison should always be true.  Macro language will always be comparing either (0 LT 2) or (1 LT 2).

Hope this helps rather than confuses!

Occasional Contributor
Posts: 14

Re: help with macro problem

Folks, thanks a lot!

🔒 This topic is solved and locked.

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

Discussion stats
  • 3 replies
  • 215 views
  • 3 likes
  • 3 in conversation