タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】RPGLE-一括レコード更新処理サンプル(UNLOCK命令を使用)

AS400でレコード更新を処理する場合、専用アプリ、SQL、DFUなど多くの方法がございますが、複雑な条件をつけて、1つ1つ判定したうえで、更新したい!という場合では、RPGでやるのが便利だと思っています。

そこでサンプルを。
サンプルは、単純に売上明細を全件READし、条件判定の結果、対象レコードのみを更新させるというもの。

売上明細条件付き更新処理 サンプル

  • 下記の例では、SQL文で十分な更新処理なのですが、本来は、更新判定条件や格納したい値を別のテーブルから持ってくる場合など、複雑なものであるかと思います。あくまでUNLOCK命令にフォーカスしたいので、シンプルな処理判定になっています。
     F* 売上明細
     FURIAGE    UF   E           K DISK 
     F*
     D MAIN            PR                  EXTPGM('SAMPLE33')  
     D MAIN            PI                                                   
     D*                                                                            
     D W@LOOP          S              1A   INZ(*OFF)                            //LOOP CONTROL
     D W@FUPD          S              1A   INZ(*OFF)                            //更新対象フラグ
     D*                         
      /FREE   
           SETLL *LOVAL RECURI;  
                          
           DOU W@LOOP= *ON;    
               W@FUPD= *OFF;
               READ  RECURI; // (1) レコード読み取り後、レコードロック発生 
               IF %EOF();             
                   W@LOOP = *ON;  
               ELSE;              
                  // (2) 更新対象かの判定 ※実際は複雑な判定 
                   IF URIDATE >= 20150101;               
                       W@FUPD = *ON;      //更新対象とする(別テーブルから値を持ってきたりもする)
                       URITANTO = '9999'; //更新内容をセット 
                   ENDIF;                          
                                     
                   IF W@FUPD = *OFF;     
                       UNLOCK URIAGE; // (3) ロック解除      
                   ELSE;                             
                       UPDATE RECURI; // (4) レコード更新処理    
                   ENDIF;                                     
               ENDIF;   
           ENDDO;                                             
                                                              
          *INLR = *ON;         
          RETURN;           
      /END-FREE        

  • (1) そもそも売上明細は、ファイルタイプはUモード(更新)であるので、READ or CHAIN命令にて読み取りに成功すると、読み取られた売上明細レコード行は、ロックされます。

    • レコードロックの確認は、次のコマンドで確認できます。
DSPRCDLCK FILE(TIGERDB/URIAGE)
  • (2) ここで更新対象かの判定処理を行っています。本来は、複雑な条件になると思います。

  • (3) 更新対象かの判定で非対象のレコードは、(1)でロックされている状態を解放するために、UNLOCK命令(ロック解除)を行います。

    • ここでの注意点は、レコード様式名ではなく、テーブル名を指定することです。
    • レコード名だとコンパイルエラーになります(*RNF7260 指定された演算命令で演算項目2オペランドが正しくない)。
  • (4) 更新対象のレコードは、UPDATE命令で更新処理を行います。

    • 更新処理にて、ロックは解除されます。