2012-08-29 41 views
1

爲什麼這個代碼仍然發送​​電子郵件時,無法得到執行的情況鏈接到電子郵件發送 發送電子郵件? SASLOG證明條件價值是零放x =。從SAS程序

98 filename outbox email '[email protected]'; 
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=("[email protected]") 
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:   ("[email protected]") 
     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 
+0

如果要發送電子郵件,您希望發送此datastep的電子郵件數量是多少?只有一個?還是不止一個? –

回答

1

如果沒有更多的背景,很難猜出你究竟是如何打算這樣做,但我覺得更清潔的方法是:

  1. 確定如果電子郵件應發送。
  2. 在宏代碼中使用datastep來有條件地發送電子郵件。

步驟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 '[email protected]'; 
    data _null_; 
     file outbox to=("[email protected]") subject="Email test"; 
     put "Email test from SAS program"; 
     put " "; 
    run; 
    %end; 
%mend; 
%send_email; 

編輯:更改return語句中的代碼到stop語句。

+0

此選項有效,但我不明白爲什麼我的原始代碼無法正常工作。鏈接只能在條件爲真時才能執行,並且不可能是真的。感謝您的解決方案。 Dan – 99Valk

+0

因爲'文件'總是'執行'。就像keep語句一樣,不能在IF(或LINK或其他)之後放置keep語句 - 如果它位於DATA和RUN之間,則會使用它。聲明文件的行爲定義並最終發送電子郵件 - 而且您無法有條件地執行該操作。您或者需要使用Bob的解決方法,或者像Rob建議的那樣並有條件地運行整個代碼。 – Joe

+0

謝謝大家的建議。 – 99Valk

2

看到喬更正確的答案後,我完全重寫了我的。您可以控制電子郵件傳遞

一種方法是使用電子郵件「指令」,而不是選擇在FILE聲明。例如:

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! ("[email protected]")'; 
    put '!em_subject! Email Test'; 

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

現在,當你這樣做,你會得到一個錯誤的SAS,因爲未提供原始FILENAME聲明「收件人」地址,但它是可以忽略的錯誤。

+1

我不喜歡留下錯誤,甚至是故意錯誤,但是你可以用兩個不同的選項設置它 - 一個如果你有(真正的選項),一個如果你有(假選項)。如果不是,那麼發一封電子郵件給自己說「沒有受訪者」或其他。然後你沒有得到任何錯誤和一些有用的反饋:) – Joe

+0

@Joe:通常我會同意,但我不想通過在我的答案中引入MACRO代碼來混淆問題。羅布在下面提供。這是我真正喜歡的事情之一:不同的事情發生在同一個問題上。 – BellevueBob

3

文件不是有條件可執行語句,但編譯時聲明。即使沒有記錄輸出到文件,該文件仍然會被創建,在這種情況下,即使沒有記錄將數據放入該文件,電子郵件仍然會被髮送。

請參閱以下內容:

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

即使沒有記錄被放到這個文件,你仍然可以看到在日誌中創建有關該文件的信息。

如果你試圖有條件地發送電子郵件或無法發送電子郵件,您可能需要更多的信息回來你在做什麼,所以你可以得到關於如何做一個有用的響應。

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; 

run;