10 Sept 2012

How to create a VSAM

Below step explains how to create a VSAM KSDS using IDCAMS utility.
//STEP          EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN         DD *
         DEFINE CLUSTER ( -
                 NAME(MY.VSAM.CREATE) -
                 TRACKS(5 5) -
                 VOLUME(TST232) -

                 CONTROLINTERVALSIZE(4096) -
                 ERASE -
                 FREESPACE(2 1) -
                 KEYS(10 5) -
                 RECORDSIZE(80 80) -

                 INDEXED -
                 NOREUSE -
                 NO REPLICATE -
       )DATA( -
             NAME(MY.VSAM.CREATE.DATA) -
       )INDEX( -
            NAME(MY.VSAM.CREATE.INDEX) -
       ) 

  • DEFINE      - To create a new VSAM.
  • NAME         - Name of VSAM.
  • TRACKS    - Space allocation of the VSAM.
  • VOLUMES – One or more DASD Volumes on which it created. 
  • CONTROLINTERVALSIZE – Size of the Control-Interval.It defaults to 4096 Bytes.
  • ERASE –  When the Cluster is Deleted, the space must be over-written with Binary Zeroes, prior to marking the space free for Re-use. 
  • FREESPACE(ci ca) – The percentage of space to be left unallocated for future expansion.
  • KEYS   This is used to tell the Key Column.10 is the length of the Key, and 5 is the starting position of the key. 
  • RECORDSIZE – Logical-Reocrds in the VSAM File.
  • INDEXED– This tells the Type of Cluster – KSDS(Data is accessed using Key Value).

6 Sept 2012

How to filter using INCLUDE condition


  • Sort filters the records, based on the include condition when copying to the output dataset.
  • Records having the character(KARTHICK) from 6 position to 12 position will only be copied to the sortout dataset.
  • we have opertions like EQ(EQual), GT(Greater Than), GE(Greater and Equal), LE(Lesser and Equal), LT(Lesser Than), etc., play a vital role in include condition.

//SYSIN DD *
 SORT FIELDS=COPY
 INCLUDE COND=(6,7,CH,EQ,C'KARTHICK')
 /*

How to sort using SORT FIELDS

  • The basic operation performed in SORT is as the name mentions.
  • We are the sorting the input records based on the sort fields we are mentioning.
  • Here records will be sorted based on record position 1 to 10  of the input.
  • Data format explains the format of data in sort field.
  • Data formats like CH(CHaracter) , ZD(Zoned Decimal), PD(Packed Decimal), BI(BInary) are very commonly used.
  • Sequence tells on what sequence the output needs to be stored whether Ascending or Descending.

//SYSIN DD *
  SORT FIELDS=(1,10,CH,A)
/*


1    --> Starting sort position

10  --> Length  of sort field

CH --> Data Format (Character)

A    --> Sequence (Ascending)

  • We can also mention more than one sort fields.
  • First the record will be sorted based on the first sort fields and it continues.


//SYSIN DD *
  SORT FIELDS=(1,10,CH,A,15,5,CH,A)

/*

Sort Utility

  • Sort Utility is used in most applications in JCL's.  
  • It is frequently used for three basic functions .Sorting, Merging and Copying.
 

SAMPLE JCL FOR SORT


//STEPNAME   EXEC PGM=SORT
//SYSOUT         DD SYSOUT=*
//SORTIN          DD DSN=MY.SORTIN
//SORTOUT      DD DSN=MY.SORTOUT
//SORTOFxx    DD DSN=MY.SORTOFXX
//SORTXSUM  DD DSN=MY.SORTXSUM
//SYSIN              DD *
   sort statements                                       
/*

  • SORTIN         Input dataset
  • SORTOUT     Output dataset
  • SORTOFxx    Multiple output files
  • SORTXSUM  Output dataset for eliminated records
  • SYSOUT        Output message

Rexx
-----
1. Retrieve data from CA7 
   ----------------------
//STEP02   EXEC PGM=CAL2X2WB,PARM='*AUTO*,CA71'
//STEPLIB  DD DSN=SYS1.CA7.LOADLIB,DISP=SHR
//SYSPRINT DD DSN=T01.SP02.OUTPUT.ABEND,
//            SPACE=(CYL,(15,5)),
//            DISP=(NEW,CATLG,DELETE)
//SYSDUMP  DD SYSOUT=Z
//SYSIN    DD DSN=T01.SYSPLEX.PARM.ABD,DISP=SHR


sysin la namba ca7 la ena command tharamo atha kuduthu data pick pannikanum

2. CHANGE
   ------
/************************************REXX*******************************
****/
CHANGE:
T_STR1=ARG(1)
T_STR2=ARG(2)
T_STR3=ARG(3)
NUM=0
ARRAY=
FOUND_FLAG=0
VAR2=LENGTH(T_STR1)
VAR3=LENGTH(T_STR2)
I=1
DO FOREVER
VAR1=POS(T_STR1,T_STR2)
IF VAR1 =0 THEN
 DO
  CALL PROCESS
  IF FOUND_FLAG=1 THEN
       DO
      RETURN FINAL_STR
       END
    ELSE
     DO
      RETURN T_STR2
     END
   EXIT
  END
  IF VAR1 \= 0 THEN
    DO
     FOUND_FLAG=1
     VAR4=SUBSTR(T_STR2,1,VAR1-1)
     VAR5=SUBSTR(T_STR2,VAR1+VAR2)
     VAR6=VAR4||T_STR3
     T_STR2=VAR5
     NUM=NUM+1
    ARRAY.I=VAR6
               I=I+1
           END
         END
         PROCESS:
          SIZE=I
          ARRAY.SIZE=VAR5
          FINAL_STR=ARRAY.1
          DO I=2 TO SIZE
            FINAL_STR=FINAL_STR||ARRAY.I
          END
         RETURN FINAL_STR

3. CNT
   ---
