如何告诉SAS在每次调用宏时编译宏,而不是手动编译

如何告诉SAS在每次调用宏时编译宏,而不是手动编译,sas,sas-macro,Sas,Sas Macro,上下文:我们使用SAS 9.4和企业指南7.15。目前,我们正在实现一些新的宏,当然在这一过程中需要做很多更改。有时更小,有时更大的变化。问题是,为了使更改生效,SAS需要我们手动编译宏代码或重新启动会话,这有点繁琐 这是主文件(调用所有宏)中的当前设置: /*宏选项*/ MAUTOSOURCE sasautos=”“mlogic mLogicTest mprint mprintnest MRECALL 在使用MAUTOSOURCE*/sasaautos=“选项时,是否可以在每次调用宏时告知S

上下文:我们使用
SAS 9.4
企业指南7.15
。目前,我们正在实现一些新的宏,当然在这一过程中需要做很多更改。有时更小,有时更大的变化。问题是,为了使更改生效,
SAS
需要我们手动编译宏代码或重新启动会话,这有点繁琐

这是主文件(调用所有宏)中的当前设置:

/*宏选项*/
MAUTOSOURCE sasautos=”“mlogic mLogicTest mprint mprintnest MRECALL
在使用
MAUTOSOURCE*/sasaautos=“
选项时,是否可以在每次调用宏时告知
SAS
,以实际编译宏,而不是使用会话存储的宏?理想情况下,宏只能在主文件(
MAUTOSOURCE*/sasufs=”“
等)中的整行代码执行时编译,否则它应该在会话中保留编译版本

我在结论中发现了这一点

之后,SAS将使用已经存在的代码 已经编辑好了。如果对宏进行了更改,则必须 在更改生效之前再次编译


我希望这并不意味着我必须手动操作。是否有任何宏选项可设置?

如果从工作中删除已编译的宏。再次调用该宏时,SASMACR SAS必须重新编译该宏

proc catalog c=work.sasmacr;
   *contents;
   delete your-macro-to-recompile.macro;
   run;
   quit;

对于普通用户,您应该设置更改的发布计划。发布后,用户将知道他们需要重新启动新会话

对于正在测试更改的开发人员,他们只需要使用%INCLUDE重新编译宏。因此,如果您知道宏XYZ已更改,则只需运行:

%include maclib('xyz.sas');
或者,您可以强制执行它并重新编译自动调用库中的所有宏

%incldue maclib('*.sas');
你可以做一个宏来清理编译过的宏的实际目录。比如:

%macro clean_autocall;
proc catalog force c=work.sasmacr;
 save clean_autocall /et=macro;
quit;
options mrecall mautosource;
%mend clean_autocall;
但如果您使用的是企业指南,则有两个问题

首先,出于某种原因,它使用不同的目录来存储编译后的宏。(为什么?)

第二个EG将手动编译它所需要的一组helper宏。我不确定这些宏的完整列表是否有官方来源?您可以尝试向项目中添加代码,以便在项目启动时根据目录中的条目自动创建列表。下面是我10多年前在生产环境中尝试使用EG时列出的一个列表。但我确信它已经过时了

%let s_eg_save= checkfmt checkhotfix
  eclibassign eclibunassign enterpriseguide gaccessible
  _eg_conditional_dropds
;

在SAS 9.3中,他们添加了
%SYSMACDELETE
宏函数。因此,如果您只想让autocall重新定义单个宏,请使用该宏删除当前定义

%symacdelete mymacro;
下面是一个实用程序宏,它将查询SASHELP.vcatag视图,以在工作库中查找已编译的宏并将其删除。它可以选择列出要删除或保留的宏的名称。请注意,正常SAS会话使用WORK.SASMACR存储编译的宏。但是SAS/Studio和EG(也许还有其他运行SAS的方法)使用WORK.SASMAC1

例如:

3348  %macro test1; %mend;
3349  %macro test2; %mend;
3350  %macro test3; %mend;
3351  %macro test4; %mend;
3352  %macdelete(test1 test3);
Removing TEST1 from WORK catalog SASMACR
Removing TEST3 from WORK catalog SASMACR
3353  %macdelete(keep=test2);
Removing TEST4 from WORK catalog SASMACR
运行SAS/Studio或Enterprise Guide时的示例:

 97         %macro test1; %mend;
 98         %macro test2; %mend;
 99         %macro test3; %mend;
 100        %macro test4; %mend;
 101        %macdelete(test1 test3);
 Removing TEST1 from WORK catalog SASMAC1
 Removing TEST3 from WORK catalog SASMAC1

您将SAS会话保持活动状态多长时间?您是否只使用EG作为用户界面,或者一些用户也直接调用SAS作为批处理/后台作业或使用SAS显示管理器?@Tom基本上我从不退出会话,除非我必须退出。我主要使用EG(与VS代码结合使用,但我想这并不重要),是的,我们使用SAS服务器,所以其他用户也在调用SAS。我刚刚找到一个选项
%SYSMACDELETE macro\u name
这似乎是我想要的-似乎与data null建议的一样…但是我想知道为什么在
WORK.SASMACR
.Thx中找不到编译后的宏,只是为了澄清一下:我找到了宏函数
%SYSMACDELETE
,当它放在我的主执行文件的头文件中时,它至少看起来完全符合我的要求。这个函数和您的建议是否以相同的方式执行?是的,文档中明确说明:从Work.SASMacr目录中删除宏定义。我也阅读了定义,但有一件事我搞不清楚(Tom提到过):我的宏不会在
WORK.SASMACR
中结束,而是在
WORK.SASMAC1
中结束,因此从技术上讲,函数不应该仅仅因为目录
WORK.SASMACR
不存在而删除任何内容(如果您将
SASMACR
更改为
SASMAC1
您的答案非常有效。)是的,您必须从存储宏的目录中删除宏。太好了!我真的很喜欢你的两个答案。现在,情况并没有那么复杂,所以我们可能只需要简单地调用
%SYSMACDELETE macro\u name
%包括“路径到宏”
但我会确保保留一份实用程序宏的副本,非常方便!顺便说一句,你是对的,目录是
WORK.SASMAC1
。知道为什么
%SYSMACDELETE宏\u name
也会删除此目录中的内容,尽管它在文档中的说明不同(只有
WORK.SASMACR
应该受到影响)?EG和SAS/Studio运行SAS的方式如何使其使用WORK.SASMAC1。我从来没有在手册中找到任何关于它们的参考。然后我就照原样去做了(尽管他们真的应该加上这个)。顺便说一句,您的最后一个示例可能是在EG中运行,而不是在SAS/Studio中运行?EG也使用WORK.SASMAC1,但我不再使用EG。我在您的回答中的意思是(“运行SAS/Studio时的示例:”):它不应该只有在使用EG时才是WORK.SASMAC1吗?但是我没有在SAS/Studio中测试它。。。
3348  %macro test1; %mend;
3349  %macro test2; %mend;
3350  %macro test3; %mend;
3351  %macro test4; %mend;
3352  %macdelete(test1 test3);
Removing TEST1 from WORK catalog SASMACR
Removing TEST3 from WORK catalog SASMACR
3353  %macdelete(keep=test2);
Removing TEST4 from WORK catalog SASMACR
 97         %macro test1; %mend;
 98         %macro test2; %mend;
 99         %macro test3; %mend;
 100        %macro test4; %mend;
 101        %macdelete(test1 test3);
 Removing TEST1 from WORK catalog SASMAC1
 Removing TEST3 from WORK catalog SASMAC1