-2

我正在使用带有 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 会导致宏中的宏变量失败?

阿尔文·萧

4

2 回答 2

3

从您的问题的简化版本中很难看出,但是如果您问为什么plength宏执行后宏变量不存在,那是因为您必须在宏代码本身中将其定义为全局。换句话说:

%macro combine( startdate= , fullprefix= );
%global plength;
...
%mend;

是的,如果您使用%SYSRPUT不受 SAS/CONNECT 控制的 SAS 会话中的命令,您将收到 SAS 错误;并且得到一个 SAS 错误将使您的非交互式会话进入“语法检查”模式,在这种情况下,您程序中的其余语句将不会完全执行。

在将代码从 SAS/CONNECT 环境转换为“普通旧 SAS”时,最后一点是一个常见的误解。当您使用 SAS/CONNECT 时,连接的“服务器”端使用“-NOSYNTAXCHECK”选项启动。

于 2012-10-30T17:29:32.480 回答
-1

经过一些小测试的调查。也许这就是答案。

实际上,我将在所有批处理 SAS 程序中使用 OPTIONS ERRORABEND 来停止 SAS 以防出错。这非常适用于许多错误和功能。

%SYSRPUT 语句确实给出了错误消息,说... options DMR ...
但是程序并没有异常停止。
它没有给出任何消息说... OBS = 0 ...
它只是继续。所以,我只是“认为”这是一些小错误,就像 LIBNAME 一个不存在的目录一样,SAS 将“正常”继续。
(顺便说一句,我认为 SYSRPUT 错误已经默默地打开了 SYNTAX CHECK 模式,没有任何通知或提示。)

下一个 %PUT 语句是正常的,与前一个相同的值。
这误导我程序运行正常。

接下来的语句也是正常的。有许多 SYMBOLGEN、MPRINT 和 MLOGIC 消息。
所以,这进一步误导了我,程序运行得非常非常正常。

在调用 symput plength 语句之后,有一条 NOTE: Numeric values have been converted ...
这进一步误导了我程序运行正常。

直到现在(经过这么多看似正常的消息之后),还有一个 NOTE 说 SAS set option OBS=0 ...
(也许这个 NOTE 只会出现在 RUN 语句之后。)

这个 OBS=0 消息实际上是告诉 SAS 正在使用 SYNTAX CHECK 模式的提示。
也许这个 OBS=0 是由 SYSRPUT 错误引起的。但是,因为在 SYSRPUT 错误之后有很多看起来像正常的消息,我只是忽略了这个 OBS=0 消息。
实际上,调用符号非常简单,不应该导致任何错误。
这只会使情况更加复杂。

由于 SAS 处于 SYNTAX CHECK 模式,这就是为什么会在 balance 语句中的 plength 变量中出现类似错误的原因。

这就是整个故事。

无论如何,为了防止进入这种复杂和误导的情况,只要记住注释掉所有 %SYSRPUT 会做的事情。

于 2012-10-31T13:24:48.430 回答