~
 /*                     REXX PROGRAM                             */
 /*--------------------------------------------------------------*/
 /*  THIS PROGRAM WILL COUNT THE NUMBER OF BYTES PRESENT IN      */
 /*  A RANGE OF INPUT ( BOUNDED BY THE LINE COMMAND 'C' OR 'CC').*/
 /*  THE OUTPUT WILL BE DISPLAYED ON THE UPPER RIGHT SIDE OF THE */
 /*  SCREEN.                                                     */
 /*--------------------------------------------------------------*/
 /* TRACE I*/
 SUM   = 0
 VALUE1 = 0
 VALUE2 = 0
 OCC_1_LVL   = 99
 OCC_1_TIMES = 1
 OCC_2_LVL   = 99
 OCC_2_TIMES = 1
 OCC_3_LVL   = 99
 OCC_3_TIMES = 1
 OCC_4_LVL   = 99
 OCC_4_TIMES = 1
 OCC_5_LVL   = 99
  OCC_5_TIMES = 1
  ADDRESS ISREDIT
     'ISREDIT MACRO NOPROCESS'
  ADDRESS ISPEXEC
     'ISPEXEC CONTROL ERRORS RETURN'
  ADDRESS ISREDIT
     'ISREDIT PROCESS RANGE C CC'
  SELECT
    WHEN RC = 4 THEN
      DO
        ZEDSMSG = 'ENTER C OR CC'
        ZEDLMSG = 'ENTER A C OR CC ON LINE'
        ADDRESS ISPEXEC
         'ISPEXEC SETMSG MSG(ISRZ001)'
          EXIT 12
      END
    WHEN RC > 4 THEN
          EXIT RC
    OTHERWISE NOP
      END
         /* GET FIRST AND LAST LINE OF THE INPUT */
      ADDRESS ISREDIT
        'ISREDIT (FIRST) = LINENUM .ZFRANGE'
        'ISREDIT (LAST)  = LINENUM .ZLRANGE'
      PREV_REC = ''
  DO LPTR = FIRST TO LAST
     ADDRESS ISREDIT
     'ISREDIT (REC) = LINE' LPTR
    /*   LINE IS COMMENTED OUT  */
    IF SUBSTR(REC,7,1) = '*' THEN
       DO
           ITERATE
       END
     /* OMIT LINE 1-7 AND 73-80 */
     REC = SUBSTR(REC,8,65)
     WORD_CNT = WORDS(REC)
     IF WORD_CNT = 0 THEN
        ITERATE
     /*  THIS CHECKS IF LAST CHAR IN THE RECORD IS A PERIOD */
     IF SUBSTR(WORD(REC,WORD_CNT),WORDLENGTH(REC,WORD_CNT),1) = '.' THEN
        DO
           PREV_REC = PREV_REC || ' ' || REC
           PIC_POS = WORDPOS(' PIC ',REC)
           IF  PIC_POS = 0 THEN
             /*   GET POSITION OF 'PICTURE'  */
               PIC_POS = WORDPOS(' PICTURE ',REC)
           PIC_VALUE_WORD = WORD(REC,PIC_POS + 1)

           LEVEL = WORD(REC,1)
       /*  SAY REC ' REC'
           SAY LEVEL ' LEVEL'
           SAY REDEFINES_LEVEL ' REDEFINES_LEVEL'
           SAY REDEFINES_ACTIVE ' REDEFINES_ACTIVE'
           PULL AA */
           IF REDEFINES_ACTIVE = 'YES' THEN
           DO
              IF LEVEL > REDEFINES_LEVEL THEN
                 ITERATE
              ELSE
              DO
                 REDEFINES_ACTIVE = 'NO'
                 REDEFINES_LEVEL =
              END
           END
           IF INDEX(REC,' REDEFINE ')  > 0,
           |  INDEX(REC,' REDEFINES ') > 0 THEN
           DO
              REDEFINES_ACTIVE = 'YES'
              REDEFINES_LEVEL = LEVEL
              ITERATE
           END
           IF INDEX(PIC_VALUE_WORD,'88') > 0 THEN
              ITERATE
           IF INDEX(REC,' PIC ') > 0 THEN
              CALL PIC_VALUE
           VALUE2=VALUE2+VALUE1
      /*   SAY VALUE2 ' VALUE2 '
           SAY VALUE1 ' VALUE1 ' */
           ITERATE
        END
     ELSE
       DO
          REC = PREV_REC || ' ' || REC
          PREV_REC = ''
       END
    /*   GET LEVEL NUMBER               */
    LEVEL = WORD(REC,1)
    IF LEVEL = 88 THEN
       ITERATE
    CALL CLEAN_UP_OCCURS_ARRAY     /*  INITIALIZE OCCURS ARRAY IF   */
                                   /*  POSSIBLE DUE TO NEW LEVEL NO */
    /*   CHECK IF PART OF A REDEFINES   */
    IF REDEFINES_ACTIVE = 'YES' THEN
       DO
          IF LEVEL > REDEFINES_LEVEL THEN
             ITERATE
          ELSE
             REDEFINES_ACTIVE = 'NO'
       END
    /*   LINE IS A REDEFINES LINE */
    IF INDEX(REC,' REDEFINE ')  > 0,
    |  INDEX(REC,' REDEFINES ') > 0 THEN
       DO
          REDEFINES_ACTIVE = 'YES'
          REDEFINES_LEVEL = LEVEL
          ITERATE
       END
    /*   LINE IS AN OCCURS LINE */
    IF INDEX(REC,' OCCURS ') > 0,
    |  INDEX(REC,' OCCUR ')  > 0 THEN
       CALL SAVE_OCCURS_IN_ARRAY      /* INITIALIZE OCCURS ARRAY IF   */
                                      /* POSSIBLE DUE TO NEW LEVEL NO */
    /*   GET POSITION OF 'PIC'  */
    PIC_POS = WORDPOS(' PIC ',REC)
    IF  PIC_POS = 0 THEN
        /*   GET POSITION OF 'PICTURE'  */
        PIC_POS = WORDPOS(' PICTURE ',REC)
    IF PIC_POS = 0 THEN
       DO
          VALUE1 = 0
       END
    ELSE
       DO
          /*   GET VALUE AFTER 'PIC'  */
          PIC_VALUE_WORD = WORD(REC,PIC_POS + 1)
          VALUE1 = 0
          CALL PIC_VALUE
       END
 /* SAY '#1' LEVEL OCC_1_LVL OCC_1_TIMES  */
 /* SAY '#2' LEVEL OCC_2_LVL OCC_2_TIMES  */
 /* SAY '#3' LEVEL OCC_3_LVL OCC_3_TIMES  */
 /* SAY '#4' LEVEL OCC_4_LVL OCC_4_TIMES  */
 /* SAY '#5' LEVEL OCC_5_LVL OCC_5_TIMES  */
     IF LEVEL > OCC_1_LVL,
      | (   LEVEL = OCC_1_LVL,
          & LPTR  = OCC_1_LINE ) THEN
        VALUE1 = VALUE1 * OCC_1_TIMES
     IF LEVEL > OCC_2_LVL,
      | (   LEVEL = OCC_2_LVL,
          & LPTR  = OCC_2_LINE ) THEN
        VALUE1 = VALUE1 * OCC_2_TIMES
     IF LEVEL > OCC_3_LVL,
      | (   LEVEL = OCC_3_LVL,
          & LPTR  = OCC_3_LINE ) THEN
        VALUE1 = VALUE1 * OCC_3_TIMES
     IF LEVEL > OCC_4_LVL,
      | (   LEVEL = OCC_4_LVL,
          & LPTR  = OCC_4_LINE ) THEN
       VALUE1 = VALUE1 * OCC_4_TIMES
    IF LEVEL > OCC_5_LVL,
     | (   LEVEL = OCC_5_LVL,
         & LPTR  = OCC_5_LINE ) THEN
       VALUE1 = VALUE1 * OCC_5_TIMES
    SUM = SUM + VALUE1
