«Простой» шаг DATA останавливается при попытке чтения после прочтения последней записи набора.Обычно это происходит во время неявного цикла, который присущ магии шага DATA.Когда вы зацикливаете набор явным образом с проверками конца данных, попытка чтения после него не происходит и, таким образом, не означает, что шаг окончательно не завершается.
Флаг eof изменяется только при достижении конца данных.Он не установлен в 0, когда не в конце данных - флаг eof это просто то, что он есть в начале цикла.Таким образом, флаг должен быть сброшен при повторном использовании для последующего цикла.
* 'top' is logged twice;
* the data step ends when the second implicit iteration tries to read past eof of the first set;
data _null_;
put 'top';
do until (eof);
set sashelp.class(obs=2) end=eof;
put name=;
end;
eof = 0; * reset flag;
do until (eof);
set sashelp.class(where=(name=:'J')) end=eof;
put name=;
end;
run;
* 'top' is logged once;
* the data step ends when the stop is reached at the bottom;
data _null_;
put 'top';
do until (eof);
set sashelp.class(obs=2) end=eof;
put name=;
end;
eof = 0;
do until (eof);
set sashelp.class(where=(name=:'J')) end=eof;
put name=;
end;
run;