I have a number of macro programs that take different data sets for processing.
For example,
%macro Abc; /* Takes data set abc*/
..............
.............
%Mend Abc;
This way I have created a number of macro programs.
Now I need to execute macro program 'Abc' if data set Abc exists,
%Macro Action(Dsn);
%IF %SYSFUNC(EXIST(Dsn))>0 %THEN %DO;
%(&Dsn); /*Here is the problem*/
%END;
%ELSE %DO;
%PUT***********Dataset &Dsn does not exist;
%END;
%MEND Action;
Now if I use
%Action(Abc); The program fails to execute because in %(&Dsn) , &Dsn fails to resolve so %Abc does not execute.
Is there a way to fix this?
Thanks every one for your attention.
Raghu.
You have brackets around the &dsn., the below works (I note you also miss the ampersand on the exists function):
%macro abc;
%put hello;
%mend abc;
%macro action (dsn);
%&dsn.;
%mend action;
%action(abc);
Although I would suggest there are better ways of doing something like this than having a macro per dataset, even creating one macro which accepts the dataset as a parameter:
%macro do_something (dset=);
...
%mend;
%do_something(dset=abc);
Or alternatively create a loop dataset and then use that to generate code with call execute.
This sounds like a bad design.
Perhaps explain more about what you're trying to do and someone can suggest better design techniques.
That is because the code the macro generated: %(abc) is not valid syntax for a macro call. You want it to generate %abc; or %abc() .
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.