/*  SAY SUM ' SUM AT LAST'
    SAY VALUE1 ' VALUE 1 AT LAST'
    PULL AA */
 END
 /*SAY SUM ' SUM B4'
 SAY VALUE2 ' VALUE2 A4' */
    SUM = SUM + VALUE2
 /* SAY SUM ' SUM FINAL'
    SAY VALUE2 ' VALUE2 FINAL' */
 ZEDSMSG = SUM || ' BYTE(S)'
 ZEDLMSG = 'TOTAL NUMBER OF BYTE(S) IS' SUM
 ADDRESS ISPEXEC
    'ISPEXEC SETMSG MSG(ISRZ001)'
 EXIT
 /*************************/
 /*    END OF PROGRAM     */
 /*************************/
 /*************************/
 /*  ROUTINE TO COUNT THE */
 /*  PICTURE IN A LINE    */
 /*************************/
 PIC_VALUE:
  /*  SAY PIC_VALUE_WORD ' PIC_VALUE_WORD' */
    LOOK_FOR_CLOSE_PAREN = 'NO'
    VALUE1 = 0
    VALUE_IN_PAREN = 0
    DO W1 = 1 TO LENGTH(PIC_VALUE_WORD)
      /*  SAY    SUBSTR(PIC_VALUE_WORD,W1,1)  ' SUBSTR'
          PULL AA */
       SELECT
         WHEN SUBSTR(PIC_VALUE_WORD,W1,1) = ' ' THEN
         DO
      /*    SAY ' IN SPACE PARA' */
            ITERATE
         END
         WHEN LOOK_FOR_CLOSE_PAREN = 'YES' THEN
            DO
         /*    SAY LOOK_FOR_CLOSE_PAREN ' LOOK_FOR_CLOSE_PAREN' */
               IF SUBSTR(PIC_VALUE_WORD,W1,1) = ')' THEN
                  ITERATE
               ELSE
                  DO
                     LOOK_FOR_CLOSE_PAREN = 'NO'
                     ITERATE
                   END
             END
          WHEN SUBSTR(PIC_VALUE_WORD,W1,1) = 'S' THEN
                DO
                  ITERATE
                END
          WHEN SUBSTR(PIC_VALUE_WORD,W1,1) = 'V' THEN
                DO
                  ITERATE
                END
          WHEN SUBSTR(PIC_VALUE_WORD,W1,1) = '(' THEN
             DO
      /*       SAY ' VALUE1 IN ( PARA B4' VALUE1 */
               VALUE1 = VALUE1 - 1
               OPEN_PAREN_FOUND = 'YES'
               ITERATE
             END
          WHEN OPEN_PAREN_FOUND = 'YES' THEN
             DO
               RPAREN_POS = INDEX(PIC_VALUE_WORD,')',W1)
              VALUE_IN_PAREN = SUBSTR(PIC_VALUE_WORD,W1,RPAREN_POS - W1)
               VALUE1 = VALUE1 + VALUE_IN_PAREN
          /*   SAY ' VALUE1 A4 ' VALUE1
               SAY ' VALUE_IN_PAREN ' VALUE_IN_PAREN */
           /*  PULL AA */
               OPEN_PAREN_FOUND = 'NO'
               LOOK_FOR_CLOSE_PAREN = 'YES'
               ITERATE
             END
         WHEN SUBSTR(PIC_VALUE_WORD,W1,1) = '.' THEN
            DO
      /*      SAY W1 ' W1'
              SAY PIC_VALUE_WORD ' PIC_VALUE_WORD'
              PULL AA */
               IF W1 = LENGTH(PIC_VALUE_WORD) THEN
                  DO
                     ITERATE
                  END
               ELSE
                 VALUE1 = VALUE1 + 1
            END
       OTHERWISE
       DO
         VALUE1 = VALUE1 + 1
     /*  SAY ' VALUE1 IN OTHERWISE ' VALUE1 */
       END
       END
    END
    /* SAY 'VALUE = ' || VALUE */
    IF SUBSTR(PIC_VALUE_WORD,1,1) = 'S',
     | SUBSTR(PIC_VALUE_WORD,1,1) = 'V',
     | SUBSTR(PIC_VALUE_WORD,1,1) = '9' THEN
       DO
          SELECT
             WHEN INDEX(REC,' COMP ')   > 0,        /* COMP OR COMP-4 */
              |   INDEX(REC,' COMP.')   > 0,
              |   INDEX(REC,' COMP-4 ') > 0,
              |   INDEX(REC,' COMP-4.') > 0 THEN
                DO
                   SELECT
                      WHEN VALUE1 <= 4 THEN
                         VALUE1 = 2
                      WHEN VALUE1 <= 9 THEN
                         VALUE1 = 4
                      OTHERWISE
                         VALUE1 = 8
                   END
                END
             WHEN INDEX(REC,' COMP-3 ') > 0,        /* COMP-3 */
              |   INDEX(REC,' COMP-3.') > 0 THEN
                VALUE1 = (VALUE1 % 2) + 1
             WHEN INDEX(REC,' COMP-1 ') > 0,        /* COMP-1 */
              |   INDEX(REC,' COMP-1.') > 0 THEN
                VALUE1 = 4
             WHEN INDEX(REC,' COMP-2 ') > 0,        /* COMP-2 */
              |   INDEX(REC,' COMP-2.') > 0 THEN
                VALUE1 = 8
             OTHERWISE NOP
          END
       END
  /*   SAY VALUE1 ' VALUE1 IN PIC ROUTINE' */
 RETURN
 /*   END OF PIC_VALUE ROUTINE     */
 /*************************/
  /*  ROUTINE TO CLEAN UP  */
  /*  THE OCCURS ARRAY     */
  /*************************/
  CLEAN_UP_OCCURS_ARRAY:
     IF LEVEL <= OCC_1_LVL THEN
        DO
           OCC_1_LVL   = 99
           OCC_1_TIMES =  1
           OCC_1_LINE  =  0
        END
     IF LEVEL <= OCC_2_LVL THEN
        DO
           OCC_2_LVL   = 99
           OCC_2_TIMES =  1
           OCC_2_LINE  =  0
        END
     IF LEVEL <= OCC_3_LVL THEN
        DO
           OCC_3_LVL   = 99
           OCC_3_TIMES =  1
           OCC_3_LINE  =  0
        END
     IF LEVEL <= OCC_4_LVL THEN
        DO
           OCC_4_LVL   = 99
           OCC_4_TIMES =  1
           OCC_4_LINE  =  0
        END
     IF LEVEL <= OCC_5_LVL THEN
        DO
          OCC_5_LVL   = 99
          OCC_5_TIMES =  1
          OCC_5_LINE  =  0
       END
 RETURN
 /*   END OF CLEAN_UP_OCCURS_ARRAY ROUTINE     */
 /*************************/
 /*  ROUTINE TO SAVE IN   */
 /*  OCCURS ARRAY         */
 /*************************/
 SAVE_OCCURS_IN_ARRAY:
     OCCURS_WORD_POS = WORDPOS(' OCCURS ',REC)
     IF OCCURS_WORD_POS = 0 THEN
        OCCURS_WORD_POS = WORDPOS(' OCCUR ',REC)
     TIMES = WORD(REC,OCCURS_WORD_POS + 1)
     DO
        SELECT
           WHEN OCC_1_LVL = 99 THEN
              DO
                 OCC_1_LVL   = LEVEL
                 OCC_1_TIMES = TIMES
                 OCC_1_LINE  = LPTR
              END
           WHEN OCC_2_LVL = 99 THEN
              DO
                OCC_2_LVL   = LEVEL
                OCC_2_TIMES = TIMES
                OCC_2_LINE  = LPTR
             END
          WHEN OCC_3_LVL = 99 THEN
             DO
                OCC_3_LVL   = LEVEL
                OCC_3_TIMES = TIMES
                OCC_3_LINE  = LPTR
             END
          WHEN OCC_4_LVL = 99 THEN
             DO
                OCC_4_LVL   = LEVEL
                OCC_4_TIMES = TIMES
                OCC_4_LINE  = LPTR
             END
          WHEN OCC_5_LVL = 99 THEN
             DO
                OCC_5_LVL   = LEVEL
                OCC_5_TIMES = TIMES
                OCC_5_LINE  = LPTR
             END
          OTHERWISE
             SAY 'ERROR ===> ARRAY EXCEEDED (MORE THAN 5)'
       END
    END
 RETURN
 /*   END OF SAVE_OCCURS_IN_ARRAY ROUTINE     */

