Return to Mainframe Utilities Page
Module
/* REXX ***************************************************************/
/* UTILITY: IDFIX */
/* AUTHOR: DAVID LEIGH */
/* FUNCTION: THIS UTILITY SCANS REGULAR PDS'S OR ISPF PROFILE PDS'S */
/* TO REPLACE OCCURANCES OF ONE'S OLD USER ID WITH ONE'S */
/* NEW USERID. */
/* */
/**********************************************************************/
ADDRESS ISPEXEC "CONTROL ERRORS RETURN"
/**********************************************************************/
/* GET THE ID EITHER PASSED IN OR PROMPT FOR IT */
/**********************************************************************/
PARSE UPPER ARG DSN OLDID
DO WHILE DSN = ''
SAY 'PLEASE ENTER THE LIBRARY NAME TO SCAN OR "X" TO QUIT ==>'
PULL DSN
IF DSN = 'X' THEN EXIT
END
/**********************************************************************/
/* DETERMINE WHAT THE OLD ID WAS THAT YOU'RE CHANGING FROM */
/**********************************************************************/
OLDID = SUBSTR(SYSVAR(SYSUID),1,2) ¦¦,
SUBSTR(SYSVAR(SYSUID),4,3)
/**********************************************************************/
/* HAVE THE USER CONFIRM THIS AND GIVE THE OPPORTUNITY TO QUIT */
/**********************************************************************/
ADDRESS ISPEXEC
"ADDPOP ROW(7) COLUMN(15)"
DO FOREVER
"DISPLAY PANEL(IDFIX)"
SELECT
WHEN RC = 0 & OLDID > '' THEN DO
"VPUT OLDID SHARED"
LEAVE
END
WHEN RC = 8 THEN DO
"REMPOP"
EXIT
END
OTHERWISE NOP
END
END
/**********************************************************************/
/* PREP THE DATASET NAME AND DETERMINE IF THIS IS THE ISPF PROFILE */
/**********************************************************************/
QTE = "'"
IF POS(QTE,DSN) = 0 THEN DSN = QTE ¦¦ DSN ¦¦ QTE
IF DSN = "'" ¦¦ SYSVAR(SYSUID) ¦¦ ".ISPF.ISPPROF'" THEN
PROFLIB = YES
ELSE
PROFLIB = NO
/**********************************************************************/
/* SET UP THE PROCESSING MESSAGES TO GO TO A TEMPORARY FILE */
/**********************************************************************/
ADDRESS TSO
DUMMY = OUTTRAP(NULL)
"FREE DD(TEMPOUT)"
TEMPFILE = SYSVAR(SYSUID)".TEMP.IDFIX.D"SUBSTR(DATE('S'),3,6) ¦¦,
".T"SUBSTR(TIME('N'),1,2) ¦¦,
SUBSTR(TIME('N'),4,2) ¦¦,
SUBSTR(TIME('N'),7,2)
"DELETE '"TEMPFILE"'"
"ALLOCATE DD(TEMPOUT) DSN('"TEMPFILE"')" ,
"NEW CATALOG" ,
"UNIT(SYSDA) VOLUME(WRK$$$)" ,
"SPACE(1,1) CYLINDERS RELEASE" ,
"RECFM(F B) LRECL(255) BLKSIZE(23460) DSORG(PS)"
DROP NULL.
"NEWSTACK"
QUEUE "IDFIX RESULTS FOR DATASET: "DSN
"EXECIO 1 DISKW TEMPOUT"
"DELSTACK"
/**********************************************************************/
/* POINT TO THE DATASET TO BE PROCESSED AND DO A PRIMING MEMBER READ */
/**********************************************************************/
ADDRESS ISPEXEC
"ADDPOP"
"LMINIT DATASET("DSN") DATAID(DID) ENQ(SHRW)"
IF PROFLIB = 'YES' THEN
DO
"LIBDEF ISPTLIB"
"LIBDEF ISPTLIB LIBRARY ID(ISPPROF)"
"VGET ZAPPLID"
END
"LMOPEN DATAID("DID")"
"LMMLIST DATAID("DID") MEMBER(MBR) OPTION(LIST)"
/**********************************************************************/
/* LOOP THROUGH THE MEMBERS AND EDIT THEM TO FIX THEM. */
/**********************************************************************/
DO WHILE RC = 0
MBR = STRIP(MBR)
IF PROFLIB = 'YES' THEN
IF POS('PROF',MBR) = LENGTH(MBR) - 3 THEN
DO
APPL = SUBSTR(MBR,1,POS('PROF',MBR)-1)
IF APPL ¬= 'ISPS' THEN
DO
IF APPL = ZAPPLID THEN
DO
APPL = ''
SAMEAPPL = 'YES'
END
ELSE
DO
APPL = "NEWAPPL("APPL")"
SAMEAPPL = 'NO'
END
"CONTROL DISPLAY LOCK"
"DISPLAY PANEL(IDFIX2)"
"SELECT CMD(%IDFIXPRF",
OLDID MBR SAMEAPPL ")" APPL
END
END
ELSE NOP
ELSE
DO
"CONTROL DISPLAY LOCK"
"DISPLAY PANEL(IDFIX2)"
"EDIT DATAID("DID") MEMBER("MBR") MACRO(IDFIXLIB)"
IF RC = 20 THEN DO
XMBR = SUBSTR(MBR" ",1,8) "-"
QUEUE XMBR "RC = 20, MESSAGE:" ZERRLM
ADDRESS TSO "EXECIO 1 DISKW TEMPOUT"
END
END
"LMMLIST DATAID("DID") MEMBER(MBR) OPTION(LIST)"
END
/**********************************************************************/
/* CLEAN UP AND LET THE USER KNOW WHERE THE OUTPUT IS. */
/**********************************************************************/
"LMMLIST DATAID("DID") MEMBER(MBR) OPTION(FREE)"
"LMCLOSE DATAID("DID")"
"LMFREE DATAID("DID")"
"REMPOP"
"REMPOP"
ADDRESS TSO
"EXECIO 0 DISKW TEMPOUT (FINIS"
"FREE DD(TEMPOUT)"
ADDRESS ISPEXEC "EDIT DATASET('"TEMPFILE"')"
Documentation
IDFIX was created at a time when UNIPAC switched from 5 character logon ids to
6 character logon ids. It would be equally applicable, however, when anyone
switched from one logon id to another.
The problem that arises is as follows. You build up, over time, a great deal
of id-specific "settings" throughout ISPF. These settings are stored in ISPF
profile variables. If your id should change for some reason but you want to
maintain the effort expended in creating these settings over time...well...you
have a problem. Additionally, you build up a great deal of jobcards as well.
Some of these jobcards are in ISPF profiles variables and some are in "plain
ol'" JCL libraries. If your id changes to one of the same length, you're ok to
do a SCAN/REPLACE utility but if it gets LONGER, you could create invalid job
cards. IDFIX will take this into account and truncate the jobname to 8
characters...in both standard JCL libararies and ISPF profile members.
Each of these settings now has your "old" id in it and won't function the way
you'd like. This is where IDFIX comes in.
IDFIX processes your ISPF profile library via ISPF services or standard JCL
libraries via edit macros and changes instances of your old id to your new id.
In the case of non-ISPF profile libraries, it only changes job cards.
Type the following at an ISPF command/option line:
COMMAND ===> tso idfix
You'll be prompted to enter the name of your ISPF profile library or other PDS
name that contains ISPF profile members. Then you'll be prompted (with a
confirmation prompt) for your "old" and "new" id values. Then it will go to
work. When IDFIX completes, you'll be taken into an edit session on a "log"
file of all IDFIX accomplished.

0 Comments