многократный цикл всего кода в программе SAS вызывает ошибку - PullRequest
0 голосов
/ 03 мая 2019

У меня длинный код около 5000 строк. Когда я макрос этой программы, и цикл в несколько раз. Он успешно выполнен, но если я изменил цикл 300 раз, код начал вызывать ошибку, я не могу понять, почему это вызывает,

%let Numberl=300;

%macro programall;
%do r=0 %to &numberl;
.
.
.
.
.
%end;
%mend Programall;
%Programall;

Я предполагаю, что функция сна может решить эту проблему https://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm#p0a6vn2td7bjr2n1viy8y4lgvq61.htm

Кто-нибудь имеет подобный опыт?

извините за мой английский

Спасибо

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Код внутри цикла, вероятно, не сбрасывает важные макро-переменные, которые он использует, или есть вложенные макро-вызовы, которые используют макропеременные, которые не определены должным образом как %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 на наличие проблем и отправить его по отдельности, чтобы определить, куда все пошло не так.

0 голосов
/ 07 мая 2019

ТАК, я обнаружил, что в цикле между циклами есть такой комментарий

*********GPA's something;

Я взлетел, затем начал бегать отлично. Это был комментарий, но макрос выглядит как строка

Спасибо

...