4. COPY A CERTAIN MEMBERS FROM A PDS TO ANOTHER PDS
   ------------------------------------------------
/****REXX**/
/****COPY A CERTAIN MEMBERS FROM A PDS TO ANOTHER PDS ***/
INP='N01.LK.SNE.GDIS.PROGRAM.CUT'
INP1='NANNA1.SQL.FINAL.OUTPUT'
OUTJOB='N01.LK.GDIS.FREEZE.PGMS.INP2'
ADDRESS TSO
X=OUTTRAP("RESJOB.")
"LISTDS ('"||INP||"') MEMBERS"
X=OUTTRAP("OFF")
ADDRESS TSO
"ALLOC FI(DD3) DS('"INP1"') SHR"
"EXECIO * DISKR DD3(FINIS STEM INP2."
"FREE FI(DD3)"

/******************DECLARATIONS******************/
Z=1
DO K=1 TO INP2.0
   INP2.K=STRIP(INP2.K)
   SAY INP2.K
   DO J=7 TO RESJOB.0
     RESJOB.J=STRIP(RESJOB.J)
     IF RESJOB.J=INP2.K THEN
     DO
        INPUT=INP||'('RESJOB.J')'
        INP1.=
        INP3.=
        ADDRESS TSO
        "ALLOC FI(DD4) DS('"INPUT"') SHR"
        "EXECIO * DISKR DD4(FINIS STEM INP1."
        "FREE FI(DD4)"
        DO L=1 TO INP1.0
           INP3.L=INP1.L
        END
        OUTPUT=OUTJOB||'('RESJOB.J')'
        ADDRESS TSO
        "ALLOC FI(DD5) DS('"OUTPUT"') SHR"
        "EXECIO * DISKW DD5(FINIS STEM INP3."
        "FREE FI(DD5)"
     END
   END
END
EXIT

5. CREATE A DATASET
   ----------------
/*REXX*/
OUTPUT='NANNA1.SNE.DIT2'
IF SYSDSN("'"OUTPUT"'") = 'OK' THEN
   NOP
ELSE
DO
   ADDRESS TSO
   "ALLOCATE DATASET('"OUTPUT"') CATALOG LRECL (80) EXPDT(2017/364)
    VOLUME(PRJ002)             BLKSIZE(27920) MGMTCLAS(STANDARD)
  STORCLAS(STANDARD) RECFM(F B) DSORG(PS) CYLINDER SPACE(50 50) DIR(0)"
  "FREE DA('"OUTPUT"')"
END
EXIT

6. DELETE A SET OF FILES
   ---------------------
/*****REXX************/
INPUT='NANNA1.OUT12'
"ALLOC FI(DD2) DS('"INPUT"') SHR"
"EXECIO * DISKR DD2(FINIS STEM INP."
"FREE FI(DD2)"
DO I = 1 TO INP.0
    INP.I=STRIP(INP.I)
    INP.I="'" || INP.I || "'"
    SAY INP.I
    DELETE INP.I
END

7. FILEAID JCL
   -----------
//NANNA1AA JOB (ACCOUNT),CLASS=A,MSGLEVEL=(1,1),MSGCLASS=R,             
//         NOTIFY=NANNA1
//FASTEP   EXEC PGM=FILEAID,REGION=8M
//STEPLIB  DD  DISP=SHR,DSN=SYS2.FILEAID.V940.CXFALOAD
//         DD  DISP=SHR,DSN=SYS2.FILEAID.V940.SXFALOAD
//SYSPRINT DD  SYSOUT=*
//SYSLIST  DD  SYSOUT=*
//DD01     DD  DSN=N01.LIBR.LIBCCF.DST,DISP=SHR
//DD01O    DD  DSN=NANNA1.GFMV.PGM,
//             DISP=OLD
//SYSIN    DD  *
$$DD01 COPY PADCHAR=X'00',CEM=YES,RLM=YES,
  MEMBER=(DCC81,DCEDI01)
