1. はじめに
私は IBM i 若手技術者コミュニティ「IBM i RiSING」のBチームに所属しています。
Bチームでは 「RPGⅢからRPGⅣへのコンバート」 をテーマに活動しています。
メンバー全員がRPGは初心者。右も左もわからないところから、調べたり試したりしながら勉強会形式で研究を進めてきました。
この記事では、私たちが実際にやってみた中で得られたことをまとめています。
- RPGⅢからⅣにコンバートする方法
- コンバート中にうまくいかなかった点と解決策
- RPGⅢとRPGⅣのソース比較
「RPGⅢの資産をRPGⅣに置き換えたい」「どんな違いがあるのか知りたい」と思っている方にとって、少しでも参考になれば嬉しいです。
対象システムや環境の概要
| 接続先 | PUB400 |
| エミュレーター | IBM i Access Client Solutions (ACS) |
| 言語 | RPGⅢ、RPGⅣ(ILE RPG) |
| 対象ソース | 「System i 自習書 実習ライブラリーQEOL」のプログラム(IPH220) |
| ローカル環境 | Windows 11 |
※対象ソースについての詳細は、下記のまとめ記事をご覧ください。
IPH220.rpgのソースコード読み解きとコンパイル
2. RPGⅢとRPGⅣの違いざっくりまとめ
「RPGⅢとRPGⅣって、実際に何が違うの?」ということで、
調べた内容をまとめてみました。
| RPGⅢ | RPGⅣ (ILE RPG) | |
|---|---|---|
| コード形式 | 固定形式 | フリーフォーマット対応 |
| 変数定義 | 桁数・型をカラムに合わせて記述 | D仕様書での定義で柔軟に記述可能、型も豊富 |
| 命令仕様 |
C F I Oなど各仕様がカラムごとに固定 |
C F D など統合され、記述がシンプル |
| SQL記述 | 固定位置に記述し、長いSQLが書きにくい | フリーフォームで記述でき、長いSQLもそのまま記述可能 |
| 配列・構造体 | 固定長配列のみで、構造体配列やネスト構造は不可 | 可変長配列・構造体配列・ネスト構造が使用可能 |
| モジュール化 | 基本モノリシック(大きなプログラムになりがち) | ILE対応でプロシージャやモジュール分割が可能 |
| 保守性 | 可読性が低く、属人化しやすい | 自由度が高く、保守・改修がしやすい |
個人的には、
- PRGⅢ:桁位置などを一度覚えてしまえば、読みやすい
- RPGⅣ:RPGⅢよりも自由度が高く、できることが多い
というイメージです。
3. コンバート手順(実際にやったこと)
① コンバートしたソースを格納するソースファイルの作成
下記コマンドを実行してソースファイルを作成します。
CRTSRCPF FILE(ライブラリ名/QEOLRPGLE) RCDLEN(112)
※112長のソースファイルが既にある場合は作成不要。
⚠️112長のソースファイルを作成せずコンバートをした場合、下記エラーが出て失敗するので、必ず先に作成してください。

