|
SAS/IntrNet 9.1: Application Dispatcher |
|
The Dispatcher program creates a temporary file for each request. When multiple requests are run at the same time, one request may write over the temporary file of another. There are several ways to create a unique file for the life of a request so that files do not interfere with each other:
To create a uniquely named file, use a random function to generate the filename. Then, use the name in a FILENAME statement:
/* Use a data step function RANUNI to generate a random number
and format the number with some text to create the unique name.
The RAN macro variable will be something like 'A2578900.txt' */
data _null_;
numb = ceil (ranuni(0)*10000000);
r = 'A' || put(numb, Z7.) || '.txt';
call symput ('ran', r);
run;
filename foo "c:\temp\&ran";
/* prepend the temp subdirectory */
data _null_;
file foo;
put 'This is output to a uniquely named file';
run;
This technique requires that you explicitly delete the file when you are finished.
You can avoid file interference by using a unique subdirectory. Beginning with Version 8 of SAS/IntrNet: Application Dispatcher, the WORK library is unique for each request. Find the path to the WORK library and use it as the subdirectory to store the temporary file.
Note: To append text to a macro variable reference, use the period (.) operator.
/* use pathname function to get work library's path and store in macro variable wpath */ %let wpath=%sysfunc(pathname(work)); /* use wpath macro variable and append filename to it in filename statement */ filename foo "&wpath.\winapi.txt"; data _null_; file foo; put 'This output is going to file in the work subdirectory'; run;
If the SESSIONS feature is used, then you can specify the path of the SAVE library:
%let spath=%sysfunc(pathname(save)); filename foo "&spath.\winapi.txt";
This technique deletes the file automatically at the end of the request.
You can create a unique file for each request by storing the file in a unique SAS catalog. Text can be easily stored in a catalog SOURCE memtype by using the CATALOG access method.
filename foo catalog "work.mytext.foo.source"; data _null_; file foo; put 'This output is going to file in the work catalog'; run;
You can use any one of these techniques in a Dispatcher program to create unique files for each request. To put it all together, here is a Dispatcher program that reports the username for the current process:
/*****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: HelloWorld with a twist */
/* TITLE: Hello World */
/* PRODUCT: SAS/IntrNet (Application Dispatcher) */
/* SYSTEM: ALL */
/* KEYS: */
/* PROCS: */
/* DATA: */
/* */
/* SUPPORT: Web Tools Group UPDATE: 20JAN1999 */
/* REF: http://support.sas.com/rnd/web/intrnet/dispatch/ */
/* MISC: */
/*****************************************************************/
/* create macro variable containing the path to the work subdirectory */
%let wpath=%sysfunc(pathname(work));
%put &wpath;
filename sascbtbl "&wpath.\winapi.txt";
/* write WINAPI GetUserNameA parameter list to the file for later use */
data _null_;
file sascbtbl;
input line $char80.;
put line $char80.;
cards4;
routine GetUserNameA
minarg=2
maxarg=2
stackpop=called
module=advapi32
returns=short;
arg 1 char update format=$cstr20;
arg 2 num update format=pib4.;
;;;;
run;
/* Here's the DATA step: Modulen will use the filename sascbtbl for
parameter list to the called API */
data _null_;
length Name $20.;
name='';
Size=20;
rc=modulen('GetUserNameA',Name,Size);
put rc= Name=;
/* Store the current process username in the macro named vqpname */
call symput('vqpname',name);
run;
/*simply write out a Web page that says "Hello World!"*/
/* use a DATA step variable and a macro variable in displayed text */
data _null_;
/* store macro variable value in data set variable named vname */
vname=symget('vqpname');
file _webout;
put '<HTML>';
/* Use data set variable in the output */
put '<HEAD><TITLE>Hello World!' vname ' is running dispatcher!
</TITLE></HEAD>';
put '<BODY>';
/* Use macro variable in the output */
put "<H1>Hello World! Your work path is &wpath.
vname is &vqpname.</H1>";
put '</BODY>';
put '</HTML>';
run;
|
SAS/IntrNet 9.1: Application Dispatcher |
|