DELETE’RECORD

Rewritten March 2019

DELETE’RECORD #file-channel

DELETE'RECORD deletes the last accessed record and all associated keys. Like UPDATE'RECORD, it relies on the record being previously locked, but unlike UPDATE'RECORD, it ignores the value of the recnovar variable and instead always deletes the last accessed record. Also unlike UPDATE'RECORD, it removes the lock on completion of the operation.

All errors trap as BASIC errors.

Examples

The typical delete scenario consists of a GET'LOCKED (or GET'NEXT'LOCKED) to read and lock the record to be deleted, followed by the DELETE'RECORD, e.g.

OPEN #ch, filespec, ISAMP'INDEXED, recnovar, fstatvar , wait'record

...

GET'LOCKED #ch, ISAM'KEY(0) = key$, rec

if fstatvar = ISAM_EQ then

    DELETE'RECORD #ch

endif

 

In a more complex scenario, you may want to lock several records, and then—perhaps based on user input or other logic—decide to delete just one of them. This requires re-accessing the record to be deleted, presumably by its unique key, prior to the delete. Note that as long as the record is locked by the first access, the second access will not affect that lock; i.e. it doesn't matter whether the second access uses the 'LOCKED option or not. In this example we lock a group of "items" using GET'NEXT'LOCKED operations, then allow the user to select one to be deleted:

defstruct ST_ITEM            ! record def

    map2 key,s,10            ! item key

    map2 description,s,30

    map2 price,f

endstruct

 

map1 item, ST_ITEM

dimx items(0), ST_ITEM, auto_extend

 

open #ch, filespec, ISAMP'INDEXED, recnovar, fstatvar , wait'record

...

? "Locking n items..."

for i = 1 to n

    GET'NEXT'LOCKED #ch, item

    if fstatvar # ISAM_NF then

        ? "item #";i;" ";item.key;" ";item.description

        items(i) = item      ! save items in array for future reference

    else

        exit   

    endif

next i

 

input "Enter item # to delete (or 0 for none): ",i

if i > 0 then

    GET #ch, ISAM'KEY(0) = items(i).key, item   ! re-access to set context

    if fstatvar = ISAM_EQ then

          DELETE'RECORD #ch

    endif

endif

 

RELEASE'ALL #ch               ! release all the remaining locked recs

 

Note the critical step in the above example of doing another GET on the target record prior to the DELETE'RECORD, and that it doesn't matter if it was GET or GET'LOCKED since the record was already locked.

See the sample program ISPDEL.BP in EXLIB:[908,033] for a more complete working version of the above scenario.