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

Removing tapes from the library with JCL


IBM Mainframe Forums -> JCL & VSAM
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
expat

Global Moderator


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

PostPosted: Fri Jul 03, 2009 5:23 pm
Reply with quote

100% correct icon_biggrin.gif
Back to top
View user's profile Send private message
Ivan P

New User


Joined: 08 Jun 2009
Posts: 63
Location: Europe

PostPosted: Tue Jul 07, 2009 6:38 pm
Reply with quote

Ran into some trouble... Maybe this is more suitable for the REXX sub-forum now?

Here's the situtation:

2 DS are used:
MYUSER.DITTO.RES - sequential DS, contains just the VOLSERs list
MYUSER.PRIVLIB - PDS with members: DITTOJCL, DITTOREX, REXXEXEC

DITTOJCL - skeleton
DITTOREX - REXX code
REXXEXEC - JCL for running REXX

DITTOJCL skelton
Code:
//Z0DT&JNM. JOB NOTIFY=MYUSER,CLASS=S,MSGCLASS=X
//DITTO1   EXEC PGM=DITTO
//SYSPRINT DD  SYSOUT=*
//TAPE1    DD  UNIT=&UNIT.,DISP=SHR,LABEL=(,BLP),VOL=SER=&VOLSER.
//SYSIN    DD *
$$DITTO ERT OUTPUT=TAPE1
$$DITTO EOJ
//

DITTOREX code (thnx to expat)
Code:
SIGNAL ON SYNTAX NAME ERR                                             
                                                                     
ADDRESS ISPEXEC "LIBDEF ISPSLIB DATASET ID()"                         
ADDRESS ISPEXEC "LIBDEF ISPSLIB DATASET ID('MYUSER.PRIVLIB')" STACK
                                                                     
SYSUID = SYSVAR(SYSUID)                                               
"FREE  FI(ISPFILE,INDD)"                                             
"ALLOC FI(INDD) DA('MYUSER.DITTO.RES') SHR"                       
"DEL  '"SYSUID".ISPFILE'"                                             
"ALLOC FI(ISPFILE) DA('"SYSUID".ISPFILE') NEW TRACKS SPACE(10 10)     
       RECFM(F B) LRECL(80)"                             
JNM = 1                                                               
"EXECIO * DISKR INDD ( STEM STNAME. "                                 
DO AA = 1 TO STNAME.0                                                 
  PARSE VAR STNAME.AA VOLSER                                         
  VOLSER = STRIP(VOLSER)                                             
  UNIT = "A00"                                                       
  "ISPEXEC FTOPEN"                                                   
  "ISPEXEC FTINCL DITTOJCL"                                           
  "ISPEXEC FTCLOSE"                                                   
  "SUBMIT '"SYSUID".ISPFILE'"                                         
  JNM = JNM + 1                                                       
  IF JNM = 4 THEN JNM = 1                                             
END                                                                   
"FREE  FI(ISPFILE,INDD)"                                             
"DEL  '"SYSUID".ISPFILE'"                                             
EXIT                                                                 
ERR:                                                                 
  SIGNAL OFF SYNTAX                                                   
  SAY "ERROR ROUTINE OUTPUT STARTING"                                 
  SAY "ERROR ROUTINE OUTPUT STARTING"                                 
  SAY "   "                                                           
  SAY RIGHT(SIGL,6) ">>>" SOURCELINE(SIGL)                           
  SAY "   "                                                           
  TRACE I                                                             
  INTERPRET SOURCELINE(SIGL)

(UNIT is intentionally left as a fixed value in this version...)

REXXEXEC (without the JOBCARD)
Code:
//REXX1    EXEC PGM=IKJEFT01
//SYSEXEC  DD  DSN=MYUSER.PRIVLIB,DISP=SHR
//SYSTSPRT DD  SYSOUT=*
//SYSTSIN  DD  *
 %DITTOREX
