BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Sven111
Pyrite | Level 9

Does anyone know of a simple method of temporarily setting a SAS option and then reverting it back to it's previous value?  I maintain a large set of macro functions that are frequently used by my team.  Some of these functions need to have specific SAS options set (such as DLCREATEDIR or SASTRACE), but since these macros are generally just small parts of larger programs I don't want to unilaterally change a system option someone may be relying on later on in their program or which may cause unexpected behavior. 

 

I've tried some stuff where I use GETOPTION to save the original value of the option I need to change so I can change it back when my function has done it's piece, but this seems kind of hit and miss (for SASTRACE at least) and it seems like there should be a better, simpler way, although perhaps not. 

 

Does anyone have some tips on handling situations like this?

1 ACCEPTED SOLUTION

Accepted Solutions
Quentin
Super User

Probably easiest to just use double quotes, like:

options sastrace="&SAStrace_Opt" ;

 

I think below is an example of saving, changing, and restoring the SASTRACE option:

 

*set option ;
options sastrace=',,t,dbs' ;
%put >>%sysfunc(getoption(sastrace))<< ;

*store the option in a macro var ;
%let SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));

*change the option ;
options sastrace='' ;
%put >>%sysfunc(getoption(sastrace))<< ;

*restore the option ;
options sastrace="&SAStrace_Opt" ;
%put >>%sysfunc(getoption(sastrace))<< ;
BASUG is hosting free webinars Next up: Jane Eslinger presenting PROC REPORT and the ODS EXCEL destination on Mar 27 at noon ET. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.

View solution in original post

7 REPLIES 7
ballardw
Super User

Two procedures OPTSAVE and OPTLOAD.

 

Proc OPTSAVE will save current settings to a data set and then Proc opload will read a data set to set options:

 

Example from the online help that displays a current option, saves options, changes it , shows the changed value, reloads the saved and the shows that the saved version has been restored. The example only shows one option but all options in effect are saved/ restored.

 

libname mysas "c:\mysas";

proc options option=yearcutoff;
run;
proc optsave out=mysas.options;
run;
options yearcutoff=2000;
proc options option=yearcutoff;
run;
proc optload data=mysas.options;
run;


proc options option=yearcutoff;
run;
Sven111
Pyrite | Level 9

That would be perfect, except the option I'm really having trouble with is SASTRACE, and that's one of the few options that cannot be saved or loaded with OPTSAVE/OPTLOAD unfortunately (according to PROC OPTIONS LISTOPTSAVE).

 

Basically it's any option where I need to set it with quotes like

OPTION SASTRACE=',,t,dbs';

I can pull the original value with:

%LET SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));

But for some reason the normal quoting mechanisms aren't working when I try to use that variable later to set it back like this:

OPTIONS SASTRACE=&SASTrace_Opt;

I've tried manually putting quotes around the value in many different ways, but it won't take it.  Does the macro processor get partially disabled or something on OPTIONS statements?

 

 

ballardw
Super User

I don't use Information Maps so don't think I can go much further.

 

But what does %put SAStrace_opt ; generate after running %LET SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));?

Sven111
Pyrite | Level 9

I'm not sure what Information Maps are, the SASTRACE option affects SAS/ACCESS to relational DB products, or at least that's what I'm using it for. 

 

Thanks for your help thus far though.  I really wish that OPTLOAD/OPTSAVE would've worked here.  I hadn't heard of those previously so it's something to add to my toolkit in any case.

 

Here's the code output you requested:

119 17         %LET SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));
120 18         %PUT &=SASTrace_Opt;
121 SASTRACE_OPT=,,t,dbs
122 19         OPTIONS SASTRACE=&SASTrace_Opt;
123 NOTE: LINE GENERATED BY THE MACRO VARIABLE "SASTRACE_OPT".
124 19         ,,t,dbs
125             _
126             13
127 ERROR 13-12: UNRECOGNIZED SAS OPTION NAME ,.
128
129               _
130               13
131 19       ! ,,t,dbs
132              _
133              13
134 ERROR 13-12: UNRECOGNIZED SAS OPTION NAME T.
135
136 19       ! ,,t,dbs
137                ___
138                13
139 ERROR 13-12: UNRECOGNIZED SAS OPTION NAME DBS.

I've also tried the following (and many other permutations, dealing with quoting gives me a headache, so I generally just go for a brute-force approach to get it to work right), all of which result in the same error:

%LET SASTrace_Opt = %STR(%')%SYSFUNC(GETOPTION(SASTRACE))%STR(%');
OPTIONS SASTRACE=&SASTrace_Opt

%LET SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));
OPTIONS SASTRACE=%STR(%')&SASTrace_Opt%STR(%');

%LET SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));
OPTIONS SASTRACE=%BQUOTE(&SASTrace_Opt);

%LET SASTrace_Opt = %STR(%')%SYSFUNC(GETOPTION(SASTRACE))%STR(%');
OPTIONS SASTRACE=%BQUOTE(&SASTrace_Opt);

 

 

 

Quentin
Super User

Probably easiest to just use double quotes, like:

options sastrace="&SAStrace_Opt" ;

 

I think below is an example of saving, changing, and restoring the SASTRACE option:

 

*set option ;
options sastrace=',,t,dbs' ;
%put >>%sysfunc(getoption(sastrace))<< ;

*store the option in a macro var ;
%let SASTrace_Opt = %SYSFUNC(GETOPTION(SASTRACE));

*change the option ;
options sastrace='' ;
%put >>%sysfunc(getoption(sastrace))<< ;

*restore the option ;
options sastrace="&SAStrace_Opt" ;
%put >>%sysfunc(getoption(sastrace))<< ;
BASUG is hosting free webinars Next up: Jane Eslinger presenting PROC REPORT and the ODS EXCEL destination on Mar 27 at noon ET. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.
Sven111
Pyrite | Level 9

That seems to be working, although I'd swear I'd tried that before and it wasn't, I guess my memory isn't what it used to be.  I still really wish that OPTSAVE/OPTLOAD worked for all of the options since that'd be a cleaner solution overall.  I wonder why it doesn't.

Tom
Super User Tom
Super User

Don't understand why you are having trouble.  You do need the quotes. You either add them back when you revert.

%LET optsave = %SYSFUNC(GETOPTION(SASTRACE));
options SASTRACE='something else';
options sastrace="&optsave";

Or you could add the quotes when you create the macro variable. I would suggest storing the syntax needed to reset the option.

%LET optsave = sastrace="%SYSFUNC(GETOPTION(SASTRACE))";
options SASTRACE='something else';
options &optsave ;

 

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 7 replies
  • 1203 views
  • 6 likes
  • 4 in conversation