Modifying Fixed-Length OCCURS Segments in VSAM

Data sources with OCCURS=n segments are maintained using standard MATCH and NEXT logic in a MODIFY procedure.

The following Master File illustrates a VSAM data source with an OCCURS=n segment:

FILENAME=VSAMFILE ,SUFFIX=VSAM
SEGNAME=ROOT ,SEGTYPE=SO .S
GROUP=KEY INFO ,ALIAS=KEY ,USAGE=Al3 ,ACTUAL=A15 ,$
FIELD=STUDENT ,ALIAS=LN ,USAGE=A9 ,ACTUAL=A9 ,$
FIELD=BIRTHDAY ,ALIAS=BD ,USAGE=I6YMD ,ACTUAL=A6 ,$
FIELD=FIRST NAME ,ALIAS=FN ,USAGE=A15 ,ACTUAL=A15 ,$
SEGNAME=REPSEG ,PARENT=ROOT ,OCCURS=9 ,SEGTYPE=SO ,$
FIELD=COURSE ,ALIAS=CN ,USAGE=A9 ,ACTUAL=A9 ,$
FIELD=GRADE ,ALIAS=GD ,USAGE=Al ,ACTUAL=Al ,$
FIELD=QTR_TAKEN ,ALIAS=QA ,USAGE=A2 ,ACTUAL=A2 ,$

A MODIFY procedure for loading a new student record automatically fills in the OCCURS segment with zeros and spaces as appropriate. You cannot use INCLUDE or DELETE to maintain fixed-length, multiply-occurring segments. Instead, use a MODIFY procedure with an UPDATE statement to load them. If you specify the ORDER field in your Master File, you can use that with MATCH or NEXT commands to retrieve appropriate occurrence of the repeating fields.

This procedure illustrates how to maintain the VSAMFILE defined above. The first section determines whether the input data is for a new or existing record.

MODIFY FILE VSAMFILE
FIXFORM ON BIGFIX STUDENT/9 BIRTHDAY/6
REPOSITION STUDENT
MATCH STUDENT
ON NOMATCH INCLUDE
ON MATCH/NOMATCH GOTO ANYREC

When including a new root segment, the OCCURS=n segments are all filled with zeros and spaces as appropriate. Therefore, all actions against repeating fields are considered updates and can be processed by the ANYREC case.

CASE ANYREC
COMPUTE
DELT/Al = ' ';
MATCH STUDENT BIRTHDAY
ON NOMATCH REJECT
ON MATCH REPEAT 9 TIMES
NEXT COURSE
ON NEXT HOLD COURSE GRADE QUARTER_TAKEN DELT
ON NEXT GOTO ENDREPEAT
ON NONEXT GOTO EXITREPEAT
ENDREPEAT

The next CRTFORM displays the student's last name, first name, and COURSE information. You can update the student's name and add or update up to nine occurrences of COURSE information. You can also delete an occurrence by placing a D in the field DELT.

ON MATCH CRTFORM LINE 1
"****************************************************"
"* TECH REP HIGH SCHOOL *"
"* -------------------- *"
"* LAST NAME:<D.STUDENT FIRST NAME:<T.FN> *"
"* *"
"* COURSE GRADE QUARTER_TAKEN *"
"* ------ ----- ------------- *"
"* <T.COURSE(00l) <T.GRADE(00l) <T.QTR_TAKEN(00l) <T.DELT(00l)*"
"* <T.COURSE(002) <T.GRADE(002) <T.QTR_TAKEN(002) <T.DELT(002)*"
"* <T.COURSE(003) <T.GRADE(003) <T.QTR_TAKEN(003) <T.DELT(003)*"
"* <T.COURSE(004) <T.GRADE(004) <T.QTR_TAKEN(004) <T.DELT(004)*"
"* <T.COURSE(005) <T.GRADE(005) <T.QTR_TAKEN(OOS) <T.DELT(005)*"
"* <T.COURSE(006) <T.GRADE(006) <T.QTR_TAKEN(006) <T.DELT(006)*"
"* <T.COURSE(007) <T.GRADE(007) <T.QTR_TAKEN(007) <T.DELT(007)*"
"* <T.COURSE(008) <T.GRADE(008) <T.QTR_TAKEN(008) <T.DELT(008)*"
"* <T.COURSE(009) <T.GRADE(009) <T.QTR_TAKEN(009) <T.DELT(009)*"
"* *"
"* *"
"* ENTER=UPDATE PFl=EXIT PF2=HOME *"
"****************************************************"

This section can either update the existing record or include new values. If data is marked for deletion, processing branches to DELCASE.

ON MATCH UPDATE FN
ON MATCH REPEAT 9 TIMES
GETHOLD
IF DELT EQ 'D' THEN PERFORM DELCASE;
NEXT COURSE
ON NEXT UPDATE COURSE GRADE QTR_TAKEN
ON NEXT GOTO ENDREPEAT
ENDREPEAT
GOTO TOP
ENDCASE

Delete values by updating the COURSE, GRADE, and QTR_TAKEN fields with blanks.

CASE DELCASE
COMPUTE
COURSE = ' '; GRADE = ' '; QTR_TAKEN = ' ';
NEXT COURSE
ON NEXT UPDATE COURSE GRADE QTR_TAKEN
GETHOLD
ENDCASE
DATA 
END

Information Builders