|
|
| Author |
Message |
rajantsr
New User
Joined: 31 Jan 2007 Posts: 19 Location: Chennai
|
|
|
|
Hi ,
How do i close and reopen a file in the same rexx.
Thanks,
Rajan |
|
| Back to top |
|
 |
References
|
Posted: Wed May 14, 2008 8:33 pm Post subject: Re: How do i close and reopen a file in the same rexx |
 |
|
|
 |
ofer71
Global Moderator
Joined: 27 Dec 2005 Posts: 1812 Location: Israel
|
|
|
|
Can you specify what do you mean by "open" and "close"? In my TSO REXXs, I use ALLOCATE and FREE.
O. |
|
| Back to top |
|
 |
rajantsr
New User
Joined: 31 Jan 2007 Posts: 19 Location: Chennai
|
|
|
|
This is my code.
I am reading the spool writting into a temp1 file. and later I read that temp1 file from top and proceed for further processing.
This is failing with file already open even if i free it.
| Code: |
/* REXX */
ADDRESS TSO
"ALLOC F(TEMP1) DA('TEST.MASRS.REXX.TEMP1') NEW",
"TRACKS SPACE(100,100) LRECL(250) RECFM(F,B) DSORG(PS)"
"ALLOC F(INPUTF) DA('TEST.MASRS.REXX.JOBNAME') SHR"
"EXECIO * DISKR INPUTF (STEM JOBNAME. FINIS"
DO I = 1 TO JOBNAME.0
"ALLOC F(ISFIN) TRACKS SPACE(1) REU" /* USED BY SDSF */
"ALLOC F(ISFOUT) NEW DELETE REU " /* USED BY SDSF */
QUEUE "SET CONFIRM OFF"
QUEUE "OWNER *"
QUEUE "PREFIX "JOBNAME.I
QUEUE "ST"
QUEUE "AFD REFRESH"
QUEUE "END"
QUEUE ""
"EXECIO * DISKW ISFIN (FINIS"
PARM = "/ ++20,400"
ADDRESS LINKPGM "SDSF PARM"
X=OUTTRAP("OUT.")
"EXECIO * DISKR ISFOUT (STEM OUT. FINIS"
X=OUTTRAP("OFF")
DO J= 1 TO OUT.0
STR = SUBSTR(OUT.J,171,2)
IF STR = "CC" THEN
DO
PUSH OUT.J
"EXECIO 1 DISKW TEMP1 "
END
END
"FREE DD(ISFIN,ISFOUT)"
END
"EXECIO 0 DISKW TEMP1 (FINIS"
"FREE DD(TEMP1)"
/*****************************/
/* FOR GETTING THE CPU TIME */
/*****************************/
"ALLOC F(OUTPUTF) DA ('TEST.MASRS.REXX.CPU') NEW " ,
"TRACKS SPACE(100,100) LRECL(80) RECFM(F,B,A) DSORG(PS)"
"ALLOC F(TEMP2) DA('TEST.MASRS.REXX.TEMP1') "
SAY 'RC' RC
"EXECIO * DISKR TEMP1 (STEM JOBDET. FINIS"
SAY 'RC' RC
DO K = 1 TO JOBDET.0
"ALLOC F(ISFIN) TRACKS SPACE(1) REU" /* USED BY SDSF */
"ALLOC F(ISFOUT) NEW DELETE REU " , /* USED BY SDSF */
"TRACKS SPACE(100,100) LRECL(133) RECFM(F,B,A) DSORG(PS)"
"ALLOC F(TEMPPRT) DA('TEST.MASRS.REXX.TEMP2') NEW"
P_JOBNAME = SUBSTR(JOBDET.K,8,8)
P_JOBID = SUBSTR(JOBDET.K,17,8)
P_OWNER = SUBSTR(JOBDET.K,26,8)
P_MAXCC = SUBSTR(JOBDET.K,174,4)
IF P_MAXCC = '0000' THEN
DO
QUEUE "SET CONFIRM OFF"
QUEUE "OWNER " P_OWNER
QUEUE "PREFIX " P_JOBNAME
QUEUE "ST"
QUEUE "SELECT " P_JOBID
QUEUE "AFD REFRESH"
QUEUE "FIND "P_JOBNAME
QUEUE "++?"
QUEUE "FIND JESYSMSG"
QUEUE "++S"
QUEUE "PRINT FILE TEMPPRT"
QUEUE "PRINT"
QUEUE "PRINT CLOSE"
QUEUE "END"
QUEUE " "
"EXECIO" QUEUED()" DISKW ISFIN (FINIS" /* INPUT TO SDSF BATCH */
ADDRESS ISPEXEC "SELECT PGM(ISFAFD) PARM('++25,80')" /*INVOKE SDSF */
ADDRESS TSO "FREE F(ISFIN,ISFOUT,TEMPPRT)"
"ALLOC F(INPDD) DA('TEST.MASRS.REXX.TEMP') SHR"
X=OUTTRAP("SUB.")
"EXECIO * DISKR INPDD (STEM SUB. FINIS"
X=OUTTRAP("OFF")
P=SUB.0
P1 = POS('CPU',SUB.P)
CPU_TIME = SUBSTR(SUB.P,P1,20)
PUSH P_JOBNAME ',' P_JOBID ',' P_OWNER ',' P_MAXCC ',' CPU_TIME
"EXECIO 1 DISKW OUTFIL "
END
"FREE DD(INPDD)"
END
|
|
|
| Back to top |
|
 |
