1

メール送信にリンクする条件を実行できないのに、なぜこのコードがメールを送信するのですか?SASLOGは、条件値がゼロであると証明しますx=。

98   filename outbox email 'dan.xxxxx@zz.com';
99
100  data _null_;
    /* Set variable */
101     x=0;  
102     put x=;
    /* condition cannot be true */
103     if x=1 then do;  
104        link send_email;  /* should only be hit if condition is true */
105     end;
106  return;
107
108  send_email:  /* seems to get executed no matter what */
109     file outbox
110     to=("dan.xxxxx@zzcom")
111     subject="Email test";
112     put "Email test from SAS program";
113     put " ";
114  return;
115  run;

NOTE: The file OUTBOX is:
      E-Mail Access Device

x=0
Message sent
      To:          ("dan.xxxxx@zz.com" )
      Cc:
      Bcc:
      Subject:     Email test
      Attachments:
NOTE: 0 records were written to the file OUTBOX.
NOTE: DATA statement used (Total process time):
      real time           7.22 seconds
      cpu time            0.35 seconds
4

4 に答える 4

3

FILEは、条件付きで実行可能なステートメントではなく、コンパイル時のステートメントです。ファイルにレコードが出力されていない場合でも、ファイルは作成されます。この場合、データを入れているレコードがなくても、おそらく電子メールは送信されます。

以下を参照してください。

data _null_;
set sashelp.class;
if 0 then do;
    file "c:\temp\temp.txt";
    put age;
end;
run;

ファイルにレコードが書き込まれていなくても、作成中のファイルに関する情報がログに表示されます。

条件付きで電子メールを送信しようとしている場合、または電子メールを送信しない場合は、実行していることに関する詳細情報を返送して、その方法について役立つ応答を得ることができます。

于 2012-08-29T21:24:37.900 に答える
2

ジョーのより正しい答えを見た後、私は完全に私のものを書き直しています。

FILE電子メールの配信を制御する1つの方法は、ステートメントのオプションではなく、電子メールの「ディレクティブ」を使用することです。例えば:

filename outbox email;
data _null_;
   x=0;  
   put x=;
   if x=1 then do;  
      link send_email;
      end;
   return;
send_email:  
   file outbox;
   put '!em_to! ( "dan.xxxxx@zzcom" )';
   put '!em_subject! Email Test';

   put "Email test from SAS program";
   put " ";
return;
run;
filename outbox clear;

これを行うと、元のステートメントで「TO」アドレスが指定されていないため、SASエラーがFILENAME発生しますが、これは無視できるエラーです。

于 2012-08-29T21:10:58.417 に答える
1

これ以上の背景がなければ、これをどのように計画しているかを正確に推測することは困難ですが、よりクリーンなアプローチは次のようになると思います。

  1. メールを送信する必要があるかどうかを確認します。
  2. マクロコード内のデータステップを使用して、条件付きで電子メールを送信します。

ステップ1:

%let send_email = 0;  * WHEN 0 EMAIL WILL NOT BE SENT. WHEN 1 EMAIL WILL BE SENT;

data _null_;
  set mydata;
  if x = 1 then do;
    call symput('send_email',1);
    stop; * LEAVE THE DATASTEP AS SOON AS WE DECIDE AN EMAIL SHOULD BE SENT;
  end;
run;

ステップ2:

%macro send_email;
  %if &send_email eq 1 %then %do;
    filename outbox email 'dan.xxxxx@zz.com';
    data _null_;
      file outbox to=("dan.xxxxx@zzcom") subject="Email test";
      put "Email test from SAS program";
      put " ";
    run;
  %end;
%mend;
%send_email;

編集:returnコード内のステートメントをステートメントに 変更しましたstop

于 2012-08-30T04:37:46.303 に答える
0
*Just modified Step 1 to not send emails on weekends - Works great!

%let send_email = 0;  * WHEN 0 EMAIL WILL NOT BE SENT. WHEN 1 EMAIL WILL BE SENT;

data _null_;
   dt=today();
   weekday=weekday(dt);
   if weekday ne 7 or weekday ne 1 then do;
     call symput('send_email',1);
     stop; * LEAVE THE DATASTEP AS SOON AS WE DECIDE AN EMAIL SHOULD BE  SENT;
   end;

走る;

于 2015-04-21T15:05:43.663 に答える