expat
Global Moderator
Joined: 14 Mar 2007 Posts: 8797 Location: Welsh Wales
|
|
|
|
This is an old REXX for extracting some VSAM information using CSI. If you want to add more fields then you will have to refer to the manual below for field names and also change the code accordingly.
Click HERE to see the manual for using CSI. Appendix C.
You may also want to investigate DCOLLECT records as a source of information instead.
This was created for batch execution with CATIN DD * supplying the VSAM clusters to be interrogated. It Accepts full * ** % and %% filtering capabilities for CATIN.
Good luck ......................
Code: |
/* REXX ** RETURNS VSAM INFO, HARBA, HURBA, PHYRECSZ, RECS/TRK */
NUMERIC DIGITS(30)
"EXECIO * DISKR CATIN ( STEM CAT. FINIS"
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 = 'C '
CSICLDI = SUBSTR('Y',1,1)
CSIRESUM = SUBSTR(' ',1,1)
CSIS1CAT = SUBSTR(' ',1,1)
CSIRESRV = SUBSTR(' ',1,1)
CSINUMEN = '0005'X
CSIFLD1 = 'VOLSER '
CSIFLD2 = 'HARBADS '
CSIFLD3 = 'HURBADS '
CSIFLD4 = 'PHYBLKSZ'
CSIFLD5 = 'NOBLKTRK'
CSIOPTS = CSICLDI || CSIRESUM || CSIS1CAT || CSIRESRV
CSIFIELD = CSIFILTK || CSICATNM || CSIRESNM || CSIDTYPS || CSIOPTS
CSIFIELD = CSIFIELD || CSINUMEN || CSIFLD1 || CSIFLD2 || CSIFLD3
CSIFIELD = CSIFIELD || CSIFLD4 || CSIFLD5
WORKLEN = 65536
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
SAY 'CATALOG ' CATNAME
SAY ' '
CATNAMET = CATNAME
END
POS1 = POS1 + 50
END
DNAME = SUBSTR(DWORK,POS1+2,44) /* GET ENTRY NAME */
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+14
DO I=1 TO 3
VOLSER.I = SUBSTR(' ',1,6)
END
DO I = 1 TO NUMVOL
VOLSER.I = SUBSTR(DWORK,POS2,6)
POS2 = POS2 + 6
END
DSHARBA = X2D(C2X(SUBSTR(DWORK,POS2,4)))
DSHARBA = RIGHT(DSHARBA,15)
POS2 = POS2 + 4
DSHURBA = X2D(C2X(SUBSTR(DWORK,POS2,4)))
DSHURBA = RIGHT(DSHURBA,15)
POS2 = POS2 + 4
DSBLKSZ = X2D(C2X(SUBSTR(DWORK,POS2,4)))
DSBLKSZ = RIGHT(DSBLKSZ,6)
POS2 = POS2 + 4
IF NUMVOL > 1 THEN DO
DO J = 2 TO NUMVOL
POS2 = POS2 + 4
END
END
BLKTRK = X2D(C2X(SUBSTR(DWORK,POS2,2)))
BLKTRK = RIGHT(BLKTRK,6)
IF DNAMET ^= DNAME THEN
DO
IF DTYPE = 'DATA ' THEN DO
SAY DTYPE DNAME VOLSER.1 VOLSER.2 DSHARBA DSHURBA DSBLKSZ BLKTRK
END
IF DTYPE = 'INDEX ' THEN DO
SAY DTYPE DNAME VOLSER.1 VOLSER.2 DSHARBA DSHURBA DSBLKSZ BLKTRK
END
DNAMET=DNAME
END
POS1 = POS1 + C2D(SUBSTR(DWORK,POS1,2))
END
END
END
|
|
|