/*

8. GET MEMBER NAME FROM A PDS
   --------------------------
/*************REXX****************/
INP='N01.LK.UPC.OTHERS'
OUTPUT='NANNA1.OUT'
ADDRESS TSO
X=OUTTRAP("RES.")
"LISTDS ('"||INP||"') MEMBERS"
X=OUTTRAP("OFF")
/**************DECLARATIONS**************/
Z=1

DO I = 7 TO RES.0
   RES.I=STRIP(RES.I)
   OUTPUT.Z=RES.I
   Z=Z+1
END
   ADDRESS TSO
   "ALLOC FI(DD4) DS('"OUTPUT"') SHR"
   "EXECIO * DISKW DD4(FINIS STEM OUTPUT."
   "FREE FI(DD4)"
EXIT

9. CHECK NEW DATASETS FROM A SET OF JCLS
   -------------------------------------
/*************REXX****************/
JCLRC = 0
DO WHILE JCLRC < 8
   MSGSTAT=MSG('ON')
   MSGI = "TOOL TO CHECK NEW DATASETS FROM A SET OF JCLS"
   ADDRESS ISPEXEC "SETMSG MSG(ISRZ001 )"
ADDRESS ISPEXEC
 "LIBDEF ISPPLIB DATASET ID('NANNA1.REXX')"
ADDRESS ISPEXEC
 "DISPLAY PANEL(TABPANL)"

 JCLRC = RC
 MSGSTAT=MSG('OFF')

INP = INPI
INP = TRANSLATE(INP)
INP = STRIP(INP)
OUTPUT = OUTI
OUTPUT = TRANSLATE(OUTPUT)
OUTPUT = STRIP(OUTPUT)
  IF JCLRC = 8 THEN
  DO
   INPI = " "
   OUTI = " "
  END
  IF RESP = "PF03" THEN
  DO
     EXIT(0)
  END
ADDRESS TSO
X=OUTTRAP("RES.")
"LISTDS ('"||INP||"') MEMBERS"
X=OUTTRAP("OFF")
/**************DECLARATIONS**************/
DL ='DSN='
DL1=','
Z=1
COUNT=0
INLINE_FLAG=0
SECOND_INLINE=0
THIRD_INLINE=0

DO I = 7 TO RES.0
   RES.I=STRIP(RES.I)
   INPUT=INP||'('RES.I')'
   INP.=
   ADDRESS TSO
   "ALLOC FI(DD2) DS('"INPUT"') SHR"
   "EXECIO * DISKR DD2(FINIS STEM INP."
   "FREE FI(DD2)"
   SAY INP.0
   OUTPUT.Z=RES.I
   Z=Z+1
   DO X= 1 TO INP.0
      IF INDEX(INP.X,'NEW') > 0 & INDEX(INP.X,'DISP') > 0 &,
         SUBSTR(INP.X,3,1) \= '*' THEN
      DO
          IF INDEX(INP.X,'DSN') > 0 THEN
          DO
             PARSE VAR INP.X FIRST (DL) FILE (DL1)
             IF INDEX(FILE,'&&') = 0 THEN
             DO
               OUTPUT.Z=RIGHT(FILE,60,' ')
               Z=Z+1
             COUNT=COUNT+1
             END
             INLINE_FLAG = 1
          END
          G=X-1
          IF INDEX(INP.G,'DSN') > 0 & INLINE_FLAG = 0 THEN
          DO
             PARSE VAR INP.G FIRST (DL) FILE (DL1)
             IF INDEX(FILE,'&&') = 0 THEN
             DO
               OUTPUT.Z=RIGHT(FILE,60,' ')
               Z=Z+1
               COUNT=COUNT+1
             END
             G=0
          END
          INLINE_FLAG = 0
      END
      IF INDEX(INP.X,'(,CATLG,DELETE)') > 0 &,
         INDEX(INP.X,'DISP') > 0 &,
         SUBSTR(INP.X,3,1) \= '*' THEN
      DO
          IF INDEX(INP.X,'DSN') > 0 THEN
          DO
             PARSE VAR INP.X FIRST (DL) FILE (DL1)
             IF INDEX(FILE,'&&') = 0 THEN
             DO
               OUTPUT.Z=RIGHT(FILE,60,' ')
               Z=Z+1
               COUNT=COUNT+1
             END
             SECOND_INLINE = 1
          END
          G=X-1
          IF INDEX(INP.G,'DSN') > 0 & SECOND_INLINE = 0 THEN
          DO
             PARSE VAR INP.G FIRST (DL) FILE (DL1)
             IF INDEX(FILE,'&&') = 0 THEN
             DO
               OUTPUT.Z=RIGHT(FILE,60,' ')
               Z=Z+1
               COUNT=COUNT+1
             END
             G=0
          END
          SECOND_INLINE = 0
      END
      IF INDEX(INP.X,'(MOD,CATLG') > 0 &,
         INDEX(INP.X,'DISP') > 0 &,
         SUBSTR(INP.X,3,1) \= '*' THEN
      DO
          IF INDEX(INP.X,'DSN') > 0 THEN
          DO
             PARSE VAR INP.X FIRST (DL) FILE (DL1)
             IF INDEX(FILE,'&&') = 0 THEN
             DO
               OUTPUT.Z=RIGHT(FILE,60,' ')
               Z=Z+1
               COUNT=COUNT+1
             END
             THIRD_INLINE = 1
          END
          G=X-1
          IF INDEX(INP.G,'DSN') > 0 & THIRD_INLINE = 0 THEN
          DO
             PARSE VAR INP.G FIRST (DL) FILE (DL1)
             IF INDEX(FILE,'&&') = 0 THEN
             DO
               OUTPUT.Z=RIGHT(FILE,60,' ')
               Z=Z+1
               COUNT=COUNT+1
             END
             G=0
          END
          THIRD_INLINE = 0
      END

   END
   OUTPUT.Z=RIGHT(COUNT,70,' ')
   Z=Z+1
   OUTPUT.Z='---------------------------------------------------------'
   Z=Z+1
   COUNT=0
END
IF SYSDSN("'"OUTPUT"'") = 'OK' THEN
   NOP
ELSE
DO
   ADDRESS TSO
   "ALLOCATE DATASET('"OUTPUT"') CATALOG LRECL (80)
    BLKSIZE(27920)  RECFM(F B) DSORG(PS) TRACKS SPACE(50 50) DIR(0)"
  "FREE DA('"OUTPUT"')"
