2012-03-02 17 views
3

是否有任何代碼/宏可以合併到我的sas程序中,只要在運行sas代碼時發生錯誤,我會立即給我發送電子郵件?SAS電子郵件如果發生錯誤

此電子郵件也可能包含發生的錯誤嗎?

+0

此代碼在批處理模式?什麼環境(Windows,Unix,z/OS)?它會是一系列的節目還是隻有一個?錯誤發生後,你是否編寫了程序以停止運行? – 2012-03-02 17:42:31

+0

是的,它將處於批處理模式。在Windows 7上運行。它將是一系列連續運行的6個程序。沒有編碼他們停止,如果錯誤。 – Adam 2012-03-02 19:34:46

回答

2

是....沒有...

這是可能的 - 但有沒有很好的辦法來做到這一點。您必須在每個程序後檢查是否發生錯誤。基本上你會插入一行代碼在你的代碼中執行數十次(或數百次)的測試。

我經常發現,在整個程序運行後進行測試就足夠了。如果中途發生錯誤,則SAS通常會進入語法檢查模式,因此在錯誤發生後它不會執行任何代碼。

這種方法還帶有它自己的一套獨立的問題。首先包含有關錯誤信息的SYS宏變量僅存儲最近錯誤的信息。我們可以檢查日誌,但問題在於日誌仍然被我們正在運行的程序使用,並檢查哪些阻止我們使用SAS打開它來讀取它。

我解決這個問題的方法是調用SAS兩次。第一次運行該程序並將日誌保存到指定的文件。第二次運行一個程序,該程序將檢查剛剛創建的日誌文件,並在符合特定條件時發送電子郵件(例如,該行以ERROR:開頭。

某些詳細信息...當您啓動sas第2個時間,你可以使用SYSPARM參數要檢查日誌文件的名稱來傳遞您可以解析的代碼是這樣的日誌文件(我建議你自定義的條件你自己的情況)。

** 
** READ IN LOGFILE. CHECK FOR PROBLEMS 
*; 

data problems log; 
    length line $1000; 

    infile "&logfile"; 
    input; 

    logfile = "&logfile"; 
    line_no = _n_; 
    line = _infile_; 
    problem = 0; 

    if 
    (
    line =: "ERROR:" 
    or line =: "WARNING:" 
    or line =: "NOTE: Numeric values have been converted to character values" 
    or line =: "NOTE: Character values have been converted to numeric values" 
    or line =: "NOTE: Missing values were generated as a result of performing an operation on missing values" 
    or line =: "NOTE: MERGE statement has more than one data set with repeats of BY values" 
    or line =: "NOTE: Invalid (or missing) arguments to the INTNX function have caused the function to return" 
    or line =: "INFO: Character variables have defaulted to a length of 200" 
    or line =: "NOTE: Invalid" 
) 
    and not 
    (
     line =: "WARNING: Your system is scheduled to expire" 
    or line =: "WARNING: The Base Product product with which Session Manager is associated" 
    or line =: "WARNING: will be expiring soon, and is currently in warning mode to indicate" 
    or line =: "WARNING: this upcoming expiration. Please run PROC SETINIT to obtain more" 
    or line =: "WARNING: information on your warning period." 
    or line =: "WARNING: This CREATE TABLE statement recursively references the target table. A consequence" 
    or line =: "WARNING: Unable to copy SASUSER registry to WORK registry. Because of this, you will not see registry customizations during this" 
    or line =: "WARNING: Estimates did not improve after a ridge was encountered in the objective function." 
    or line =: "WARNING: Estimates may not have converged." 
    or line =: "ERROR: A lock is not available for" 
    or line =: "ERROR: Errors printed on page" 
    or (line =: "WARNING: Apparent symbolic reference TODT not resolved." and "%upcase(&jobname)" eq "DIAL800.REPORTING_API") 
) 
    then do; 
    problem = 1; 
    output problems; 
    end; 
    output log; 
run; 

filename mymail email content_type="text/html" 
         to=([email protected]) 
         from=("[email protected]") 
         subject="mysubject" 
         attach="&logfile"; 

data _null_; 
    length divider $200; 

    file mymail; 

    set problems end=eof; 

    divider = repeat('=',80); 

    if _n_ eq 1 then do; 
    put '<font style="font-family:courier new;font-size:9pt"><br>'; 
    put divider "<br>"; 
    put "SUMMARY OF PROBLEMS: &logfile <br>"; 
    put divider "<br><br>"; 
    end; 

    put line_no 5. ": " line "<br>"; 

    if eof then do; 
    put divider "<br>"; 
    put "END OF SUMMARY  <br>"; 
    put divider "<br><br>"; 
    end; 

run; 

從您的問題中不清楚您是否知道如何使用SAS發送電子郵件,但如果沒有,我建議先使用Google搜索功能,如果仍然無法正常工作,請回過頭再發佈一個單獨的問題。

EDITS:您可以在調用SAS時使用參數-LOG "myfile.log"指定SAS應將日誌文件保存到的位置。

+0

如何指定日誌在提供的代碼中的位置? 另外,如果您的代碼返回正值,您將如何發送電子郵件? – Adam 2012-03-02 19:40:48

+0

編輯答案。發送電子郵件的代碼未經測試,但您應該明白。基本上,它會在電子郵件正文中打印錯誤列表,打印日誌的位置並附加日誌。 – 2012-03-02 20:10:08

0

本簡潔的文章給出了簡單的SAS代碼,它顯示瞭如何檢查錯誤並在錯誤情況下發送電子郵件。正如Rob已經提到的那樣,您應該在每個過程之後檢查錯誤代碼。

https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

這個代碼不發送日誌,但你可以通過定義一個簡要說明宏變量像發送普通錯誤「無法查詢SQL數據庫。」在我們的組織中,我們在批處理作業中運行大約50-100(?)SAS程序,並且我們使用日期標記來保存每個日誌,如2012-03-05 13:05 daily job.log