INIT:
/* Get the parameter list. */
entry myparms 8;
length msg $200;
return;
MAIN:
/* Get the parameters, execute the program, and */
/* assign any return values. */
link getparms;
link execute;
link setparms;
return;
TERM:
return;
GETPARMS:
/* Strip off any supplied parameters. */
dsid=getnitemn(myparms,'DSID',1,1,0);
if not dsid then
dsname=getnitemc(myparms,'DSNAME',1,1,
optgetc('_LAST_'));
obs=getnitemn(myparms,'OBS',1,1,1);
time=getnitemn(myparms,'TIME',1,1,1);
maxtrys=getnitemn(myparms,'TRYS',1,1,9999);
modvar=getnitemc(myparms,'VARIABLE',1,1,' ');
modamt=getnitemn(myparms,'AMOUNT',1,1,0);
/* Delete any premature return values, possibly */
/* due to an earlier call. */
if nameditem(myparms,'MESSAGE') then
rc=delnitem(myparms,'MESSAGE');
if nameditem(myparms,'SUCCESS') then
rc=delnitem(myparms,'SUCCESS');
return;
EXECUTE:
/* Assume no success. */
success=0;
/* If a DSID was not supplied, create one */
/* for the named data set. */
if not dsid then
dsid=open(dsname);
/* If a DSID was either found or created, try to */
/* lock the observation. */
if dsid then do;
/* Starting now, we have not tried and */
/* no time has elapsed. */
try=0;
elapse=0;
start=time();
/* While we have not locked it, exceeded */
/* our allotted tries or time, try again. */
do while((elapse < time) and (try < maxtrys)
and (not success));
rc=fetchobs(dsid,obs);
/* If the update was not successful, */
/* we do not have a lock. */
if update(dsid) then do;
/* Note why the update failed, increment */
/* our number of tries, and calculate the */
/* elapsed time. */
msg=sysmsg();
elapse=time() - start;
try=try + 1;
end;
/* Or else we have locked it. */
else do;
/* Note the success and modify any */
/* specified variable. */
success=1;
if modvar not= ' ' then do;
/* If the variable exists, add some */
/* amount to it. */
vnum=varnum(dsid,modvar);
if vnum then do;
/* Note the new value and save that */
/* value in the data set. */
newvalue=getvarn(dsid,vnum) + modamt;
call putvarn(dsid,vnum,newvalue);
rc=update(dsid);
end;
end;
end;
end;
end;
return;
SETPARMS:
/* Note the success or reason for failure. */
if success then
rc=setnitemn(myparms,1,'SUCCESS');
else
rc=setnitemc(myparms,msg,'MESSAGE');
/* If the DSID was not supplied, send one back. */
if not dsid then
rc=setnitemn(myparms,dsid,'DSID');
/* Note the new value. */
rc=setnitemn(myparms,newvalue,'NEWVALUE');
return;
/**********************************************************************/
/* Open the data set containing the current */
/* unique TWNUM number. */
poolid=open('pubtkda.pool','U');
/* Make a list to act as the parameter for GETLOCK. */
poolparm=makelist();
/* The opened DSID is the DSID to use in GETLOCK. */
rc=setnitemn(poolparm,poolid,'DSID');
/* The variable containing the current unique */
/* TWNUM number is named NUMBER. */
rc=setnitemc(poolparm,'NUMBER','VARIABLE');
/* Add 1 to the current value for each */
/* call to GETLOCK. */
rc=setnitemn(poolparm,1,'AMOUNT');
/* Use observation 1, where the description of the */
/* number is TWNUM. */
rc=where(poolid,'DESCRIP="TWNUM"');
return;
/**********************************************************************/
/* If the observation is new, get the next */
/* available TWNUM number. */
if obsinfo('NEW') then do;
/* Call GETLOCK to get the next number. */
call display('getlock.scl',poolparm);
/* The TWNUM is the returned number */
/* with a TW appended. */
twnum=trim(left(put(getnitemn
(poolparm,'NEWVALUE'),8.))) || 'TW';
/* Be sure to unlock the locked observation. */
rc=unlock(poolid);
end;
/**********************************************************************/