END
ADDRESS TSO
   "ALLOC FI(DD4) DS('"OUTPUT"') SHR"
   "EXECIO * DISKW DD4(FINIS STEM OUTPUT."
   "FREE FI(DD4)"
    MSGSTAT=MSG(ON)
    MSGY='NEW DATASETS ARE LISTED IN OUTPUT REPORT SUCCESSFULLY'
    MSGO=' CHECK YOUR OUTPUT IN  ' || OUTPUT
    ADDRESS ISPEXEC "SETMSG MSG(ISRZ001 )"
    INPI=" "
    OUTI=" "
END
EXIT

10. CONNECT REXX TO DB2 TABLES
    --------------------------
/**rexx**/
ADDRESS TSO "SUBCOM DSNREXX"
say rc
IF RC = 0 THEN
DO
    S_RC=RXSUBCOM('ADD','DSNREXX','DSNREXX')
    SAY 'DB2 CONNECTED'
END
ADDRESS DSNREXX "CONNECT DSNT"
CALL RXSUBCOM 'ADD','SQL','RXTASQL'
X=DB2SET('PS','O')
SAY RC' A4 OPN'
QUERY1 = "SELECT JOB_NAME FROM  DEVGEN.JOB WHERE JOB_NAME="@@ABC123";"
SAY QUERY1
ADDRESS SQL QUERY1
SAY RC' A4 QRY'
X=DB2SET('PS','C')
SAY SQLCA.SQLROWS
 ADDRESS DSNREXX "DISCONNECT"
 S_RC=RXSUBCOM('DELETE','DSNREXX','DSNREXX')
EXIT

11. COMMENT CERTAIN LINES IN COBOL
    ------------------------------
/**REXX**/
"ISREDIT MACRO (N) NOPROCESS"
 ISREDIT "(MX)=LINENUM .ZLAST "
 SAY MX 'MX '
 SAY N  'N  '
 IF LENGTH(N)=0 THEN N=7
 ISREDIT "PROCESS RANGE CO"
 ISREDIT "(L)=LINENUM .ZFRANGE "
 ISREDIT "(MX)=LINENUM .ZLRANGE "
 ISREDIT "LABEL "L"=.THIS "
 ISREDIT "LABEL "MX"=.THAT "
 ISREDIT "C "N" ' ' '*' ALL .THIS .THAT"
 EXIT

12. REXXJCL
    -------
//TESTJOB  JOB DST,CLASS=A,MSGCLASS=9,MSGLEVEL=(1,1),
//         NOTIFY=&SYSUID
//STEP1 EXEC PGM=IKJEFT01
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
 EXEC 'N01.LN.REXX.TOOL(COMPCHK)'
/*

13. GET COBOL TIMESTAMP FROM LINKLIB
    --------------------------------
//TIMEJCL  JOB (DVBP),MASSCLON,CLASS=B,MSGCLASS=A,
//         NOTIFY=&SYSUID,MSGLEVEL=(1,1)
//*********************************************************************
//* DELETE OUTPUT DATASETS GENERATED IN THE NEXT STEP
//*********************************************************************
//STEP00 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//DD2      DD DSN=S3S2.PGMVALID,DISP=(MOD,DELETE,DELETE),
//         SPACE=(TRK,0)
//DD3      DD DSN=S3S2.INSTALL.STATUS,DISP=(MOD,DELETE,DELETE),
//         SPACE=(TRK,0)
/*
//STEP000   EXEC PGM=IEBGENER,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DATA,DLM='灿'
//*********************************************************************
//ACTIVEOB JOB (DGBP,$$CLPREP),FIN,
//             CLASS=C,MSGCLASS=R,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
/*JOBPARM  C=0,L=1,T=5
/*ROUTE    PRINT SP03
/*ROUTE    XEQ SP02
//*
//*********************************************************************
//STEP01 EXEC PGM=IEFBR14
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//DD1      DD DSN=S2S3.TIMESTMP.OUT,DISP=(MOD,DELETE,DELETE),
//         SPACE=(TRK,0)
/*
//*********************************************************************
//* TO GET THE COMPILE TIMESTAMP FOR LIST OF LOAD MODULES IN THE
//* REMEDIATED LOAD LIBRARIES
//*********************************************************************
//FNDTSTP1 EXEC PGM=AMBLIST
//SYSPRINT DD   DSN=S2S3.TIMESTMP.OUT,
//         SPACE=(TRK,(30,20),RLSE),DISP=(,CATLG,DELETE),
//         DCB=(RECFM=FB,LRECL=80)
//SYSOUT   DD   SYSOUT=*
//STEPLIB  DD   DSN=SYS1.LINKLIB,DISP=SHR
//MYLOAD   DD   DSN=WM.BR.LINKLIB,DISP=SHR
//SYSIN    DD   DSN=S3S2.TIMESTMP.BATCH,DISP=SHR
//*
//FNDTSTP2 EXEC PGM=AMBLIST
//SYSPRINT DD   DSN=S2S3.TIMESTMP.OUT,
//         SPACE=(TRK,(30,20),RLSE),DISP=(MOD,CATLG,DELETE),
//         DCB=(RECFM=FB,LRECL=80)
//SYSOUT   DD   SYSOUT=*
//STEPLIB  DD   DSN=SYS1.LINKLIB,DISP=SHR
//MYLOAD   DD   DSN=WM.BR.CICSLINK,DISP=SHR
//SYSIN    DD   DSN=S3S2.TIMESTMP.CICS,DISP=SHR
//*
//**********************************************************
//*STEP002 - TRIGGERS SP03JOB WHICH WILL RUN IN SP03
//**********************************************************
//STEP002   EXEC PGM=IEBGENER,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DATA,DLM='止'
//*********************************************************************
//SP03JOB  JOB (DGBP,$$CLPREP),FIN,
//             CLASS=C,MSGCLASS=R,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
//*********************************************************************
/*JOBPARM  C=0,L=1,T=5
/*ROUTE    PRINT SP03
/*ROUTE    XEQ SP03
//*
//*********************************************************************
//* CHECKS FOR PGM COMPILE DATE AND CURRENT DATE
//*********************************************************************
//STEP02 EXEC PGM=IKJEFT01
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
 EXEC 'N01.LN.REXX.TOOL.SUIN(DATEINTL)'
/*

//SYSIN     DD DUMMY
//SYSUT2    DD SYSOUT=(A,INTRDR),
//             DCB=(RECFM=F,LRECL=80,BLKSIZE=80)

//SYSIN     DD DUMMY
//SYSUT2    DD SYSOUT=(A,INTRDR),
//             DCB=(RECFM=F,LRECL=80,BLKSIZE=80)


14. PANEL SAMPLE
    ------------
)ATTR
@ TYPE(TEXT) COLOR(RED) INTENS(HIGH)
$ TYPE(TEXT) COLOR(WHITE) INTENS(HIGH)
! TYPE(TEXT) COLOR(YELLOW) INTENS(HIGH)
% TYPE(TEXT) COLOR(GREEN) INTENS(HIGH)
_ TYPE(INPUT) INTENS(HIGH) COLOR(WHITE) PAD('_')
/ TYPE(OUTPUT) INTENS(HIGH)  COLOR(YELLOW)
)BODY
%COMMAND ===>_ZCMD
$
$ *****************************************
$ *** "PROGRAM INSTALL VALIDATION"      ***
$ *****************************************
$
% ENTER YOUR OPTION _Z+
@  1. US MARKETS
@  2. INTERNATIONAL MARKETS
$  ------------------------------------------------------------------
$  -NOTE:
$  -ENTER A NUMBER 1 OR 2 TO USE THE SPECIFIED TOOL
$  ------------------------------------------------------------------
! /MSGY
)INIT
ZVARS='(OPT)'
)REINIT
 REFRESH(*)
)PROC
VER(&OPT,NB)
VER(&OPT,RANGE,1,2)
&RESP = .PFKEY
)END

15. SUPERC
    ------
/*******************REXX*******************/
/********* USING NEXCLUDE , OEXCLUDE COLS IN SUPERC JCL**********/
QUEUE 'SUPERC'
  ADDRESS TSO EX "'NANNA1.SNE.TOOLS.SIMPLE(STATLOG)'"
  ADDRESS TSO
 PDSN = USERID()".SUPERC.JCL"
 IF SYSDSN("'"PDSN"'") \= "OK" THEN
 DO
  "ALLOC F(DD1) DS('"PDSN"') NEW TRACKS SPACE(10,10) DIR(10) REUSE",
  "DSORG(PO) RECFM(F,B) LRECL(80) blksize(8000)"
  "FREE FILE(DD1)"
 END
 PDSN1=USERID()".SUPERC.MAILPAM"
 IF SYSDSN("'"PDSN1"'") \= "OK" THEN
 DO
  "ALLOC F(DD1) DS('"PDSN1"') NEW TRACKS SPACE(1,14) REUSE",
  "DSORG(PS) RECFM(F,B,A) LRECL(203)"
  "FREE FILE(DD1)"
 END
  ELEMENT="N01.LN.SNE.REXX.TOOLS(PARMSKL)"
 /* ELEMENT=USERID()."SUPERC.TOOL(PARMSKL)" */
 "ALLOC F(DD1) SHR DS('"ELEMENT"')"
 "EXECIO * DISKR DD1(FINIS STEM IN."
 "FREE F(DD1)"
 ELEMENT=USERID()."SUPERC.MAILPAM"
 "ALLOC F(DD1) SHR DS('"ELEMENT"')"
 "EXECIO * DISKW DD1(FINIS STEM IN."
 "FREE F(DD1)"
