Joined: 14 Mar 2007 Posts: 8797 Location: Welsh Wales
OK, so I just had a similar need to copy about 400 files and to add a new qualifier into the existing dataset names. Well, Dfdss is great for copying but not so much fun for renames. And me being me, after creating and editing a dataset list from oldname to newname decided to REXX it up a little. This will build the complete SYSIN dataset for processing a DFdss COPY and RENAME step.
I am running this in an ISPF environment in batch, followed by the DFdss step, and of course I don't need to tell anyone on the forum that this has been discussed zillions of times and that a simple search will find exactly what you are looking for to be able to do this.
OK, first the JCL. Both the INCLUDE and EXCLUDE statements support full use of wildcards for filtering, so yes, you can use the * and % any way that you want to. Do I really need to explain the use of these two DD statements.
CHANGES DD - A few of options here
as shown *NONE* .TESTCOPY will not change anything except to append .TESTCOPY to the end of any existing dataset names found as a result from the INCLUDE / EXCLUDE statement proceeing. The code works around any little problems like VSAM component names and GDS datasets, so no need to worry there.
If you need to do other changes rather than append a new qualifier, you can use the CHANGES DD statements to do this for you. Just change the *NONE* into two fields "Change from" "Change to". These will be used in an ISPF edit macro to make the desired changes to the DFdss COPY rename statements.
You can combine the two together and for example change the HLQ of the new datasets AND append a new LLQ. Example below. You are not limited to only one change statement, use as many as you like.
"EXECIO * DISKR CHANGES ( STEM CHG. FINIS"
IF CHGS.0 = 0 THEN EXIT
"EXECIO * DISKR WORK02 ( STEM DSNS. FINIS"
IF DSNS.0 = 0 THEN DO
SAY "NO DATASETS SELECTED FOR PROCESSING - STEP TERMINATES RC 04"
SAY "NO DATASETS SELECTED FOR PROCESSING - STEP TERMINATES RC 04"
SAY "NO DATASETS SELECTED FOR PROCESSING - STEP TERMINATES RC 04"
ZISPFRC = 4
"ISPEXEC VPUT (ZISPFRC) SHARED"
EXIT
END
DSI = LISTDSI(WORK02 FILE)
DO A = 1 TO CHG.0
IF WORD(CHG.A,1) = "*NONE*"
THEN PARSE VAR CHG.A PFXO ADDON
ELSE PARSE VAR CHG.A PFXO PFXN ADDON
IF PFXO = "*NONE*"
THEN PFXN = PFXO
PFXO = STRIP(PFXO)
PFXN = STRIP(PFXN)
ADDON = STRIP(ADDON)
IF SUBSTR(ADDON,1,1) <> '.'
THEN ADDON = '.'ADDON
"ISPEXEC VPUT (PFXO PFXN ADDON) SHARED"
"ISPEXEC EDIT DATASET('"STRIP(SYSDSNAME)"') VOLUME("SYSVOLUME")
MACRO(CSIDFSMM)"
END
"EXECIO * DISKR WORK02 ( STEM DSN2. FINIS"
"FREE FI(WORK01,WORK02)"
QUEUE OVERLAY('COPY DATASET(INCLUDE(',CARD,2)
DO AA = 1 TO INS.0
INS.AA = STRIP(INS.AA)
IF AA = INS.0
THEN INS.AA = INS.AA')'
QUEUE OVERLAY(INS.AA,CARD,24)
END
IF CAT.0 > 0 THEN DO AA = 1 TO CAT.0
POS = 24
CAT.AA = STRIP(CAT.AA)
IF AA = 1 THEN DO
POS = 16
CAT.AA = 'EXCLUDE('CAT.AA
END
IF AA = CAT.0
THEN CAT.AA = CAT.AA')'
QUEUE OVERLAY(CAT.AA,CARD,POS)
END
QUEUE OVERLAY(')',CARD,24)
QUEUE OVERLAY('RENAMEUNCONDITIONAL(',CARD,16)
DO AA = 1 TO DSNS.0
DTYPE = SUBSTR(DSNS.AA,2,8)
DSNS.AA = STRIP(SUBSTR(DSNS.AA,11))
DSN2.AA = STRIP(SUBSTR(DSN2.AA,11))
IF DTYPE = "GDS" | DTYPE = "AIX" | DTYPE = "PATH" THEN DO
REVGDS = REVERSE(DSN2.AA)
POS1 = POS('.',REVGDS)
NNAME = SUBSTR(REVGDS,1,POS1)
REVGDS = SUBSTR(REVGDS,POS1+1)
POS1 = POS('.',REVGDS)
GNAME = SUBSTR(REVGDS,1,POS1)
REVGDS = SUBSTR(REVGDS,POS1+1)
DSN2.AA = REVERSE(REVGDS)||REVERSE(NNAME)||REVERSE(GNAME)
END
IF POS('..',DSN2.AA) > 0 THEN DO
PART1 = SUBSTR(DSN2.AA,1,POS('..',DSN2.AA))
PART2 = SUBSTR(DSN2.AA,POS('..',DSN2.AA)+2)
DSN2.AA = PART1||PART2
END
IF RIGHT(DSN2.AA,1) = '.'
THEN DSN2.AA = SUBSTR(DSN2.AA,1,LENGTH(DSN2.AA)-1)
QUEUE OVERLAY('('DSNS.AA',',CARD,16)
QUEUE OVERLAY(DSN2.AA')',CARD,24)
END
QUEUE OVERLAY(')',CARD,16)
QUEUE OVERLAY('REPLACEUNCONDITIONAL CATALOG TOL(ENQF)',CARD,16)
QUEUE OVERLAY('TGTGDS(ACTIVE)',CARD,16)
QUEUE OVERLAY('ALLDATA(*) ALLEXCP SPHERE 'COPIES(' ',60),CARD,16)
"EXECIO "QUEUED()" DISKW WORKOUT ( FINIS"
EXIT
/*-------------------------------------------------------------------*/
CSIUTIL:
DO KCNT = 1 TO CAT.0
KEY = SUBSTR(CAT.KCNT,1,44)
MODRSNRC = SUBSTR(' ',1,4)
CSIFILTK = SUBSTR(KEY,1,44)
CSICATNM = SUBSTR(' ',1,44)
CSIRESNM = SUBSTR(' ',1,44)
CSIDTYPS = SUBSTR(' ',1,16)
CSICLDI = SUBSTR('Y',1,1)
CSIRESUM = SUBSTR(' ',1,1)
CSIS1CAT = SUBSTR(' ',1,1)
CSIRESRV = SUBSTR(' ',1,1)
CSINUMEN = '0002'X
CSIFLD1 = 'VOLSER '
CSIFLD2 = 'DEVTYP '
CSIOPTS = CSICLDI || CSIRESUM || CSIS1CAT || CSIRESRV
CSIFIELD = CSIFILTK || CSICATNM || CSIRESNM || CSIDTYPS || CSIOPTS
CSIFIELD = CSIFIELD || CSINUMEN || CSIFLD1 || CSIFLD2
WORKLEN = 4096
DWORK = '00001000'X || COPIES('00'X,WORKLEN-4)
RESUME = 'Y'
CATNAMET = SUBSTR(' ',1,44)
DNAMET = SUBSTR(' ',1,44)
DO WHILE RESUME = 'Y'
ADDRESS LINKPGM 'IGGCSI00 MODRSNRC CSIFIELD DWORK'
RESUME = SUBSTR(CSIFIELD,150,1)
USEDLEN = C2D(SUBSTR(DWORK,9,4))
POS1=15
DO WHILE POS1 < USEDLEN
IF SUBSTR(DWORK,POS1+1,1) = '0'
THEN DO
CATNAME=SUBSTR(DWORK,POS1+2,44)
IF CATNAME <> CATNAMET THEN
DO
CATNAMET = CATNAME
END
POS1 = POS1 + 50
END
DNAME = SUBSTR(DWORK,POS1+2,44)
IF SUBSTR(DWORK,POS1+1,1) = 'C' THEN DTYPE = 'CLUSTER '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'D' THEN DTYPE = 'DATA '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'I' THEN DTYPE = 'INDEX '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'A' THEN DTYPE = 'NONVSAM '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'H' THEN DTYPE = 'GDS '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'B' THEN DTYPE = 'GDG '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'R' THEN DTYPE = 'PATH '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'G' THEN DTYPE = 'AIX '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'X' THEN DTYPE = 'ALIAS '
ELSE IF SUBSTR(DWORK,POS1+1,1) = 'U' THEN DTYPE = 'UCAT '
ELSE DTYPE = ' '
POS1 = POS1 + 46
NUMVOL = C2D(SUBSTR(DWORK,POS1+4,2))/6
POS2 = POS1+8
VOLSER. = ""
DO I = 1 TO NUMVOL
VOLSER.I = SUBSTR(DWORK,POS2,6)
POS2 = POS2 + 6
END
VOLSER.0 = NUMVOL
DEVTY1 = SUBSTR(DWORK,POS2,4)
DEVTY2 = C2X(SUBSTR(DWORK,POS2,4))
IF SUBSTR(DEVTY2,5,2) = '20' THEN DELDEV = 'DASD'
ELSE
IF SUBSTR(DEVTY2,5,2) = '80' THEN DELDEV = 'TAPE'
ELSE
DELDEV = 'XXXX'
IF DNAMET <> DNAME THEN
DO
DNAMET=DNAME
IF LEFT(VOLSER.1,6) <> "MIGRAT" & DELDEV = "DASD" THEN DO
DNAMX = ' 'DTYPE DNAME
PUSH DNAMX
"EXECIO 1 DISKW WORK01"
END
IF POS(STRIP(DTYPE),VSAMLST) > 0 THEN DO
DNAMX = ' 'DTYPE DNAME
PUSH DNAMX
"EXECIO 1 DISKW WORK01"
END
END
POS1 = POS1 + C2D(SUBSTR(DWORK,POS1,2))
END
END
END
RETURN
/*-------------------------------------------------------------------*/
ERR:
SIGNAL OFF SYNTAX
DROPBUF
SAY "ERROR ROUTINE STARTING"
SAY " "
SAY RIGHT(SIGL,6) ">>>" SOURCELINE(SIGL)
SAY " "
TRACE I
INTERPRET SOURCELINE(SIGL)
And finally the ISPF edit macro
Code:
/* REXX *** SOURCE CSIRENAM *** BUILD RENAME CARDS FOR DFDSS COPY */
"ISREDIT MACRO"
"ISPEXEC VGET (PFXO PFXN ADDON) SHARED"
"ISREDIT X ALL"
"ISREDIT F '"PFXO"' ALL"
"ISREDIT X '~' 1 ALL"
"ISREDIT (STR,LIN) = FIND_COUNTS"
"ISREDIT C '"PFXO"' '"PFXN"' NX ALL"
"ISREDIT C ' ' '~' 1 NX ALL"
"ISREDIT SAVE"
IF LIN > 0 THEN DO
"ISREDIT C ' ' '"ADDON"' 60 NX ALL"
"ISREDIT C ' ' '' 11 60 NX ALL"
"ISREDIT C ' ' '~' 1 NX ALL"
END
IF PFXO = '*NONE*' THEN DO
"ISREDIT RESET"
"ISREDIT X '~' 1 ALL"
"ISREDIT C ' ' '"ADDON"' 60 NX ALL"
"ISREDIT C ' ' '' 11 60 NX ALL"
"ISREDIT C ' ' '~' 1 NX ALL"
END
"ISREDIT END"
Joined: 14 Mar 2007 Posts: 8797 Location: Welsh Wales
PROBLEM - If a VSAM cluster had more than one AIX associated with it, the naming for .AIX and .PATH changed, and was not catered for. This has now been changed.
I have changed the code for the REXX and the MACRO in my original post rather than put the whole thing up again.