User Owned Index sets can be rebuilt by means of the MAINTAIN INDEX utility, but only if a front-end program is written which walks the index set and passes the involved owner and member records to the utility.
An example of such a program is available at Sample front-end program for rebuilding user-owned indexed sets.
This document describes the advantage of having owner pointers in the member records in case such rebuild is necessary.
Release: All supported releases.
There have been situations where a user owned index set became corrupted and that a rebuild of the index set was necessary to remove the corrupted structures.
In those cases, the front-end program needs to walk the owner records and all of the member records. It is very well possible that the corruption doesn’t allow to find all member records via their owner records, e.g. by means of an OBTAIN NEXT IN index-set DML call. If so, the alternative is to access the member records in a different way, e.g.by means of an area sweep, and then find the owner record for each of them.
Normally, this can be done by means of an OBTAIN OWNER DML call, but again depending upon the nature of the corruption, it might be possible that this won’t work either.
In such case, it would be very helpful if the user owned index set was defined with owner pointers.
Example :
ADD
SET NAME IS OFFICE-EMPLOYEE
ORDER IS SORTED
MODE IS INDEX BLOCK CONTAINS 30 KEYS
OWNER IS OFFICE
WITHIN AREA ORG-DEMO-REGION
MEMBER IS EMPLOYEE
WITHIN AREA EMP-DEMO-REGION
LINKED TO OWNER
MANDATORY AUTOMATIC
KEY IS (
EMP-LAST-NAME-0415 ASCENDING
EMP-FIRST-NAME-0415 ASCENDING )
DUPLICATES ARE LAST
NATURAL SEQUENCE
COMPRESSED
.
In this case, the front-end program after reading a member record, can use the following DML call :
ACCEPT dbkey-workfield FROM setname OWNER CURRENCY.
This DML call will return the dbkey of the owner of the set occurrence as found in the prefix of the member record, without the need to issue an OBTAIN OWNER dml call. Note that this type of ACCEPT DML call is only allowed to use if the involved set has OWNER pointers.
If the front-end program needs to process a specific set occurrence only, then this dbkey can be compared with the dbkey of the owner record itself, and if they match, then that indicates that the current member record is participating in the set occurrence that has to be processed.
Using the above OFFICE-EMPLOYEE set definition as example, the front-end (Cobol) program could do the following (extract from program):
READ-DB-001.
OBTAIN CALC OFFICE.
IF ERROR-STATUS = 0000
ACCEPT O-DBKEY FROM CURRENCY.
PERFORM IDMS-STATUS.
* Pass this owner record to TBLU.
CALL 'IDMSTBLU' USING OWNERTYP.
* Perform an area sweep on the member records
READ-DB-010.
OBTAIN FIRST EMPLOYEE WITHIN EMP-DEMO-REGION.
READ-DB-020.
PERFORM IDMS-STATUS.
ACCEPT M-DBKEY FROM CURRENCY.
PERFORM IDMS-STATUS.
ACCEPT M-ODBKEY FROM OFFICE-EMPLOYEE OWNER CURRENCY.
PERFORM IDMS-STATUS.
* Check if Owner dbkey in Member record is equal to
* dbkey of owner (OFFICE) record.
* If so, pass this member along to TBLU.
IF M-ODBKEY = O-DBKEY
CALL 'IDMSTBLU' USING MEMBERTYP EMPLOYEE.
* Continue the area sweep of the members until 0307
OBTAIN NEXT EMPLOYEE WITHIN EMP-DEMO-REGION.
IF ERROR-STATUS = 0307 GO TO READ-DB-900.
GO READ-DB-020.
READ-DB-900.
CALL 'IDMSTBLU' USING EOFTYP.
READ-DB-950.
FINISH.
PERFORM IDMS-STATUS.