Hi,
I framed a rexx pgm which needs to be run using JCL. I am passing 4 pds as an argument values in Rexx but my userid has automatically set as a prefix value of the pds. when i execute the rexx program using JCL my user id has automatically set as a prefix value of the pds.
EX:
I am passing the below pds as an argument
Test.prod.source
But my mainframe user id prefix to the above pds like below
userid.test.prod.source
Could you please help me out to fix the above issue.
/* REXX */
ARG PDSSYS4
ARG PROSYS4
ARG PROSYS5
ARG PDSSYS5
ADDRESS TSO "PROFILE NOPREFIX"
IF SYSDSN(PDSSYS4) <> "OK" THEN
DO
SAY "ERROR: SYS4 JCLLIB NOT FOUND:" PDSSYS4
SAY "ERROR: " PDSSYS4 " > " SYSDSN(PDSSYS4)
SAY "PRESS ENTER TO CONTINUE"
PULL URESP
EXIT 8
END
IF SYSDSN('PDSSYS5') <> "OK" THEN
DO
SAY "ERROR: SYS5 JCLLIB NOT FOUND:" PDSSYS5
SAY "ERROR: " PDSSYS5 " > " SYSDSN(PDSSYS5)
SAY "PRESS ENTER TO CONTINUE"
PULL URESP
EXIT 8
END
ADDRESS TSO
"EXECIO * DISKR MEMDSN (FINIS STEM MEM."
ADDRESS TSO
"FREE F(MEMDSN)"
DO M=1 TO MEM.0
PARSE VALUE MEM.M WITH MEMNAME
MEMNAME=STRIP(MEMNAME)
DSNMEM = PDSSYS4"("MEMNAME")"
P = SYSDSN("'"DSNMEM"'")
IF P = "OK" THEN
DO
CALL SYS4FND
END
ELSE DO
CALL SYS5FND
END
END
EXIT
SYS4FND:
/* ADDRESS TSO
"ALLOC F(XXIN) DS("DSNMEM") SHR REUSE" */
ADDRESS TSO
"EXECIO * DISKR XXIN (FINIS STEM IN."
ADDRESS TSO
"FREE F(XXIN)"
FND=0
STR="EXEC"
DO RECID=1 TO IN.0
IF POS(STR,IN.RECID) > 0 THEN
DO
X = IN.RECID
PARSE VAR X WORD1 WORD2 WORD3 WORD4
Y = STRIP(WORD3)
MEMSTR.1 = STRIP(Y,,',')
ADDRESS TSO "EXECIO" 1 "DISKW PROCOUT (STEM MEMSTR. FINIS"
/*"EXECIO 0 DISKW XXOUT (FINIS" */
ADDRESS TSO
"FREE F(PROCOUT)"
END
END
CALL SYS4PROC
RETURN
SYS4PROC:
ADDRESS TSO "EXECIO * DISKR PROCOUT (FINIS STEM PR."
ADDRESS TSO "FREE F(PROCOUT)"
DO STRID=1 TO PR.0
STRING = STRIP(PR.STRID)
DSNMEM = PROSYS4"("STRING")"
P = SYSDSN("'"DSNMEM"'")
IF P = "OK" THEN DO
ADDRESS TSO "EXECIO * DISKR YYIN (FINIS STEM RE."
ADDRESS TSO "FREE F(YYIN)"
FND=0
STR="BTCH"
DO RECID=1 TO RE.0
IF POS(STR,RE.RECID) > 0 THEN
DO
PROSTR.1 = MEMNAME
ADDRESS TSO "EXECIO" 1 "DISKW JCLOUT (STEM PROSTR. FINIS"
ADDRESS TSO "FREE F(JCLOUT)"
RETURN
END
END
END /* END FOR IF LOOP */
ELSE SAY PROC "PR.1" NOT FOUND
/* "EXECIO 0 DISKW PROUT (FINIS"
"FREE F(PROUT)" */
END
RETURN
SYS5FND:
DSNMEM = PDSSYS5"("MEMNAME")"
P = SYSDSN("'"DSNMEM"'")
ADDRESS TSO "EXECIO * DISKR XXIN (FINIS STEM IN."
ADDRESS TSO "FREE F(XXIN)"
FND=0
STR="EXEC"
DO RECID=1 TO IN.0
IF POS(STR,IN.RECID) > 0 THEN
DO
X = IN.RECID
PARSE VAR X WORD1 WORD2 WORD3 WORD4
Y = STRIP(WORD3)
MEMSTR.1 = STRIP(Y,,',')
ADDRESS TSO "EXECIO" 1 "DISKW PROCOUT (STEM MEMSTR. FINIS"
ADDRESS TSO "FREE F(PROCOUT)"
END
END
CALL SYS5PROC
RETURN
SYS5PROC:
ADDRESS TSO "EXECIO * DISKR PROCOUT (FINIS STEM PR."
ADDRESS TSO "FREE F(PROCOUT)"
DO STRID=1 TO PR.0
STRING = STRIP(PR.STRID)
DSNMEM = PROSYS5"("STRING")"
P = SYSDSN("'"DSNMEM"'")
ADDRESS TSO "EXECIO * DISKR YYIN (FINIS STEM RE."
ADDRESS TSO "FREE F(YYIN)"
FND=0
STR="BTCH"
DO RECID=1 TO RE.0
IF POS(STR,RE.RECID) > 0 THEN
DO
PROSTR.1 = MEMNAME
ADDRESS TSO "EXECIO" 1 "DISKW JCLOUT (STEM PROSTR. FINIS"
ADDRESS TSO "FREE F(JCLOUT)"
RETURN
END
END
END
/*"EXECIO 0 DISKW PROUT (FINIS"
"FREE F(PROUT)" */
RETURN
The MEMDSN is the I/P which the rexx step receives from previous step
and it has only members. My rexx pgm is first reading the members from the MEMDSN file and listout the number of procs inside the JCL member. After that rexx pgm will search against the proc with the keyword BTCH. If its identified the pgm will put the JCL member name in the JCLOUT file.
Here I am facing the below error while JCL execution.
Err Msg:
READY
%NSRPROC2
ERROR: SYS4 JCLLIB NOT FOUND:
ERROR: > MISSING DATASET NAME
PRESS ENTER TO CONTINUE
READY
END
Joined: 03 Oct 2009 Posts: 1788 Location: Bloomington, IL
Have you executed this exec with TRACE I or TRACE R, or otherwise checked the message returned from SYSDSN (other than verify that it is not "OK")? If not, I urge you to do so.
Are you actually passing the DSNs as arguments, or are you expecting to somehow get them from the DD statements? If the latter, delete the ARG statements, and instead of SYSDSN, use LISTDSI:
Code:
rc = LISTDSI("PDSSYS4" FILE)
if (rc=0) then
sys4dsn = sysdsname
else do
/* Error processing */
end
Hi, Thanks, Its absolutely working fine for verifying the PDS name. Please check the below code and help me out what needs to be modified to make the code work fine.
I answer your question
Q: are you expecting to somehow get them from the DD statements
Ans: Yes, I am expecting the DD statement values needs to be feed to the Rexx.
I modified the below rexx to get the values from DD statements of the JCL. But it failing , Could yoiu please help
Code:
ADDRESS TSO
"EXECIO * DISKR MEMDSN (FINIS STEM MEM."
ADDRESS TSO
"FREE F(MEMDSN)"
DO M=1 TO MEM.0
PARSE VALUE MEM.M WITH MEMNAME
MEMNAME=STRIP(MEMNAME)
DSNMEM = PDSSYS4"("MEMNAME")"
P = SYSDSN("'"DSNMEM"'")
IF P = "OK" THEN
DO
CALL SYS4FND
END
ELSE DO
CALL SYS5FND
END
END
EXIT
SYS4FND:
/* ADDRESS TSO
"ALLOC F(XXIN) DS("DSNMEM") SHR REUSE" */
ADDRESS TSO
"EXECIO * DISKR XXIN (FINIS STEM IN."
ADDRESS TSO
"FREE F(XXIN)"
FND=0
STR="EXEC"
DO RECID=1 TO IN.0
IF POS(STR,IN.RECID) > 0 THEN
DO
X = IN.RECID
PARSE VAR X WORD1 WORD2 WORD3 WORD4
Y = STRIP(WORD3)
MEMSTR.1 = STRIP(Y,,',')
ADDRESS TSO "EXECIO" 1 "DISKW PROCOUT (STEM MEMSTR. FINIS"
/*"EXECIO 0 DISKW XXOUT (FINIS" */
ADDRESS TSO
"FREE F(PROCOUT)"
END
END
CALL SYS4PROC
RETURN
SYS4PROC:
ADDRESS TSO "EXECIO * DISKR PROCOUT (FINIS STEM PR."
ADDRESS TSO "FREE F(PROCOUT)"
DO STRID=1 TO PR.0
STRING = STRIP(PR.STRID)
DSNMEM = PROSYS4"("STRING")"
P = SYSDSN("'"DSNMEM"'")
IF P = "OK" THEN DO
/* ADDRESS TSO "ALLOC F(YYIN) DS("DSNMEM") SHR REUSE" */
ADDRESS TSO "EXECIO * DISKR YYIN (FINIS STEM RE."
ADDRESS TSO "FREE F(YYIN)"
FND=0
STR="BTCH"
DO RECID=1 TO RE.0
IF POS(STR,RE.RECID) > 0 THEN
DO
PROSTR.1 = MEMNAME
/* "ALLOC F(PROUT) DS("BPV544.REXX.SEARCH9") MOD" */
ADDRESS TSO "EXECIO" 1 "DISKW JCLOUT (STEM PROSTR. FINIS"
ADDRESS TSO "FREE F(JCLOUT)"
RETURN
END
END
END /* END FOR IF LOOP */
ELSE SAY PROC "PR.1" NOT FOUND
/* "EXECIO 0 DISKW PROUT (FINIS"
"FREE F(PROUT)" */
END
RETURN
SYS5FND:
DSNMEM = PDSSYS5"("MEMNAME")"
P = SYSDSN("'"DSNMEM"'")
/* "ALLOC F(XXIN) DS("DSNMEM") SHR REUSE" */
ADDRESS TSO "EXECIO * DISKR XXIN (FINIS STEM IN."
ADDRESS TSO "FREE F(XXIN)"
FND=0
STR="EXEC"
DO RECID=1 TO IN.0
IF POS(STR,IN.RECID) > 0 THEN
DO
X = IN.RECID
PARSE VAR X WORD1 WORD2 WORD3 WORD4
Y = STRIP(WORD3)
MEMSTR.1 = STRIP(Y,,',')
ADDRESS TSO "EXECIO" 1 "DISKW PROCOUT (STEM MEMSTR. FINIS"
/*"EXECIO 0 DISKW XXOUT (FINIS" */
ADDRESS TSO "FREE F(PROCOUT)"
END
END
CALL SYS5PROC
RETURN
SYS5PROC:
ADDRESS TSO "EXECIO * DISKR PROCOUT (FINIS STEM PR."
ADDRESS TSO "FREE F(PROCOUT)"
DO STRID=1 TO PR.0
STRING = STRIP(PR.STRID)
DSNMEM = PROSYS5"("STRING")"
P = SYSDSN("'"DSNMEM"'")
/* "ALLOC F(YYIN) DS("DSNMEM") SHR REUSE" */
ADDRESS TSO "EXECIO * DISKR YYIN (FINIS STEM RE."
ADDRESS TSO "FREE F(YYIN)"
FND=0
STR="BTCH"
DO RECID=1 TO RE.0
IF POS(STR,RE.RECID) > 0 THEN
DO
PROSTR.1 = MEMNAME
ADDRESS TSO "EXECIO" 1 "DISKW JCLOUT (STEM PROSTR. FINIS"
ADDRESS TSO "FREE F(JCLOUT)"
RETURN
END
END
END
/*"EXECIO 0 DISKW PROUT (FINIS"
"FREE F(PROUT)" */
RETURN
IKJ56246I DATA SET PSTY5.PROD.JCLLIB NOT ALLOCATED, FILE IN USE
IKJ56228I DATA SET MEMDSN NOT IN CATALOG OR CATALOG CAN NOT BE ACCESSED
IKJ56701I MISSING DATA SET NAME+
IKJ56701I MISSING NAME OF DATA SET TO BE ALLOCATED
IRX0555E The input or output file PROCOUT is not allocated. It cannot be opened
IRX0670E EXECIO error while trying to GET or PUT a record.
IKJ56247I FILE PROCOUT NOT FREED, IS NOT ALLOCATED
IKJ56228I DATA SET MEMDSN NOT IN CATALOG OR CATALOG CAN NOT BE ACCESSED
IKJ56701I MISSING DATA SET NAME+
IKJ56701I MISSING NAME OF DATA SET TO BE ALLOCATED
IRX0555E The input or output file PROCOUT is not allocated. It cannot be opened
IRX0670E EXECIO error while trying to GET or PUT a record.
IKJ56247I FILE PROCOUT NOT FREED, IS NOT ALLOCATED
Joined: 03 Oct 2009 Posts: 1788 Location: Bloomington, IL
Pedro wrote:
You need to follow Akatsukami's advice to use the LISTDSI service with the FILE parameter.
I also again urge you to use a TRACE statement in your testing. You do not seem to be anxious to provide us with the information that we need to assist you.
Joined: 01 Sep 2006 Posts: 2547 Location: Silicon Valley
Code:
DSNMEM = PDSSYS4"("MEMNAME")"
PDSSYS4 does not seem to be initialized. I think you need to issue LISTDSI prior to that statement to get a value for PDSSYS4.
Within the loop, you call some subroutines which issue EXECIO and FREE. There are several instances of EXECIO followed by FREE. It may work fine the first time, but afterwards the file is no longer there because it has been freed. EXECIO will fail.