ADDRESS ISPEXEC
   "ISPEXEC EDIT DATASET('"ELEMENT"') MACRO(UCHANGE)"
   "ISREDIT CANCEL"
/* DISPLAYING THE PANEL*/
CALL PANEL_THROW
EXIT
PANEL_THROW:
   "DISPLAY PANEL(SUPCPNL)"
    IF RESP = "PF03" THEN
    DO
      SAY ' YOU HAVE PRESSED EXIT'
      EXIT(0)
    END
    ELSE DO
      NAME1 = FILE1
      NAME2 = FILE2
      COLRANGE = COLS
      COLRANGE = STRIP(COLRANGE)
      POSNUM = POS(' ',COLRANGE)
    IF POSNUM \= 0 THEN
      DO
    /*  INPUT IS HAVING MORE THAN ONE RANGE */
       LOC1 = POSNUM - 1
       LOC2 = POSNUM + 1
       PART1 = SUBSTR(COLRANGE,1,LOC1)
       PART2 = SUBSTR(COLRANGE,LOC2)
       PARSE VAR PART1 COL1 ":" COL2
       PARSE VAR PART2 COL3 ":" COL4
      CALL SUPERC
      CALL EMAIL
      RETURN
      EXIT
      END
    ELSE IF COLS \= "" THEN
      DO
       /* INPUT IS HAVING ONE RANGE*/
         PARSE VAR COLRANGE COL1 ":" COL2
   /*    COL3 = 0
         COL4 = 0 */
         CALL SUPERC
         CALL EMAIL
         RETURN
         EXIT
      END
     ELSE
       /* INPUT IS NOT HAVING RANGE*/
      DO
       COL1 = 0
       COL2 = 0
       COL3 = 0
       COL4 = 0
      CALL SUPERC
      CALL EMAIL
      RETURN
      EXIT
      END
    END
SUPERC:
/* CODE TO EXECUTE SUPERC ON USER INPUT FILES */
ADDRESS ISPEXEC
SAY 'EXECUTING SUPERC'
USER = USERID()
/*SKLDSN = USER".SUPERC.TOOL"*/
SKLDSN = "N01.LN.SNE.REXX.TOOLS"
JCLDSN = USER".SUPERC.JCL"
"LIBDEF ISPSLIB DATASET ID('"SKLDSN"')"
"LIBDEF ISPFILE DATASET ID('"JCLDSN"')"
JOBLINE1  = '//'USER'H  JOB (DCBP),DST,MSGLEVEL=(1,1),'
JOBLINE2  = '//             CLASS=9,MSGCLASS=A,NOTIFY=&SYSUID'
NEWDSN   = NAME1
OLDDSN   = NAME2
OUTDSN  = USER".SUPERC.OUTPUT"
 "FTOPEN"
 "FTINCL SUPCSKL"
NEWJOB = "SUPCJCL"
"FTCLOSE NAME("NEWJOB")"
TEMPDSN = JCLDSN || "("NEWJOB")"
X =  OUTTRAP('JOB.')
ADDRESS TSO "SUBMIT '"TEMPDSN"'"
X = OUTTRAP("OFF")
ADDRESS SYSCALL
 "SLEEP" 10
 CALL SYSCALLS 'OFF'
   RETURN
 /* SENDING SUPERC OUTPUT IN EMAIL WITH ATTACHMENT*/
