Editor's Note: Thanks also to @mohamed_zaki for his additional insight into the issue.
The
if _n_ = 1 then call symput(); else stop;
construct makes the data step create the macro variable in the first iteration of the data step (which happens to be when the first record of the dataset in the set; statement is read), and in the second iteration (where _n_ = 2) the execution of the data step stops. Basically, this means "get me the first record of the data set".
Another method would have been
data _null_ ;
set flowersales (obs=1);
call symput( "selectedcustomer",CustomerID);
run;
as this makes the data step read only the first observation of flowersales, and no explicit stop is needed.
Now, in your original example, the following may have happened:
- you ran the original code, which set &selectedcustomer to the intended value
- you changed the number (2, then 9) in the if _n_ = condition
- you ran the code, but it entered the else stop; branch in the first iteration (_n_ being 1) and did not set &selectedcustomer at all
- since &selectedcustomer was already set from the first run, nothing seemed to change
... View more