2017-09-19 12 views
-1

テーブルが最後に変更された日時をチェックしていて、その日が今日と等しい場合は、通知メールを送信します。私は監視している3つの異なるテーブルのためにこのコードx3を持っています。重複したメール(SAS)を送信しない

filename myemail EMAIL 
to="[email protected]" 
cc="" 
from="[email protected]" 
; 

data _null_; 
file myemail; 
if _n_=1 and eof then put '!EM_ABBORT!'; 
set test end=eof; 
where (memname = 'class' and datepart(modate) = date()); 
    put "Hello"; 
    put" "; 
    put"This is a test email"; 
    put" "; 
    put memname= ; 
    put modate= ; 
    put" "; 
    put"Many thanks"; 
run; 

私が持っている問題は、基準が満たされると、電子メールが私はしたくない(人が通知されている)が送信された後に同じメールが、彼らはすでにされているように、コードが実行される次回を送ったということですその特定のテーブルについて通知されます。コードは、1時間ごとに実行されるようにスケジュールされています(Windowsスケジューラ)。

私はどこのメールが送られたかを記録する必要があると思います。誰かが私のデータセット(s)のブール値またはdate_email_sentフィールドで行うことができると示唆しました。

誰も私にどのようにこれを達成するための最良の方法の例のコードを提供できますか?ここ

感謝

アーロン

答えて

0

は思考のためのいくつかの食品です。

/*tab1 is the table we want to monitor for a change*/ 
data tab1; 
col1='a'; 
run; 

/*initial load of log_table - this table contains the last modified date of the table(s) we monitor*/ 
proc contents noprint data=tab1 out=columns(keep=libname memname modate);quit; 
proc sql; 
create table log_table as 
select distinct * 
from columns 
;quit; 

/*wait a second*/ 
%let rc = %sysfunc(sleep(1)); 

/*now we update tab1*/ 
proc sql; 
insert into tab1 values ('b') 
;quit; 

/*check when tab1 was last modified*/ 
proc contents noprint data=tab1 out=columns(keep=libname memname modate);quit; 
proc sql; 
create table last_modate as 
select distinct 
    libname 
    ,memname 
    ,modate as new_modate 
from columns 
;quit; 

/*and compare the current modate with modate from the last run*/ 
data log_table(drop=new_modate); 
merge log_table (in=a) 
     last_modate (in=b); 
by libname memname; 
if modate ne new_modate then do; 
    /*check other conditions, send an email, ...*/ 
    modate = new_modate; 
end; 
run; 

複数のテーブルを監視するための、ちょうどそれがマージに使用できるようにソートlog_tableを保ちます。

+0

あなたの回答をありがとう、私はあなたのコードの周りに私の頭を取得しようとしている(私はSASの初心者だと言及すべきである)私はあなたの既存のコードを組み込む場所と方法を把握しようとしている? ??あなたは例を提供できますか? – Aaron

+0

コーディングに手伝ってくれる人がいますか?これはコピー&ペーストの仕事ではありません。 「ログ」テーブルをどこに保存するかを決める必要があります。いくつかのチェックを追加することもできます(テーブルが存在する場合など)。 – Petr

0

Petrの考えはしっかりしています。私は彼のアイデアを基にして、次のことを考え出しました。

は、私がメールや誰送られてきたし、何日に送信する店舗永久データ、作るお勧め:

data res_mails; 
    input mail $; 
    cards; 
    'mail1' 
    'mail2' 
    'mail3' 
;run; 

data sent_mails; 
    input date mail $; 
    cards; ; 
ruN; 

次の私たちは、あなたがメールを送信することができますものを選択選択します。 (==今日は送られてきません)あなたの手にトリガー条件を残します。 (ただ、テーブルをres_mailsするカテゴリ変数を追加します。)

%macro select_and_update_recipiants; 
    proc sql; /*the selection bit*/ 
     select distinct(mail) into: respList separated by ' ' 
     from res_mail 
     where mail not in (
     select(select distinct(mail) from sent_mails 
      where date=date(); 
      ) 
     ) 
    quit; 
    /*The update bit. Go through the mails that will be sent and add them to list that have been sent.*/ 
    data sent_mails; 
     set sent_mail; 
     %for i=1 %to %sysfunc(countw(&SYSPARM.,' ')); 
      date=date(); 
      mail=%scan(&repList.,&i,' '); 
      output; 
     %end; 
%mend; 

%sendMail_to_resplist; 

免責事項:テストされていません。

関連する問題