Anvendelse af Model- View koncept i SAS Stored Processer Peter Sandal Boll Chefkonsulent Professional Services, Skanderborg SAS Institute A/S
Agenda Model-View-Controller konceptet (MVC) Eksempel med put-rapport Hvordan anvendes MVC i en SAS Stored Process Eksempler (HTML, RTF) Anbefalinger og konklusioner Spørgsmål
Model-View-Controller Client Application Server Data Server request Controller Browser Model response View
Model-View-Controller SAS Stored Process Server Client SAS Stored Process Server Data Server request SAS-program Browser Macrovariable Datastep response HTMLtemplate
Eksempel: put-rapport data _null_; file _webout; txt = "Vores besked i alertboksen!!"; put '<HTML>'; put '<HEAD><TITLE>Hello World!</TITLE>'; put '<script language="javascript">'; put 'function showalert(msg) {'; put ' alert(msg)'; put '}'; put '</script>'; put '</HEAD>'; put '<BODY>'; put '<H1>Hello World!</H1>'; put '<H2>Dannet med put-rapport og javascript...</h2>'; put '<form>'; put '<input type="button" value="vis alert" onclick="showalert(''' txt +(-1) ''');">'; put '</form>'; put '</BODY>'; put '</HTML>'; run; stp\helloworld.sas http://localhost:8080/sasstoredprocess/input/sasforum0 9/HelloWorld.jsp Skriv output til browser Eksempel på SAS-variabel Statisk HTML-kode Anvendelse af SAS-variabel
Udfordringer i koden? Sammenblanding af programlogik og kode til præsentation af data Kode bliver nemt uoverskueligt F. eks. hører nogle plinger til SAS logik, andre hører til HTML 80-90% er statisk indhold Kan koden struktureres på en mere overskuelig måde? Ja, principperne fra Model-View konceptet kan anvendes! data _null_; file _webout; txt = "Vores besked i alertboksen!!"; put '<HTML>'; put '<HEAD><TITLE>Hello World!</TITLE>'; put '<script language="javascript">'; put 'function showalert(msg) {'; put ' alert(msg);'; put '}'; put '</script>'; put '</HEAD>'; put '<BODY>'; put '<H1>Hello World!</H1>'; put '<H2>Dannet med put-rapport og javascript...</h2>'; put '<form>'; put '<input type="button" value="vis alert" onclick="showalert(''' txt +(-1) ''');">'; put '</form>'; put '</BODY>'; put '</HTML>'; run;
HTML-template Viewer-del lægges i en separat fil, som kaldes af SAS - programmet Dynamiske elementer lægges i tags, som efterfølgende substitueres med værdien af konkret macrovariabel F.eks. substitueres &txt med indholdet af macrovariablen txt i SAS programmet <HTML> <HEAD><TITLE>Hello World!</TITLE> <script language="javascript"> function showalert(msg) { } alert(msg); </script> </HEAD> <BODY> <H1>Hello World!</H1> <H2>Dannet via ekstern template...</h2> <form> <input type="button" value="vis alert" onclick="showalert('&txt');"> </form> </BODY> </HTML>
SAS -program %let template=c:\sas Forum 2009\templates\HelloWorld_Template.html; * Liste af macrovariable, der skal substitueres i templaten; %let txt = Besked fra Hello World!!; %streamfile("&template",_webout, txt _srvname _srvport _metauser); Reference til template Reference til output Liste af macrovariable, der skal substitueres stp\helloworld_template.sas http://localhost:8080/sasstoredprocess/input/sasforu m09/helloworld_template.jsp
Streamfile Macro Substituerer tags i template-fil med indholdet af macrovariabel Tags er opbygget med ved hjælp af & + navn på macrovariabel *stop*-tags afbryder udskrivning midlertidigt Mulighed for at substituere *stop*-tags med output fra SAS Udskrivning i template fortsættes, når dynamisk SAS-kode er udført
Streamfile Macro %macro streamfile(inputfile,outputfile,resolvevars,mode=); %if not %symexist(linienr) %then %do; %put NOTE: Linienr defineres...; %global linienr; %end; %if %upcase(&mode) ne CONTINUE %then %let linienr=0; %put NOTE: Startlinienr: &linienr; data _null_; length taller 8; retain taller 0; infile &inputfile lrecl=32767 _infile_=inputbuf end=eof; input ; taller=taller+1; %local i; %let i=1; %do %while(%scan(&resolvevars,&i) ne ); %let mvar=%scan(&resolvevars,&i); %global &mvar; if index(inputbuf,'&'!!"&mvar") then inputbuf = tranwrd(inputbuf,'&'!!"&mvar","&&&mvar"); %let i=%eval(&i+1); %end; file &outputfile lrecl=32767; if index(inputbuf,'*stop*') and &linienr<taller then do; call symput('taller',taller); stop; end; if &linienr<=taller then put _infile_; if eof then call symput('taller',taller); run; %let linienr=%eval(&taller+1); %put NOTE: Slutlinienr: &linienr; %mend streamfile;
HTML-template med stop-tags. <form action="&_url" method="post" target="newwin"> <input type="hidden" name="_program" value="/sasforum09/class_report"> <table><tr><td>vælg køn:</td></tr> <tr><td> <select name="sex"> *stop* </select> </td></tr> Her returneres kontrollen til SAS -programmet igen <tr><td>vælg alder:</td></tr> <tr><td> <select name="age"> *stop* </select> </td></tr> <tr><td><input type="button" name="button1" Value="Dan rapport" onclick="form.submit();"></td></tr> </table> </form>
SAS -program med stop-tags %let template=c:\sas Forum 2009\templates\Class_Template.html; %streamfile("&template",_webout,_srvname _srvport _url _program _metauser); proc sql; create table sex as select distinct sex from sashelp.class; quit; data _null_; set sex; file _webout; put '<option value="' sex +(-1) '"> ' sex +(-1) '</option>'; run; Læs template indtil første *stop*-tag Udskriv distincte værdier for køn Læs template indtil næste *stop*-tag %streamfile("&template",_webout,_srvname _srvport _url _program _metauser,mode=continue);
SAS -program med stop-tags proc sql; create table age as select distinct age from sashelp.class; quit; data _null_; set age; file _webout; put '<option value="' age +(-1) '"> ' age +(-1) '</option>'; run; Udskriv distincte værdier for alder Læs resten af template %streamfile("&template",_webout,_srvname _srvport _url _program _metauser,mode=continue); stp\class_template.sas http://localhost:8080/sasstoredprocess/input/sasforum09/class_template.jsp
Eksempel med RTF-template Templaten behøver ikke være HTML, f. eks. kan RTF også benyttes RTF er et tekst-baseret format på linje med HTML, hvor vi kan substituere værdier F.eks. kan MS Word benyttes til opbygning/redigering af skabelon templates\lonaftale_skabelon_kto.rtf
Eksempel med RTF-template %let template=c:\sas Forum 2009\templates\lonaftale_skabelon_kto.rtf; * Liste af macrovariable, der skal substitueres i templaten; %let afd = Afdeling A1; %let navn = Ulla Jensen; %let stilling = Sygeplejerske; %let cpr = 123456-7890; %let tjnr = 12345; %let tj = ; %let ovk = X; %let rc = %sysfunc(stpsrv_header(content-type,application/vnd.msword)); %let rc = %sysfunc(stpsrv_header(content-disposition,"attachment;filename=report.doc")); %streamfile("&template",_webout, afd navn stilling cpr tjnr tj ovk _srvname _srvport _metauser); http://localhost:8080/sasstoredprocess/input/sasforum09/rtf_template.jsp
Anbefalinger og konklusioner Undgå så vidt muligt sammenblanding af SAS -kode og HTMLkode i put-rapporter Programlogik og præsentation kan skilles ad, med anvendelsen af templates Løs kobling af model (data) og viewer (template) gør det nemt at vise modellens data i et andet view Lettere vedligeholdelse af webgrænseflade Mere overskuelige programmer Fleksibel måde at danne flere typer output HTML, RTF
Spørgsmål?
Peter Sandal Boll Peter.Boll@sdk.sas.com