How to copy a member as multiple members in the same pds.



JES, JES2, JCL utilities, IDCAMS, Compile & Run JCLs, PROCs etc...

How to copy a member as multiple members in the same pds.

Postby shabukumar » Thu Dec 18, 2008 4:39 pm

My pds a.b.c contains only one member named a1.

I have to copy a1 to a2, a3,......a100 in the same pds so that my pds a.b.c should contain 100 members (a1,a2,a3,....a100) after this.

Using IEBCOPY or IEBUPDTE we can have only one input dataset and only one output dataset.

Please send me the code in this regard at the earliest.
Warm Regards
Shabukumar
Mainframe Trainer
What you learnt new in mainframe
shabukumar
 
Posts: 27
Joined: Thu Dec 18, 2008 4:15 pm
Has thanked: 0 time
Been thanked: 0 time

Re: How to copy a member as multiple members in the same pds.

 

Re: How to copy a member as multiple members in the same pds.

Postby MrSpock » Thu Dec 18, 2008 7:21 pm

IEBUPDTE method:

//STEP0001 EXEC PGM=IEBUPDTE,PARM=NEW
//SYSPRINT DD   SYSOUT=*
//SYSUT2   DD   DSN=MY.PDS,DISP=SHR
//SYSIN    DD   DATA,DLM=@@
./ ADD NAME=A2
@@
//         DD   DSN=MY.PDS(A1),DISP=SHR
//         DD   DATA,DLM=@@
./ ADD NAME=A3
@@
//         DD   DSN=MY.PDS(A1),DISP=SHR
...
//         DD   DATA,DLM=@@
./ ADD NAME=A100
@@
//         DD   DSN=MY.PDS(A1),DISP=SHR
//*
User avatar
MrSpock
Global moderator
 
Posts: 810
Joined: Wed Jun 06, 2007 9:37 pm
Location: Raleigh NC USA
Has thanked: 0 time
Been thanked: 2 times

Re: How to copy a member as multiple members in the same pds.

Postby MrSpock » Thu Dec 18, 2008 7:43 pm

A DFSORT/ICETOOL method:

//STEP0001 EXEC PGM=ICETOOL
//PDSI     DD   DISP=SHR,DSN=MY.PDS(A1)
//PDSO002  DD   DISP=SHR,DSN=MY.PDS(A2)
//PDSO003  DD   DISP=SHR,DSN=MY.PDS(A3)
...
//PDSO100  DD   DISP=SHR,DSN=MY.PDS(A100)
//DFSMSG   DD   SYSOUT=*
//TOOLMSG  DD   SYSOUT=*
//TOOLIN   DD   *
  COPY FROM(PDSI) TO(PDSO002)
  COPY FROM(PDSI) TO(PDSO003)
...
  COPY FROM(PDSI) TO(PDSO100)
/*
//*
User avatar
MrSpock
Global moderator
 
Posts: 810
Joined: Wed Jun 06, 2007 9:37 pm
Location: Raleigh NC USA
Has thanked: 0 time
Been thanked: 2 times

Re: How to copy a member as multiple members in the same pds.

Postby MrSpock » Thu Dec 18, 2008 8:25 pm

A simple TSO/E REXX method:

/* REXX */
/* Build multiple PDS members from a single source member */
pds = "MY.PDS"
member = "A1"
/* Store the contents of the original member into a stem variable */
"ALLOC F(thepds) DA('"pds"("member")') SHR REU"
"EXECIO * DISKR thepds (STEM in. FINIS"
/* Create the Loop */
Do loop = 2 To 100
  new_member = "A"loop
  "ALLOC F(thepds) DA('"pds"("new_member")') SHR REU"
  "EXECIO * DISKW thepds (STEM in. FINIS"
End
"FREE F(thepds)"
Exit 0
User avatar
MrSpock
Global moderator
 
Posts: 810
Joined: Wed Jun 06, 2007 9:37 pm
Location: Raleigh NC USA
Has thanked: 0 time
Been thanked: 2 times

Re: How to copy a member as multiple members in the same pds.

Postby MrSpock » Mon Dec 22, 2008 7:45 pm

