/* REXX */ /* TRACE I */ /* TRACE IS A DEBUGGING COMMAND AND WILL PRODUCE A */ /* LOT OF OUTPUT. IT SHOULD BE COMMENTED OUT WHEN NOT */ /* DEBUGGING. */ /*********************************************************************/ /* AUTHOR OF THIS REXX PROC: FDBPSE PHIL SEVETSON */ /* (C) FISA/CITY OF NEW YORK. AUG 31 2015. */ /*********************************************************************/ /* PROGRAM: PDSCOPY */ /* TASK: */ /* COPY A LIST OF MEMBERS FROM ONE DATASET TO ANOTHER */ /* METHOD: */ /* * CREATE IEBGENER JOB TO COPY MEMBER FROM SOURCE TO */ /* TARGET PDS, ONE JOB FOR EACH MEMBER */ /* * THIS IS USEFUL WHEN GIVEN A LARGE LIST OF MEMBERS TO BE COPIED */ /*********************************************************************/ /* */ /*********************************************************************/ /* ATTENTION! !!!!!!!!!!!!!!!!!!!!!!!! */ /* ATTENTION! !!! READ THIS PART !!! */ /* ATTENTION! !!!!!!!!!!!!!!!!!!!!!!!! */ /* */ /* 1. TO COPY MEMBER NAMES, SET THE FOLLOWING VALUES TO REFLECT THE */ /* DATASETS YOU WISH TO COPY FROM AND TO, AND THE LIST */ /* OF MEMBER NAMES. */ /* 2. REVIEW THE JCL VALUES -- PARAGRAPH 150 CONTAINS THIS LANGUAGE. */ /* 3. NOTE THAT THE IEBGENER JCL DATASET CONTENTS ARE OVERWRITTEN!!! */ /* 4. THIS CODE IS BUILT FOR USE IN A Z/OS ENVIRONMENT AND IS NOT */ /* LIKELY TO BE USEFUL OUTSIDE OF Z/OS */ /* 5. CAN BE EXECUTED IN A TSO SESSION OR RUN IN IKJEFT01 */ /*********************************************************************/ FROM_PDS = 'SOURCE.PDSNAME'; TO_PDS = 'TARGET.PDSNAME'; MEMBER_LIST = 'MEMBERS.SEQUENTIAL.DATA'; IEBGENER_JCLDS = 'OUTPUT.JCL.DATA'; GENER_JOBNAME = 'JOBNAME'; /***************************************************/ 000_CONTROL: /***************************************************/ CALL 110_INITIALIZE ; CALL 120_READ_LIST_OF_MEMBERS ; CALL 140_PROCESS_MEMBER_LIST ; CALL 240_WRITE_IEBGENER_OUT_DATASET ; SAY "PROGRAM" PGMNAME "COMPLETE."; SAY "MULTIPLE-JOB IEBGENER JCL TO COPY MEMBERS ", "NEEDS TO BE SUBMITTED TO COMPLETE THE COPY PROCESS." SAY "THE JCL TO BE SUBMITTED IS IN '"IEBGENER_JCLDS"'". EXIT 0; /***************************************************/ 110_INITIALIZE: /***************************************************/ /* TRACE I; */ PGMNAME = 'PDSCOPY'; SAY "PROGRAM" PGMNAME "COMMENCING."; CALL 115_VALIDATE_ARGUMENTS; IEBGENER_JCL_LINE=0; COPY_MEMBER_LINE = 1; RETURN; /***************************************************/ 115_VALIDATE_ARGUMENTS: /***************************************************/ /* SAY "PARAGRAPH 115 COMMENCING."; */ SAY "IEBGENER JOBNAME = '"GENER_JOBNAME"'"; IF LENGTH(GENER_JOBNAME) > 8 THEN DO; SAY "LENGTH OF JOBNAME IS" LENGTH(GENER_JOBNAME)",", " BUT MUST BE 8 CHARACTERS OR LESS."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; SAY "SOURCE PDS DSNAME = '"FROM_PDS"'"; IF LENGTH("'"FROM_PDS"'") > 44 THEN DO; SAY "LENGTH OF SOURCE PDS DSNAME IS" LENGTH(FROM_PDS)",", " BUT MUST BE 44 CHARACTERS OR LESS."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; IF SYSDSN("'"FROM_PDS"'") <> 'OK' THEN DO; SAY "SOURCE PDS DOES NOT EXIST OR CANNOT BE ACCESSED."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; SAY "TARGET PDS DSNAME = '"TO_PDS"'"; IF LENGTH(TO_PDS) > 44 THEN DO; SAY "LENGTH OF TARGET PDS DSN IS" LENGTH(TO_PDS)",", " BUT MUST BE 44 CHARACTERS OR LESS."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; IF SYSDSN("'"TO_PDS"'") <> 'OK' THEN DO; SAY "TARGET PDS DOES NOT EXIST OR CANNOT BE ACCESSED."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; SAY "MEMBER LIST SEQ DSNAME = '"MEMBER_LIST"'"; IF LENGTH(MEMBER_LIST) > 44 THEN DO; SAY "LENGTH OF MEMBER_LIST DSN IS" LENGTH(MEMBER_LIST)",", " BUT MUST BE 44 CHARACTERS OR LESS."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; IF SYSDSN("'"MEMBER_LIST"'") <> 'OK' THEN DO; SAY "MEMBER LIST DS DOES NOT EXIST OR CANNOT BE ACCESSED."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; SAY "IEBGENER JCL SEQ DSNAME = '" || IEBGENER_JCLDS || "'"; IF LENGTH(IEBGENER_JCLDS) > 44 THEN DO; SAY "LENGTH OF IEBGENER_JCLDS DSN IS" LENGTH(IEBGENER_JCLDS)",", " BUT MUST BE 44 CHARACTERS OR LESS."; SAY PGMNAME "ABENDING. PLEASE FIX THIS ERROR BEFORE RESUBMITTING."; EXIT 12; END; IF SYSDSN("'"IEBGENER_JCLDS"'") <> 'OK' THEN DO; SAY "IEBGENER JCL DS DOES NOT EXIST OR CANNOT BE ACCESSED."; SAY "ALLOCATING THE JCL DS AS NAME" IEBGENER_JCLDS "."; "ALLOCATE DSNAME('"IEBGENER_JCLDS"') DDNAME(MEMBERFI) ", "CATALOG SPACE(10 10) CYLINDERS UNIT(DISK) LRECL(80) ", "BLKSIZE(27920) RECFM(F,B) DSORG(PS)"; "FREE DDNAME(MEMBERFI)"; IF RC <> 0 THEN DO; SAY "IEBGENER JCL DS ALLOC FAILED."; SAY PGMNAME "ABENDING. PLEASE CREATE THE JCL DATASET BEFORE ", "RESUBMITTING."; EXIT 12; END; END; RETURN; /***************************************************/ 120_READ_LIST_OF_MEMBERS: /***************************************************/ /* SAY "PARAGRAPH 120 COMMENCING."; */ /* READ DATASET CONTAINING LIST OF MEMBERS TO BE COPIED */ "ALLOC DATASET('"MEMBER_LIST"') DD(MEMBERFI) OLD"; IF RC <> 0 THEN DO; SAY "ALLOC OF MEMBER_LIST DATASET" MEMBER_LIST, " RETURNED A NONZERO CODE RC=" RC; SAY "ABORTING THIS EXECUTION OF" PGMNAME"." EXIT 12; END; "EXECIO * DISKR MEMBERFI (FINIS STEM COPY_MEMBER." IF RC <> 0 THEN DO; SAY "READ OF MEMBER_LIST DATASET" MEMBER_LIST, " RETURNED A NONZERO CODE RC=" RC; SAY "ABORTING THIS EXECUTION OF" PGMNAME"." EXIT 12; "FREE DD(MEMBERFI)" END; "FREE DD(MEMBERFI)" SAY COPY_MEMBER.0 "MEMBERS WILL BE COPIED FROM:"; SAY " " FROM_PDS; SAY "TO"; SAY " " TO_PDS; RETURN; /***************************************************/ 140_PROCESS_MEMBER_LIST: /***************************************************/ /* SAY "PARAGRAPH 140 COMMENCING."; */ DO WHILE (COPY_MEMBER_LINE <= COPY_MEMBER.0); PARSE VAR COPY_MEMBER.COPY_MEMBER_LINE CURRENT_MEMBER .; CALL 150_WRITE_IEBGENER_JOB; COPY_MEMBER_LINE = COPY_MEMBER_LINE + 1; END; RETURN; /***************************************************/ 150_WRITE_IEBGENER_JOB: /***************************************************/ IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//"GENER_JOBNAME "JOB ,'IEBGENER PDS COPY',", || "CLASS=X,MSGCLASS=X,"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "// REGION=4M,TIME=1440,MSGLEVEL=(1,1)"; /* "// NOTIFY=&SYSUID,REGION=4M,TIME=1440,MSGLEVEL=(1,1)"; */ IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "/*JOBPARM SYSAFF=LPAR,LINES=9999"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//STEP1 EXEC PGM=IEBGENER"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//SYSPRINT DD SYSOUT=*"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//SYSIN DD DUMMY"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//SYSUT1 DD DISP=SHR,DSN=" ||, FROM_PDS || "(" || CURRENT_MEMBER || ")"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//SYSUT2 DD DISP=SHR,DSN=" ||, TO_PDS || "(" || CURRENT_MEMBER || ")"; IEBGENER_JCL_LINE = IEBGENER_JCL_LINE + 1; IEBGENER_JCL.IEBGENER_JCL_LINE = , "//"; RETURN; IEBGENER_JCLDS = 'FDBPSE.IEBGENER.JCLDS.RM343404'; /*********************************************************************/ 240_WRITE_IEBGENER_OUT_DATASET: /*********************************************************************/ /* SAY "PARAGRAPH 240 COMMENCING."; */ "ALLOC DATASET('"IEBGENER_JCLDS"') DD(IEBGNRFI) OLD"; "EXECIO * DISKW IEBGNRFI (FINIS STEM IEBGENER_JCL." "FREE DD(IEBGNRFI)" SAY "JCL WRITTEN IN '" || IEBGENER_JCLDS || "'"; SAY " TO COPY SELECTED MEMBERS.", " (ONE BATCH IEBGENER JOB PER MEMBER)"; SAY "THE FILE CONTAINS JCL TO COPY THE" COPY_MEMBER.0, " SELECTED MEMBERS."; SAY "A TOTAL OF" IEBGENER_JCL_LINE "LINES OF JCL WERE WRITTEN."; RETURN; /*********************************************************************/ /* END OF REXX EXEC */ EXIT /*********************************************************************/