2012-03-02 24 views
3

コード/マクロがありますが、実行中にsasコードにエラーが発生するとすぐにメールを送信するsasプログラムに組み込むことができますか?エラーが発生した場合は

このメールには、発生したエラーが含まれている可能性もありますか?

+0

このコードはバッチモード?どのような環境(Windows、Unix、z/OS)ですか?それは一連のプログラムか、それとも単なるものか?エラーの後に実行を停止するようにプログラムをコード化しましたか? –

+0

はい、バッチモードになります。 Windows 7で実行します。これは連続して実行される一連の6つのプログラムになります。エラーの場合は停止するようにコード化していません。 – Adam

答えて

2

はい....ノー...

これは可能である - しかし、それを行うには良い方法はありません。エラーが発生したかどうかを確認するには、各手順の後にチェックする必要があります。基本的には、コード全体に数十回(または数百回)テストを実行するコード行を挿入します。

多くの場合、プログラム全体を実行した後にテストを実行するだけで十分です。途中でエラーが発生した場合、SASは通常、構文チェックモードに入りますので、エラーが発生してもコードは実行されません。

このアプローチには、独自の別の問題があります。エラーに関する情報を含むSYSマクロ変数で始めるには、最新のエラーの情報のみが格納されます。ログを確認することはできますが、この問題は、現在実行しているプログラムがログを使用していて、SASを使用してそのログを読むことができなくなっていることを調べることです。

これを回避する方法は、SASを2回呼び出すことです。初めてプログラムを実行し、指定されたファイルにログを保存します。 2回目は、作成したばかりのログファイルをチェックし、特定の基準が満たされた場合に電子メールを送信するプログラムを実行します(例えば、行はERROR:で始まります)。

詳細... sasを起動すると。

** 
** 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; 
:時間、あなたはあなたがチェックしたいログファイルの名前を渡し SYSPARMパラメータを使用することができますが、この(私はあなたがあなた自身の状況に条件をカスタマイズ提案)のようなコードの何かをログファイルを解析することができます

あなたの質問から、あなたがSASで電子メールを送る方法を知っているかどうかは分かりませんが、そうでない場合は最初にグーグルにして、それでも動作しない場合は別の質問を投稿してください。

EDITS:SASを呼び出すときに-LOG "myfile.log"パラメータを使用して、SASがログファイルを保存する場所を指定できます。

+0

ログが提供されたコードのどこに配置されているかをどのように指定しますか? また、あなたのコードが肯定的な結果を返すならば、どうやってメールしますか? – Adam

+0

答えを編集しました。電子メールを送信するコードはテストされていませんが、そのアイデアを得るべきです。基本的には、電子メールの本文にエラーのリストを出力し、ログの場所を出力し、ログも添付します。 –

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

関連する問題