2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IPH220.rpgのソースコード読み解きとコンパイル

Posted at

1. はじめに

この記事は2025年に2回目の開催となった「IBM i RiSING」にBチームとして参加した際の活動を記録したものになります。

IPH220というRPGⅢのソースコードの読み解きとコンパイルをPUB400に接続して行いました。
前提として、QEOLライブラリー導入用保管ファイル qeol.savf をPUB400に移行後、IPH220の確認を行います。

2. IPH220のプログラム概要

IPH220は受注入力のプログラムです。
画面表示ファイル(IPH220S)や得意先データなどいくつかのファイルを参照しています。

image.png

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Ⅲ)

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などサブルーチンの処理で記述があります。

IPH220 (例.解決前抜粋)
     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を入力することでソースコードの編集が可能になり、#に変更します。

IPH220 (例.解決後抜粋)
     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に帰属します。
詳細はこちらを参照ください。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?