我正在使用带有SAS 9.1.3的AIX 6.1
我有一个在PC SAS 9.1中运行的程序
该程序将提交给unix
现在,我将程序转换为在AIX 6.1中完全运行
该程序非常奇怪地失败了
经过调查,这是由于%sysrput
以下是该计划的简化版本:
options mPrint mLogic symbolGen ;
%macro combine( startdate= , fullprefix= );
data _null_ ;
call symput( 'plength',compress(length(compress("&fullprefix."))));
run;
data _null_ ;
length balance 8. ;
balance= 1 + &plength.;
run;
%mEnd;
data _null_ ;
call symput( 'refdate', put(today(),date9.));
run;
%put &refdate.;
* -- If I forget to comment out the sysrput, the plength cannot be resolved -- ;
%sysrput refdate=&refdate.;
%put &refdate.;
%combine( startdate= "&refdate."d, fullprefix=a_filename_prefix );
(很抱歉,这些措辞没有意义,我只是想做一个演示。)
实际上,在AIX中,我不应该使用%sysrput
我只是忘记发表评论
但是,如果我忘记了这一点,则balance =语句中的plength宏变量会出错。这很奇怪。
要解决,只需注释掉%sysrput即可。
但是,有没有人知道为什么%sysrput会导致宏中的宏变量失败?
Alvin SIU
答案 0 :(得分:3)
很难从您的问题的简化版本中判断出来,但如果您在宏执行后询问为什么宏变量plength
不存在,那是因为您必须将其定义为 global < / strong>在宏代码中。换句话说:
%macro combine( startdate= , fullprefix= );
%global plength;
...
%mend;
是的,如果您使用来自SAS会话不受SAS / CONNECT控制的%SYSRPUT
命令,您将获得SAS错误;并且出现SAS错误会使您的非交互式会话进入“语法检查”模式,在这种情况下,程序中的其余语句将无法完全执行。
将代码从SAS / CONNECT环境转换为“普通旧SAS”时,最后一点是一个常见的误解。使用SAS / CONNECT时,连接的“服务器”端以“-NOSYNTAXCHECK”选项启动。
答案 1 :(得分:-1)
经过一些小测试后调查。也许这就是答案。
实际上,我会在所有批处理SAS程序中使用OPTIONS ERRORABEND来在发生错误时停止SAS。这很好地适用于许多错误和功能。
%SYSRPUT语句确实发出错误消息,说明...选项DMR ...
但该计划并未在此停止。
它没有给出任何消息说...... OBS = 0 ...
它继续下去。
所以,我只是'认为'这是一个小错误,就像LIBNAME一个不存在的目录一样,SAS将继续“正常”。
(顺便说一下,我认为SYSRPUT错误已经静默打开SYNTAX CHECK模式,没有任何通知也没有提示。)
下一个%PUT语句是正常的,与前一个语句相同 这误导了程序运行正常。
接下来的陈述也很正常。有许多SYMBOLGEN,MPRINT和MLOGIC信息 所以,这进一步误导了我,程序运行非常正常。
在调用symput plength语句之后,有一个注意:数字值已被转换...
这进一步误导我程序正常运行。
直到现在(经过如此多的看似正常的消息之后),有一个注释说SAS设置选项OBS = 0 ...
(也许这个NOTE只会在RUN语句之后出现。)
此OBS = 0消息实际上是告诉SAS使用SYNTAX CHECK模式的提示
也许这个OBS = 0是由SYSRPUT错误引起的。但是,因为在SYSRPUT错误之后有如此多的看似正常的消息,我只是忽略了这个OBS = 0消息。
实际上,电话会议很简单,不应该引起任何错误
这使情况进一步复杂化。
由于SAS处于SYNTAX CHECK模式,这就是在balance语句中导致plength变量出现类似错误的原因。
这是整个故事。
无论如何,为了防止进入这种复杂和误导的情况,只需记住注释掉所有%SYSRPUT会做的。