Это не так. Препроцессор макроса оценивает статистику макроса (% let и т. Д.) До того, как шаг данных будет скомпилирован и запущен. Поэтому, когда на шаге данных выполняются только фактические операторы SAS (включая любые условно сгенерированные кодом макроса), выполняется следующее.
Вы в основном выполняете этот код:
%LET GLOB = 1;
%LET GLOB =2;
%PUT GLOB = &GLOB;
%LET GLOB =3;
%PUT GLOB = &GLOB;
DATA DST;
IF GLOB = 1 THEN DO;
END;
ELSE DO;
END;
RUN;
%PUT GLOB = &GLOB;
Обратите внимание, что вашПредложение THEN никогда не будет выполнено, так как ваш оператор IF проверяет переменную GLOB, которая никогда не может быть 1, поскольку ей никогда не назначалось какое-либо значение. Любые значения были назначены только макропеременной с именем GLOB.
Возможно, вы хотели вместо этого запустить нечто подобное?
%LET GLOB = 1;
DATA DST;
IF &GLOB = 1 THEN DO;
call symputx('glob','2');
END;
ELSE DO;
call symputx('glob','3');
END;
RUN;
%PUT GLOB = &GLOB;
Или что-то, использующее только код макроса? Как это:
%LET GLOB = 1;
%IF &GLOB = 1 %THEN %DO;
%LET GLOB = 2;
%END;
%ELSE %DO;
%LET GLOB = 3;
%END;
%PUT GLOB = &GLOB;