IBM Mainframe Forum Index
 
Log In
 
IBM Mainframe Forum Index Mainframe: Search IBM Mainframe Forum: FAQ Register
 

How do i close and reopen a file in the same rexx


IBM Mainframe Forums -> CLIST & REXX
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
rajantsr

New User


Joined: 31 Jan 2007
Posts: 21
Location: Chennai

PostPosted: Wed May 14, 2008 8:33 pm
Reply with quote

Hi ,

How do i close and reopen a file in the same rexx.

Thanks,
Rajan
Back to top
View user's profile Send private message
ofer71

Global Moderator


Joined: 27 Dec 2005
Posts: 2358
Location: Israel

PostPosted: Wed May 14, 2008 8:58 pm
Reply with quote

Can you specify what do you mean by "open" and "close"? In my TSO REXXs, I use ALLOCATE and FREE.

O.
Back to top
View user's profile Send private message
rajantsr

New User


Joined: 31 Jan 2007
Posts: 21
Location: Chennai

PostPosted: Wed May 14, 2008 9:13 pm
Reply with quote

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
View user's profile Send private message
Pedro

Global Moderator


Joined: 01 Sep 2006
Posts: 2547
Location: Silicon Valley

PostPosted: Wed May 14, 2008 10:04 pm
Reply with quote

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
View user's profile Send private message
enrico-sorichetti

Superior Member


Joined: 14 Mar 2007
Posts: 10873
Location: italy

PostPosted: Wed May 14, 2008 10:13 pm
Reply with quote

what about looking at the manual ??
http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/IKJ3A320/10.3?SHELF=IKJOSE20&DT=20000113164209
Back to top
View user's profile Send private message
rajantsr

New User


Joined: 31 Jan 2007
Posts: 21
Location: Chennai

PostPosted: Thu May 15, 2008 9:57 pm
Reply with quote

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
View user's profile Send private message
rajantsr

New User


Joined: 31 Jan 2007
Posts: 21
Location: Chennai

PostPosted: Fri May 16, 2008 4:07 pm
Reply with quote

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
View user's profile Send private message
expat

Global Moderator


Joined: 14 Mar 2007
Posts: 8797
Location: Welsh Wales

PostPosted: Fri May 16, 2008 4:09 pm
Reply with quote

Looks like a case of reading the SDSF manual to define your screen size
Back to top
View user's profile Send private message
rajantsr

New User


Joined: 31 Jan 2007
Posts: 21
Location: Chennai

PostPosted: Fri May 16, 2008 5:54 pm
Reply with quote

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
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic View Bookmarks
All times are GMT + 6 Hours
Forum Index -> CLIST & REXX

 


Similar Topics
Topic Forum Replies
No new posts Compare 2 files and retrive records f... DFSORT/ICETOOL 3
No new posts FTP VB File from Mainframe retaining ... JCL & VSAM 8
No new posts Compile Several JCL JOB Through one r... CLIST & REXX 4
No new posts Extract the file name from another fi... DFSORT/ICETOOL 6
No new posts How to split large record length file... DFSORT/ICETOOL 10
Search our Forums:

Back to Top