Bypassing a Locked Record, Take Two
January 7, 2009 Hey, Ted
I have a slightly different solution to the locked record problem your friends tackled in Bypassing a Locked Record. Like them, I have RPG programs that sequentially read a file and update some of the records. When a program tries to read a record that another job has locked, I sometimes bypass the locked record. Here’s how.
Notice the READ operation in the second calculation of this example:
FSomeFile UF E K Disk Prefix(SR_) D Forever S N inz(*On) D Open C Const(' ') D Closed C Const('Z') /Free DoW Forever; Read(E) SomeRec; If %Eof(SomeFile); Leave; EndIf; If %Error(); Read(N) SomeRec; Iter; EndIf; If SR_Status = Open and SR_Balance = *Zero; Eval SR_Status = Closed; Update SomeRec %Fields(SR_Status); EndIf; EndDo; Eval *InLR = *On; Return; /End-Free
The READ includes an E extender, which tells the RPG compiler not to stop if the read ends in error. After the READ and the usual check for end-of-file, I use the %ERROR built-in function to trap the locked records. If the read failed, I read again, but this time without a lock. This second read allows me to move the file pointer to the next record.
In this example, I didn’t verify that the read error was caused by a lock. If you need to get that granular, check the %STATUS built-in function for a value of 1218.
Thanks for writing about record locking. It’s a big deal in my shop.
Thanks for the example, Don. We’ve run several tips about record locking, and I have more to cover when I can get to it.