A simple method using ISPF Library Management (LM) Services:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. XXXXXXXX.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.

       DATA DIVISION.
       FILE SECTION.

       WORKING-STORAGE SECTION.
      ******************************************************************
      ** WORKING-STORAGE SECTION                                      **
      ******************************************************************
       77  ISPF-SERVICE            PIC X(8)           VALUE SPACES.
       77  ISPF-DATA-ID            PIC X(8)           VALUE SPACES.
       77  ISPF-PROJECT            PIC X(8)           VALUE SPACES.
       77  ISPF-GROUP1             PIC X(8)           VALUE SPACES.
       77  ISPF-GROUP2             PIC X(8)           VALUE SPACES.
       77  ISPF-GROUP3             PIC X(8)           VALUE SPACES.
       77  ISPF-GROUP4             PIC X(8)           VALUE SPACES.
       77  ISPF-TYPE               PIC X(8)           VALUE SPACES.
       77  ISPF-DSNAME             PIC X(50)          VALUE SPACES.
       77  ISPF-DDNAME             PIC X(8)           VALUE SPACES.
       77  ISPF-SERIAL             PIC X(6)           VALUE SPACES.
       77  ISPF-PSWD-VALUE         PIC X(8)           VALUE SPACES.
       77  ISPF-ENQ-VAR            PIC X(8)           VALUE SPACES.
       77  ISPF-ORG-VAR            PIC X(8)           VALUE SPACES.
       77  ISPF-OPTIONS            PIC X(34)          VALUE SPACES.
       77  ISPF-OPTION1            PIC X(8)           VALUE SPACES.
       77  ISPF-OPTION2            PIC X(8)           VALUE SPACES.
       77  ISPF-OPTION3            PIC X(8)           VALUE SPACES.
       77  ISPF-OPTION4            PIC X(8)           VALUE SPACES.
       77  ISPF-OPTION5            PIC X(8)           VALUE SPACES.
       77  ISPF-DATA-LENVAR        PIC X(8)           VALUE SPACES.
       77  ISPF-RECFORM            PIC X(8)           VALUE SPACES.
       77  ISPF-MEMBER-NAME        PIC X(8)           VALUE SPACES.
       77  ISPF-LOCK-OPT           PIC X(8)           VALUE SPACES.
       77  ISPF-DATA-LOCVAR        PIC X(8)           VALUE SPACES.
       77  ISPF-MAX-LEN            PIC 9(6)      COMP VALUE ZEROES.
       77  ISPF-UDATA-VALUE        PIC X(8)           VALUE SPACES.
       77  ISPF-OPTION-LIST        PIC X(21)          VALUE SPACES.
       77  ISPF-LENGTH             PIC 9(6)      COMP VALUE ZEROES.

       01  VARLIST.
           03  VMEMB               PIC X(08) VALUE SPACES.
           03  VMYPDS              PIC X(08) VALUE SPACES.
           03  LOCVAR              PIC X(08) VALUE SPACES.
       01  NVMEMB                  PIC X(7) VALUE '(VMEMB)'.
       01  NVMYPDS                 PIC X(8) VALUE '(VMYPDS)'.
       01  NLOCVAR                 PIC X(8) VALUE '(LOCVAR)'.
       01  VDEFINE                 PIC X(8) VALUE 'VDEFINE'.
       01  VPUT                    PIC X(8) VALUE 'VPUT   '.
       01  SHARED                  PIC X(8) VALUE 'SHARED '.
       01  CHAR                    PIC X(8) VALUE 'CHAR   '.
       01  L8                      PIC 9(6) VALUE 8  COMP.
       01  L80                     PIC 9(6) VALUE 80 COMP.
       01  PDS-RECORD              PIC 9(5) VALUE ZEROES.
       01  MAX-RECORD              PIC 9(5) VALUE ZEROES.
       01  FILLER.
           05  PDS-DATA OCCURS 99999 TIMES PIC X(80).
       01  MEMBER-COUNT            PIC 9(3) VALUE ZEROES.

       PROCEDURE DIVISION.
           CALL 'ISPLINK' USING VDEFINE NVMEMB VMEMB CHAR L8.
           DISPLAY 'VDEFINE=' RETURN-CODE.
           CALL 'ISPLINK' USING VDEFINE NVMYPDS VMYPDS CHAR L8.
           DISPLAY 'VDEFINE=' RETURN-CODE.
           CALL 'ISPLINK' USING VDEFINE NLOCVAR LOCVAR CHAR L80.
           DISPLAY 'VDEFINE=' RETURN-CODE.
           MOVE 'LMINIT  ' TO ISPF-SERVICE.
           MOVE 'VMYPDS  ' TO ISPF-DATA-ID.
           MOVE '        ' TO ISPF-PROJECT.
           MOVE '        ' TO ISPF-GROUP1.
           MOVE '        ' TO ISPF-GROUP2.
           MOVE '        ' TO ISPF-GROUP3.
           MOVE '        ' TO ISPF-GROUP4.
           MOVE '        ' TO ISPF-TYPE.
           MOVE '                                                  '
      -         TO ISPF-DSNAME.
           MOVE 'PDS     ' TO ISPF-DDNAME.
           MOVE '      '   TO ISPF-SERIAL.
           MOVE '        ' TO ISPF-PSWD-VALUE.
           MOVE 'SHRW    ' TO ISPF-ENQ-VAR.
           MOVE '        ' TO ISPF-ORG-VAR.
           CALL 'ISPLINK' USING  ISPF-SERVICE     ISPF-DATA-ID
                                 ISPF-PROJECT     ISPF-GROUP1
                                 ISPF-GROUP2      ISPF-GROUP3
                                 ISPF-GROUP4      ISPF-TYPE
                                 ISPF-DSNAME      ISPF-DDNAME
                                 ISPF-SERIAL      ISPF-PSWD-VALUE
                                 ISPF-ENQ-VAR     ISPF-ORG-VAR.
           DISPLAY 'LMINIT RC=' RETURN-CODE.
           MOVE 'LMOPEN  ' TO ISPF-SERVICE.
           MOVE VMYPDS     TO ISPF-DATA-ID.
           MOVE 'INPUT   ' TO ISPF-OPTION1.
           MOVE SPACES     TO ISPF-DATA-LENVAR.
           MOVE SPACES     TO ISPF-RECFORM.
           MOVE SPACES     TO ISPF-ORG-VAR.
           CALL 'ISPLINK' USING ISPF-SERVICE ISPF-DATA-ID
                                ISPF-OPTION1 ISPF-DATA-LENVAR
                                ISPF-RECFORM ISPF-ORG-VAR.
           DISPLAY 'LMOPEN:' RETURN-CODE.
           MOVE 'LMMFIND ' TO ISPF-SERVICE.
           MOVE 'A1      ' TO ISPF-MEMBER-NAME.
           MOVE '        ' TO ISPF-LOCK-OPT.
           MOVE '        ' TO ISPF-DATA-LENVAR.
           MOVE '        ' TO ISPF-RECFORM.
           MOVE '        ' TO ISPF-GROUP1.
           MOVE 'NO      ' TO ISPF-OPTION1.
           CALL 'ISPLINK' USING  ISPF-SERVICE       ISPF-DATA-ID
                                 ISPF-MEMBER-NAME   ISPF-LOCK-OPT
                                 ISPF-DATA-LENVAR   ISPF-RECFORM
                                 ISPF-GROUP1        ISPF-OPTION1.
           DISPLAY 'LMMFIND:' RETURN-CODE.
           IF RETURN-CODE = 0
             PERFORM P100-GET-RECORDS THRU P100-EXIT.
           MOVE 'LMCLOSE ' TO ISPF-SERVICE.
           MOVE VMYPDS     TO ISPF-DATA-ID.
           CALL 'ISPLINK' USING ISPF-SERVICE ISPF-DATA-ID.
           DISPLAY 'LMCLOSE:' RETURN-CODE.
           MOVE 'LMOPEN  ' TO ISPF-SERVICE.
           MOVE VMYPDS     TO ISPF-DATA-ID.
           MOVE 'OUTPUT  ' TO ISPF-OPTION1.
           MOVE SPACES     TO ISPF-DATA-LENVAR.
           MOVE SPACES     TO ISPF-RECFORM.
           MOVE SPACES     TO ISPF-ORG-VAR.
           CALL 'ISPLINK' USING ISPF-SERVICE ISPF-DATA-ID
                                ISPF-OPTION1 ISPF-DATA-LENVAR
                                ISPF-RECFORM ISPF-ORG-VAR.
           DISPLAY 'LMOPEN:' RETURN-CODE.
           PERFORM P200-ADD-MEMBER
             VARYING MEMBER-COUNT FROM 2 BY 1
               UNTIL MEMBER-COUNT = 100.

           MOVE 'LMFREE  ' TO ISPF-SERVICE.
           CALL 'ISPLINK' USING  ISPF-SERVICE  ISPF-DATA-ID.
           DISPLAY 'LMFREE:' RETURN-CODE.
           MOVE 0 TO RETURN-CODE.
           STOP RUN.

       P100-GET-RECORDS.
           MOVE 'LMGET   ' TO ISPF-SERVICE.
           MOVE 'INVAR   ' TO ISPF-OPTION1.
           MOVE 'LOCVAR  ' TO ISPF-DATA-LOCVAR.
           MOVE 'LENVAR  ' TO ISPF-DATA-LENVAR.
           MOVE 80         TO ISPF-MAX-LEN.
           CALL 'ISPLINK' USING  ISPF-SERVICE      ISPF-DATA-ID
                                 ISPF-OPTION1      ISPF-DATA-LOCVAR
                                 ISPF-DATA-LENVAR  ISPF-MAX-LEN.
           DISPLAY 'LMGET RC=' RETURN-CODE.
           IF RETURN-CODE > 0
             GO TO P100-EXIT
           ELSE
             ADD 1 TO PDS-RECORD
             ADD 1 TO MAX-RECORD
             MOVE LOCVAR TO PDS-DATA(PDS-RECORD)
             GO TO P100-GET-RECORDS.
       P100-EXIT.
           EXIT.

       P200-ADD-MEMBER.
           STRING 'A'
                  MEMBER-COUNT
                  DELIMITED BY SIZE
                  INTO ISPF-MEMBER-NAME.
           DISPLAY ISPF-MEMBER-NAME.
           PERFORM P300-PUT-RECORDS
             VARYING PDS-RECORD FROM 1 BY 1
               UNTIL PDS-RECORD = MAX-RECORD.
           MOVE 'LMMADD  ' TO ISPF-SERVICE.
           MOVE 'NO      ' TO ISPF-OPTION1.
           MOVE 'NOENQ   ' TO ISPF-OPTION2.
           CALL 'ISPLINK' USING  ISPF-SERVICE       ISPF-DATA-ID
                                 ISPF-MEMBER-NAME   ISPF-OPTION1
                                 ISPF-OPTION2.
           DISPLAY 'LMMADD RC=' RETURN-CODE.
       P200-EXIT.
           EXIT.

       P300-PUT-RECORDS.
           MOVE PDS-DATA(PDS-RECORD) TO LOCVAR.
           MOVE 'LMPUT   ' TO ISPF-SERVICE.
           MOVE 'INVAR   ' TO ISPF-OPTION1.
           MOVE 'LOCVAR  ' TO ISPF-DATA-LOCVAR.
           MOVE 80         TO ISPF-LENGTH.
           MOVE '        ' TO ISPF-OPTION2.
           MOVE 'NOBSCAN ' TO ISPF-OPTION3.
           CALL 'ISPLINK' USING  ISPF-SERVICE     ISPF-DATA-ID
                                 ISPF-OPTION1     ISPF-DATA-LOCVAR
                                 ISPF-LENGTH      ISPF-OPTION2
                                 ISPF-OPTION3.
           DISPLAY 'LMPUT RC=' RETURN-CODE.
       P300-EXIT.
           EXIT.
