2012-08-29 44 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;