Pedro
Active User
Joined: 01 Sep 2006 Posts: 185 Location: work
|
|
|
|
In:
| Code: |
"ALLOC F(TEMP2) DA('TEST.MASRS.REXX.TEMP1') "
SAY 'RC' RC
"EXECIO * DISKR TEMP1 (STEM JOBDET. FINIS"
SAY 'RC' RC
|
You are allocating TEMP2 but trying to read TEMP1. I think you should use the same file name in both cases. What are the return codes?
But if I understand what you are doing, I do not think you need to write to TEMP1 at all. It looks like you are combining a bunch of lines into one big stem variable by writing to the file then reading them back in. I think you can just gather them into a stem
| Code: |
drop jobdet.
jobdet.0 = 0 /* set to zero early in the program*/
|
| Code: |
DO J= 1 TO OUT.0
STR = SUBSTR(OUT.J,171,2)
IF STR = "CC" THEN
DO
jobdet.0 = jobdet.0 +1
line_count = jobdet.0
jobdet.line_count = OUT.J
END
END
|
|
|
| Back to top |
|
 |
enrico-sorichetti
Global Moderator
Joined: 14 Mar 2007 Posts: 2443 Location: italy
|
|
| Back to top |
|
 |
rajantsr
New User
Joined: 31 Jan 2007 Posts: 19 Location: Chennai
|
|
|
|
It worked well..
Here is final working code to extract cputime and elapsed time from spool with a small screen.
| Code: |
/* REXX */
ADDRESS TSO
/***************************************************/
/* TO SHOW THE PANEL */
/***************************************************/
"ISPEXEC ADDPOP"
"ISPEXEC LIBDEF ISPPLIB DATASET ID('TEST.XYZ.REXX.PANEL')"
"ISPEXEC DISPLAY PANEL (SCPUTIME)"
"ISPEXEC REMPOP"
/***************************************************/
/* TO ALLOCATE INPUT AND OUTPUT FILES */
/***************************************************/
/*"ALLOC F(INPUTF) DA('TEST.XYZ.REXX.JOBNAME') SHR"*/
Y=OUTTRAP('ON')
"DELETE '"||OUTDSN||"' PURGE"
Y=OUTTRAP('OFF')
IF RC >= 0 THEN
DO
"ALLOC F(OUTPUTF) DA ('"OUTDSN"') NEW " ,
"TRACKS SPACE(100,100) LRECL(80) RECFM(F,B) DSORG(PS)"
IF RC > 0 THEN
DO
SAY "ERROR!!! ALLOCATING THE OUTPUT DATASET."
EXIT
END
END
/***************************************************/
/* INITIALIZE VARIABLES */
/***************************************************/
WSUB = 0
DROP JOBDET
JOBDET.0 = 0
DROP JOBNAME
JOBNAME.0 = 0
/* IF THE SCREEN DOES NOT WORK TO USE BATCH INPUT FILE */
/*"EXECIO * DISKR INPUTF (STEM JOBNAME. FINIS" /*READ INPUT FILE*/*/
/***************************************************/
/* TO GET VALUES FROM THE PANEL */
/***************************************************/
IF JOBN1 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.JOBC = JOBN1
END
IF JOBN2 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.2 = JOBN2
END
IF JOBN3 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.3 = JOBN3
END
IF JOBN4 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.4 = JOBN4
END
IF JOBN5 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.5 = JOBN5
END
IF JOBN6 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.6 = JOBN6
END
IF JOBN7 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.7 = JOBN7
END
IF JOBN8 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.8 = JOBN8
END
IF JOBN9 /= '' THEN
DO
JOBNAME.0 = JOBNAME.0 + 1
JOBC = JOBNAME.0
JOBNAME.9 = JOBN9
END
/***************************************************/
/* TO PRINT HEADER IN THE REPORT */
/***************************************************/
PUSH 'JOBNAME , JOBID , OWNER , MAX CC , CPU TIME' ,
' , ELAPSED'
"EXECIO 1 DISKW OUTPUTF "
SAY 'PROCESSING REQUEST, PLEASE WAIT...'
DO I = 1 TO JOBNAME.0 /* LOOPING UNTIL END OF FILE */
"ALLOC F(ISFIN) TRACKS SPACE(1) REU" /* USED BY SDSF */
"ALLOC F(ISFOUT) NEW DELETE REU " /* USED BY SDSF */
/***************************************************/
/* TO GET SPOOL DETAILS */
/***************************************************/
QUEUE "SET CONFIRM OFF"
QUEUE "OWNER *"
QUEUE "PREFIX "JOBNAME.I
QUEUE "ST"
QUEUE "END"
QUEUE ""
"EXECIO * DISKW ISFIN (FINIS"
PARM = "/ ++20,400"
ADDRESS LINKPGM "SDSF PARM"
X=OUTTRAP("OUT.")
"EXECIO * DISKR ISFOUT (STEM OUT. FINIS"
X=OUTTRAP("OFF")
DO J= 1 TO OUT.0
CSTR = SUBSTR(OUT.J,171,2) /*GET MAXCC */
IF CSTR = "CC" THEN /*FOR SUCCESSFUL JOBS ONLY */
DO
JOBDET.0 = JOBDET.0 +1
WSUB = JOBDET.0
JOBDET.WSUB = OUT.J
END
END
"FREE DD(ISFIN,ISFOUT)"
END
/***************************************************/
/* FOR GETTING THE CPU AND ELAPSED TIME */
/***************************************************/
DO J = 1 TO WSUB
P_JOBN = SUBSTR(JOBDET.J,8,8) /*GET JOBNAME */
P_JOBI = SUBSTR(JOBDET.J,17,8) /*GET JOBID */
P_OWN = SUBSTR(JOBDET.J,26,8) /*GET OWNER */
P_CC = SUBSTR(JOBDET.J,171,8) /*GET MAXCC */
IF P_CC = 'CC 0000' THEN /*FOR SUCCESSFUL JOBS ONLY*/
DO
/***************************************************/
/* FOR GETTING THE CPU TIME */
/***************************************************/
"ALLOC F(ISFIN) TRACKS SPACE(1) REU" /* USED BY SDSF */
"ALLOC F(ISFOUT) NEW DELETE REU " /* USED BY SDSF */
"ALLOC F(TEMPPR1) DA('TEST.XYZ.REXX.TEMP1') NEW" /*TEMP FILE*/
QUEUE "SET CONFIRM OFF"
QUEUE "OWNER "P_OWN
QUEUE "ST"
QUEUE "SELECT "P_JOBN P_JOBI
QUEUE "AFD REFRESH"
QUEUE "FIND "P_JOBN
QUEUE "++?"
QUEUE "FIND JESYSMSG"
QUEUE "++S"
QUEUE "PRINT FILE TEMPPR1"
QUEUE "PRINT"
QUEUE "PRINT CLOSE"
QUEUE "END"
QUEUE " "
"EXECIO" QUEUED()" DISKW ISFIN (FINIS"
ADDRESS ISPEXEC "SELECT PGM(ISFAFD) PARM('++25,80')"
ADDRESS TSO "FREE F(ISFIN,ISFOUT,TEMPPR1)"
"ALLOC F(INPDD1) DA('TEST.XYZ.REXX.TEMP1') SHR"
X=OUTTRAP("SUB.")
"EXECIO * DISKR INPDD1 (STEM SUB. FINIS"
P=SUB.0
P1 = POS('CPU',SUB.P) + 4
P_CPU = SUBSTR(SUB.P,P1,16)
"FREE DD(ISFIN,ISFOUT)"
/***************************************************/
/* TO GET ELAPSED TIME */
/***************************************************/
"ALLOC F(ISFIN) TRACKS SPACE(1) REU" /* USED BY SDSF */
"ALLOC F(ISFOUT) NEW DELETE REU " /* USED BY SDSF */
"ALLOC F(TEMPPR2) DA('TEST.XYZ.REXX.TEMP2') NEW" /*TEMP FILE*/
QUEUE "SET CONFIRM OFF"
QUEUE "OWNER "P_OWN
QUEUE "ST"
QUEUE "SELECT "P_JOBN P_JOBI
QUEUE "AFD REFRESH"
QUEUE "FIND "P_JOBN
QUEUE "++?"
QUEUE "FIND JESMSGLG"
QUEUE "++S"
QUEUE "PRINT FILE TEMPPR2"
QUEUE "PRINT"
QUEUE "PRINT CLOSE"
QUEUE "END"
QUEUE " "
"EXECIO" QUEUED()" DISKW ISFIN (FINIS"
ADDRESS ISPEXEC "SELECT PGM(ISFAFD) PARM('++20,400')"
ADDRESS TSO "FREE F(ISFIN,ISFOUT,TEMPPR2)"
"ALLOC F(INPDD2) DA('TEST.XYZ.REXX.TEMP2') SHR"
X=OUTTRAP("SUB2.")
"EXECIO * DISKR INPDD2 (STEM SUB2. FINIS"
DO K= 1 TO SUB2.0
ESTR = SUBSTR(SUB2.K,89,7) /*GET ELAPSED*/
IF ESTR = 'ELAPSED' THEN
DO
P_ELAP = SUBSTR(SUB2.K,97,10)
END
END
"FREE DD(ISFIN,ISFOUT)"
/***************************************************/
/* TO WRITE THE DETAIL RECORD INTO THE OUTPUT */
/***************************************************/
PUSH P_JOBN ',' P_JOBI ',' P_OWN ',' P_CC ',' P_CPU ',' P_ELAP
"EXECIO 1 DISKW OUTPUTF " /*WRITE OUTPUT DATA */
"FREE DD(INPDD1 INPDD2)"
"DELETE 'TEST.XYZ.REXX.TEMP1'"
"DELETE 'TEST.XYZ.REXX.TEMP2'"
X=OUTTRAP("OFF")
END
END
PUSH ' ***** END OF REPORT ***** '
"EXECIO 1 DISKW OUTPUTF (FINIS"
"FREE DD(OUTPUTF)"
EXIT
|
| Code: |
TEST.XYZ.REXX.PANEL(SCPUTIME)
--------------------------------------
)ATTR DEFAULT(%+_)
% TYPE(TEXT) INTENS(HIGH)
_ TYPE(INPUT) INTENS(HIGH) CAPS(ON) JUST(LEFT) PAD('_')
)body
%-----------------------------------------------------------------------
%| Extract CPU time and elapsed time from SPOOL
%| --------------------------------------------
%|%
%|% JOB 1 PREFIX: _JOBN1 +
%|% JOB 2 PREFIX: _JOBN2 +
%|% JOB 3 PREFIX: _JOBN3 +
%|% JOB 4 PREFIX: _JOBN4 +
%|% JOB 5 PREFIX: _JOBN5 +
%|% JOB 6 PREFIX: _JOBN6 +
%|% JOB 7 PREFIX: _JOBN7 +
%|% JOB 8 PREFIX: _JOBN8 +
%|% JOB 9 PREFIX: _JOBN9 +
%|%
%|%
%|% Note: For getting cpu times for more than 9 jobs,
%|% represent job names are ABCDE*
%|%
%|%Output DSN name : _OUTDSN +
%|%(without quotes)
%|
%|
%-----------------------------------------------------------------------
)end
|
|
|
| Back to top |
|
 |
