(C G D F) 長さまたは開始桁はストリング操作の範囲外にある。
のような実行時においてエラーが発生したときの対処法について
解説する。
経験あるプログラマーではこのようなエラーを調べるのは
やさしいことであるがまだ経験の浅い方のために
実行時のエラーを調査する方法を紹介する。
まず上記のようなエラーが発生したらすぐにキャンセルなど
してはならない。
プログラムのどこでエラーになっているのかがわからなく
なってしまうからである。
(1) エラーの場所を特定する。
エミュレータのSyste-Requestを実行してシステム要求の
「3. 現行ジョブの表示」を選択する。
(2)呼び出しスタックを調べる。
下記のように活動ジョブ(WRKACTJOB)の表示が表示されるので
「11. 呼び出しスタックの表示 」を選択する
ジョブの表示 システム : Sxxxxxxx ジョブ : QPADEV0022 ユーザー : QTR 番号 : 912836 次の 1 つを選択してください。 1. ジョブ状況属性の表示 2. ジョブ定義属性表示 3. ジョブ実行属性の表示(活動状態の場合) 4. スプール・ファイルの表示 10. ジョブ・ログ表示(活動状態,ジョブ待ち行列上,または保留中の場合) 11. 呼び出しスタックの表示(活動状態の場合) 12. ロックの表示(活動状態の場合) 13. ライブラリー・リストの表示(活動状態の場合) 14. オープンされたファイルの表示(活動状態の場合) 15. ファイル一時変更の表示(活動状態の場合) 16. コミットメント制御状況の表示(活動状態の場合) 続く ... 選択項目 F3= 終了 F12= 取り消し
(3)RPGプログラムの呼び出しスタックを確認する。
下記の例であれば RPG : RTVPNL のステートメント: 128900 で
エラーが発生していることがわかる。
呼び出しスタックの表示 システム : Sxxxxxxx ジョブ : QPADEV0022 ユーザー : QTR 番号 : 912836 スレッド: 00000026 タイプ プログラム ステートメント プロシージャー QCMD QSYS /0517 QUICMENU QSYS /00C1 1 QUIMNDRV QSYS /060F 2 QUIMGFLW QSYS /04D7 3 QUICMD QSYS /056E 4 QCMD QSYS /01C8 RTVPNLSRCC QUATTRO 17300 /0164 RTVPNL QUATTRO _QRNP_PEP_RTVPNL RTVPNL QUATTRO 128900 RTVPNL QRNXIE QSYS 11 _QRNX_G_FC_H QRNXIE QSYS 2 _QRNX_DFT_ERROR QRNXIE QSYS 17 _QRNX_INQ QRNXIE QSYS 16 IトヌMヘキ
(4) エラー・ルッセージにD(=DUMP)で応答する。
(C G D F) 長さまたは開始桁はストリング操作の範囲外にある 応答を入力して,実行キーを押してください。 応答 . . . D
(5)RPG : のエラーのあったソース・ステートメンと行を確認する。
/FREE : 1289.00 %SUBST(WORD_DS.STRING:1:LEN2) = %SUBST(WUIK:POS:LEN2); : /END-FREE
(6) フィールド値に異常がないかとどうかを調べる。
この場合では異常値の可能性があるフィールドは LEN2またはPOSであるので
WRKOUTQ QEZDEBUG でこれらのフィールド値を調べる
スプール・ファイルの表示 ファイル . . . : QPPGMDMP 制御 . . . . . . 検索 . . . . . . *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9 ILE RPG 定様式ダンプ プログラム状況域 : プロシージャー名 . . . . . . . . . . : RTVPNL プログラム名 . . . . . . . . . . . . : RTVPNL ライブラリー . . . . . . . . . . . : QUATTRO モジュール名 . . . . . . . . . . . . : RTVPNL プログラム状況 . . . . . . . . . . . : 00100 (C G D F) 長さまたは開始桁はストリング操作の範囲外にある。 直前の状況 . . . . . . . . . . . . . : 00000 エラーのステートメント . . . . . . . : 00128900 : : LEN2C DS LEN2 UNS(5) 388 '0184'X POS INT(10) 1384 '00000568'X WORD_DS DS LEN BIN(4,0) 0388. '0184'X M PACKED(5,0) 00000. '00000F'X OFFSET CHAR(2) ' キ' '0567'X STRING CHAR(256) '
これによって
%SUBST(WORD_DS.STRING:1:LEN2) が WORD_DS.STRING 256桁を LEN2 = 388 がオーバーしていることが
わかった。
これがエラーの原因である。