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() .
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
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.