【发布时间】:2016-09-15 14:24:52
【问题描述】:
这是previous post 的后续问题。除了我原始帖子中引用的资源之外,我还尝试将宏存储在这些文章中概述的目录中:
- PROC CATALOG, the Wish Book SAS® Procedure
- Ways to Store Macro Source Codes and How to Retrieve Them
- Creating a Stored Macro Facility in Ten Minutes
这是我目前所做的:
我创建了一个目录“C:\myMacros”。首先,我创建了一个名为“HelloWorld.sas”的程序,其中包含以下代码:
/* HelloWorld.sas */
option mstored sasmstore=mymacros;
libname myMacros 'C:\myMacros';
%macro HelloWorld() / store source;
data _null_;
put "Hello, World!";
run;
%mend;
代码使用以下日志条目执行:
1 option mstored sasmstore=mymacros;
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3
4 %macro HelloWorld() / store source;
5 data _null_;
6 put "Hello, World!";
7 run;
8 %mend;
在 SAS 文件资源管理器中,已创建活动库“Mymacros”,其中驻留目录名为“Sasmacr”。在 Windows 资源管理器中检查,我看到“C:\myMacros\sasmacr.sas7bcat”已创建。在 SAS File Explorer 中,我点击“Sasmacr”目录,在里面找到“Helloworld”。当我双击它时,我得到消息框说,
宏数据类型没有默认操作。
因此,我得出结论,该宏已编译并存储在“Sasmacr”目录中。我关闭 SAS 以清除所有内存。
现在,我尝试调用宏。我打开一个新的 SAS 会话并创建一个名为“CallHelloWorld1.sas”的新程序,其中包含以下代码:
/* CallHelloWorld1.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr.helloworld.source';
%include myCat;
%HelloWorld();
这会在%include 语句中生成错误。
1 /* CallHelloWorld1.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 filename myCat catalog 'mymacros.sasmacr.helloworld.source';
4 %include myCat;
ERROR: Physical file does not exist, SOURCE .
ERROR: Cannot open %INCLUDE file MYCAT.
5
6 %HelloWorld();
-
180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
该错误声称物理文件不存在,这与我在上面的观察相矛盾。因此,我得出结论,我称它不正确。根据FILENAME Statement, CATALOG Access Method,SAS 四部分名称由 library.catalog.entry.entrytype 组成。我的陈述包括
- 库:
myMacros由libname myMacros 'C:\myMacros';定义 - 目录:
sasmacr - 条目:
helloworld - 类型:
source
即mymacros.sasmacr.helloworld.source。这里肯定有错误,但我无法理解它是什么。
要尝试另一种方法,我再次关闭 SAS 以清除内存。我创建了“CallHelloWorld2.sas”,其中包含以下代码:
/* CallHelloWorld2.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr';
%include myCat(HelloWorld);
%HelloWorld();
这也会在%include 行产生错误:
1 /* CallHelloWorld2.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 filename myCat catalog 'mymacros.sasmacr';
4 %include myCat(HelloWorld);
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
5
6 %HelloWorld();
-
180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
看来我的宏没有正确存储或调用不正确。然而,资源严重不足。请帮忙!
【问题讨论】: