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

Hi,

Can anyone help me where I am going wrong with the following code:

%let __tmpmv_dsid = %sysfunc(open(__tmpds_param_check));

%let __tmpmv_num = %sysfunc(varnum(&__tmpmv_dsid,si_unit));

%let __tmpmv_rc  = %sysfunc(fetchobs(&__tmpmv_dsid,1));

%let __tmpmv_val = %sysfunc(getvarc(&__tmpmv_dsid,&__tmpmv_num));

%if not &__tmpmv_val  %then %do;

       %put %str (W)ARNING: SI Unit is not available for parameter: %nrbquote(&param) ;

       %put %str (W)ARNING: Raw unit will be used for CTCAE grade computation;

       %let errcode = %eval(&errcode + 1);

       %let __tmpmv_dsid = %sysfunc(close(&__tmpmv_dsid));

  %end;

  %else %let __tmpmv_dsid = %sysfunc(close(&__tmpmv_dsid));

I am getting ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: not &__tmpmv_val

Thanks in advance.

KC

1 ACCEPTED SOLUTION

Accepted Solutions
Astounding
PROC Star

While there is some debate on the best way, this is the way I prefer to check for blank vs. non-blank:

%if %length(&__tmpmv_val)=0 %then %do;

You can actually find an entire paper devoted to this subject.

Good luck.

View solution in original post

6 REPLIES 6
Quentin
Super User

What is the value of &__tmpm_val?

%put >>&__tmpmv_val.<< ;

From the message (and your code), since you are using GETVARC, it could a character value.  The %IF statement is written as if it expects a Boolean value (0/1), or at least an integer that the macro language could treat as a Boolean.

28   %macro Check(p);
29     %if not &p %then %put true;
30     %else %put false;
31   %mend;
32
33   %check(1)
false
34   %check(0)
true
35   %check(9)
false
36   %check(A)   /*Error*/
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
       operand is required. The condition was: not &p
ERROR: The macro CHECK will stop executing.
37   %check(1.)  /*Error: %eval doesnt know about decimals*/
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
       operand is required. The condition was: not &p
ERROR: The macro CHECK will stop executing.

Kind Regards,

--Q.

kingCobra
Obsidian | Level 7

Hi Quentin,

Thanks, for your answer. My &__tmpmv_val is either blank (" ") or a char value (d/L, mg/dL etc).

What is the way out in these cases? Any alternative idea would be great too.

Many thanks,

DS

ballardw
Super User

You can check for most BLANK conditions with

%if %sysevalf(%superq(macrovariablename)=,boolean)=1 %then %do

NOTE: the macrovariable name should not use the &macrovariablename format. Look at the documentation of %superq.

Astounding
PROC Star

While there is some debate on the best way, this is the way I prefer to check for blank vs. non-blank:

%if %length(&__tmpmv_val)=0 %then %do;

You can actually find an entire paper devoted to this subject.

Good luck.

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

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
  • 6158 views
  • 6 likes
  • 5 in conversation