RPG

163. RPG のエラー・モニター (1)

RPG ソース・コード内でのエラーの監視には、様々な方法が用意されていて
最近では機能も拡張されているので個々の方法について紹介する。

伝統的で最も簡単な方法は、RPG 命令にエラー標識を定義する方法である。
例えば、

SHCODE         CHAIN   SHOHIN                 99

のように CHAIN 命令では 54桁目に標識 99 を定義して 99 がオンであれば
CHAIN に失敗したと判断することができる。
しかし

               CALL   'MYPGM'                    99

のように CALL 命令において CALL 命令の実行が失敗したことを判定する標識は56 桁目である。
このように 命令コードによって標識の位置が異なる場合があるので使う頻度の少ない命令コードを
久しぶりに使用するのであればRPG 解説書を参照して標識の位置を確かめなければならない。
近年、標識の使用は避けられる傾向にあり、他言語から RPG へ参入した開発者が最初に最も戸惑うのが
標識」の使用である。
IBM のそのあたりの傾向はよく承知しているようで、RPG のフリー・フォーマットで標識を使う必要を無くし、
さらには固定フォーマットの記述でも標識の使用を避けることができるようになってきている。

上記の命令は次のように書き換えることができる。

SHCODE            CHAIN(E)  SHOHIN
                  CALL(E)   'MYPGM'

このように命令拡張コード (E) を使用すると、標識を使う必要がないのと、標識の場所を覚えておく必要がない。
エラーが起こったときの措置は組み込み関数 %ERROR を使って次のように記述する。

SHCODE             CHAIN(E)  SHOHIN
                   IF        %ERROR
           ( エラーが起こったときの措置をここに記述 )
                   END

                   CALL(E)  'MYPGM'
                   IF       %ERROR
           ( エラーが起こったときの措置をここに記述 )
                   END

また、更新レコードのレコード・ロックを直ちに解放したい CHAIN 命令は CHAIN(N) として知られているが、
上記の CHAIN 命令のエラーと併せて記述したいのであれば

SHCODE             CHAIN(E N) SHOHIN

のように命令拡張コード (E) と 命令拡張コード (N) を重ねて使用することができる。
このようにして 命令拡張コード (E) を使用することができる RPG 命令コードは
次のとおりである。

ACQ(E)ADDDUE(E)ALLOC(E)CALL(E)CALLB(DE)CALLP(EM/R)
CHAIN(EN)CHECK(E)CHECKR(E)CLOSE(E)COMMIT(E)DEALLOC(E/N)
DELETE(E)DSPLY(E)EXFMT(E)EXTRCT(E)FEOD(E)IN(E)
NEXT(E)OCCUR(E)OPEN(E)OUT(E)POST(E)READ(EN)
READC(E)READE(EN)READP(EN)READPE(EN)REALLOC(E)REL(E)
RESET(E)ROLBK(N)SCAN(E)SETGT(E)SETLL(E)SUBDUR(E)
SUBST(EP)TEST(ED/T/Z)UNLOCK(E)UPDATE(E)WRITE(E)XLATE(EP)

CALLP はエラー標識を設定することはできないが、 命令拡張コード (E) は使用することができる。
また命令拡張コード (E) を使用すると *PSSR を明示的に呼び出すこともできる。

【 例 】
CALL(E)      'MYPGM'
IF           %ERROR
EXSR         *PSSR
END

*PSSR は後で解説するがファイルが定義されていないと使用することができないが
命令拡張コード (E) を使用するとこのように明示的に *PSSR を呼び出すことができる。