1. はじめに
この記事は2025年に2回目の開催となった「IBM i RiSING」にBチームとして参加した際の活動を記録したものになります。
IPH220というRPGⅢのソースコードの読み解きとコンパイルをPUB400に接続して行いました。
前提として、QEOLライブラリー導入用保管ファイル qeol.savf をPUB400に移行後、IPH220の確認を行います。
2. IPH220のプログラム概要
IPH220は受注入力のプログラムです。
画面表示ファイル(IPH220S)や得意先データなどいくつかのファイルを参照しています。
3. IPH220の確認手順
① PUB400ログイン後、5250画面(メインメニュー)でCHGJOB CCSID(1399)を実行します。
※CHGJOB CCSID(1399)を実行しないとソースコードの文字化けが起こりました。
② 5250画面(メインメニュー)でSTRPDMを実行後、1(ライブラリーの処理)を選択します。
→ qeol.savf を復元したライブラリーを指定します。
③ ライブラリー処理画面でOPT:12を入力後、QEOLRPGファイル内(OPT:12入力)のIPH220をOPT:5を入力して表示の確認を行います。
4. IPH220のソースコード読み解き (RPGⅢ)
SRCDTA
H Y
F*****************************************************************
F*受注入力プログラム(サブファイル)IPH220
F*****************************************************************
FIPH220S CF E WORKSTN 画面表示
F RRN01 KSFILE PANEL81 サブファイル
FJUMIDP UF E K DISK A 受注見出しを更新
FJUMEIP O E K DISK A 受注明細を出力
FTOKMSP IF E K DISK 得意先マスタ
FHINMSP IF E K DISK 品番マスタ
E*****************************************************************
E @MSG 1 1 20
C*****************************************************************
C*見出し画面入力
C*****************************************************************
C @START TAG スタート
C SETOF 35 標識35をオフ
C WRITEPANEL02 PANEL02を書き出す
C EXFMTPANEL01 PANEL01の入出力
C*(F3が押されたとき)
C *IN03 IFEQ '1' F3押下で処理終了
C SETON LR
C RETRN
C END
C*(受注番号重複チェック)
C SETOF 30 標識30をオフ
C CHUBAN CHAINJUMIDP 50 CHUBANをキーにJUMIDPを読み込む
C *IN50 IFEQ '0' 標識50が0のとき
C SETON 30 標識30をオン
C GOTO @START スタートに移動
C END
C*(得意先番号チェック)
C TOKBAN CHAINTOKMSP 31 TOKBANをキーにTOKMSPを読み込む
C *IN31 IFEQ '1' 標識31が1のとき
C GOTO @START スタートに移動
C END
C*****************************************************************
C*明細入力画面表示
C*****************************************************************
C*(見出し再表示)
C SETON 35 標識35をオン
C WRITEPANEL01 PANEL01を書き出す
C WRITEPANEL02 PANEL02を書き出す
C*(サブファイルの初期設定)
C Z-ADD0 RRN01 相対レコード(RRN01)に0
C MOVE *BLANK HINBAN HINBAN・SURYO・TANKA・HNNAKJを初期値設定
C MOVE *ZERO SURYO
C MOVE *ZERO TANKA
C MOVE *BLANK HNNAKJ
C SETOF 51 標識51をオフ
C *IN51 DOWEQ'0' 標識51が0の間
C ADD 1 RRN01 相対レコード(RRN01)に1
C MOVE RRN01 RRNS
C WRITEPANEL81 51 PANEL81を書き出す
C END
C*(サブファイルの表示)
C @DSP81 TAG
C SETON 41 標識41をオン
C EXFMTPANEL91 PANEL91を表示
C SETOF 41 標識41をオフ
C*(F3が押されたとき)
C *IN03 IFEQ '1' ファンクションキー3を押下
C SETON LR 終了処理
C RETRN
C END
C*(F5が押されたとき)
C *IN05 IFEQ '1' ファンクションキー5を押下
C EXSR ¥CLEAR \CLEARサブルーチン実行
C GOTO @START スタートに移動
C END
C*
C EXSR ¥CHECK \CHECKサブルーチン実行
C*(実行キーが押されたとき)
C *IN08 IFEQ '0'
C WKERR ORGT 0 WKERRが0より大きいとき
C GOTO @DSP81 @DSP81に移動
C END
C*(F8が押されたとき)
C EXSR ¥WRITE \WRITEサブルーチン実行
C EXSR ¥CLEAR \CLEARサブルーチン実行
C GOTO @START スタートに移動
C*****************************************************************
C*クリアー・サブルーチン
C*****************************************************************
C ¥CLEAR BEGSR \CLEARサブルーチン開始
C SETON 42 標識42をオン
C WRITEPANEL91 PANEL91を書き出す
C SETOF 42 標識42をオフ
C MOVE *BLANK TKNAKJ TKNAKJ・TKADR1・TKADR2をブランク
C MOVE *BLANK TKADR1
C MOVE *BLANK TKADR2
C ENDSR クリアー・サブルーチン終了
C*****************************************************************
C*チェック・サブルーチン
C*****************************************************************
C ¥CHECK BEGSR \CHECKサブルーチン開始
C Z-ADD0 WKERR 30
C Z-ADD1 RRN01 10
C*
C SETOF 52 標識52をオフ
C *IN52 DOWEQ'0' 標識52が0の間
C RRN01 CHAINPANEL81 52
C *IN52 IFEQ '0' 標識52が0のとき
C MOVE *BLANK HNNAKJ HNNAKJはブランク
C HINBAN IFNE *BLANK HINBANがブランク以外のとき
C HINBAN CHAINHINMSP 32 HINBANをキーにHINMSPを読み込む
C TANKA IFEQ 0 TANKAが0のとき
C Z-ADDHNTEIK TANKA HNTEIK→TANKA
C END
C *IN32 IFEQ '1' 標識32が1のとき
C MOVE @MSG,1 HNNAKJ メッセージ表示(@MSG,1)
C ADD 1 WKERR エラー件数カウント
C END
C*
C END
C UPDATPANEL81 PANEL81の画面更新
C END
C ADD 1 RRN01 RRN01に1を追加
C END
C ENDSR チェック・サブルーチン終了
C*****************************************************************
C*レコード書出しサブルーチン
C*****************************************************************
C ¥WRITE BEGSR \WRITEサブルーチン開始
C Z-ADD0 JHKING JHKINGの初期値設定
C Z-ADD0 JHGYOS JHGYOSの初期値設定
C*
C Z-ADD0 RRN01 相対レコード(RRN01)に0
C SETOF 53 標識53をオフ
C *IN53 DOWEQ'0' 標識53が0の間
C ADD 1 RRN01 RRN01に1を追加
C RRN01 CHAINPANEL81 53 RRN01をキーにPANEL81を読み込む
C *IN53 IFEQ '0' 標識53が0のとき
C HINBAN IFNE *BLANK HINBANがブランクではないとき
C MOVE CHUBAN JDCHUB CHUBANをJDCHUBに移送
C MOVE TOKBAN JDTOKB TOKBANをJDTOKBに移送
C MOVE HINBAN JDHINB HINBANをJDHINBに移送
C Z-ADDSURYO JDSURY SURYO→JDSURY
C Z-ADDTANKA JDUTAN TANKA→JDUTAN
C JDSURY MULT JDUTAN JDKING JDSURY × JDUTAN = JDKING
C Z-ADDRRN01 JDGYOB RRN01→JDGYOB
C WRITEJUMEIR JUMEIRを書き出す
C ADD 1 JHGYOS 1をJHGYOSに追加
C ADD JDKING JHKING JDKINGをJHKINGに追加
C END 終了処理
C END
C END
C*
C MOVE CHUBAN JHCHUB CHUBANをJHCHUBに移送
C MOVE TOKBAN JHTOKB TOKBANをJHTOKBに移送
C MOVE CHUBI JHDATE CHUBIをJHDATEに移送
C WRITEJUMIDR JUMIDRを書き出す
C ENDSR レコード書出しサブルーチン終了
**
品番エラー
◆ IPH220の読み解きから分かること (RPGⅢ)
・標識を利用した処理が多い
・複数のサブルーチンを利用、それぞれ異なる処理を実行
・ソースコードのWKERRでエラー件数をカウント
5. IPH220のコンパイル (RPGⅢ)
5-1. コンパイル手順
① qeol.savf を復元したライブラリーを指定します。
② QEOLDSPファイル内(OPT:12入力)で画面表示プログラムのIPH220SをOPT:14入力でコンパイルを行います。
③ QEOLRPGファイル内(OPT:12入力)のIPH220をOPT:14入力でコンパイルを行います。
5-2. コンパイルエラー
IPH220をOPT:14入力でコンパイルしたとき、
The factor 1 field-name entry is not valid.
「ファクタ1に指定したフィールド名が不正です」
The factor 2 entry is not valid.
「ファクタ2の記述が不正です」
上記のエラーメッセージが表示されます。
5-3. コンパイルエラーの原因と解決策
【原因】IPH220のソースコードで¥が無効な名前と判断されています。
¥CLEARや¥CHECKなどサブルーチンの処理で記述があります。
C*(F5が押されたとき)
C *IN05 IFEQ '1'
C EXSR ¥CLEAR
C GOTO @START
C END
C*
C EXSR ¥CHECK
C*(実行キーが押されたとき)
C *IN08 IFEQ '0'
C WKERR ORGT 0
C GOTO @DSP81
C END
C*(F8が押されたとき)
C EXSR ¥WRITE
C EXSR ¥CLEAR
C GOTO @START
【解決】
¥を#に変更することでエラーが解決しました。
【変更手順】
① ライブラリー処理画面でOPT:12を入力後、QEOLRPGファイル内(OPT:12入力)のIPH220をOPT:2を入力します。
② OPT:2を入力することでソースコードの編集が可能になり、¥を#に変更します。
C*(F5が押されたとき)
C *IN05 IFEQ '1'
C EXSR #CLEAR
C GOTO @START
C END
C*
C EXSR #CHECK
C*(実行キーが押されたとき)
C *IN08 IFEQ '0'
C WKERR ORGT 0
C GOTO @DSP81
C END
C*(F8が押されたとき)
C EXSR #WRITE
C EXSR #CLEAR
C GOTO @START
6. まとめ
・IPH220のソースコードを表示する前にCHGJOB CCSID(1399)を実行します。
→ CHGJOB CCSID(1399)を実行することで文字化けを防ぐことができました。
・画面表示プログラムのIPH220Sをコンパイル後、IPH220のコンパイルを行います。
・IPH220をコンパイルするとエラーメッセージが表示されます。
→ ソースコード内の¥が原因で¥を#に変更することで解決しました。
◆ 感じた点
RPGⅢのソースコードを読み解いてみて、標識を利用した処理が多く複雑に思うところが多々ありました。
RPGⅣでは標識を利用しなくてもコードを記述することが可能なため、その点ではRPGⅣの方が比較的読みやすいのではないかと思いました。
続いて、【RPG初心者】RPGⅢをRPGⅣにコンバートしてみた! に繋がります。
よろしければ、他のメンバーの記事もぜひ読んでみてください。
Bチーム活動報告
7. 参考文献
System i 学習プログラム EOL | デジタル人材の育成をリードするアイ・ラーニング
https://www.i-learning.jp/it-skills/eol/
命令コード - IBM Documentation
https://www.ibm.com/docs/ja/i/7.3.0?topic=functions-operation-codes
当記事の著作権はIBMに帰属します。
詳細はこちらを参照ください。