② コンバート
下記コマンドを実行し、RPGⅢからRPGⅣへコンバートをします。
CVTRPGSRC FROMFILE(変換元ライブラリー/QEOLRPG) FROMMBR(IPH220)TOFILE(変換先ライブラリー/QEOLRPGLE) LOGFILE(*NONE)
4. うまくいかなかった点と解決策
前述のコマンドを実行する際に、うまくいかなかった点がありました。
- コンバートはできたが日本語部分のみ文字化けになる。
H DATEDIT(*YMD)
F*****************************************************************
F*??<?????7?P???B?[?w?(???J?????b???)?IPH220
F*****************************************************************
FIPH220S CF E WORKSTN
F SFILE(PANEL81:RRN01)
FJUMIDP UF A E K DISK
FJUMEIP O A E K DISK
FTOKMSP IF E K DISK
FHINMSP IF E K DISK
D*****************************************************************
D @MSG S 20 DIM(1) CTDATA PERRCD(1)
C*****************************************************************
C*??????????j???7?
C*****************************************************************
C @START TAG
C SETOFF 35
C WRITE PANEL02
C EXFMT PANEL01
C*??(?F?3?{???????j?n?g?)?
C *IN03 IFEQ '1'
C SETON LR
C RETURN
C END
C*??(?<?????S?t.??k?????h?)?
C SETOFF 30
C CHUBAN CHAIN JUMIDP 50
C *IN50 IFEQ '0'
C SETON 30
C GOTO @START
C END
C*??(?Y???s???S?k?????h?)?
C TOKBAN CHAIN TOKMSP 31
C *IN31 IFEQ '1'
C GOTO @START
C END
C*****************************************************************
C*??w?????7???j?{???
C*****************************************************************
C*??(?????????{???)?
C SETON 35
C WRITE PANEL01
C WRITE PANEL02
C*??(???J?????b?????.???S?X?)?
C Z-ADD 0 RRN01
C MOVE *BLANK HINBAN
C MOVE *ZERO SURYO
C MOVE *ZERO TANKA
C MOVE *BLANK HNNAKJ
C SETOFF 51
C *IN51 DOWEQ '0'
C ADD 1 RRN01
C MOVE RRN01 RRNS
C WRITE PANEL81 51
C END
C*??(???J?????b?????{???)?
C @DSP81 TAG
C SETON 41
C EXFMT PANEL91
C SETOFF 41
C*??(?F?3?{???????j?n?g?)?
C *IN03 IFEQ '1'
C SETON LR
C RETURN
C END
C*??(?F?5?{???????j?n?g?)?
C *IN05 IFEQ '1'
C EXSR ¥CLEAR
C GOTO @START
C END
C*
C EXSR ¥CHECK
C*??(???u?g???{???????j?n?g?)?
C *IN08 IFEQ '0'
C WKERR ORGT 0
C GOTO @DSP81
C END
C*??(?F?8?{???????j?n?g?)?
C EXSR ¥WRITE
C EXSR ¥CLEAR
C GOTO @START
C*****************************************************************
C*??h???a???????J?????k?]?
C*****************************************************************
C ¥CLEAR BEGSR
C SETON 42
C WRITE PANEL91
C SETOFF 42
C MOVE *BLANK TKNAKJ
C MOVE *BLANK TKADR1
C MOVE *BLANK TKADR2
C ENDSR
C*****************************************************************
C*??k?????h?????J?????k?]?
C*****************************************************************
C ¥CHECK BEGSR
C Z-ADD 0 WKERR 3 0
C Z-ADD 1 RRN01 1 0
C*
C SETOFF 52
C *IN52 DOWEQ '0'
C RRN01 CHAIN PANEL81 52
C *IN52 IFEQ '0'
C MOVE *BLANK HNNAKJ
C HINBAN IFNE *BLANK
C HINBAN CHAIN HINMSP 32
C TANKA IFEQ 0
C Z-ADD HNTEIK TANKA
C END
C *IN32 IFEQ '1'
C MOVE @MSG(1) HNNAKJ
C ADD 1 WKERR
C END
C*
C END
C UPDATE PANEL81
C END
C ADD 1 RRN01
C END
C ENDSR
C*****************************************************************
C*??????????????????J?????k?]?
C*****************************************************************
C ¥WRITE BEGSR
C Z-ADD 0 JHKING
C Z-ADD 0 JHGYOS
C*
C Z-ADD 0 RRN01
C SETOFF 53
C *IN53 DOWEQ '0'
C ADD 1 RRN01
C RRN01 CHAIN PANEL81 53
C *IN53 IFEQ '0'
C HINBAN IFNE *BLANK
C MOVE CHUBAN JDCHUB
C MOVE TOKBAN JDTOKB
C MOVE HINBAN JDHINB
C Z-ADD SURYO JDSURY
C Z-ADD TANKA JDUTAN
C JDSURY MULT JDUTAN JDKING
C Z-ADD RRN01 JDGYOB
C WRITE JUMEIR
C ADD 1 JHGYOS
C ADD JDKING JHKING
C END
C END
C END
C*
C MOVE CHUBAN JHCHUB
C MOVE TOKBAN JHTOKB
C MOVE CHUBI JHDATE
C WRITE JUMIDR
C ENDSR
**
??}???d?[???
【原因】
コンバート時にTOFILEで指定したファイルが、日本語対応(CCSID 1399)していなかったため。
【解決方法】
以下コマンドにて、新しくソースファイルを作成し、コンバートしなおして解消。
CRTSRCPF FILE(ライブラリー名/新ファイル名) RCDLEN(数値(長さ)) IGCDTA(*YES) TEXT('テキスト名') CCSID(1399)
5.コンバート結果
H DATEDIT(*YMD)
F*****************************************************************
F*受注入力プログラム(サブファイル)IPH220
F*****************************************************************
FIPH220S CF E WORKSTN
F SFILE(PANEL81:RRN01)
FJUMIDP UF A E K DISK
FJUMEIP O A E K DISK
FTOKMSP IF E K DISK
FHINMSP IF E K DISK
D*****************************************************************
D @MSG S 20 DIM(1) CTDATA PERRCD(1)
C*****************************************************************
C*見出し画面入力
C*****************************************************************
C @START TAG
C SETOFF 35
C WRITE PANEL02
C EXFMT PANEL01
C*(F3が押されたとき)
C *IN03 IFEQ '1'
C SETON LR
C RETURN
C END
C*(受注番号重複チェック)
C SETOFF 30
C CHUBAN CHAIN JUMIDP 50
C *IN50 IFEQ '0'
C SETON 30
C GOTO @START
C END
C*(得意先番号チェック)
C TOKBAN CHAIN TOKMSP 31
C *IN31 IFEQ '1'
C GOTO @START
C END
C*****************************************************************
C*明細入力画面表示
C*****************************************************************
C*(見出し再表示)
C SETON 35
C WRITE PANEL01
C WRITE PANEL02
C*(サブファイルの初期設定)
C Z-ADD 0 RRN01
C MOVE *BLANK HINBAN
C MOVE *ZERO SURYO
C MOVE *ZERO TANKA
C MOVE *BLANK HNNAKJ
C SETOFF 51
C *IN51 DOWEQ '0'
C ADD 1 RRN01
C MOVE RRN01 RRNS
C WRITE PANEL81 51
C END
C*(サブファイルの表示)
C @DSP81 TAG
C SETON 41
C EXFMT PANEL91
C SETOFF 41
C*(F3が押されたとき)
C *IN03 IFEQ '1'
C SETON LR
C RETURN
C END
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
C*****************************************************************
C*クリアー・サブルーチン
C*****************************************************************
C ¥CLEAR BEGSR
C SETON 42
C WRITE PANEL91
C SETOFF 42
C MOVE *BLANK TKNAKJ
C MOVE *BLANK TKADR1
C MOVE *BLANK TKADR2
C ENDSR
C*****************************************************************
C*チェック・サブルーチン
C*****************************************************************
C ¥CHECK BEGSR
C Z-ADD 0 WKERR 3 0
C Z-ADD 1 RRN01 1 0
C*
C SETOFF 52
C *IN52 DOWEQ '0'
C RRN01 CHAIN PANEL81 52
C *IN52 IFEQ '0'
C MOVE *BLANK HNNAKJ
C HINBAN IFNE *BLANK
C HINBAN CHAIN HINMSP 32
C TANKA IFEQ 0
C Z-ADD HNTEIK TANKA
C END
C *IN32 IFEQ '1'
C MOVE @MSG(1) HNNAKJ
C ADD 1 WKERR
C END
C*
C END
C UPDATE PANEL81
C END
C ADD 1 RRN01
C END
C ENDSR
C*****************************************************************
C*レコード書出しサブルーチン
C*****************************************************************
C ¥WRITE BEGSR
C Z-ADD 0 JHKING
C Z-ADD 0 JHGYOS
C*
C Z-ADD 0 RRN01
C SETOFF 53
C *IN53 DOWEQ '0'
C ADD 1 RRN01
C RRN01 CHAIN PANEL81 53
C *IN53 IFEQ '0'
C HINBAN IFNE *BLANK
C MOVE CHUBAN JDCHUB
C MOVE TOKBAN JDTOKB
C MOVE HINBAN JDHINB
C Z-ADD SURYO JDSURY
C Z-ADD TANKA JDUTAN
C JDSURY MULT JDUTAN JDKING
C Z-ADD RRN01 JDGYOB
C WRITE JUMEIR
C ADD 1 JHGYOS
C ADD JDKING JHKING
C END
C END
C END
C*
C MOVE CHUBAN JHCHUB
C MOVE TOKBAN JHTOKB
C MOVE CHUBI JHDATE
C WRITE JUMIDR
C ENDSR
**
品番エラー
6. ソースの比較
コンバートすると、ソースの記述方法の変更が数か所ありました。
各仕様書ごとに下記にまとめました。
H仕様書
- ジョブ日付の形式
H Y
H DATEDIT(*YMD)
F仕様書
- サブファイルに関する記述方法
F RRN01 KSFILE PANEL81
F SFILE(PANEL81:RRN01)
- ファイル追加(A)の記述位置
FJUMIDP UF E K DISK A
FJUMEIP O E K DISK A
FJUMIDP UF A E K DISK
FJUMEIP O A E K DISK
E仕様書
- D仕様書への変更
- 配列の記述方法
E @MSG 1 1 20
D @MSG S 20 DIM(1) CTDATA PERRCD(1)
C仕様書
- 演算命令
C SETOF 35
C RETRN
C UPDATPANEL81
C SETOFF 35
C RETURN
C UPDATE PANEL81
7. コンバートして感じたこと
〇良い点
- 演算命令などの桁数が拡張されている分、
余白が増えてソースが若干見やすくなった。 -
SETOFFやRETURN、UPDATEなど、略されていないので、
直感的に何を示しているか、わかりやすくなった。
×まだ課題だと感じた点
- コンバートしただけでは、ロジックや命令語レベルでは大きな違いは見られなかったため、RPGⅣの自由度を活かすためには、コンバート後に手修正が必要だと感じた。
- シンプルな処理内容のプログラムであれば「RPGⅢのままでも十分では?」と感じる部分もあった。
今回コンバートしたソースはシンプルな処理だったため、
逆に言えば、複雑な処理や保守性が求められるソースほど、RPGⅣへの移行によるメリット(可読性や拡張性の向上)を実感しやすいのかもしれません。
(おまけ)コンバートしたソースをそのままコンパイルしたらどうなる?
過去にRPGⅢからⅣへコンバートした際、変換直後のソースをそのままコンパイルするとエラーになることがありました。
もし実際にRPGⅢからⅣへ移行を検討する場合、
「コンバート→即コンパイル」では通らない可能性があるため、一定の修正作業は避けられないのでは…?
早速コンパイルしてみた。
変換したRPGⅣのソースをコンパイルかけると、予想通りコンパイルエラーが2件。
The factor 1 field-name entry is not valid.
「ファクタ1に指定したフィールド名が不正です」
The factor 2 entry is not valid.
「ファクタ2の記述が不正です」
コンパイルリストを見ると、どうやらサブルーチン名の「¥」が引っかかっているそう。
ただ、コンバートする前と同じコンパイルエラーだったため、
コンバートすることでコンパイルエラーが出たわけではなさそうです。
(RPGⅢのソースをコンパイルしてみた記事もあるので、良ければ参考にしてください。)
【結果】修正作業が必要ない場合もある!
ただ、様々なソースで検証の必要があると思いました。
8. まとめ
- コンバートしただけでは、ソース内容には大きな違いはなかった。
とはいえ、RPGⅣにコンバートすると、できることの幅は広がるようですので、
コンバートして終了!ではなく、そこからさらに手を加えてみて、RPGⅣの良さを享受したいと思います。
これからやってみる方へ
コマンドを実行すると簡単に変換はできますが、
RPGⅣの良さを活かしたいのであれば、手修正が必要です。
コンバート後のRPGⅣのソースを手修正してみた記事もありますので、ご参考いただければと思います。
次はこちら>>>RPGIVの書き方に書き換え・比較
9. 参考資料
RPG ⅢとRPG Ⅳのコーディングの違い ~連載|RPG Ⅳの魅力と可能性◎第1回
https://www.imagazine.co.jp/imagazine-3582/
RPG ⅢとILE RPGのソースをARCAD Transformer RPGでFFRPGに変換する ~FFRPG変換サービス
https://www.imagazine.co.jp/ffrpg-transformation-service/
当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。