@alepage wrote:
Hello,
I trying to use if and else if condition to define macro variables varname and varname2 but I am unable to check their value.
Does someone can help me with that issue.
data _null_;
set inforcelisting5;
call execute
(compbl(cat(
"Libname dssource ", engine,'"',path,'";',
'%nrstr(%macro lookuptbl;)',
'%nrstr(%if %varexist(',strip(fname),',police) %then %do; %let varname=police;%end;)',
'%nrstr(%else %if %varexist(',strip(fname),',agreement_nbr) %then %do; %let varname=agreement_nbr;%end;)',
'%nrstr(%else %if ',strip(cie),' eq be %then %do; %let varname2=datechea;%end;)',
'%nrstr(%mend lookuptbl;)',
'%nrstr(%lookuptbl;)',
'%nrstr(%put &=varname &=varname2;)',
"Libname dssource clear;"
)));
run;
partial log file:
NOTE: CALL EXECUTE generated line. 1 + Libname dssource base"/dwh_actuariat/sasdata/sas2002/be/habi/bel.prod1000.sah1stat.dec2002.data/ "; NOTE: Libref DSSOURCE was successfully assigned as follows: Engine: BASE Physical Name: /dwh_actuariat/sasdata/sas2002/be/habi/bel.prod1000.sah1stat.dec2002.data/ 1 + %macro lookuptbl;%if %varexist(polices,police) %then %do; %let varname=police;%end;%else %if %varexist(polices,agreement_nbr) %then %do; %let 2 The SAS System 13:22 Thursday, September 19, 2024
2 + varname=agreement_nbr;%end;%else %if be eq be %then %do; %let varname2=datechea;%end;%mend lookuptbl;%lookuptbl;%put &=varname &=varname2;Libname dssource clear; WARNING: Apparent symbolic reference VARNAME not resolved. WARNING: Apparent symbolic reference VARNAME2 not resolved. varname varname2 NOTE: Libref DSSOURCE has been deassigned.
After cleaning up the log text so it looks a bit more like nice code I get this:
%macro lookuptbl;
%if %varexist(polices,police) %then %do;
%let varname=police;
%end;
%else %if %varexist(polices,agreement_nbr) %then %do;
%let varname=agreement_nbr;
%end;
%else %if be eq be %then %do;
%let varname2=datechea;
%end;
%mend lookuptbl;
%lookuptbl;
%put &=varname &=varname2;
Libname dssource clear;
Which tells me the reason the variables do not exist where you use the %put at the end because they are currently only LOCAL in scope to the macro %lookuptbl.
You can fix this by adding something inside the definition of the macro that generates:
%global varname varname2 ;
I really don't see much reason for this macro definition to be in call execute statements though.
Perhaps provide some PARAMETERS to the macro definition instead of recompiling it with different values of Fname and Cie in the body of the macro.
Maybe something like
%macro lookuptbl (val1=, val2=;
%if %varexist(&val1.,police) %then %do;
%let varname=police;
%end;
%else %if %varexist(&val2.,agreement_nbr) %then %do;
%let varname=agreement_nbr;
%end;
%else %if be eq be %then %do;
%let varname2=datechea;
%end;
%mend lookuptbl;
Then you would just have to call the macro with the val1=fname, val2=cie .
If you are naming the library Dssource because you have hard coded the library name into whatever that %varexist macro might be you have also likely made a poor style choice for that macro.
... View more