/*
//


And the REXX related output in SDSF...
Code:
     6 *-* ADDRESS ISPEXEC "LIBDEF ISPSLIB DATASET ID()"                         
       +++ RC(-3) +++                                                           
     7 *-* ADDRESS ISPEXEC "LIBDEF ISPSLIB DATASET ID('MYUSER.PRIVLIB')" STACK
       +++ RC(-3) +++                                                           
IKJ56247I FILE ISPFILE NOT FREED, IS NOT ALLOCATED                               
IKJ56247I FILE INDD NOT FREED, IS NOT ALLOCATED                                 
IDC3012I ENTRY MYUSER.ISPFILE NOT FOUND+                                       
IDC3009I ** VSAM CATALOG RETURN CODE IS 8 - REASON CODE IS IGG0CLEG-42           
IDC0551I ** ENTRY MYUSER.ISPFILE NOT DELETED                                   
IDC0014I LASTCC=8
......
IKJ56265I INPUT DATA SET MYUSER.ISPFILE NOT USABLE+
IKJ56265I THE DATA SET IS EMPTY
......
IKJ56861I  FILE INDD NOT FREED, DATA SET IS OPEN                                 
IDC0550I ENTRY (A) MYUSER.ISPFILE DELETED                                       
READY                                                                           
END

"......" means those two messages are repeated as many times as there are VOLSERs in the RES data set.
First few messages are harmless, but I guess the "NOT USABLE" message is critical - it means the generated JCL isn't saved to the ISPFILE?

Any thoughts? icon_smile.gif

EDIT: fixed typo
Back to top
View user's profile Send private message
expat

Global Moderator


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

PostPosted: Tue Jul 07, 2009 6:49 pm
Reply with quote

You are running ISPF under TSO, and will need to allocate the required ISPF libraries to your batch job.

TSO ISRDDN on the command line will show all of the alllocated ISPF libraries for your foreground session. These will need to be replicated in your JCL.

Here is what I usually use. Although there may be some subtle differences from site to site, this should suffice almost anywhere.
Code:

//ISPFBAT  EXEC PGM=IKJEFT01,DYNAMNBR=256                 
//PROFLIST DD DSN=&&TEMPPROF,DISP=(,PASS,DELETE),         
//            SPACE=(TRK,(45,45,44)),                     
//            RECFM=FB,LRECL=80                           
//SYSLBC   DD DSN=SYS1.BRODCAST,DISP=SHR                 
//SYSPROC  DD DSN=My REXX library,DISP=SHR                       
//         DD DSN=Concatenation from ISRDDN
//SYSEXEC  DD DSN=My.REXX library,DISP=SHR                       
//         DD DSN=Concatenation from ISRDDN
//ISPPLIB  DD DSN=Concatenation from ISRDDN
//ISPMLIB  DD DSN=Concatenation from ISRDDN
//ISPSLIB  DD DSN=My ISPSLIB,DISP=SHR                       
//         DD DSN=Concatenation from ISRDDN
//ISPTLIB  DD DSN=*.PROFLIST,DISP=SHR,VOL=REF=*.PROFLIST 
//         DD DSN=Concatenation from ISRDDN
//ISPTABL  DD DSN=*.PROFLIST,DISP=SHR,VOL=REF=*.PROFLIST 
//         DD DSN=Concatenation from ISRDDN
//MSGTABL  DD DSN=Concatenation from ISRDDN
//ISPPROF  DD DSN=*.PROFLIST,DISP=SHR,VOL=REF=*.PROFLIST 
//ISPCTL0  DD DISP=(NEW,DELETE),SPACE=(TRK,(10,10)),UNIT=VIO,
//            RECFM=FB,LRECL=80,DSORG=PS                     
//ISPCTL1  DD DISP=(NEW,DELETE),SPACE=(TRK,(10,10)),UNIT=VIO,
//            RECFM=FB,LRECL=80,DSORG=PS                     
//ISPWRK1  DD DISP=(NEW,DELETE),SPACE=(TRK,(10,10)),UNIT=VIO,
//            RECFM=FB,LRECL=80,DSORG=PS                     
//ISPLIST  DD SYSOUT=*                                       
//ISPLST1  DD DISP=(NEW,DELETE),SPACE=(TRK,(10,10)),         
//            RECFM=VB,LRECL=133,DSORG=PS                   
//ISPLOG   DD SYSOUT=*,                                     
//            RECFM=FB,LRECL=120,DSORG=PS                   
//SYSOUT   DD SYSOUT=*                                       
//SYSPRINT DD SYSOUT=*                                       
//SYSTSPRT DD SYSOUT=*                                       
//TOOLMSG  DD SYSOUT=*                                       
//DFSMSG   DD SYSOUT=*                                       
//SYSTSIN  DD DUMMY                                         
Back to top
View user's profile Send private message
Ivan P

New User


Joined: 08 Jun 2009
Posts: 63
Location: Europe

PostPosted: Wed Jul 08, 2009 1:28 pm
Reply with quote

The concatenation from ISRDDN is quite long for some libs...
I guess all those datasets aren't really necessary in this case...?
For example, isn't SYSPROC and SYSEXEC concatenation useless here, because the only exec is in my REXX lib?

I tried the example you provided, but didn't put all the datasets from ISRDDN (didn't use some with unusual HLQ), and it's still the same error (ISPFILE isn't populated with the generated job).

Is there a shorter allocation of libs in this case? 3 or 4 maybe on which to focus on?
Back to top
View user's profile Send private message
expat

Global Moderator


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

PostPosted: Wed Jul 08, 2009 1:47 pm
Reply with quote

Have you tried running with TRACE R or TRACE I to get an idea of exactly what happens during your exec ?
Back to top
View user's profile Send private message
Ivan P

New User


Joined: 08 Jun 2009
Posts: 63
Location: Europe

PostPosted: Wed Jul 08, 2009 2:08 pm
Reply with quote

Here's the relevant part of the output:
Code:
    22 *-*  UNIT = "A00"
       >L>    "A00"
    23 *-*  "ISPEXEC FTOPEN"
       >L>    "ISPEXEC FTOPEN"
       +++ RC(20) +++
    24 *-*  "ISPEXEC FTINCL DITTOJCL"
       >L>    "ISPEXEC FTINCL DITTOJCL"
       +++ RC(20) +++
    25 *-*  "ISPEXEC FTCLOSE"
       >L>    "ISPEXEC FTCLOSE"
       +++ RC(20) +++
    26 *-*  "SUBMIT '"SYSUID".ISPFILE'"
       >L>    "SUBMIT '"
       >V>    "MYUSER"
       >O>    "SUBMIT 'MYUSER"
       >L>    ".ISPFILE'"
       >O>    "SUBMIT 'MYUSER.ISPFILE'"
IKJ56265I INPUT DATA SET MYUSER.ISPFILE NOT USABLE+
IKJ56265I THE DATA SET IS EMPTY

icon_confused.gif
Back to top
View user's profile Send private message
expat

Global Moderator


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

PostPosted: Wed Jul 08, 2009 2:18 pm
Reply with quote

try changing
Code:

//REXX1    EXEC PGM=IKJEFT01
//SYSEXEC  DD  DSN=MYUSER.PRIVLIB,DISP=SHR
//SYSTSPRT DD  SYSOUT=*
//SYSTSIN  DD  *
 %DITTOREX
/*
//

to
Code:

//REXX1    EXEC PGM=IKJEFT01
//SYSEXEC  DD  DSN=MYUSER.PRIVLIB,DISP=SHR
//SYSTSPRT DD  SYSOUT=*
//SYSTSIN  DD  *
 ISPSTART CMD(%DITTOREX)
/*
//
Back to top
View user's profile Send private message
Ivan P

New User


Joined: 08 Jun 2009
Posts: 63
Location: Europe

PostPosted: Wed Jul 08, 2009 4:04 pm
Reply with quote

After adding ISPPROF, ISPPLIB, ISPSLIB, ISPTLIB and ISPMLIB statements to the JCL, it works. \o/

But, if I switch back to:
//SYSTSIN DD *
%DITTOREX

it doesn't work... so it seems ISPSTART CMD() is crucial.
Back to top
View user's profile Send private message
expat

Global Moderator


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

PostPosted: Wed Jul 08, 2009 4:06 pm
Reply with quote

Oh yes, and I should have thought about it earlier ...........

If you invoke ISPF services within your REXX code, you must use ISPSTART.
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 -> JCL & VSAM Goto page 1, 2  Next

 


Similar Topics
Topic Forum Replies
No new posts Calling an Open C library function in... CICS 1
No new posts Submit multiple jobs from a library t... JCL & VSAM 14
No new posts Duplicate several members of/in one l... JCL & VSAM 7
No new posts Issue after ISPF copy to Linklist Lib... TSO/ISPF 1
No new posts Access library name in REXX CLIST & REXX 6
Search our Forums:

Back to Top