sas将表格插入html电子邮件

sas将表格插入html电子邮件,sas,enterprise-guide,datastep,Sas,Enterprise Guide,Datastep,是否可以在不重复电子邮件开头和结尾的情况下,通过循环表的记录来填充html电子邮件 在这个例子中,我得到了一封邮件,其中有5个表,共1行(因为WORK.MyEmailTable是5条记录的表,并且set在数据步骤中创建了一个循环): 数据\u空\u; 归档我的邮件; 设置WORK.MyEmailTable; 放‘’; ***循环浏览所有记录; 放‘’; 放置%sysfunc(猫('',变量1'); 放置%sysfunc(猫('',变量2'); 放置%sysfunc(猫('',变量3'); 放‘’

是否可以在不重复电子邮件开头和结尾的情况下,通过循环表的记录来填充html电子邮件

在这个例子中,我得到了一封邮件,其中有5个表,共1行(因为
WORK.MyEmailTable
是5条记录的表,并且
set
在数据步骤中创建了一个循环):

数据\u空\u;
归档我的邮件;
设置WORK.MyEmailTable;
放‘’;
***循环浏览所有记录;
放‘’;
放置%sysfunc(猫('',变量1');
放置%sysfunc(猫('',变量2');
放置%sysfunc(猫('',变量3');
放‘’;
放‘’;
跑
我希望有一张5行的桌子

我不知道在数据步骤中使用
set
时,是否有方法可以递归地防止
put
邮件的开头和结尾

(如果不清楚,请告诉我,我将更新。)


谢谢,

您可以使用
\u n
自动数据步变量让您知道何时开始第一次观察,并使用
设置
语句选项
结束=
来知道您正在进行最后一次观察:

data _null_;
    file mymail;
    set WORK.MyEmailTable end=eof;

    if _n_ eq 1 then do;
      put '<html><body><table>';
    end;

    /*loop trhough all records*/
    put '<tr>';
    put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var1,'</td>'));
    put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var2,'</td>'));
    put %sysfunc(cats('<td>','_n_=',n,' eof=',eof,' ',var3,'</td>'));
    put '</tr>';

    if eof then do;
      put '</table></body></html>';
    end;
run;
数据\u空\u;
归档我的邮件;
set WORK.MyEmailTable end=eof;
如果等式1,则执行;
放‘’;
结束;
/*循环所有记录*/
放‘’;
放置%sysfunc(cats(“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”);
放置%sysfunc(cats(“”,“”,“”,“”,“”,“”,“”,“”,“”,eof=“”,eof,“”,var2,“”);
放置%sysfunc(cats(“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,”);
放‘’;
如果是eof,那么做;
放‘’;
结束;
跑

我已经在输出中添加了
\u n
eof
值,这样您就可以清楚地看到它们是如何工作的了。

Rob的方法几乎是标准的,但是如果您更喜欢编写显式循环的脚本,还有另一个选项(这对于非SAS程序员来说更容易阅读)。这将与Rob的答案完全相同,甚至可以编译成相同的机器代码

data _null_;
    file mymail;

    put '<html><body><table>';
    do _n_ = 1 by 1 until (eof);
    /*loop trhough all records*/
      set WORK.MyEmailTable end=eof;
      put '<tr>';
      put %sysfunc(cats('<td>',var1,'</td>'));
      put %sysfunc(cats('<td>',var2,'</td>'));
      put %sysfunc(cats('<td>',var3,'</td>'));
      put '</tr>';
    end;
    put '</table></body></html>';
    stop;
run;
数据\u空\u;
归档我的邮件;
放‘’;
do_n_=1乘以1直到(eof);
/*循环所有记录*/
set WORK.MyEmailTable end=eof;
放‘’;
放置%sysfunc(猫('',变量1');
放置%sysfunc(猫('',变量2');
放置%sysfunc(猫('',变量3');
放‘’;
结束;
放‘’;
停止
跑
\u n\u
这里没有任何特殊意义(就像Rob的回答中那样);它被惯例所使用,因为这样它实际上具有与通常相同的含义

您需要使用
end=eof
创建变量
eof
,该变量在数据集的最后一条记录上为true;否则,数据步骤将提前终止(在实际执行最终语句之前)。您还需要
停止
来告诉它不要返回开始-否则它将返回,并将放置一个新的开始部分,然后在点击
时立即终止。(试试看。)

do\u n\u=1乘以1直到(eof)
是使用增量循环的SAS特定方式;例如,它类似于(_n_=1;!eof;_n_++)的c/c++
——它允许您拥有一个自动递增的do循环,同时拥有一个单独的、不相关的停止条件

data _null_;
    file mymail;

    put '<html><body><table>';
    do _n_ = 1 by 1 until (eof);
    /*loop trhough all records*/
      set WORK.MyEmailTable end=eof;
      put '<tr>';
      put %sysfunc(cats('<td>',var1,'</td>'));
      put %sysfunc(cats('<td>',var2,'</td>'));
      put %sysfunc(cats('<td>',var3,'</td>'));
      put '</tr>';
    end;
    put '</table></body></html>';
    stop;
run;