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

How to execute Rexx program using JCL


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

New User


Joined: 16 Oct 2007
Posts: 12
Location: Chennai

PostPosted: Tue Oct 01, 2013 4:12 am
Reply with quote

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.

Thanks in advance
Back to top
View user's profile Send private message
Akatsukami

Global Moderator


Joined: 03 Oct 2009
Posts: 1788
Location: Bloomington, IL

PostPosted: Tue Oct 01, 2013 4:39 am
Reply with quote

Use the DSN in single quotes; it will be assumed to be fully qualified.
Back to top
View user's profile Send private message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1742
Location: Tirupur, India

PostPosted: Tue Oct 01, 2013 11:46 am
Reply with quote

Hello,
You could try adding
Code:
ADDRESS TSO "PROFILE NOPREFIX"

after the /*REXX*/ line to prevent your userid from being prefixed.
Hope it helps.
Back to top
View user's profile Send private message
selvan_nn

New User


Joined: 16 Oct 2007
Posts: 12
Location: Chennai

PostPosted: Wed Oct 02, 2013 12:38 am
Reply with quote

I am passing the PDS names as an argument in Rexx thru JCL like below
Ex: In Rexx
/* REXX */
ADDRESS TSO "PROFILE NOPREFIX"
ARG "PDSSYS4"
ARG "PROSYS4"
ARG "PROSYS5"
ARG "PDSSYS5"
In JCL:
//PDSSYS4 DD DSN=PSTY4.PROD.JCLLIB,DISP=SHR
//PROSYS4 DD DSN=PSTY4.PROD.PROCLIB,DISP=SHR
//PROSYS5 DD DSN=PSTY5.PROD.PROCLIB,DISP=SHR
//PDSSYS5 DD DSN=PSTY5.PROD.JCLLIB,DISP=SHR

and I submitted the JCL but again it failed with the below error:

ERROR: SYS4 JCLLIB NOT FOUND: PDSSYS4
ERROR: PDSSYS4 > DATASET NOT FOUND

Also i am passing I/P & O/P file also as an argument thru JCL . Could you please help!!!
Back to top
View user's profile Send private message
Akatsukami

Global Moderator


Joined: 03 Oct 2009
Posts: 1788
Location: Bloomington, IL

PostPosted: Wed Oct 02, 2013 12:57 am
Reply with quote

The nature of your problem seems to have changed radically from one post to the next. Please post your JCL and the JES message log of the failing job.
Back to top
View user's profile Send private message
selvan_nn

New User


Joined: 16 Oct 2007
Posts: 12
Location: Chennai

PostPosted: Wed Oct 02, 2013 1:36 am
Reply with quote

Thanks for your reply

Please find my rexx coding & JCL in below:
Code:
/* 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


Please find the JCL in below:
Code:
//REXXST   EXEC PGM=IKJEFT01,DYNAMNBR=20,REGION=0M 
//SYSTSPRT DD  SYSOUT=*                             
//SYSPRINT DD SYSOUT=*                             
//SYSUDUMP DD SYSOUT=*                             
//SYSOUT   DD SYSOUT=*                             
//SYSEXEC  DD  DSN=PSTY.REXX.EXEC,               
//             DISP=(SHR,KEEP,KEEP)                 
//MEMDSN   DD  DSN=PSTY.PROD.MEM.SEARCH.LIST,     
//             DISP=(OLD,KEEP,KEEP)                 
//PDSSYS4  DD  DSN=PSTY.PROD.JCLLIB,DISP=SHR     
//PROSYS4  DD  DSN=PSTY.PROD.PROCLIB,DISP=SHR     
//PROSYS5  DD  DSN=PSTY.PROD.SYS5.PROCLIB,DISP=SHR
//PDSSYS5  DD  DSN=PSTY.PROD.JCL,DISP=SHR         
//PROCOUT  DD  DSN=PSTY.PROD.MEM.PROC.OUT,       
//             DISP=(NEW,CATLG,DELETE),             
//             DATACLAS=MB001,UNIT=3390,           
//             RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS
//JCLOUT  DD  DSN=PSTY.PROD.MEM.JCL.OUT,         
//             DISP=(MOD,CATLG,DELETE),             
//             DATACLAS=MB001,UNIT=3390,           
//             RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS
//SYSTSIN  DD *                                     
 %NSRPROC2                 

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

Please help me out...
Back to top
View user's profile Send private message
Akatsukami

Global Moderator


Joined: 03 Oct 2009
Posts: 1788
Location: Bloomington, IL

PostPosted: Wed Oct 02, 2013 1:53 am
Reply with quote

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

and likewise for the other DD names.
Back to top
View user's profile Send private message
selvan_nn

New User


Joined: 16 Oct 2007
Posts: 12
Location: Chennai

PostPosted: Wed Oct 02, 2013 4:25 am
Reply with quote

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                                                     

In JCL I mention the file names like below:

Code:
//REXXST   EXEC PGM=IKJEFT01,DYNAMNBR=20,REGION=0M     
//SYSTSPRT DD  SYSOUT=*                                 
//SYSPRINT DD SYSOUT=*                                 
//SYSUDUMP DD SYSOUT=*                                 
//SYSOUT   DD SYSOUT=*                                 
//SYSEXEC  DD DSN=PSTY.REXX.EXEC1,DISP=SHR           
//PDSSYS4 DD DSN=PSTY4.PROD.JCLLIB,DISP=SHR             
//PROSYS4 DD DSN=PSTY4.PROD.PROCLIB,DISP=SHR             
//PROSYS5 DD DSN=PSTY5.PROD.PROCLIB,DISP=SHR             
//PDSSYS5 DD DSN=PSTY5.PROD.JCLLIB,DISP=SHR             
//MEMDSN   DD  DSN=PSTY.VSERR.CA7.JOBS,               
//             DISP=(OLD,KEEP,KEEP)                     
//PROCOUT  DD  DSN=PSTY.PROD.MEM.PROC.OUT,             
//             DISP=(OLD,CATLG,DELETE),                 
//             DATACLAS=MB001,                         
//             RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS     
//JCLOUT  DD  DSN=PSTY.PROD.MEM.JCL.OUT,               
//             DISP=(OLD,CATLG,DELETE),                 
//             DATACLAS=MB001,                         
//             RECFM=FB,LRECL=80,BLKSIZE=0,DSORG=PS     
//SYSTSIN  DD  *                                       
%NSRPROC3                                         

When I submit the job, I get the below error

Code:
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               


Could you please help me out to resolve the issue

Code'd
Back to top
View user's profile Send private message
Pedro

Global Moderator


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

PostPosted: Wed Oct 02, 2013 5:57 pm
Reply with quote

You need to follow Akatsukami's advice to use the LISTDSI service with the FILE parameter.

Rather than a 500 line exec that you are asking us to debug for you, I recommend that you use short proof of concept execs and share those with us.

Further, it is customary to add comments to large program segments.
Back to top
View user's profile Send private message
Akatsukami

Global Moderator


Joined: 03 Oct 2009
Posts: 1788
Location: Bloomington, IL

PostPosted: Wed Oct 02, 2013 8:25 pm
Reply with quote

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

Global Moderator


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

PostPosted: Thu Oct 03, 2013 2:03 am
Reply with quote

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.
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 Compile Several JCL JOB Through one r... CLIST & REXX 4
No new posts Using API Gateway from CICS program CICS 0
No new posts Running REXX through JOB CLIST & REXX 13
No new posts Error to read log with rexx CLIST & REXX 11
No new posts isfline didnt work in rexx at z/OS ve... CLIST & REXX 7
Search our Forums:

Back to Top