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
を呼び出すことができる。