Hi, for the marco below
data test;
/* store="Susan's Office Supplies";*/
store="Susan's store.";
call symput('s',store);
run;
%macro readit;
%if %bquote(&s) ne %then %put *** valid ***;
%else %put *** null value ***;
%mend readit;
%readit
DATA getting_I_want;
I_want = SYMGET('readit');
I_want_c = "&readit";
run;
Then I get a result table for GETTING_I_WANT as below:
I_want I_want_c
&readit
However I really wanted to see the message uner I_want and I_want_c be "*** valid ***
".
How do I modify my code.
Thanks
Adding: if you have SAS 9.4M5 or later, you don't need macro %READIT here, you can use %IF %THEN %ELSE in open code.
%if %bquote(&s) ne %then %do; %let readit= *** valid ***; %end;
%else %do; %let readit= *** null value ***; %end;
Maxim 2: Read the log
1 data test; 2 /* store="Susan's Office Supplies";*/ 3 store="Susan's store."; 4 call symput('s',store); 5 run; NOTE: The data set WORK.TEST has 1 observations and 1 variables. NOTE: Compressing data set WORK.TEST increased size by 100.00 percent. Compressed is 2 pages; un-compressed would require 1 pages. NOTE: DATA statement used (Total process time): real time 0.05 seconds cpu time 0.06 seconds 6 7 %macro readit; 8 %if %bquote(&s) ne %then %put *** valid ***; 9 %else %put *** null value ***; 10 %mend readit; 11 12 13 %readit *** valid *** 14 15 DATA getting_I_want; 16 I_want = SYMGET('readit'); 17 I_want_c = "&readit"; WARNING: Apparent symbolic reference READIT not resolved. 18 run; NOTE: Invalid argument to function SYMGET('readit') at line 16 column 10. I_want= I_want_c=&readit _ERROR_=1 _N_=1 NOTE: The data set WORK.GETTING_I_WANT has 1 observations and 2 variables. NOTE: Compressing data set WORK.GETTING_I_WANT increased size by 100.00 percent. Compressed is 2 pages; un-compressed would require 1 pages. NOTE: DATA statement used (Total process time): real time 0.01 seconds cpu time 0.01 seconds
You have not created a macro variable named &READIT and so your code doesn't work.
Here's an alternative that does create a macro variable named &READIT and does work:
%macro readit;
%global readit;
%if %bquote(&s) ne %then %let readit= *** valid ***;
%else %let readit= *** null value ***;
%mend readit;
Adding: if you have SAS 9.4M5 or later, you don't need macro %READIT here, you can use %IF %THEN %ELSE in open code.
%if %bquote(&s) ne %then %do; %let readit= *** valid ***; %end;
%else %do; %let readit= *** null value ***; %end;
Hi @sarahzhou,
Looking at your code, it looks like you are trying to get the result out of the macro readit.
Removing %put from readit allows you to execute the macro to populate the fixed string value in the data step.
The below code looks like it achieves what you want.
I assume there is more to your code than you have shared, as no macro code would really be needed to achieve the same result.
data test;
/* store="Susan's Office Supplies"; */
store="Susan's store.";
call symput('s',store);
run;
%macro readit;
%if %bquote(&s) ne %then *** valid ***;
%else *** null value ***;
%mend readit;
data getting_I_want;
I_want = "%readit";
I_want_c = "%readit";
run;
Thanks & Kind regards,
Amir.
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
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.