Как ссылаться на файл HTML для файла _webout вместо операторов put?
Поэтому я видел различные страницы, которые информируют пользователей SAS Stored Process, создающих веб-страницы хранимых процессов, о том, как сделать что-то вроде:
https://support.sas.com/documentation/cdl/en/stpug/62758/HTML/default/viewer.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;
HTML-предложения put - это хороший и быстрый способ получить HTML-код на странице, но я заметил, что мой HTML с использованием put становится довольно грязным и не подлежит сопровождению.
Как я могу вместо этого ссылаться на внешний файл HTML? У меня есть некоторые макросы SAS, на которые я ссылаюсь в выражениях HTML put, поэтому я не уверен, что они разрешатся во внешнем html, но все еще хотел бы увидеть рабочий пример ссылки на внешний файл HTML в хранимом процессе.
ОБНОВЛЕНИЕ - Мой пример программы
В этом месте HTML я просто пишу форму на веб-страницу с некоторыми данными, которые заполняются в раскрывающемся списке. Я просто хотел бы назвать это необработанным html из внешнего HTML-файла, в то же время разрешая код SAS, встроенный в HTML, как ссылки на макропеременные.
%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, вы можете получить сообщение об ошибке "Ошибка: оператор%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>
2 ответа
В зависимости от ваших точных данных, есть несколько способов сделать это, но самые простые два - либо прочитать HTML в шаг данных (в символьной переменной, по одному в строке), а затем снова вернуть его (лучше, если вам нужно выполнить некоторые изменения), или, как предложил Том, вы можете использовать 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