RPG

108. レコード・ロックの使用方法

RPG でのレコード・アクセスにおいてレコード・ロックの理解を深めるためのサンプルを紹介する。
ここで紹介するサンプル RPG は更新用ファイルのレコードを CHAIN 命令によって読み取った
ままで EXFMT で画面を表示している。
明細画面は次のとおりである。

0001.00 H DFTNAME(RCD001) DATEDIT(*YMD/)                                        
0002.00 F********  レコード・ロック処理の例  ********************************** 
0003.00 FRCD001FM  CF   E             WORKSTN                                   
0004.00 FSHOHIN    UF A E           K DISK                                      
0005.00 F********************************************************************** 
0006.00 D SAVDTA          S              1    DIM(1024)                         
0007.00 D SAVEDS        E DS                  EXTNAME(SHOHIN)                   
0008.00 C*----------------------------------------------------+                 
0009.00 C     START         TAG                                                 
0010.00 C                   EXFMT     DSPHEAD                                   
0011.00 C*----------------------------------------------------+                 
0012.00 C                   SETOFF                                       919299 
0013.00 C*( CF03 )- 終了                                                        
0014.00 C   03              SETON                                        LR     
0015.00 C   LR              RETURN                                              
0016.00 C     *NOKEY        CLEAR                   SHOHINR                     
0017.00 C                   SETOFF                                       90     
0018.00 C     SHCODE        CHAIN     SHOHIN                             90     
0019.00 C  N90              MOVEA     SAVEDS        SAVDTA                      
0020.00 C*----------------------------------------------------+     
0021.00 C     DSPLY         TAG                                                
0022.00 C                   EXFMT     DSPDTA01                                 
0023.00 C*----------------------------------------------------+                
0024.00 C                   SETOFF                                       919299
0025.00 C*( CF03 )- 終了                                                       
0026.00 C   03              SETON                                        LR    
0027.00 C   LR              RETURN                                             
0028.00 C*-( CF12 )- 前画面                                                    
0029.00 C     *IN12         IFEQ      *ON                                      
0030.00 C                   UNLOCK    SHOHIN                               90  
0031.00 C                   GOTO      START                                    
0032.00 C                   END                                                
0033.00 C                   MOVEA     SAVDTA        SAVEDS                     
0034.00 C*----------------------------------------------------+                
0035.00 C   90              WRITE     SHOHINR                                  
0036.00 C  N90              UPDATE    SHOHINR                                  
0037.00 C*----------------------------------------------------+                
0038.00 C                   GOTO      DSPLY                                    
0039.00 C     END           TAG

商品マスター SHOHIN は

0018.00 C     SHCODE        CHAIN     SHOHIN                             90

によってレコードを獲得した状態のままで

0022.00 C                   EXFMT     DSPDTA01

が実行されているので、このユーザーが画面を眺めているあいだはレコードは他の更新ユーザー
からはロックされたままとなる。
つまり同じレコードを他ののユーザーがこのプログラム、または他の更新用のプログラムを使って
同じレコードを更新用としては読み取ることはできない。

このユーザーが実行キーを押してレコードを更新するか、または F12キーを押して初期画面に
戻るまでは他の同じレコードを要求したユーザーは待ちの状態となる。
待ち時間は物理ファィルの作成 : CRTPF コマンドで指定されている、「最大レコード待機時間」
であり通常の初期値は 60秒、つまり1分である。
この「最大レコード待機時間」を *NOMAX で作成する開発者もいるが、待たされるユーザーは
エラーでは終了しないものの、永続的に原因不明で待たされることになるのでお奨めはできない。

次に F12キーによる処理であるが、

0028.00 C*-( CF12 )- 前画面                                                    
0029.00 C     *IN12         IFEQ      *ON                                      
0030.00 C                   UNLOCK    SHOHIN                               90  
0031.00 C                   GOTO      START                                    
0032.00 C                   END

のように UNLOCK 命令によってレコード・ロックを解除していることに注意されたい。
逆にレコード・ロックを行いたくないのであれば CHAIN 命令を

0018.00 C     SHCODE        CHAIN(N)  SHOHIN                             90

のようにすればよい。
レコード・ロックを理解していないと不用意なレコード・ロックによって、運用時にユーザーから
クレームを受け取ることにもなりかねない。
更新用のファイルの読み取りにはレコードがロックされることに注意が必要である。