我有一个存储已编译宏的库,即我定义的宏如下:
options mstored sasmstore=MYLIB;
%macro say_something(txt) / STORE SOURCE;
%put &txt;
%mend;
我经常收到此错误消息:
注意:SAS系统无法打开引用的宏库 由SASMSTORE = libref MYLIB。
错误:MYLIB.SASMACR.CATALOG无法使用锁定。
错误:由流程4653302持有锁。
错误:将编译虚拟宏。
当我尝试定义一个宏(例如执行上面的代码)并且我相信它发生在两种情况时会发生这种情况:
打开另一个会话,其中已经定义了一个宏。
使用我的库中的宏
(虽然我并不清楚)
我可以避免这个吗?
在第一种情况下,我想放弃写作权利,以便另一个会话可以接受它们。我目前通过关闭文件并重新打开它来完成它,这很乏味且非常烦人,如果我错误地在这个文件上启动了一个很长的过程,然后再重启#34;它
在第二种情况下,我真的不明白为什么会发生锁定,因为我几乎没有使用宏,也没有给库写任何东西。由于我的图书馆将被更多人使用,我需要找到合适的时间"提交,这真的不是我正在寻找的干净工作流程。
答案 0 :(得分:4)
我的建议是停止使用存储的编译宏,并使用sasautos
选项使用自动调用宏文件夹。然后,您可以随时进行更改,而无需担心锁定。任何已经运行的会话都需要重新加载宏才能获取新的定义。
答案 1 :(得分:4)
其中一些可能需要不同的工作流程,但它可能是“正确”的工作流程。
特别是(2)。您不应该写入您的同事正在阅读的宏目录。相反,您应该写入本地宏目录,然后定期提交源代码控制(或者,如果您正在执行“手动”源代码控制,则定期将其复制到生产位置)。这也允许在部署之前进行适当的测试。在这里,定期可能意味着“每天一次”或更少,这取决于您的开发周期。
否则,您可能会对同事正在使用的宏进行更改,并且他们可能不会理解该更改,或者可能不知道他们是否运行了宏的更改前或更改后的版本 - 这只是好不好。
这也将在很大程度上阻止(1);如果每个SAS会话只写入本地副本(到该会话或用户),那么您不应该有太多的实例存在冲突。你可以让两个SAS实例打开自己,当然是写同一个,但那是你应该避免的。