HPlogo KSAM/3000 Reference Manual: HP 3000 MPE/iX Computer Systems > Chapter 6 USING KSAM FILES IN BASIC PROGRAMS

BKREWRITE

» 

Technical documentation

Complete book in PDF
» Feedback

 » Table of Contents

Changes the contents of a record in a KSAM file.

 

   CALL BKREWRITE (filenum, status, parameterlist) 

A call to BKREWRITE replaces the contents of an existing record with new values. The record to be rewritten is the last record accessed by a call to BKREAD, BKREADBYKEY, or BKSTART. To use BKREWRITE, the file must be open in the access mode that allows update. If access is shared, it must also be opened with dynamic locking allowed, and the file locked by BKLOCK before records are rewritten.

PARAMETERS

filenum

A numeric variable containing the file number that identifies the file; this number was returned by the last call to BKOPEN. It should not be altered unless the file is closed with a successful call to BKCLOSE. (Required parameter)

status

A four-character string variable to which is returned a code that indicates whether or not the call to BKREWRITE was successful and if not, why not. The first character is set to zero if the call succeeds, to another value if not. (Refer to the Status Parameter discussion earlier in this section. (Required parameter)

parameterlist

A list of variables or constants, separated by commas, that contain the data to be written to the file replacing the last record read or written. The total length of the new record is derived from the total number, data type, and length in characters of each item in parameterlist. Although this length need not be the same as the record it replaces, it should be long enough to contain all the keys, but not so long that it exceeds the defined record length. (Required parameter)

USING BKREWRITE

After calling BKREWRITE, you should always check the status parameter to make sure that the rewrite was successful. Upon successful completion of BKREWRITE, new values replace the data in the last record read to or written from the BASIC program. The new data may change every value in the previously read record including the primary key value.

If you want to replace a record with a particular key value, you should locate and read the record with BKREADBYKEY or BKSTART. To rewrite a series of records you should read the records with BKREAD.

When the data in the parameterlist of BKREWRITE is shorter in total length than the data in the record being rewritten, there is less total data in the rewritten record. In order to maintain the key sequence of all keys, defined values should be written to the location of all keys, both the primary key and any alternate keys.

NOTE: Items written to a KSAM file with the BKREWRITE procedure are concatenated; rounding to word boundaries does not occur.

The example in Figure 6-7 “Rewriting Record in KSAM File with BKREWRITE” writes new values to a record originally written if Figure 6-11 “Writing to a KSAM File with BKWRITE” and read in Figure 6-5 “Reading From a KSAM File with BKREAD”. The new values fill an array that had undefined values in the last five words, now defined as two arrays A3 and A2 by the BKREAD call. The primary key value "23" in location 2 is unchanged.

The record read by BKREAD contained the following values:

[f0606a]

After being rewritten by BKREWRITE, it contains the following values:

[f0606b]

Shared Access

When access is shared, the call to BKREAD, BKREADBYKEY, or BKSTART that locates the record to be rewritten should be included in the same pair of BKLOCK/BKUNLOCK calls as the call to BKREWRITE. This insures that no other user alters the record pointer between the call that locates the record and the call that rewrites it.

Duplicate Keys

If you want to sequentially rewrite all records in a chain of records with duplicate keys, locate the first record in the chain with BKREADBYKEY. Then call BKREWRITE to modify this record. If no key value (the selected key or any other) is modified, subsequent calls to BKREWRITE will modify the next sequential records in the chain of duplicate keys. If, however, any key has been changed, the modified key is written to the end of the chain and the next sequential record is one with the next higher key value. In this case, to rewrite all records with duplicate keys, precede each call to BKREWRITE by a call to BKREADBYKEY.

Figure 6-7 Rewriting Record in KSAM File with BKREWRITE

 

2600 REM 
2610 REM ********************************************************* 
2620 REM * REVISE THE CONTENTS OF A RECORD READ FROM A KSAM FILE * 
2630 REM ********************************************************** 
2640 REM 
2650 REM F IS THE FILE NUMBER OF A KSAM FILE OPENED BY A CALL TO BKOPEN 
2660 REM NOTE THAT FOR BKREWRITE,BKOPEN ACCESS MODE MUST=4 FOR UPDATE. 
2670 REM 
2680 REM AN ASSUMPTION HAS BEEN MADE THAT THE RECORD TO BE READ 
2690 REM CONTAINS THE SAME INFORMATION THAT WAS WRITEM TO THE 
2700 REM KSAM FILE IN THE BKWRITE EXAMPLE,, 
                 |------------------ parameterlist 
2710 REM /------------------------\ 
2720 CALL BKREAD(F,S$,B1$,B2$,A5[*],A3[*],A2[*]) 
2730 REM 
2740 REM NOW DETERMINE WHETHER THE CALL HAS SUCCEEDED. 
2750 REM 
2760 IF S$(1;1]<>"0" THEN DO 
2770   REM N$ CONTAINS THE NAME OF THE KSAM FILE 
2780   REM S$ CONTAINS THE STATUS CALL SET BY THE PRECEDING CALL 
2790   PRINT "UNABLE TO READ ";N$;" ERROR ";S$[1;1]" DETAIL ";S$[2] 
2800   CALL BKERROR(S$,M$) 
2810   PRINT M$ 
2820   GOTO 3620 
2830 DOEND 
2900 REM THE CONTENTS OF B1=1", OF B2$="23" 
2910 REM THE CONTENTS OF A5(1) THROUGH A5(5) ARE 1 THROUGH 5 
2920 REM THE CONTENTS OF A3 AND A2 ARE UNKNOWN 
2930 REM 
2940 REM STORE VALUES 1 THROUGH 3 INTO A3(1) THROUGH A3(3) 
2950 REM STORE VALUES 1 AND 2 INTO A2(1) AND A2(2). 
2960 REM 
2970 FOR I=1 TO 2 
2980   A2[I]=I 
2990   A3[I]=I 
3000 NEXT I parameterlist 
3010 A3[3]=3 | 
3020 REM /------------------------\ 
3030 CALL BKREWRITE(F,S$,B1$,B2$,A5[*],A3[*],A2[*]) 
3040 REM 
3050 REM NOW DETERMINE WHETHER THE CALL HAS SUCCEEDED 
3060 REM 
3070 IF S$[1;1]<>"0 THEN DO 
3080   REM N$ CONTAINS THE NAME OF THE KSAM FILE 
3090   REM S$ CONTAINS THE STATUS CODE SET BY THE PRECEDING CALL 
3100   PRINT "UNABLE TO REWRITE ";N$;" ERROR ";S$[1;1];" DETAIL ";S$[2] 
3110   CALL BKERROR(S$,M$) 
3120   PRINT M$ 
3130   GOTO 3620 
3140 DOEND 
3150 REM 
3160 REM ECHO WHAT WAS UPDATED 
3170 REM 
3180 PRINT "REWRITTEN RECORD = ";B1;B2 
3190 MAT PRINT A5,A3,A2 
3200 REM 
3210 REM THE PROGRAM CONTINUES