2012-10-30 70 views
-2

%sysrput的误用,我使用AIX 6.1与SAS 9.1.3
我在PC SAS 9.1
运行的程序,程序将rsubmit到UNIX。
现在,我转换程序在AIX 6.1
被完全运行程序非常奇怪的失败。
经过调查,这是由于%sysrput
这里是程序的简化版本:奇怪的错误是由于SAS

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将在宏宏变量导致失败?

阿尔文SIU

+0

SYSRPUT在包含它时是否给出错误,或者它是否工作?第二个%是否放入&refdate?看起来正确(与第一个相同)? – Joe

回答

3

很难从你的问题你的简化版告诉,但如果你问为什么宏变量plength是不是你的宏执行后存在,那是因为你必须把它定义为全球在你的宏代码本身。换句话说:

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

是的,如果你从一个SAS会话中使用%SYSRPUT命令不在SAS/CONNECT的控制,你会得到一个错误的SAS;并且获得SAS错误会将您的非交互式会话置于“语法检查”模式,在这种情况下,程序中的其余语句将无法完全执行。从SAS/CONNECT环境“普通老式SAS”转换代码时

最后这是一个常见的误区。当您使用SAS/CONNECT时,连接的“服务器”端将启动“-NOSYNTAXCHECK”选项。

+0

我也在帖子后数小时思考了这种语法检查模式。随着你的评论,我直接朝这个方向前进,最后也许可以得到答案。整个故事有点长,并没有足够的字符来评论。所以,我使用答复你的问题,希望它有足够的空间。无论如何,感谢您的帮助。 –

-1

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

实际上,我将在所有批次SAS程序中使用OPTIONS ERRORABEND来在发生错误时停止SAS。这对很多错误和功能都很适用。

%SYSRPUT语句确实会给出错误消息,说...选项DMR ...
但是,程序不会在此停止。
它不给任何消息说... OBS = 0 ...
它只是去。 所以,我只是'想'这是一个小错误就像LIBNAME一个不存在的目录和SAS将'正常'继续。
(顺便说一句,我认为SYSRPUT错误已打开语法检查模式默默地,没有任何通知,也没有提示。)

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

下一个陈述也是正常的。有许多SYMBOLGEN,MPRINT和MLOGIC消息。
因此,这进一步误导我,程序运行非常非常正常。

在调用symput plength语句之后,有一个注意:数字值已被转换...
这进一步误导我程序运行正常。

到现在为止(经过了这么多的样子,就像普通邮件),有一个纸条,上面写着SAS设置选项OBS = 0 ...
(也许这说明只在RUN语句后出现。)

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

由于SAS处于SYNTAX CHECK模式,这就是为什么会在balance语句的plength变量中引起类似于外观的错误。

这是整个故事。

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

+0

这完全不可理解。 – itzy