如何整合两段SAS代码实现自动邮件发送并替换PUT内容?
解决方案:整合SAS代码实现自动发送检查结果邮件
要把两段代码整合,核心是把Code1的检查结果从日志输出转为可被邮件模块调用的内容,具体修改步骤如下:
1. 修正并改造Code1的宏,存储检查结果
原来的Code1存在两个问题:一是SQL语句未将计数结果存入宏变量,导致%if判断无效;二是仅在日志输出结果,无法直接用于邮件。我们需要修改宏,将每个分支的检查结果存入全局宏变量,方便后续邮件调用:
%macro Controle_QDD (Branche); /* 声明全局宏变量,用于存储所有分支的检查结果 */ %global Email_Content; data SITMVT&Branche.; set Stock&Branche.; merge Stock&Branche. (in=A) Base&Branche. (in=B); by &Varlist.; if A and not B; run; proc sql noprint; /* 将计数结果存入宏变量&NB&Branche.,trimmed去除多余空格 */ select count(*) into :NB&Branche. trimmed from SITMVT&Branche.; quit; /* 根据计数生成检查消息,并追加到全局宏变量中 */ %if &NB&Branche. > 0 %then %let Email_Content = &Email_Content. Le contrôle QDD est OK pour SITMVT&Branche..<br>; %else %let Email_Content = &Email_Content. Le contrôle est KO pour SITMVT&Branche. Je vous invite à vérifier les résultats en exécutant le code.<br>; %mend; /* 初始化全局宏变量,避免空值导致的拼接问题 */ %let Email_Content = ; %Controle_QDD(B); %Controle_QDD(L);
2. 修改Code2的邮件模块,调用预存的检查结果
直接在邮件数据步中输出全局宏变量&Email_Content.的内容,替换原来的占位符:
filename mymail email FROM= "XXX" TO=( "XXX" ) Cc=("XXX" ) TYPE="text/html" CONTENT_TYPE="text/html"; DATA _null_; FILE mymail SUBJECT="Controle QDD "; PUT 'Bonjour,'; PUT '<br>'; PUT '<br>'; PUT '<br>'; /* 输出预先生成的检查结果 */ PUT "&Email_Content."; PUT '<br>'; PUT 'Pour avis :-)'; PUT '<br>'; PUT '<br>'; PUT '<i>Note: ce mail est généré automatiquement, merci de ne pas y répondre.</i> '; PUT '<br>'; PUT 'Cordialement,'; RUN;
关键修改说明
- 新增
%global Email_Content;声明全局宏变量,确保宏内部生成的内容能被外部邮件模块访问 - SQL语句添加
into :NB&Branche. trimmed,将查询结果存入宏变量,解决原代码%if判断无效的问题 - 初始化
%let Email_Content = ;避免首次拼接时出现空值异常 - 邮件数据步中直接调用
&Email_Content.,将所有分支的检查结果插入邮件正文
内容的提问来源于stack exchange,提问作者nadal
相关产品推荐
相关产品推荐