EMAIL :
ADDRESS ISPEXEC
SAY" EXECUTING  EMAIL"
USER = USERID()
/*SKLDSN = USER".SUPERC.TOOL"*/
SKLDSN = "N01.LN.SNE.REXX.TOOLS"
JCLDSN = USER".SUPERC.JCL"
"LIBDEF ISPSLIB DATASET ID('"SKLDSN"')"
"LIBDEF ISPFILE DATASET ID('"JCLDSN"')"
JOBLINE1  = '//'USER'H  JOB (DCBP),DST,MSGLEVEL=(1,1),'
JOBLINE2  = '//             CLASS=9,MSGCLASS=A,NOTIFY=&SYSUID'
INDSN = USER".SUPERC.MAILPAM"
OUTDSN  = USER".SUPERC.OUTPUT"
 "FTOPEN"
 "FTINCL MAILSKL"
NEWJOB = "MAILJCL"
"FTCLOSE NAME("NEWJOB")"
TEMPDSN = JCLDSN || "("NEWJOB")"
X =  OUTTRAP('JOB.')
ADDRESS TSO "SUBMIT '"TEMPDSN"'"
X = OUTTRAP("OFF")
ADDRESS SYSCALL
 "SLEEP" 2
 CALL SYSCALLS 'OFF'
 SAY 'CHECK OUTPUT IN MAILBOX'
   RETURN

16. OBSOLETE JCL
    ------------
/*REXX*/
QUEUE 'OBSJCL'
ADDRESS TSO EX "'N01.LN.SNE.REXX.TOOLS(STATLOG)'"
ADDRESS ISPEXEC
 "LIBDEF ISPPLIB DATASET ID('N01.LN.SNE.REXX.TOOLS')"
ADDRESS ISPEXEC
 "DISPLAY PANEL(OBJOBPNL)"

INP = INPI
INP = TRANSLATE(INP)
INP = STRIP(INP)

IF RESP = "PF03" THEN
DO
   EXIT(0)
END
ADDRESS TSO
X=OUTTRAP("PGM.")
"LISTDS ('"||INP||"') MEMBERS"
X=OUTTRAP("OFF")
   DO I = 7 TO PGM.0
      PGM.I=STRIP(PGM.I)
      TEMP =STRIP(PGM.I)
      INPUT=INP||'('PGM.I')'
      INP.=
       ADDRESS ISPEXEC "EDIT DATASET ('"INPUT"') " ||,
       " MACRO(OBSOLJOB) PARM(TEMP)"
   END
   SAY 'OBSOLETE JCLS GENERATED SUCCESSFULLY'
 EXIT

17. OBSOLETE JCL - 2
    ----------------
/* REXX */
ADDRESS ISREDIT "MACRO (JOBNAME)"
ADDRESS ISREDIT
"DELETE" .ZF .ZL
OUTPUT1 = '//'JOBNAME'  JOB (MOBP),OBSOLETE,'
ADDRESS ISREDIT "LINE_AFTER  0 = (OUTPUT1)"
OUTPUT2 = '//           CLASS=R,MSGCLASS=8,SCHENV=BATCH,'
ADDRESS ISREDIT "LINE_AFTER  1 = (OUTPUT2)"
OUTPUT3 = '//           MSGLEVEL=(1,1)'
ADDRESS ISREDIT "LINE_AFTER  2 = (OUTPUT3)"
OUTPUT4 = '//JOBLIB   DD DSN=WM.SP.LINKLIB,DISP=SHR'
ADDRESS ISREDIT "LINE_AFTER  3 = (OUTPUT4)"
OUTPUT5 = ,
     '//$AVRS    OUTPUT CLASS=8,DEFAULT=YES,DEST=$GO,JESDS=ALL'
ADDRESS ISREDIT "LINE_AFTER  4 = (OUTPUT5)"
/*ADDRESS ISREDIT
F FIRST NX '" JOB "'" */
/*IF RC = 0 THEN DO */
/*END */
TDATE = DATE("S")
YEAR  = SUBSTR(TDATE,3,2)
MM    = SUBSTR(TDATE,5,2)
DD    = SUBSTR(TDATE,7,2)
XDATE = MM'/'DD'/'YEAR
USER = USERID()
JLN1  = "//******************************************************"
ADDRESS ISREDIT "LINE_AFTER  5 = (JLN1)"
JLN2  = "//* JOB "JOBNAME "WAS MADE OBSOLETE "XDATE" - " USER
ADDRESS ISREDIT "LINE_AFTER  6 = (JLN2)"
JLN3  = "//******************************************************"
ADDRESS ISREDIT "LINE_AFTER  7 = (JLN3)"
JLN4  = "//*STEP01   TELLOP"
ADDRESS ISREDIT "LINE_AFTER  8 = (JLN4)"
JLN5  = "//*-----------------------------------------------------"
ADDRESS ISREDIT "LINE_AFTER  9 = (JLN5)"
JLN6  = "//STEP01   EXEC PGM=TELLOP "
ADDRESS ISREDIT "LINE_AFTER  10 = (JLN6)"
JLN7  = "//"
ADDRESS ISREDIT "LINE_AFTER  11 = (JLN7)"
ADDRESS ISREDIT
"SAVE"
"END"
EXIT

18. REXX CODE FOR INVOKING PANELS
    -----------------------------
FTPRC = 0
DO WHILE FTPRC < 8
   MSGSTAT=MSG('ON')
   MSGI = "TOOL TO CHECK FTP PARMS FROM A SET OF JCLS"
   ADDRESS ISPEXEC "SETMSG MSG(ISRZ001 )"
ADDRESS ISPEXEC
 "LIBDEF ISPPLIB DATASET ID('N01.LN.REXX.TOOL')"
ADDRESS ISPEXEC
 "DISPLAY PANEL(TABPANL)"
FTPRC = RC
   MSGSTAT=MSG('OFF')
   INP = INPI
   INP = TRANSLATE(INP)
   INP = STRIP(INP)
   OUTJOB = OUTI
   OUTJOB = TRANSLATE(OUTJOB)
   OUTJOB = STRIP(OUTJOB)
     IF FTPRC = 8 THEN
     DO
      INPI = " "
      OUTI = " "
     END
   IF RESP = "PF03" THEN
   DO
     EXIT(0)
   END
/*INP='KGANESA.SNE.HO.JCL'
OUTJOB='NANNA1.JCLOUT'*/
ADDRESS TSO
X=OUTTRAP("RESJOB.")
"LISTDS ('"||INP||"') MEMBERS"
X=OUTTRAP("OFF")
        MSGSTAT=MSG(ON)
        MSGY='FTP PARMS LISTED IN OUTPUT REPORT SUCCESSFULLY'
        MSGO=' CHECK YOUR OUTPUT IN  ' || OUTJOB
        ADDRESS ISPEXEC "SETMSG MSG(ISRZ001 )"
        INPI=" "
        OUTI=" "
END
EXIT