Is this the %VARCOND() macro you are trying to call in the middle of a %IF statement?
13 %macro varcond; 14 %let dsn=AE; 15 data _temp_; 16 %do i =1 %to %sysfunc(countw(&variables.)); 17 %let var=%scan(&variables.,&i); 18 varcond= "%"||"varexist(sdtmcro.&dsn,&var)"; 19 output; 20 %end; 21 domain="&dsn"; 22 run; 23 24 proc sort data=_temp_; 25 by domain ; 26 run; 27 28 data _temp_; 29 length varcondn $500.; 30 do until(last.domain ); 31 set _temp_; 32 by domain ; 33 varcondn=catx(' and ',varcondn,varcond); 34 end; 35 run; 36 37 proc sql; 38 select varcondn into : varcondn 39 from _temp_; 40 quit; 41 42 %put &varcondn.; 43 44 %mend varcond;
It is generating many many SAS statements. You cannot call that macro in the middle of another statement.
If you write
%if %varcond(lb) %then ....
It will generate code into the middle of your %IF statement.
%if data _tmp_; ...
It looks like that macro is intended to set a macro variable named VARCONDN.
So first create the macro variable. Then call the macro. Then test the macro variable.
%let varcondn=0 ;
%varcond;
%if (&varcondn) %then ....
Yes. This is the macro I am calling in another program.
What will be the best approach to create macro variable which holds the "string" e.g. "%varexist(sdtmcro.&dsn,var1) and %varexist(sdtmcro.&dsn,var2)" and it can be recalled in another program in IF statement?
NOTE:
VAR1 and VAR2 can be any variables which are defined in some other macro variable &VARIABLES. This is not constant macro variable, it changes with dataset name.
@petlove wrote:
What will be the best approach to create macro variable which holds the "string" e.g. "%varexist(sdtmcro.&dsn,var1) and %varexist(sdtmcro.&dsn,var2)" and it can be recalled in another program in IF statement?
NOTE:
VAR1 and VAR2 can be any variables which are defined in some other macro variable &VARIABLES. This is not constant macro variable, it changes with dataset name.
Here is a macro that you can in a "functional" mode. That is it emits only part of a statement. So you could use it inside an IF, %IF or assignment statement.
%macro varcond(dsn,varlist);
%local i sep ;
%do i=1 %to %sysfunc(countw(&varlist));
&sep %varexist(&dsn,%scan(&varlist,&i))
%let sep=and;
%end;
%mend varcond;
So you might use it this way.
80 options mprint; 81 %let mydataset=SASHELP.CLASS; 82 %let variables=AGE GENDER ; 83 data _null_; 84 if %varcond(&mydataset,&variables) then put "&mydataset has all of the variables: &variables" 84 ! ; MPRINT(VAREXIST): 3 MPRINT(VARCOND): and MPRINT(VAREXIST): 0 85 else put "&mydataset is missing one or more of the variables: &variables"; 86 run; SASHELP.CLASS is missing one or more of the variables: AGE GENDER NOTE: DATA statement used (Total process time): real time 0.26 seconds cpu time 0.01 seconds 87 88 %let variables=AGE SEX ; 89 data _null_; 90 if %varcond(&mydataset,&variables) then put "&mydataset has all of the variables: &variables" 90 ! ; MPRINT(VAREXIST): 3 MPRINT(VARCOND): and MPRINT(VAREXIST): 2 91 else put "&mydataset is missing one or more of the variables: &variables"; 92 run; SASHELP.CLASS has all of the variables: AGE SEX NOTE: DATA statement used (Total process time): real time 0.34 seconds cpu time 0.00 seconds
Thank you so much Tom for your suggestion. The approach you mentioned is working in my program.
Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!
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.
Ready to level-up your skills? Choose your own adventure.