How to copy a member as multiple members in the same pds.
Posted:
Thu Dec 18, 2008 4:39 pm
by shabukumar
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.
Re: How to copy a member as multiple members in the same pds.
Posted:
Thu Dec 18, 2008 8:25 pm
by MrSpock
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
Re: How to copy a member as multiple members in the same pds.
Posted:
Mon Dec 22, 2008 7:45 pm
by MrSpock
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.
Re: How to copy a member as multiple members in the same pds.
Posted:
Mon Dec 22, 2008 8:05 pm
by MrSpock
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