Код внутри цикла, вероятно, не сбрасывает важные макро-переменные, которые он использует, или есть вложенные макро-вызовы, которые используют макропеременные, которые не определены должным образом как %local
в их определении %macro
.
Когда вы кодируете макрос, убедитесь, что используемые им переменные объявлены сверху, как показано ниже:
%macro foo(top=);
%local index piece1 piece2;
%do index = 1 %to ⊤
%let piece1 = …;
%end;
%mend;
Существует ли согласованное конкретное значение &r
, при котором происходит сбой? Если это так, у вас могут быть предположения о r
, которые являются неправильными.
Вы можете увидеть, какой макрос генерируется, установив параметры перед вызовом %programall
. Эти параметры будут регистрировать много информации на самом детальном уровне:
options mprint mtrace symbolgen;
Вы можете сохранить фактический код, сгенерированный макросом, во внешний файл, используя mfile
.
filename mfile 'c:\temp\300-at-Thermopylae.sas';
options mprint mfile;
%programall
%options nomfile;
Примечание: проблема может быть в сгенерированном исходном коде или в процессе генерации, который он сам. Вы можете проверить сохраненный файл .sas
на наличие проблем и отправить его по отдельности, чтобы определить, куда все пошло не так.