Here is a way to return a value inside a MACRO.
But how to return a specific value, say -1, when the macro failed in middle?!
My macro simply reads a delimited file into a dataset in an automatic process; somehow it fails occasionally. I need know whether failed or not
and plan to re-read it seconds later if failed.
So the question is no longer how to return something from a macro execution.
Now the question is how to tell when a step fails.
Since you are using PROC IMPORT that already creates a macro variable as part of the SAS code it generates. Check the SAS log for one your runs (with MPRINT option on of course) to see the macro variable name.
So you might be able to use that macro variable.
%macro readin(dt, pt);
PROC IMPORT OUT=pgap_p&pt.
DATAFILE="C:\Users\Administrator\Desktop\data\1min__2022&dt._&pt..log"
DBMS=CSV REPLACE
;
GETNAMES=NO;
DATAROW=1;
RUN;
%mend;
%* Give the macro variable a value so it exists outside the macro scope ;
%let _EFIERR_= Before macro call;
%* Call the macro ;
%readin(dt=0606,pt=10)
%* Test the value of the macro variable ;
%put &=_EFIERR_ ;
Or you could just test if the dataset is created or not.
%put %sysfunc(exist(pgap_p10));
PS Why would you use PROC IMPORT? Especially if the file does not have a header row. Does the structure of the file change? Why do you need to use a guessing program to read it?
So what is the failure? Data set not created? Zero obs in data set? Character variables where it should be numeric? Something else?
Look at %ABORT CANCEL -1;
Let me get the log later since it does not happen every time. The Macro only has Proc IMPORT.
The issue is that the to-read-in file is being written in real time by C++.
%macro readin(dt, pt);
/*%let dt=0606; %let pt=10;*/
PROC IMPORT OUT=pgap_p&pt.
DATAFILE="C:\Users\Administrator\Desktop\data\1min__2022&dt._&pt..log"
DBMS=CSV REPLACE;
GETNAMES=NO;
DATAROW=1;
RUN;
%mend;
So the question is no longer how to return something from a macro execution.
Now the question is how to tell when a step fails.
Since you are using PROC IMPORT that already creates a macro variable as part of the SAS code it generates. Check the SAS log for one your runs (with MPRINT option on of course) to see the macro variable name.
So you might be able to use that macro variable.
%macro readin(dt, pt);
PROC IMPORT OUT=pgap_p&pt.
DATAFILE="C:\Users\Administrator\Desktop\data\1min__2022&dt._&pt..log"
DBMS=CSV REPLACE
;
GETNAMES=NO;
DATAROW=1;
RUN;
%mend;
%* Give the macro variable a value so it exists outside the macro scope ;
%let _EFIERR_= Before macro call;
%* Call the macro ;
%readin(dt=0606,pt=10)
%* Test the value of the macro variable ;
%put &=_EFIERR_ ;
Or you could just test if the dataset is created or not.
%put %sysfunc(exist(pgap_p10));
PS Why would you use PROC IMPORT? Especially if the file does not have a header row. Does the structure of the file change? Why do you need to use a guessing program to read it?
Create a macro before and after Proc IMPORT would be a good try, I BET.
To check the dataset is created or not is not, since I need read the same file with same output dataset periodically.
Please share your macro, and describe how it fails.
For general approaches to exception handling in SAS, see lots of papers and books by Troy Hughes, e.g.: https://www.lexjansen.com/search/searchresults.php?q=troy%20hughes
The best way to return a value from a macro call is via a macro variable. You need to make sure the macro variable exists in the calling environment (or the GLOBAL environment).
%macro mymacro(parm1,parm2,mvarname);
%if not %symexist(&mvarname) %then %global &mvarname;
....
%mend;
Then after you call the macro you can test the value of the macro variable.
%mymacro(parm1=sashelp.class,parm2=name,mvarname=status);
%if &status=1 %then %put It worked;
%else %put it failed;
@hellohere wrote:
Here is a way to return a value inside a MACRO.
But how to return a specific value, say -1, when the macro failed in middle?!
My macro simply reads a delimited file into a dataset in an automatic process; somehow it fails occasionally. I need know whether failed or not
and plan to re-read it seconds later if failed.
Why does the read of a delimited file "fail"? Some concrete example might be in order. Fix the desired process instead of the error messaging.
My experience with "failed" reading of delimited data files always comes down to the accuracy of the description of the delimited file. Either someone changes the content of the file or one or more fields were not properly described and changing content brings out the flaw in the description.
For static file, it is. The macro reads in perfectly, but I need read it in real time in which the file is being written by C++.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
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.