Bogdan
Taranta
Business Solutions
Manager
Temat: [SAS] parametryzowane raporty bez WRS
Po długim czasie nieobecności wracam z małym rodzynkiem, znów SAS'owym. Obecnie receptą SAS na publikację raportów i budowę prostych aplikacji webowych jest SAS Web Report Studio i SAS Portal. Niestety otoczenie biznesowe wymaga szybkich wdrożeń, a wspomniane narzędzia pracochłonnego definiowania metadanych.Wystarczy jednak dowolny serwer WWW zainstalowany na maszynie wykonującej skrypty (zazwyczaj już jest), a bogate możliwości ODS wystarczą na uruchomienie statycznego raportu bez angażowania WRS'a. Każdy to potrafi!
Tym sposobem możemy tworzyć niestety tylko statyczne strony WWW. Napisałem więc sprytny skrypt PHP, który wywołuje sesję SAS i przekazuje do niej parametry z zapytania WWW. Skrypt zawiera tylko kilka linijek kodu, a wykonuje następujące kroki:
a) pobiera wszystkie parametry przekazane w nagłówku GET i POST
b) tworzy z nich tymczasowy kod 4GL w pliku autoexec.sas, w którym definiowane są odpowiadające parametrom makrozmienne
c) uruchamia lokalną sesję SAS, wczytuje definicje makrozmiennych i uruchamia wybrany skrypt 4GL (definiowany w parametrze SYSIN)
d) zwraca wygenerowany rezultat ODS z powrotem do klienta WWW
Wywołanie strony...
http://serwer/submit.php?SYSIN=moje_makro&PAR_1=123&PAR_2=345
...spowoduje więc uruchomienie na serwerze sesji SAS i wykonanie skryptu moje_makro.sas z następującymi makrozmiennymi na starcie:
%let PAR_1=123
%let PAR_2=345
%let REPORTLOC=(tymczasowa lokalizacja)
Po zakończeniu pracy skryptu, w oknie przeglądarki wyświetli się cokolwiek tylko zapiszemy w tymczasowej lokalizacji &REPORTLOC za pomocą wywołanego makra, np. w taki sposob:
ods html3 file=&REPORT_LOC;
proc print data=Klienci (where=(ID=&PAR_1));
run;
ods html3 close;
Kod skryptu dostępny jest poniżej, ale wymaga oczywistej parametryzacji pod konkretną instalację oraz katalogów autoexec, reports, macros, logs i listings w miejscu wywoływania. We wspomnianych katalogach tworzone są tymczasowe raporty, wyszukiwane makra, zapisywane są logi i zawartości przekazywanych makrozmiennych.
<?
$sasroot = "\"C:\SAS\SAS 9.1\sas.exe\"";
$submitroot = "C:\WWW\submit";
$id = rand(100,999) . rand(100,999) . rand(100,999) . rand(100,999);
$autoexec_str = $submitroot . "\\autoexec\\" . "autoexec_" . $id . ".sas";
$output_str = $submitroot . "\\reports\\" . "report_" . $id . ".html";
$sascodes_str = $submitroot . "\\macros\\";
$logs_str = $submitroot . "\\logs\\" . "log_" . $id . ".log";
$listings_str = $submitroot . "\\listings\\" . "print_" . $id . ".lst";
$autoexec = fopen($autoexec_str, 'w');
fwrite($autoexec, "%LET REPORTLOC=" . $output_str . ";\r\n" );
foreach($_GET as $name => $value) {
fwrite($autoexec, "%LET ".$name."=" . $value . ";" . "\r\n" );
if ( strtoupper($name) == "SYSIN" ) { $sysin = $value; };
}
foreach($_POST as $name => $value) {
fwrite($autoexec, "%LET ".$name."=" . $value . ";" . "\r\n" );
if ( strtoupper($name) == "SYSIN" ) { $sysin = $value; };
}
fclose($autoexec);
if ( !file_exists($sascodes_str . $sysin . ".sas")) { exit(); };
$shellcmd = $sasroot . " -autoexec " . $autoexec_str . " -nosplash -icon -sysin " . $sascodes_str . "\\" . $sysin . " -log " .$logs_str. " -print " . $listings_str;
exec($shellcmd, $answer);
echo file_get_contents($output_str);
?>
Pozdrawiam i zachęcam do eksperymentów!Bogdan Taranta edytował(a) ten post dnia 20.06.11 o godzinie 15:32