RPG言語 網羅ガイド(学習用)

このページは IBM i / AS/400 文脈で使われる RPG(RPG IV / ILE RPG)を、学習用途で全体像から実装実務まで整理した解説です。完全仕様書ではなく、実務に必要な構文・設計観点を優先してまとめています。

1. RPGとは

  • RPG は IBM i 上で長く使われてきた業務アプリケーション言語です。
  • 現代実務では free-form RPG(自由形式)中心で、固定形式は保守対象として残ることが多いです。
  • 典型用途は、受注・在庫・会計などの業務トランザクション処理です。

2. 言語の全体構造

宣言

  • DCL-S: 単純変数
  • DCL-DS: 構造体(データ構造)
  • DCL-PR / DCL-PI: 手続きインターフェース

制御構文

  • IF / ELSE / ENDIF
  • SELECT / WHEN / OTHER / ENDSL
  • DOW / ENDDO, FOR / ENDFOR

入出力

  • READ/CHAIN/SETLL(ファイル)
  • WRITE/UPDATE/DELETE(更新)
  • EXFMT(画面I/O)

組み込み関数(BIF)

  • %TRIM, %SUBST, %LEN
  • %CHAR, %INT, %DEC
  • %DATE, %TIME, %TIMESTAMP

3. 最低限覚える free-form 文法

dcl-s custNo char(10);
dcl-s custName varchar(50);
dcl-s qty packed(7:0);

if %trim(custNo) = '1001';
  custName = 'KURUMON';
else;
  custName = 'UNKNOWN';
endif;

for i = 1 to 3;
  dsply ('LOOP=' + %char(i));
endfor;
  • 文末は基本的に ; 必須。
  • 比較は =, <>, >, < を使う。
  • 文字列連結は + を使う実装例が多い(環境により差異あり)。

4. データ型の実務観点

文字

  • CHAR(n): 固定長
  • VARCHAR(n): 可変長
  • 比較前に %TRIM を使い末尾空白を除去

数値

  • PACKED(p:s): 金額・数量の定番
  • ZONED: レガシー互換で出る
  • INT: カウンタ用途

日付時刻

  • DATE/TIME/TIMESTAMP 型を優先
  • 文字列比較ではなく型比較を使う

5. 画面(5250 / DDS)との関係

  • 従来は DDS で画面定義(行・列・属性)を行い、RPG から EXFMT で入出力。
  • 本サイトの AS/400 モジュールでは DDS 完全再現ではなく、JSON 画面定義で同等の学習体験を提供。
  • 実務で重要なのは「保護項目」「入力項目」「Fキー分岐」「エラー表示位置」の一貫性。

6. レガシー資産でよく出る要素

  • 固定形式(C/F/D仕様)と自由形式の混在
  • Indicator(*INxx)ベース分岐
  • 外部ファイル記述・複数物理ファイル連携
  • サブルーチン(BEGSR/ENDSR)から手続き化への移行課題

7. 代表的な処理テンプレート

検索系(存在確認)

setll key CustMst;
chain key CustMst;
if %found(CustMst);
  // 取得成功
else;
  // 未存在
endif;

更新系(楽観的でなく逐次更新)

chain key OrderMst;
if %found(OrderMst);
  status = 'DONE';
  update OrderRec;
endif;

8. パフォーマンス観点

  • ファイルI/O回数を減らす(不要な CHAIN 連発を避ける)
  • ループ内BIFの重複計算を変数に退避
  • 画面往復(EXFMT)を最小化し、入力検証を整理
  • SQL化する場合は索引とアクセスパスを先に設計

9. セキュリティ観点

  • 入力値の形式チェック(桁・型・許容文字)を画面受領直後に実施
  • 監査ログ(誰が・いつ・何を更新)を必ず記録
  • 権限に応じて機能分岐(照会のみ/更新可能)を明確化
  • 外部連携時は SQL/コマンド文字列の組み立てを固定化し、インジェクション余地を消す

10. 学習ロードマップ

  1. free-form 構文(宣言/IF/LOOP/BIF)を習得
  2. 画面I/O(入力検証、Fキー分岐)を実装
  3. ファイルI/O(READ/CHAIN/UPDATE)を実装
  4. 手続き化(PR/PI)で責務分離
  5. 既存固定形式コードの読み替え訓練

11. このサイトでの対応範囲

  • 実装済み: 5250風端末UI、画面定義JSON、RPGサブセット実行(学習用途)
  • 次段階: セッションログ保存、変数スナップショット、シナリオ拡張
  • 将来: Rust実行エンジン連携、DDS風定義との相互変換