SAS 存储过程 STP web:如何为文件 _webout 引用 html 文件而不是 put 语句?
SAS Stored Process STP web: How to reference html file for file _webout instead of put statements?
因此,我看到了各种页面,这些页面告知 SAS 存储过程用户创建存储过程网页如何执行以下操作:
data _null_;
file _webout;
put '<HTML>';
put '<HEAD><TITLE>Hello World!</TITLE></HEAD>';
put '<BODY>';
put '<H1>Hello World!</H1>';
put '</BODY>';
put '</HTML>';
run;
put HTML 语句很好,是将 HTML 转到页面的快速方法,但我注意到我的 HTML 使用 put 变得非常混乱且无法维护.
如何引用外部 HTML 文件? 我在 HTML put 语句中引用了一些 SAS 宏,所以我'我不确定这些是否会在外部 html 中解析,但仍然有兴趣查看在存储过程中引用外部 HTML 文件的工作示例。
更新 - 我的示例程序
在这个 HTML 中,我只是在网页上写了一个表单,在下拉列表中填充了一些数据。我只想从外部 HTML 文件中将其称为原始 html,同时仍像宏变量引用一样解析嵌入在 HTML 中的 SAS 代码。
%macro test;
proc sql;
create table eqmtid_name as
select distinct EQMT_ID
from library.joined_data;
%let neqmtid = &sqlobs;
quit;
data _null_;
set eqmtid_name;
suffix=put(_n_,8.);
call symput(cats('EQMTID',suffix), EQMT_ID);
run;
data _null_;
file _webout;
put '<script type="text/javascript">document.body.innerHTML = "";</script>';
put '<HTML>';
put '<head>';
put '<script type="text/javascript">';
put 'document.addEventListener("DOMContentLoaded", function initialize() {';
put ' var svgs = document.getElementsByTagName("svg");';
put ' for (i = 0; i < svgs.length; ++i) {';
put ' e = svgs[i];';
put ' e.removeAttribute("height");';
put ' e.removeAttribute("width");';
put ' e.setAttribute("width","80%");';
put ' }';
put ' ';
put '});';
put '</script>';
put '</head>';
put '<BODY onload="initialize()">';
put '<HEADER class="pageheader">';
put '<TABLE>';
put '<tr>';
put '<td>';
put '<div class="divcenter">Header Text</div>';
put '</td>';
put '</tr>';
put '</TABLE>';
put '</HEADER>';
put '<FORM NAME="sub" METHOD="GET" ACTION="/SASStoredProcess/do">';
put '<INPUT TYPE="HIDDEN" NAME="_program" SIZE="100" VALUE="/Company/IT/Development/APP/stp_program">';
put '<INPUT TYPE="CHECKBOX" NAME="_debug" VALUE="log">Show SAS Log <br>';
put '<TABLE>';
put '<tr>';
put '<td>';
put '<label class="formitem">Equipment ID:</label>';
put '</td>';
put '<td>';
put '<select class="formitem styleinput" name="EQMTID">' /
'<option value=""></option>' /
%do i = 1 %to &neqmtid; /
"<option value = %bquote(")%left(%trim(&&EQMTID&i))%bquote(") >&&EQMTID&i</option>" /
%end; /
'</select>';
put '</td>';
put '</TABLE>';
put '<br>';
put '<TABLE>';
put '<tr>';
put '<td>';
put '<INPUT class="button" class="formitem" TYPE="SUBMIT" VALUE="Search"><br>';
put '</td>';
put '</FORM>';
put '<FORM NAME="download" TARGET="_blank" METHOD="GET" ACTION="/SASStoredProcess/do">';
put '<INPUT TYPE="HIDDEN" NAME="_program" SIZE="100" VALUE="/Company/IT/Development/APP/export_data_stp">';
put '<td>';
put '<INPUT class="button" class="formitem" TYPE="SUBMIT" VALUE="Download"><br>';
put '</td>';
put '</FORM>';
put '</tr>';
put '</TABLE>';
put '</BODY>';
put '</HTML>';
run;
%mend;
%test;
更新已解决
感谢乔在下面概述的示例,这就是我必须编写的代码才能使这项工作......在 SAS 代码中:
filename htmlfile "/sasdata/IT/APP/file.html";
proc stream outfile=_webout;
begin
&streamdelim; %include htmlfile;
;;;;
run;
注意:在您的 html 文件中,如果您有像 %DO 循环这样的宏语句,您可能会得到像 "Error: The %DO statement is not valid in open code" 这样的错误。为了解决该错误,我在 html 文件中围绕该语句包含了一个宏包装器,如下所示:
<select class="formitem styleinput" name="EQMTID">
<option value=""></option>
%macro doeqmt;
%do i = 1 %to &neqmtid;
"<option value = %bquote(")%left(%trim(&&EQMTID&i))%bquote(") >&&EQMTID&i</option>"
%end;
%mend;
%doeqmt;
</select>
根据您的具体细节,有几种方法可以做到这一点,但最简单的两种方法是将 HTML 读入数据步骤(在字符变量中,每行一个),然后将它再次退出(如果您需要对其进行一些修改,这会更好),或者如 Tom 建议您可以使用 PROC STREAM
如果您不需要对其进行太多修改或者您可以插入宏变量(或宏)在原始 HTML 预文件中。
PROC STREAM 非常简单。假设我有一个 hello world 类型的文件,在 c:\temp\helloworld.html
<html>
<header>
<title>My Example Page</title>
</header>
<body>
<h1> Hello, World </h1>
</body>
</html>
那我就可以写这个小程序了:
filename htmlfile "c:\temp\helloworld.html";
filename outfile "c:\temp\stream.html";
proc stream outfile=outfile;
begin
&streamdelim readfile htmlfile;
;;;;
run;
我现在有一个内容相同的新文件 stream.html
。并解决其中的任何宏变量或宏。
例如,让我们稍微改变一下:
输入:
<html>
<header>
<title>My Example Page</title>
</header>
<body>
<h1> &mystring. </h1>
</body>
</html>
输出,注意新的%let
:
filename htmlfile "c:\temp\helloworld.html";
filename outfile "c:\temp\stream.html";
%let mystring = Hello, World;
proc stream outfile=outfile;
begin
&streamdelim readfile htmlfile;
;;;;
run;
请注意,它为我们解析了宏变量。
您可以将 outfile
更改为 _WEBOUT
,如果我理解正确的话,您应该会得到您希望的结果。
我们在 SAS Apps 团队中这样做的方法是在部署之前 将原始 HTML 编译 成 SAS 程序。
我们将这种方法称为“流式应用程序”,它可以在 SAS 9(元数据)和 Viya 上运行。这是一个细分:https://sasapps.io/sas-streamed-apps
因此,我看到了各种页面,这些页面告知 SAS 存储过程用户创建存储过程网页如何执行以下操作:
data _null_;
file _webout;
put '<HTML>';
put '<HEAD><TITLE>Hello World!</TITLE></HEAD>';
put '<BODY>';
put '<H1>Hello World!</H1>';
put '</BODY>';
put '</HTML>';
run;
put HTML 语句很好,是将 HTML 转到页面的快速方法,但我注意到我的 HTML 使用 put 变得非常混乱且无法维护.
如何引用外部 HTML 文件? 我在 HTML put 语句中引用了一些 SAS 宏,所以我'我不确定这些是否会在外部 html 中解析,但仍然有兴趣查看在存储过程中引用外部 HTML 文件的工作示例。
更新 - 我的示例程序
在这个 HTML 中,我只是在网页上写了一个表单,在下拉列表中填充了一些数据。我只想从外部 HTML 文件中将其称为原始 html,同时仍像宏变量引用一样解析嵌入在 HTML 中的 SAS 代码。
%macro test;
proc sql;
create table eqmtid_name as
select distinct EQMT_ID
from library.joined_data;
%let neqmtid = &sqlobs;
quit;
data _null_;
set eqmtid_name;
suffix=put(_n_,8.);
call symput(cats('EQMTID',suffix), EQMT_ID);
run;
data _null_;
file _webout;
put '<script type="text/javascript">document.body.innerHTML = "";</script>';
put '<HTML>';
put '<head>';
put '<script type="text/javascript">';
put 'document.addEventListener("DOMContentLoaded", function initialize() {';
put ' var svgs = document.getElementsByTagName("svg");';
put ' for (i = 0; i < svgs.length; ++i) {';
put ' e = svgs[i];';
put ' e.removeAttribute("height");';
put ' e.removeAttribute("width");';
put ' e.setAttribute("width","80%");';
put ' }';
put ' ';
put '});';
put '</script>';
put '</head>';
put '<BODY onload="initialize()">';
put '<HEADER class="pageheader">';
put '<TABLE>';
put '<tr>';
put '<td>';
put '<div class="divcenter">Header Text</div>';
put '</td>';
put '</tr>';
put '</TABLE>';
put '</HEADER>';
put '<FORM NAME="sub" METHOD="GET" ACTION="/SASStoredProcess/do">';
put '<INPUT TYPE="HIDDEN" NAME="_program" SIZE="100" VALUE="/Company/IT/Development/APP/stp_program">';
put '<INPUT TYPE="CHECKBOX" NAME="_debug" VALUE="log">Show SAS Log <br>';
put '<TABLE>';
put '<tr>';
put '<td>';
put '<label class="formitem">Equipment ID:</label>';
put '</td>';
put '<td>';
put '<select class="formitem styleinput" name="EQMTID">' /
'<option value=""></option>' /
%do i = 1 %to &neqmtid; /
"<option value = %bquote(")%left(%trim(&&EQMTID&i))%bquote(") >&&EQMTID&i</option>" /
%end; /
'</select>';
put '</td>';
put '</TABLE>';
put '<br>';
put '<TABLE>';
put '<tr>';
put '<td>';
put '<INPUT class="button" class="formitem" TYPE="SUBMIT" VALUE="Search"><br>';
put '</td>';
put '</FORM>';
put '<FORM NAME="download" TARGET="_blank" METHOD="GET" ACTION="/SASStoredProcess/do">';
put '<INPUT TYPE="HIDDEN" NAME="_program" SIZE="100" VALUE="/Company/IT/Development/APP/export_data_stp">';
put '<td>';
put '<INPUT class="button" class="formitem" TYPE="SUBMIT" VALUE="Download"><br>';
put '</td>';
put '</FORM>';
put '</tr>';
put '</TABLE>';
put '</BODY>';
put '</HTML>';
run;
%mend;
%test;
更新已解决
感谢乔在下面概述的示例,这就是我必须编写的代码才能使这项工作......在 SAS 代码中:
filename htmlfile "/sasdata/IT/APP/file.html";
proc stream outfile=_webout;
begin
&streamdelim; %include htmlfile;
;;;;
run;
注意:在您的 html 文件中,如果您有像 %DO 循环这样的宏语句,您可能会得到像 "Error: The %DO statement is not valid in open code" 这样的错误。为了解决该错误,我在 html 文件中围绕该语句包含了一个宏包装器,如下所示:
<select class="formitem styleinput" name="EQMTID">
<option value=""></option>
%macro doeqmt;
%do i = 1 %to &neqmtid;
"<option value = %bquote(")%left(%trim(&&EQMTID&i))%bquote(") >&&EQMTID&i</option>"
%end;
%mend;
%doeqmt;
</select>
根据您的具体细节,有几种方法可以做到这一点,但最简单的两种方法是将 HTML 读入数据步骤(在字符变量中,每行一个),然后将它再次退出(如果您需要对其进行一些修改,这会更好),或者如 Tom 建议您可以使用 PROC STREAM
如果您不需要对其进行太多修改或者您可以插入宏变量(或宏)在原始 HTML 预文件中。
PROC STREAM 非常简单。假设我有一个 hello world 类型的文件,在 c:\temp\helloworld.html
<html>
<header>
<title>My Example Page</title>
</header>
<body>
<h1> Hello, World </h1>
</body>
</html>
那我就可以写这个小程序了:
filename htmlfile "c:\temp\helloworld.html";
filename outfile "c:\temp\stream.html";
proc stream outfile=outfile;
begin
&streamdelim readfile htmlfile;
;;;;
run;
我现在有一个内容相同的新文件 stream.html
。并解决其中的任何宏变量或宏。
例如,让我们稍微改变一下:
输入:
<html>
<header>
<title>My Example Page</title>
</header>
<body>
<h1> &mystring. </h1>
</body>
</html>
输出,注意新的%let
:
filename htmlfile "c:\temp\helloworld.html";
filename outfile "c:\temp\stream.html";
%let mystring = Hello, World;
proc stream outfile=outfile;
begin
&streamdelim readfile htmlfile;
;;;;
run;
请注意,它为我们解析了宏变量。
您可以将 outfile
更改为 _WEBOUT
,如果我理解正确的话,您应该会得到您希望的结果。
我们在 SAS Apps 团队中这样做的方法是在部署之前 将原始 HTML 编译 成 SAS 程序。
我们将这种方法称为“流式应用程序”,它可以在 SAS 9(元数据)和 Viya 上运行。这是一个细分:https://sasapps.io/sas-streamed-apps