Как условно %включить файл *.sas, определяющий макрос?

#sas #include #sas-macro

#САС #включать #sas-макрос

Вопрос:

Я использую макрос в нескольких программах SAS, поэтому я определил его в отдельном файле /myFolder/myMacro.sas .

При работе в пакетном режиме я хочу использовать его таким образом: %include '/myFolder/myMacro.sas;'

При тестировании изменений в коде в Руководстве по предприятию я хочу отредактировать и запустить /myFolder/myMacro.sas , затем отредактировать и запустить программы , которые его используют. Как я могу условно включить определения макросов?

%if amp;server = BATCH_SERVER %then %include '/myFolder/myMacro.sas;' не работает: файл все равно включен, и %if оператор применяется к комментарию в верхней части файла и приводит к

 ERROR: Expected %DO not found. ERROR: Skipping to next %END statement.  

Комментарии:

1. Таким образом, вы хотите, чтобы %include запускался только при работе в пакетном режиме?

Ответ №1:

Просто используйте %then %do

 %let mode=BATCH; filename mac1 temp; filename mac2 temp;  data _null_;  file mac1;  put '%macro mac1;%put mac1;%mend;%mac1;'; data _null_;  file mac2;  put '%macro mac2;%put mac2;%mend;%mac2'; run; %if amp;mode=BATCH %then %do;  %inc mac2; %end; %else %do;  %inc mac1; %end;  

Комментарии:

1. Верно, Аллан, это и есть решение, но твой ответ так сильно отклонился от вопроса, что я не могу принять его как ответ на вопрос.

Ответ №2:

Как я и подозревал, ошибка возникает из-за того, что включаемый файл начинается с комментариев, что-то вроде:

 * MyMacro is written to do this and that *; * ************************************** *; %macro MyMacro;  proc this;  proc that;  run; %mend;  

Таким образом, после включения файла это становится

 %if amp;server = BATCH_SERVER %then * MyMacro is written to do this and that *; * ************************************** *; %macro MyMacro;  proc this;  proc that;  run; %mend;  

что недопустимо.

При работе внутри макроса: добавьте %do; и %end;

Как предположил Аллан, достаточно поставить %inlcude между %do; и %end;

 %if amp;server = BATCH_SERVER %then %do;  %include '/myFolder/myMacro.sas;' %end;  

Таким образом, после включения файла это становится

 %if amp;server = BATCH_SERVER %then %do;  * MyMacro is written to do this and that *;  * ************************************** *;  %macro MyMacro;  proc this;  proc that;  run;  %mend; %end;  

что работает.

При работе в открытом коде: используйте call execute

 data _null_;  if "amp;mode"="BATCH" then call execute ("%include /myFolder/myMacro.sas;"); run; %DoIt;