View previous topic :: View next topic
Author
Message
chavinash2004 New User Joined: 30 Jun 2010Posts: 37 Location: hyderabad
I have a requirement that to verify the GDG limit for lot of GDG's. I used to go manually by taking each GDG base and in file-aid i saw the limit. I have nearly 2500 GDG bases. It will take lot of time to check manually. So anybody please explain me is there any UTILITY or any short cut way to check the limit of GDG's.
Back to top
mallik4u New User Joined: 17 Sep 2008Posts: 75 Location: bangalore
Back to top
Kausar.S New User Joined: 01 Oct 2010Posts: 4 Location: Mysore
Yes.you can use LISTCAT thru IDCAMS utility. For example:
//KJCLGDG JOB(T,DN,RDS), 'KAUSAR',CLASS=S,
// MSGCLASS=0,REGION=0M
//************************************************************
//PS010 EXEC PGM=IDCAMS
//************************************************************
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
LISTCAT ENTRIES(B052SKM.NA.XKAUSAR7.STATS) ALL
LISTCAT ENTRIES(B052SKM.NA.XKAUSAR8.STMTEXT) ALL
/*
It will list out all information(Attributes,History etc..)
Hope it helps.
Back to top
Pete Wilson Active Member Joined: 31 Dec 2009Posts: 580 Location: London
You can be a bit more specific with LISTCAT:
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//X DD SYSOUT=*
//SYSIN DD *
LISTC GDG ALL OUTFILE(X) CAT(USERCAT.NAME)
/*
Even better if you have FDREPORT which provides a nice formatted report (run same JCL with XHELP ALL in the sysin to get a printed manual if required):
//GDGBASES EXEC PGM=FDREPORT
//SYSPRINT DD SYSOUT=0
//SYSOUT DD SYSOUT=0
//SYSUDUMP DD SYSOUT=0
//ABRMAP DD SYSOUT=*
//ABRSUM DD SYSOUT=*
//SORTLIB DD DSN=SYS1.SORTLIB,DISP=SHR
//SYSIN DD *
REPORT FIELD=(NAME,GDGLIMIT,GDGFLAGS,GDGENTRY)
XSELECT=HLQ1.**
XSELECT=HLQ2.**
SORT FIELD=(NAME)
SUMM FIELD=(GDGLIMIT)
PRINT SUM=YES,SORT=YES,DATATYPE=CATALOG,RPTYPE=TABLE,
ENABLE=(FASTPATH,GDGBASEONLY,ALLFILTER)
Back to top
Pete Wilson Active Member Joined: 31 Dec 2009Posts: 580 Location: London
Sorry there's a syntax error in the FDREPORT
Should be XSELECT XDSN=HLQ1.** etc
Back to top
chavinash2004 New User Joined: 30 Jun 2010Posts: 37 Location: hyderabad
Kausar.S and Pete Wilson.i got the information.
Back to top
expat Global Moderator Joined: 14 Mar 2007Posts: 8797 Location: Welsh Wales
I would use a REXX here, because it will be quite easy to tailor if you needed to change the LIMIT or other attributes. The code below is list only.
Code:
/* REXX ** INVOKE CSI VIA BATCH REXX PROCESS
GDG DEFINITIONS FROM CATALOG ENTRIES ONLY */
SIGNAL ON SYNTAX NAME ERR
"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 = 'B '
CSICLDI = SUBSTR('Y',1,1)
CSIRESUM = SUBSTR(' ',1,1)
CSIS1CAT = SUBSTR(' ',1,1)
CSIRESRV = SUBSTR(' ',1,1)
CSINUMEN = '0003'X
CSIFLD1 = 'VOLSER '
CSIFLD2 = 'GDGLIMIT'
CSIFLD3 = 'GDGATTR '
CSIOPTS = CSICLDI || CSIRESUM || CSIS1CAT || CSIRESRV
CSIFIELD = CSIFILTK || CSICATNM || CSIRESNM || CSIDTYPS || CSIOPTS
CSIFIELD = CSIFIELD || CSINUMEN || CSIFLD1 || CSIFLD2 || CSIFLD3
WORKLEN = 65536
DWORK = '00010000'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
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+10
DO I = 1 TO NUMVOL
POS2 = POS2 + 6
END
POS2 = POS1 + C2D(SUBSTR(DWORK,POS1,2)) - 2
GDGLIM = C2D(SUBSTR(DWORK,POS2,1))
POS2 = POS2 + 1
GDGA = X2B(C2X(SUBSTR(DWORK,POS2,1)))
GDGA1 = SUBSTR(GDGA,1,1)
GDGA2 = SUBSTR(GDGA,2,1)
GDAT1 = 'NOEMPTY'
IF GDGA1 = '1' THEN DO
GDAT1 = 'EMPTY '
END
GDAT2 = 'SCRATCH'
IF GDGA2 = '0' THEN DO
GDAT2 = 'NOSCR '
END
IF DNAMET <> DNAME THEN DO
IF DTYPE = 'GDG ' THEN DO
ATTRIB = GDAT1 GDAT2
SAY LEFT(DNAME,44) "LIM =" RIGHT(GDGLIM,3) " "ATTRIB
END
DNAMET=DNAME
END
POS1 = POS1 + C2D(SUBSTR(DWORK,POS1,2))
END
END
END
"EXECIO 0 DISKW CARDOUT ( FINIS"
EXIT
/* STANDARD ERROR ROUTINE - CHANGE SAY VARIABLES AS REQUIRED. */
ERR:
SIGNAL OFF SYNTAX
DROPBUFF
SAY RIGHT(SIGL,4) ">>>" SOURCELINE(SIGL)
SAY " "
SAY "ERROR ROUTINE HAS BEEN ENTERED"
SAY " "
SAY "NAME " DNAME
SAY "GDGLIM " GDGLIM
SAY " "
TRACE I
INTERPRET SOURCELINE(SIGL)
SAY RIGHT(RC,4) ">>>" ERRORTEXT(RC)
Back to top
Please enable JavaScript!