rajantsr
New User
Joined: 31 Jan 2007 Posts: 19 Location: Chennai
|
|
|
|
Hi Guys...
Everything looks ok with the code.. except one thing.. if I have to get details(CPUtime,Elapsed time) of more than 17 jobs I couldn't.
That is if give TST* in the job name (there are around 150 jobs logs in spool), I get only first 17 jobs details.
This is because this part of the code gets me only the first page of the ST.
| Code: |
/***************************************************/
/* TO GET SPOOL DETAILS */
/***************************************************/
QUEUE "SET CONFIRM OFF"
QUEUE "OWNER *"
QUEUE "PREFIX "JOBNAME.I
QUEUE "ST"
QUEUE "END"
QUEUE ""
|
can any one help me out to get the entire 150 job name list... |
|
| Back to top |
|
 |
expat
Global Moderator
Joined: 14 Mar 2007 Posts: 2551 Location: Brussels once more ...
|
|
|
|
| Looks like a case of reading the SDSF manual to define your screen size |
|
| Back to top |
|
 |
rajantsr
New User
Joined: 31 Jan 2007 Posts: 19 Location: Chennai
|
|
|
|
Thanks Expat..
I changed following code and it worked fine
from
| Code: |
"EXECIO * DISKW ISFIN (FINIS"
PARM = "/ ++20,400"
|
to
| Code: |
"EXECIO * DISKW ISFIN (FINIS"
PARM = "/ ++150,300"
|
|
|
| Back to top |
|
 |
|
|
|