Скопировать mymacro / source в другую библиотеку? - PullRequest
0 голосов
/ 28 ноября 2018

Допустим, я сохранил макрос следующим образом:

options mstored sasmstore=FOO;
%macro hello_world() / STORE SOURCE DES='hello world';
  %put hello world;
%mend;

Теперь я хочу скопировать этот макрос из библиотеки FOO в библиотеку BAR, я хотел бы что-то вроде (это, очевидно, неt work):

%copy hello_world /source LIB = BAR;

Это было бы эквивалентно выполнению:

options mstored sasmstore=BAR;
%macro hello_world() / STORE SOURCE DES='hello world';
  %put hello world;
%mend;

Цель состоит в том, чтобы удобно скопировать макросы из библиотеки разработки в производственную библиотеку.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если вы просто хотите переместить макрос в производство, PROC CATALOG - это правильный способ сделать это.

*define foo;
libname foo "c:\temp";

*create the stored macro;
options mstored sasmstore=FOO;
%macro hello_world() / STORE SOURCE DES='hello world';
  %put hello world;
%mend;

*define bar;
libname bar "c:\otherdir";

*proc catalog to copy it over;
PROC Catalog catalog = foo.sasmacr;
             copy out=bar.sasmacr;
run;

***reset SAS session before continuing to clear libname foo***;


*now redirect SAS to BAR;
libname bar "c:\otherdir";
options mstored sasmstore=bar;

*and run hello_World- see it works!;
%hello_world;

Теперь я, вероятно, не стал бы делать это так - я бы использовалgit для хранения и развертывания исходных файлов - но если вы предпочитаете хранить скомпилированные макросы, это лучший способ.

0 голосов
/ 28 ноября 2018

Proc CATALOG используется для копирования записей от одного члена к другому

%macro One;
%put ONE;
%mend;

proc catalog catalog=work.sasmacr;
  copy out=work.holdmacr;
  select one / et=macro;
run;

Альтернативой копированию записей является использование функции конкатенации, которая автоматически предоставляется с LIBNAME.

Из справки SAS

Пример 3. Объединение каталогов SAS

В этом примере объединяются три библиотеки SAS путем указания физического имени каждого из них и назначение libref ALLMINE объединенным библиотекам:

libname allmine ('file-1' 'file-2' 'file-3');

Если каждая библиотека содержит каталог SAS с именем MYCAT, то использование ALLMINE.MYCAT в качестве libref.catref обеспечивает доступ к записям каталога, которые хранятся во всех трех каталогах с именем MYCAT.Чтобы логически объединить каталоги SAS с разными именами, см. Оператор CATNAME.

Если каталоги с одинаковыми именами содержат записи с одинаковыми именами, используется запись в самой ранней библиотеке.

Это действительно удобно во время юнит-тестов, так как оригинал не нужно изменять, пока не будет доказано, что обновления не повреждают.У вас есть юнит-тесты интеграции?; -)

...