Hi All,
Can anyone please help me on below code.
%macro check (sdt , edt ,dif);
%if &sdt ne . and &edt ne . %then %do;
&dif=&edt - &sdt;
%end;
%if &sdt ne . and &edt eq . %then %do;
&dif= &sdt;
%end;
%if &sdt eq . and &edt ne . %then %do;
&dif=&edt ;
%end;
%mend;
data x;
infile datalines missover;
input a b ;
datalines;
10200 10300
10300 .
. 10200
;
options mlogic;
data y;
set x;
%check(a , b ,new);
run;
Issue i am getting with this code is that only first condition is getting true while as per data provided and macro, all three conditions should get true for either records.
I am pasting below snippet from log.
65 ;
66 options mlogic;
67 data y;
68 set x;
69 %check(a , b ,new);
MLOGIC(CHECK): Beginning execution.
MLOGIC(CHECK): Parameter SDT has value a
MLOGIC(CHECK): Parameter EDT has value b
MLOGIC(CHECK): Parameter DIF has value new
MLOGIC(CHECK): %IF condition &sdt ne . and &edt ne . is TRUE
MLOGIC(CHECK): %IF condition &sdt ne . and &edt eq . is FALSE
MLOGIC(CHECK): %IF condition &sdt eq . and &edt ne . is FALSE
MLOGIC(CHECK): Ending execution.
70 run;
Please help me to modify the macro in a way that all three condtions will be resolved.
Regards,
Rajesh
ALWAYS keepi in mind that the macro processor is a preprocessor that does its work before the data step is even compiled. It cannot access data step variables, it can only create text to be included as code in the data step.
So this might work:
%macro check (sdt , edt ,dif);
if &sdt ne . and &edt ne . then do;
&dif=&edt - &sdt;
end;
if &sdt ne . and &edt eq . then do;
&dif= &sdt;
end;
if &sdt eq . and &edt ne . then do;
&dif=&edt ;
end;
%mend;
The macro now creates data step conditions and actions, only the variable names are taken from the macro parameters.
ALWAYS keepi in mind that the macro processor is a preprocessor that does its work before the data step is even compiled. It cannot access data step variables, it can only create text to be included as code in the data step.
So this might work:
%macro check (sdt , edt ,dif);
if &sdt ne . and &edt ne . then do;
&dif=&edt - &sdt;
end;
if &sdt ne . and &edt eq . then do;
&dif= &sdt;
end;
if &sdt eq . and &edt ne . then do;
&dif=&edt ;
end;
%mend;
The macro now creates data step conditions and actions, only the variable names are taken from the macro parameters.
First explain what the code is supposed to do.
Since you are placing the macro code inside a data step then show us what the generated data step should look like if the macro ran as expected.
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.