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?

【RPG初心者】RPGⅢをRPGⅣにコンバートしてみた!

Last updated at Posted at 2025-10-16

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長のソースファイルを作成せずコンバートをした場合、下記エラーが出て失敗するので、必ず先に作成してください。
image.png

② コンバート

下記コマンドを実行し、RPGⅢからRPGⅣへコンバートをします。

CVTRPGSRC FROMFILE(変換元ライブラリー/QEOLRPG) FROMMBR(IPH220)TOFILE(変換先ライブラリー/QEOLRPGLE) LOGFILE(*NONE)

4. うまくいかなかった点と解決策

前述のコマンドを実行する際に、うまくいかなかった点がありました。

  • コンバートはできたが日本語部分のみ文字化けになる。
IPH220(コンバート後)
     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.コンバート結果

IPH220
     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仕様書

  • ジョブ日付の形式
RPGⅢ
     H            Y
RPGⅣ
     H DATEDIT(*YMD)

F仕様書

  • サブファイルに関する記述方法
RPGⅢ
     F                                        RRN01 KSFILE PANEL81
RPGⅣ
     F                                     SFILE(PANEL81:RRN01)
  • ファイル追加(A)の記述位置
RPGⅢ
     FJUMIDP  UF  E           K        DISK                      A
     FJUMEIP  O   E           K        DISK                      A
RPGⅣ
     FJUMIDP    UF A E           K DISK
     FJUMEIP    O  A E           K DISK

E仕様書

  • D仕様書への変更
  • 配列の記述方法
RPGⅢ
     E                    @MSG    1   1 20
RPGⅣ
     D @MSG            S             20    DIM(1) CTDATA PERRCD(1)

C仕様書

  • 演算命令
RPGⅢ
     C                     SETOF                     35
     C                     RETRN
     C                     UPDATPANEL81
RPGⅣ
     C                   SETOFF                                       35
     C                   RETURN
     C                   UPDATE    PANEL81

7. コンバートして感じたこと

〇良い点

  • 演算命令などの桁数が拡張されている分、
    余白が増えてソースが若干見やすくなった。
  • SETOFFRETURNUPDATEなど、略されていないので、
    直感的に何を示しているか、わかりやすくなった。

×まだ課題だと感じた点

  • コンバートしただけでは、ロジックや命令語レベルでは大きな違いは見られなかったため、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に帰属します。詳細はこちらを参照ください。


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?