1

因此,我看到了各种页面,这些页面通知 SAS 存储过程用户创建存储过程网页如何执行以下操作:

https://support.sas.com/documentation/cdl/en/stpug/62758/HTML/default/viewer.htm#p0q383asmm4bejn1i7z4q7iv5eke.htm

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 导入页面的快速方法,但我注意到使用 put 的 HTML 变得非常混乱且不可维护。

如何改为引用外部 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;

更新已解决

感谢下面列出的示例 Joe,这就是我必须编写的代码才能使这项工作......在 SAS 代码中:

filename htmlfile "/sasdata/IT/APP/file.html";

proc stream outfile=_webout;
begin
&streamdelim; %include htmlfile;
;;;;
run;

注意:在您的 html 文件中,如果您有 %DO 循环之类的宏语句,您可能会收到类似“错误:%DO 语句在开放代码中无效”之类的错误。为了解决该错误,我在该语句周围的 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>
4

2 回答 2

2

根据您的具体细节,有几种方法可以做到这一点,但最简单的两种方法是将 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;

请注意,它为我们解析了宏变量。

如果我理解你的话,你可以改变outfileto_WEBOUT并且你应该得到你希望的东西。

于 2017-10-25T19:46:50.347 回答
0

我们在SAS 应用程序团队中这样做的方式是在部署之前将原始 HTML编译成 SAS 程序。

我们将这种方法称为“流式应用程序”,它可以在 SAS 9(元数据)和 Viya 上运行。这是一个细分: https ://sasapps.io/sas-streamed-apps

于 2022-01-09T13:15:24.990 回答