User avatar
MrSpock
Global moderator
 
Posts: 810
Joined: Wed Jun 06, 2007 9:37 pm
Location: Raleigh NC USA
Has thanked: 0 time
Been thanked: 2 times

Re: How to copy a member as multiple members in the same pds.

Postby MrSpock » Mon Dec 22, 2008 8:05 pm

Done as an ISPF EDIT Macros written in REXX (my favorite method):

Calling Macro
/* REXX */                                                       
"ISREDIT MACRO"                                                 
"ISREDIT (currpds) = DATASET"                                   
"ISREDIT CUT .zf .zl"                                           
Do loop = 2 To 100                                               
  member = "A"loop                                               
  "ISPEXEC EDIT DATASET('"currpds"("member")') MACRO(MYMACRO)" 
End                                                             
Exit 0                                                           


MYMACRO
/* REXX */                             
"ISREDIT MACRO"                       
"ISREDIT PASTE AFTER .zf KEEP"         
"ISREDIT END"                         
Exit 0                                 
User avatar
MrSpock
Global moderator
 
Posts: 810
Joined: Wed Jun 06, 2007 9:37 pm
Location: Raleigh NC USA
Has thanked: 0 time
Been thanked: 2 times


Return to JCL

 


  • Related topics
    Replies
    Views
    Last post