/* REXX */ MSGSTAT = MSG('OFF') /* TURN TSO/E MESSGES OFF */ /* ************************************************************** * DATE CREATED: 3-MAR-00 * DATE LAST MODIFIED: 4-MAR-00 ADD VOLSER RANGES HIGH TO LOW * ADD INDIVIDUAL VOLSER LOOKUP * ORIGINAL AUTHOR: ProTech Professional Technical Services * REXX EXEC = DASDINFO * * PURPOSE = READ THE VTOCS OF ALL ONLINE DASD AND MAKE INFORMATION * ABOUT THE PACKS AVAILABLE IN A USABLE FORMAT. ***************************************************************** */ /* REFRESH = VTOC DATA EXISTS AND I WANT TO REPLACE IT REFRESH2 = THERE IS NO VTOC DATA, IT MUST BE CREATED NOREFRESH = I WILL USE MY CURRENT VTOC DATA */ /* BUILD THE DATA SETS FOR THE ZUU090 JOB */ HLQ = SYSVAR(SYSUID) SYSPUNCH =''''³³HLQ³³.DASD.SYSPUNCH³³'''' SYSPRINT =''''³³HLQ³³.DASD.SYSPRINT³³'''' /* CHECK IF DATA DATASETS EXIST, IF SO ASK USER IF THEY WOULD LIKE TO REFRESH THEM. */ IF SYSDSN("SYSPRINT") = 'OK' THEN DO X=LISTDSI("SYSPRINT") 'CLEAR' JCREATE = REVERSE(SUBSTR(REVERSE(SYSCREATE),1,3)) DZ = DATE('J') JDATE = REVERSE(SUBSTR(REVERSE(DZ),1,3)) DAYSOLD = JDATE - JCREATE IF DAYSOLD = 0 THEN SAY 'THE CURRENT VTOC DATA IS NOT EVEN A DAY OLD' ELSE SAY 'THE CURRENT VTOC DATA IS 'DAYSOLD' DAY(S) OLD' SAY ' DO YOU WANT TO REFRESH IT ? (Y/N) ' PARSE UPPER PULL TERMIN IF ABBREV('YYYYY',TERMIN,1) THEN CALL REFRESH ELSE CALL NOREFRESH END ELSE CALL REFRESH2 /* DO NOT EXITS, MUST BE CREATED */ /* READ ALL VTOC DATA INTO A STACK RECORD LAYOUT IS ' ADDR VOLSER STATUS TYPE CCCC TTTT AAAA YYYY ZZZZ SPACE DATA IS PER MVS MESSAGE IEF234E AS DESCRIBED: CCCC = FREE CYLINDERS ON THE VOLUME TTTT = FREE TRACKS ON THE VOLUME IN ADDITION TO CYLINDERS AAAA = FREE EXETENTS YYYY = LARGEST FREE CYLINDER EXTENTS ZZZZ = LARGEST FREE TRACK EXTENTS */ /* READ ALL THE DATA INTO THE STACK, THEN PLACE IN COMPOUND VARIABLES */ 'EXECIO * DISKR SYSPUNCH ( FINIS ' TOTALREC = QUEUED() DO X=1 TO TOTALREC PARSE UPPER PULL INREC ADDR.X = SUBSTR(INREC,2,3) STRINGID.X = SUBSTR(INREC,2,2) VOLSER.X = SUBSTR(INREC,6,6) VOLNUM.X = SUBSTR(VOLSER.X,4,3) POOLID.X = SUBSTR(INREC,6,3) STATUS.X = SUBSTR(INREC,13,7) TYPE.X = SUBSTR(INREC,21,6) CCCC.X = SUBSTR(INREC,37,4) TTTT.X = SUBSTR(INREC,42,4) AAAA.X = SUBSTR(INREC,47,4) YYYY.X = SUBSTR(INREC,52,4) ZZZZ.X = SUBSTR(INREC,57,4) IF STRIP(TYPE.X) = ' ' THEN DO TYPE.X = '3380-K' CYLAVAIL.X = 2665 END IF STRIP(TYPE.X) = 'SINGLE' THEN DO TYPE.X = '3380-STD' CYLAVAIL.X = 885 END IF STRIP(TYPE.X) = 'DOUBLE' THEN DO TYPE.X = '3380-E' CYLAVAIL.X = 1770 END END /* DO X=1 TO TOTALREC */ /* FIND ALL UNIQUE VOLSER'S OR ID'S */ POOLIDS = "" POOLIDS: DO X = 1 TO TOTALREC IF FIND(POOLIDS,POOLID.X) = 0. THEN POOLIDS = POOLIDS STRIP(POOLID.X) END /* DO POOLIDS */ /* FIND ALL UNIQUE STRING'S */ STRINGS = "" STRINGS: DO X = 1 TO TOTALREC IF FIND(STRINGS,STRINGID.X) = 0. THEN STRINGS = STRINGS STRINGID.X END /* DO STRINGS */ /* FIND THE HIGHEST AND LOWEST VOLSER OF A PARTICULAR VOLSER PREFIX */ SEARCHIDS = POOLIDS SEARCH: DO X = 1 TO WORDS(POOLIDS) PREFIX = WORD(SEARCHIDS,X) FROM.X = 9999 DTO.X = 9999 CHECKLOW = 0 CHECKHGH = 0 DO Y = 1 TO TOTALREC IF POOLID.Y = PREFIX THEN DO IF FROM.X = 9999 THEN DO FROM.X = VOLSER.Y DTO.X = VOLSER.Y CHECKLOW = VOLNUM.Y CHECKHGH = VOLNUM.Y END IF VOLNUM.Y < CHECKLOW THEN DO FROM.X = VOLSER.Y CHECKLOW = VOLNUM.Y END IF VOLNUM.Y > CHECKHGH THEN DO DTO.X = VOLSER.Y CHECKHGH = VOLNUM.Y END END /* IF */ END /* DO Y = */ END /* DO STRINGS */ /* *************** DASDINFO MAIN MENU SCREEN ************************ */ STMSG =' *' MAIN: DO FOREVER 'CLEAR' SAY '*************** ON LINE DASD INFORMATION ******************' SAY '* 'STMSG SAY '*** *' SAY '*** OPTIONS: *' SAY '*** *' SAY '*** A --- LIST OF DASD VOLSER PREFIXS ONLINE *' SAY '*** *' SAY '*** B --- LIST OF DASD VOLSERS WITH A SPECIFIC PREFIX *' SAY '*** *' SAY '*** C --- LIST OF CURRENT STRINGS ON LINE *' SAY '*** *' SAY '*** D --- LIST OF DASD VOLSERS ON A SPECIFIC STRING *' SAY '*** *' SAY '*** E --- INFO ON AN INDIVIDUAL PACK *' SAY '*** *' SAY '*** X --- EXIT DASD INFORMATION *' SAY '*** *' SAY '*** *' SAY '******************************************************************' SAY 'ENTER THE DESIRED OPTION BELOW:' STMSG =' *' PARSE UPPER PULL OPTION WHICHOPTION: SELECT OPTIONA: WHEN ABBREV('AAA',OPTION,1) THEN DO CALL VOLSERS CALL HOLD END OPTIONB: WHEN ABBREV('BBB',OPTION,1) THEN DO CALL ONLINEV CALL HOLD END OPTIONC: WHEN ABBREV('CCC',OPTION,1) THEN DO CALL STRINGSX CALL HOLD END OPTIOND: WHEN ABBREV('DDD',OPTION,1) THEN DO CALL ONLINES CALL HOLD END OPTIONE: WHEN ABBREV('EEE',OPTION,1) THEN DO CALL INDIVIDUAL END OPTIONX: WHEN ABBREV('XXXX',OPTION,1) THEN CALL EXITCOM 0 OPTIONU: OTHERWISE STMSG = ' ERROR ON OPTION INPUT PLEASE RE-ENTER ' END /* SELECT */ END /* DO FOREVEOR MAIN */ /* ******************** ALL RTNS ARE LISTED BELOW ****************** */ /* HOLD SCREEN RTN */ HOLD: SAY ' PRESS ANY KEY TO CONTINUE ' PARSE PULL ANYKEY RETURN /* EXIT WITH RETURN CODE = 0 */ EXITCOM: PARSE ARG EXITRC . "DELSTACK" "FREE F(SYSPRINT)" "FREE F(SYSPUNCH)" EXIT EXITRC /* LIST OF DASD VOLSER PREFIXES ONLINE */ VOLSERS: 'CLEAR' SAY '=================================================================' SAY ' ' SAY ' THERE ARE ' WORDS(POOLIDS) ' UNIQUE VOLSER PREFIXES : ' SAY ' ' SAY ' ' DO X = 1 TO WORDS(POOLIDS) BY 3 Y = X +1 Z = X + 2 IF Y > WORDS(POOLIDS) THEN DO FROM.Y = ' ' DTO.Y = ' ' FROM.Z = ' ' DTO.Z = ' ' END IF Z > WORDS(POOLIDS) THEN DO FROM.Z = ' ' DTO.Z = ' ' END SAY FROM.X'--->'DTO.X ' ' FROM.Y'--->'DTO.Y' 'FROM.Z'-->'DTO.Z END /* LIST POOLS */ RETURN /* VOLSERS */ /* LIST OF DASD VOLSERS WIHT A SPECIFIC INDEX */ ONLINEV: DO FOREVER PACKID = '0000' CALL VOLSERS VOLCOUNT = 0 ROWCOUNT = 0 CYLCOUNT = 0 TOTALCYL = 0 SAY ' ENTER QUIT TO END ' SAY ' PLEASE ENTER THE PREFIX OF THE VOLSERS YOU WOULD LIKE INFO ON:' PARSE UPPER PULL PACKID IF ABBREV('QUIT',PACKID,1) THEN LEAVE /* ERROR HANDLING */ DO FOREVER IF FIND(POOLIDS,STRIP(PACKID)) = 0 , THEN DO CALL VOLSERS SAY ' ' SAY ' ID==>'PACKID' NOT IN THE LIST,ENTER THE VALUE AGAIN' SAY ' ' SAY ' ENTER QUIT TO END ' SAY ' PLEASE ENTER THE PREFIX OF THE VOLSERS YOU WOULD LIKE INFO ON:' PARSE UPPER PULL PACKID IF ABBREV('QUIT',PACKID,1) THEN LEAVE END ELSE LEAVE END /* ERROR HANDLING */ IF ABBREV('QUIT',PACKID,1) THEN LEAVE 'CLEAR' SAY '=================================================================' SAY ' ' SAY 'VOLSER ADDRESS TYPE FREE CYLS ' SAY ' ' LINESAVAILABLE = SYSVAR(SYSLTERM) - 6 DO X = 1 TO TOTALREC IF POOLID.X = PACKID THEN DO ROWCOUNT = ROWCOUNT + 1 IF ROWCOUNT > LINESAVAILABLE THEN DO CALL HOLD SAY 'VOLSER ADDRESS TYPE FREE CYLS ' SAY ' ' ROWCOUNT = 0 END VOLCOUNT = VOLCOUNT + 1 SAY VOLSER.X' 'ADDR.X' ' TYPE.X' 'CCCC.X CYLCOUNT = CYLCOUNT + CCCC.X TOTALCYL = TOTALCYL + CYLAVAIL.X END /* DO */ END /* TO TOTALREC */ SAY ' ' SAY 'THERE ARE ' VOLCOUNT 'VOLUMES WITH THE 'PACKID 'PREFIX ' SAY 'AND THERE ARE 'CYLCOUNT' FREE CYLINDERS FROM A TOTAL OF', TOTALCYL ' CYLINDERS AVAILABLE.' CALL HOLD END /* DO FOREVER */ RETURN /* ONLINEV: */ /* LIST OF CURRENT STRINGS ONLINE */ STRINGSX: 'CLEAR' SAY '=================================================================' SAY ' ' SAY ' THERE ARE ' WORDS(STRINGS) ' STRINGS ONLINE. ' SAY ' ' SAY ' ' DO X = 1 TO WORDS(STRINGS) BY 3 SAY WORD(STRINGS,X)'0-'WORD(STRINGS,X)'F ' , WORD(STRINGS,X+1)'0-'WORD(STRINGS,X+1)'F ' , WORD(STRINGS,X+2)'0-'WORD(STRINGS,X+2)'F' END /* LIST STRINGS */ RETURN /* STRINGSX */ /* LIST OF DASD VOLSERS ON A SPECIFIC STRING */ ONLINES: INSTRINGID = '0' DO FOREVER CALL STRINGSX CYLCOUNT = 0 TOTALCYL = 0 SAY ' ENTER QUIT TO END ' SAY 'ENTER FIRST TWO CHARACTERS OF THE STRING FOR INFO:' PARSE UPPER PULL INSTRINGID IF ABBREV('QUIT',INSTRINGID,1) THEN LEAVE 'CLEAR' /* ERROR HANDLING */ DO FOREVER IF FIND(STRINGS,STRIP(INSTRINGID)) = 0 , THEN DO CALL STRINGSX SAY ' ' SAY ' ID==>'INSTRINGID' NOT IN THE LIST ,ENTER THE VALUE AGAIN' SAY ' ' SAY ' ENTER QUIT TO END ' SAY ' ENTER FIRST TWO CHARACTERS OF THE STRING FOR INFO:' IF ABBREV('QUIT',INSTRINGID,1) THEN LEAVE PARSE UPPER PULL INSTRINGID END ELSE LEAVE END /* ERROR HANDLING */ IF ABBREV('QUIT',INSTRINGID,1) THEN LEAVE 'CLEAR' SAY ' THE VOLSERS ON THE STRING 'INSTRINGID'0 - 'INSTRINGID'F ARE:' SAY ' ' SAY 'VOLSER ADDRESS STATUS TYPE FREE CYLS' SAY ' ' DO X = 1 TO TOTALREC IF INSTRINGID = STRINGID.X THEN DO SAY VOLSER.X' 'ADDR.X' 'STATUS.X' 'TYPE.X' 'CCCC.X CYLCOUNT = CYLCOUNT + CCCC.X TOTALCYL= TOTALCYL + CYLAVAIL.X END END /* VOLLIST */ SAY ' ' SAY 'THE VOLSERS ON THE STRING 'INSTRINGID'0 - 'INSTRINGID'F ' SAY 'HAVE 'CYLCOUNT' FREE CYLINDERS FROM A TOTAL OF', TOTALCYL' CYLINDERS AVAILABLE.' CALL HOLD END /* DO FOREVER */ RETURN /* ONLINES */ /* INDIVIDUAL PACK QUERY */ /* LIST OF DASD VOLSERS WIHT A SPECIFIC INDEX */ INDIVIDUAL: PACKID = '0000' DO FOREVER CALL VOLSERS SAY ' ENTER QUIT TO END ' SAY ' PLEASE ENTER THE VOLSER YOU WOULD LIKE INFO ON: ' PARSE UPPER PULL PACKID IF ABBREV('QUIT',PACKID,1) THEN LEAVE /* ERROR HANDLING */ DO FOREVER IF ABBREV('QUIT',PACKID,1) THEN LEAVE IF FIND(POOLIDS,SUBSTR(STRIP(PACKID),1,3)) = 0 , THEN DO CALL VOLSERS SAY ' ' SAY ' ID==>'PACKID' NOT IN THE LIST,ENTER THE VALUE AGAIN' SAY ' ' SAY ' ENTER QUIT TO END ' SAY ' PLEASE ENTER THE VOLSER YOU WOULD LIKE INFO ON:' PARSE UPPER PULL PACKID END ELSE LEAVE END /* ERROR HANDLING */ IF ABBREV('QUIT',PACKID,1) THEN LEAVE 'CLEAR' SAY '=================================================================' SAY ' ' SAY ' ' "DSPACE" PACKID /* DSPACE COMMAND */ CALL HOLD END /* DO FOREVER */ RETURN /* INDIVIDUAL */ /* BASIC FILE HANDLING */ /* THE DATA EXIST BUT IT WILL BE REPLACED */ REFRESH: "DELETE SYSPRINT" "DELETE SYSPUNCH" "FREE F(SYSPUNCH)" "FREE F(SYSPRINT)" "ALLOC DA(SYSPUNCH) SPACE(10,10) DSORG(PS) , LRECL(80) BLKSIZE(9040)" "ALLOC DA(SYSPRINT) SPACE(10,10) DSORG(PS) , LRECL(133) BLKSIZE(9044)" "ALLOC F(SYSPUNCH) DA(SYSPUNCH) " "ALLOC F(SYSPRINT) DA(SYSPRINT) " 'CLEAR' SAY ' ************************************************' SAY ' ' SAY ' GATHERING VTOC DATA PLEASE HOLD ' /* EXECUTE THE ZZU090 PGM, THIS WILL READ ALL DASD VTOCS */ "LOADGO ('X.OS.LOADLIB(ZZU090)') 'ABC' EP(ZZU090)" RETURN /* REFRESH */ /* DATA SETS DO NOT EXITS */ REFRESH2: "FREE F(SYSPUNCH)" "FREE F(SYSPRINT)" "ALLOC DA(SYSPUNCH) SPACE(10,10) DSORG(PS) , LRECL(80) BLKSIZE(9040)" "ALLOC DA(SYSPRINT) SPACE(10,10) DSORG(PS) , LRECL(133) BLKSIZE(9044)" "ALLOC F(SYSPUNCH) DA(SYSPUNCH) " "ALLOC F(SYSPRINT) DA(SYSPRINT) " 'CLEAR' SAY ' ************************************************' SAY ' ' SAY ' GATHERING VTOC DATA PLEASE HOLD ' /* EXECUTE THE ZZU090 PGM, THIS WILL READ ALL DASD VTOCS */ "LOADGO ('X.OS.LOADLIB(ZZU090)') 'ABC' EP(ZZU090)" RETURN /* REFRESH2 */ /* USE EXISTING DATA */ NOREFRESH: "FREE F(SYSPUNCH)" "FREE F(SYSPRINT)" "ALLOC F(SYSPUNCH) DA(SYSPUNCH) " "ALLOC F(SYSPRINT) DA(SYSPRINT) " RETURN /* NOREFRESH */ /* END OF DASDINFO REXX EXEC */ _