Note the use of the FREEDBUF macro in
Figure 1. Usually,
the FREEDBUF macro has two functions:
- To indicate to the ISAM routines that a record that has been read
for update will not be written back
- To free a dynamically obtained buffer.
In Figure 1,
because the read operation was unsuccessful, the FREEDBUF macro frees
only the dynamically obtained buffer.
The first function of FREEDBUF lets you read a record for update,
then decide not to update it without performing a WRITE for update.
You can use this function even when your READ macro does not specify
dynamic buffering, if you have included S (for dynamic buffering)
in the MACRF field of your READ DCB.
You can cause an automatic FREEDBUF merely by reusing the DECB;
that is, by issuing another READ or a WRITE KN to the same DECB. You
should use this feature whenever possible, because it is more efficient
than FREEDBUF. For example, in Figure 1,
the FREEDBUF macro could be eliminated, because the WRITE KN addressed
the same DECB as the READ KU.
Figure 1. Directly
Updating an Indexed Sequential Data Set//INDEXDD DD DSNAME=SLATE.DICT,DCB=(DSORG=IS,BUFNO=1,...),---
//TAPEDD DD ---
...
ISUPDATE START 0
...
NEXTREC GET TPDATA,TPRECORD
ENQ (RESOURCE,ELEMENT,E,,SYSTEM)
READ DECBRW,KU,,'S',MF=E Read into dynamically
* obtained buffer
WAIT ECB=DECBRW
TM DECBRW+24,X'FD' Test for any condition
BM RDCHECK but overflow
L 3,DECBRW+16 Pick up pointer to
* record
MVC ISUPDATE-ISRECORD Update record
WRITE DECBRW,K,MF=E
WAIT ECB=DECBRW
TM DECBRW+24,X'FD' Any errors?
BM WRCHECK
DEQ (RESOURCE,ELEMENT,,SYSTEM)
B NEXTREC
RDCHECK TM DECBRW+24,X'80' No record found
BZ ERROR If not, go to error
* routine
FREEDBUF DECBRW,K,ISDATA Otherwise, free buffer
MVC ISKEY,KEY Key placed in ISRECORD
MVC ISUPDATE,UPDATE Updated information
* placed in ISRECORD
WRITE DECBRW,KN,,WKNAREA,'S',MF=E Add record to data set
WAIT ECB=DECBRW
TM DECBRW+24,X'FD' Test for errors
BM ERROR
DEQ (RESOURCE,ELEMENT,,SYSTEM) Release exclusive
* control
B NEXTREC
WKNAREA DS 4F BISAM WRITE KN work field
ISRECORD DS 0CL50 50-byte record from ISDATA
DS CL19 DCB First part of ISRECORD
ISKEY DS CL10 Key field of ISRECORD
DS CL1 Part of ISRECORD
ISUPDATE DS CL20 Update area of ISRECORD
ORG ISUPDATE Overlay ISUPDATE with
TPRECORD DS 0CL30 TPRECORD 30-byte record
KEY DS CL10 from TPDATA DCB Key
* for locating
UPDATE DS CL20 ISDATA record update
RESOURCE DC CL8'SLATE' information or new data
ELEMENT DC C'DICT'
READ DECBRW,KU,ISDATA,'S','S',KEY,MF=L
ISDATA DCB DDNAME=INDEXDD,DSORG=IS,MACRF=(RUS,WUA), C
MSHI=INDEX,SMSI=2000
TPDATA DCB ---
INDEX DS 2000C
...