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)