2012-10-30 101 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