RPG

331. 知らなかった READC (Read Change) (2)

READC の使い方について解説する。
ポイントは DSPFの SFLレコードに SFLNXTCHG キー・ワードを
指定することである。

(1) DSPF の SFL レコードに SFLNXTCHG キー・ワードを宣言する。

【例】
0041.00      A          R SFREC01                   SFL                         
0042.00      A                                      TEXT(' SFLレコード ')    
0043.00      A  20                                                              
0044.00      AO 99                                  SFLNXTCHG                   
0045.00      A            GYO            4A  B  9  2TEXT(' № ')                
0046.00      A  03                                  DSPATR(UL)                  
                :
                :
【解説】

最初に READC で読取った SFL レコードを検査してエラーがあれば
標識 : *IN99 をオンにしてからエラーのあった SFL レコードを
UPDATE 命令で更新する。
標識 99 のときに SFLNXTCHG が指定されているので
エンド・ユーザーがエラー・メッセージを無視して何もせずに
実行キーを押したとしても SFLNXTCHG によってエラー SFL レコードは
再読み取りされるので再びチェックされてエラーが戻る。
もし SFLNXTCHG が指定されていなければ、初めは READC によって
エラーと判定された SFL レコードもエンド・ユーザーが
エラー行に対して何も処置せずに実行キーを押すと
次の READC 命令ではこのエラー SFL レコードは読取られることはないので
チェックでエラーが発生しなくなってしまう。
エラーがなければデータを更新するようにプログラムが作成されていても
エラーはないものと判定されてしまうのでエラー・レコードが
更新されてしまう問題が発生する可能性がある。
従って READC を使用するときの SFL レコードには
必ずエラー標識を条件とする SFLNXTCHG キー・ワードを指定しておく
必要がある。

(2) RPG で READC を使用する。

【例】

C                   DO        *HIVAL                               
C                   SETOFF                                       50     
C*( 実行キー )                                                          
C  N10                                                                  
CANN23              READC     SFREC01                                50 
C   50              LEAVE
C                   EXSR      CHECK
C   99              UPDATE    SFREC01
C                   ENDDO
                     :
【解説】

DO *HIVAL - ENDDO で READC で変更レコードだけを読み取って
CHECK でチェックしてエラーがあれば( 99 ) SFL レコードを更新します。
99 SFLNXTCHG が指定されているのでエラー・レコードは
次回も必ず読取られます。
エラーが無くなれば READC の対象となるレコードもなくなります。