Ah. OK. Got it. This is weird, but I see what is happening. Here is the code that causes the failure to retain values properly in a macro variable:
if mod(_n_,1000)=0 then
rc = dosubl(cats('SYSECHO "Filters N=',_n_,'";'));
If the above DOSUBL code exists in the DATA steps of the macro invoked by a prior DOSUBL, the macro variables "go crazy", toggling their values in an odd pattern (but it is a pattern; I'll say more about this in a minute). In other words, if there is a DOSUBL embedded in code invoked by a DOSUBL, macro variable values appear to become unreliable. Of course, keep in mind that I'm running EG 4.3 with an AIX server running SAS 9.3 (9.03.01M2P08152012). Other instances of SAS/SAS EG may not display this behavior.
If someone has a moment, perhaps they could execute the below test program and see if they get the same results that I do. Pay attention to the values of &Debug displayed before and after each of the DATA steps inside the Test_Macro as well as before and after the primary DATA step outside the Test_Macro.
OPTIONS noSYMBOLGEN noSOURCE noSOURCE2;
/* ---------------------------------------------------------------------------- */
%MACRO Test_Macro;
%LET Debug=;
%PUT NOTE: The value of Debug before the 1st Data step=&Debug;
DATA _NULL_;
&Debug PUT "NOTE: Executing 1st Debug Logic";
PUT "NOTE: Executing 1st Regular Logic";
PUT "NOTE: The value of Debug inside the 1st Data step=&Debug";
_n_ = 1000;
if mod(_n_,1000)=0 then
rc = dosubl(cats('SYSECHO "Filters N=',_n_,'";'));
RUN;
%PUT NOTE: The value of Debug after the 1st Data step=&Debug;
/* ---------------------------------------------------------------------------- */
%LET Debug=*;
%PUT NOTE: The value of Debug before the 2nd Data step=&Debug;
DATA _NULL_;
&Debug PUT "NOTE: Executing 2nd Debug Logic";
PUT "NOTE: Executing 2nd Regular Logic";
PUT "NOTE: The value of Debug inside the 2nd Data step=&Debug";
_n_ = 1000;
if mod(_n_,1000)=0 then
rc = dosubl(cats('SYSECHO "Filters N=',_n_,'";'));
RUN;
%PUT NOTE: The value of Debug after the 2nd Data step=&Debug;
/* ---------------------------------------------------------------------------- */
%LET Debug=*;
%PUT NOTE: The value of Debug before the 3rd Data step=&Debug;
DATA _NULL_;
&Debug PUT "NOTE: Executing 3rd Debug Logic";
PUT "NOTE: Executing 3rd Regular Logic";
PUT "NOTE: The value of Debug inside the 3rd Data step=&Debug";
_n_ = 1000;
if mod(_n_,1000)=0 then
rc = dosubl(cats('SYSECHO "Filters N=',_n_,'";'));
RUN;
%PUT NOTE: The value of Debug after the 3rd Data step=&Debug;
%MEND Test_Macro;
/* ---------------------------------------------------------------------------- */
%PUT NOTE- ;
%PUT NOTE- ;
%PUT NOTE: __________________________________________________________________________________________________;
%PUT NOTE- ;
%PUT NOTE- ;
%LET Debug=*;
%PUT NOTE: Starting primary execution. The value of Debug=&Debug;
%&Debug.PUT NOTE- Debugging Primary execution 1. The value of Debug=&Debug;
DATA _NULL_;
&Debug PUT "NOTE: Primary Debug Logic.";
PUT "NOTE: The value of Debug before invoking macro, Debug=&Debug";
/* CALL EXECUTE( '%NRSTR(%Test_Macro;)' ); */
RC = DOSUBL(%NRSTR('%Test_Macro;'));
PUT "NOTE: The value of Debug after invoking macro, Debug=&Debug";
STOP;
RUN;
%PUT NOTE: Ending primary execution. The value of Debug=&Debug;
%PUT NOTE- ;
%PUT NOTE- ;
%PUT NOTE: __________________________________________________________________________________________________;
%PUT NOTE- ;
%PUT NOTE- ;
/* ---------------------------------------------------------------------------- */
Below is a screen shot of one of my runs. I start the run with Debug=*. I set the value of Debug to nothing before the first DATA Note however that the value of Debug has inexplicably changed to an asterisk after the completion of the first DATA step. In like manner, the value of Debug is an asterisk before the second DATA step, but Debug has no value after the second DATA step.
Similarly, in the third DATA step, the value again goes from asterisk to having no value. This only occurs on runs where the "nested" DOSUBL executes. Notice how I have a if mod(_n_,1000)=0 then statement before the nested DOSUBL. If the DOSUBL doesn't execute, the macro variables retain their values in the normal fashion. But set _n_ to 1000, and the macro variables start toggling back and forth in their odd pattern. The pattern seems to be this: The value of the macro variable appears to toggle back to a prior state upon the completion of a data step. Note that even outside the Test_Macro, the value toggles yet again after the completion of the primary DATA step.
If anyone can reproduce these results, that would be helpful. Please list what version of SAS you are running. This bug may also be encountered with Display Manager, SAS web studio etc., but I have not experimented with those other variants of SAS at this juncture.
Jim
... View more