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?

IBM (i) Bob RPGⅢプログラムをモダナイズしてみる ①5250対話型RPGⅢ→FFRPG変換

2
Last updated at Posted at 2026-02-27

プレビュー版なのでGA出荷版はまた変わってくるかもしれませんがかんたんに動かしてみたいと思います。
以下自分のメモの為、詳細にログしますので長くなってしまいます。いずれサマリーした記事も書ければなあ、と思います。

IBM (i) Bob の全般環境

以降書くであろう当シリーズ記事に共通の環境は以下です。差異がある場合は個別にコメントします。

IBM i 7.6
言語コード 2930  ※一般には2962が多いと思いますが影響は無いと思われます。
QCCSID 1399      ※5035の上位互換、5026や65535のシステムでは当記事通りにならない場合CCSIDを要チェック
ACS 1.1.9.11

当記事のTips

・RPGⅢ→FF RPG変換は問題無くできた(超シンプル対話型5250RPGⅢコード)
・RPGⅢソースをいったんIFS上のテキストファイルにコピペ(→さらにローカルダウンロード)してからBobで変換した
・変換結果のFF RPGソースコードをIFSにアップロードする際はCCSID 1208(UTF-8)になるようにした
・ILE RPGコンパイル時は現在はUTF8のターゲットCCSIDが指定NGなため、1399を指定した
・ACS 1.1.9.11時点でUTF-8でのテキストファイルUPLOADは日本語が文字化けした(設定ミスORバグ?)

RPGⅢの対話型プログラムをFF RPGに変換してみる

バッチ型からやろうとしてたのですが誤って(^^;対話型を流してしまいました(^^;。トークン(と電気)がもったいないのでこのままやってしまいます。

1.RPGⅢの処理概要確認

下図はパワポで書きましたw。

image.png

1.5250画面ファイル(IPH110S)をU/Iとして検索キー入力(PANEL01)と結果出力(PANEL02)を行います。
2.RPGⅢ(IPH110)は検索キーでDb2 for iテーブル(TOKMSP)の該当レコードを取得します。さらに 信用限度額 ー 売掛金 を計算し(差額 欄)出力します。
3.Db2 for i は参照のみでレコード更新はありません

2.RPGⅢのソースコード確認

ご存じのようにRPGⅢ(OPMプログラム=RPGⅢ、OPM COBOL(ILEでないCOBOL)、CLP(ILEでないCLP)はソースコードをIBM i のソース物理ファイル(SRCPF)に作成しないとコンパイルが出来ません。BobでSRCPFからコンパイルも工夫すればできると思いますが、いったんFF RPG変換を確認したいので、SRCPF上のRPGⅢをテキストファイル(IBM i ならIFS上、またはWindows上)にコピペしたものを開始点として使用します。

上記のようにSRCPFからコピペしたソースコードがこちら

     H            Y
     F* IPH110 * 得意先照会
     FIPH110S CF  E                    WORKSTN
     FTOKMSL01IF  E           K        DISK
     C                     DO   *HIVAL
     C*PANEL01の表示
     C                     EXFMTPANEL01
     C           *IN03     IFEQ '1'
     C                     SETON                     LR
     C                     RETRN
     C                     END
     C*得意先マスターの読み取り
     C           S1TOKB    CHAINTOKMSL01             30
     C           *IN30     IFEQ '0'
     C*画面フィールドセット
     C                     MOVELTKNAKJ    S2NAKJ
     C                     MOVELTKADR1    S2ADR1
     C                     MOVELTKADR2    S2ADR2
     C                     MOVELTKTIKU    S2TIKU
     C                     MOVELTKPOST    S2POST
     C                     MOVELTKGEND    S2GEND
     C                     MOVELTKUZAN    S2UZAN
     C*差額計算
     C           TKGEND    SUB  TKUZAN    S2GAKU
     C*PANEL02の表示
     C                     SETOF                     30
     C                     WRITEPANEL01
     C                     EXFMTPANEL02
     C           *IN03     IFEQ '1'
     C                     SETON                     LR
     C                     RETRN
     C                     ENDIF
     C*
     C                     ENDIF
     C                     ENDDO

※念のため注:このテキストファイルをそのままコンパイルしてRPGⅢは作成できません。(RPGⅢ(OPM)のコンパイラーはテキストファイルをインプットとしてコンパイルできないから。
※RPGⅢ 固定フォームRPGⅣ(固定フォームILE RPG)のソースは桁位置に意味があるのでPCエディターの フォントはターミナル など固定幅のフォント使用が推奨です↓(例)。
image.png

3.BobにFree-form RPG変換を指示したプロンプト

BobのモードをCodeモードにしてimage.png

指示したプロンプトはこちら。

Convert the RPG III source code
D:\DEMO\PGM_SOURCE\RPG\IPH110.txt
to Free-form RPG and save it in
D:\DEMO\PGM_SOURCE\ILERPG\IPH110FF.txt

揺らぎなく確実・無駄なく指示、の観点では上記でよいのではと思います。(業務利用時はいろいろ工夫あると思いますがいったんは)

何で英語?は単に興味です、というのと、日本語より英語の方が(正しく記述すれば)言語としての揺らぎが少ない=確実・処理も速い(消費トークンも少ない)かもしれないという推測です。
完全に同一の問いを英語・日本語などで投げて上記を確認したデータ、何てあればどなたか教えてください。。(^^;
一応日本語のプロンプトだとこちらになると思います。

RPGⅢソースコード
D:\DEMO\PGM_SOURCE\RPG\IPH110.txt
をFree-form RPGに変換して
D:\DEMO\PGM_SOURCE\ILERPG\IPH110FF.txt
に保管してください。

4.BobがFF RPG変換した結果とBobの変換コメント

こちらです。

**FREE

// IPH110 * 得意先照会 (Customer Inquiry)
// Converted from RPG III to Free-form RPG

Ctl-Opt DftActGrp(*No) ActGrp(*New) Option(*SrcStmt:*NoDebugIO);

// File Declarations
Dcl-F IPH110S WorkStn IndDs(Indicators);
Dcl-F TOKMSL01 Keyed Usage(*Input) ExtDesc('TOKMSL01');

// Indicator Data Structure
Dcl-Ds Indicators;
  Exit Ind Pos(3);
  NotFound Ind Pos(30);
End-Ds;

// Main Processing Loop
Dow '1' = '1';  // Equivalent to DO *HIVAL
  
  // PANEL01の表示 (Display PANEL01)
  ExFmt PANEL01;
  
  If Exit;
    *InLR = *On;
    Return;
  EndIf;
  
  // 得意先マスターの読み取り (Read Customer Master)
  Chain S1TOKB TOKMSL01;
  NotFound = Not %Found(TOKMSL01);
  
  If Not NotFound;
    // 画面フィールドセット (Set screen fields)
    S2NAKJ = %TrimR(TKNAKJ);
    S2ADR1 = %TrimR(TKADR1);
    S2ADR2 = %TrimR(TKADR2);
    S2TIKU = %TrimR(TKTIKU);
    S2POST = %TrimR(TKPOST);
    S2GEND = TKGEND;
    S2UZAN = TKUZAN;
    
    // 差額計算 (Calculate difference)
    S2GAKU = TKGEND - TKUZAN;
    
    // PANEL02の表示 (Display PANEL02)
    NotFound = *Off;
    Write PANEL01;
    ExFmt PANEL02;
    
    If Exit;
      *InLR = *On;
      Return;
    EndIf;
    
  EndIf;
  
EndDo;

上記の結果と一緒に下記のような実行ログメッセージがbobチャットウィンドウ上に出力されました。
image.png
以下にコピペします

Successfully converted RPG III source code to Free-form RPG format.

Conversion Summary:

Source: D:\DEMO\PGM_SOURCE\RPG\IPH110.txt
Target: D:\DEMO\PGM_SOURCE\ILERPG\IPH110FF.txt

Key Changes Made:

Header Specifications: Converted H-spec to **FREE format with Ctl-Opt directive
File Declarations: Converted F-specs to Dcl-F statements with modern syntax
Indicator Management: Created an indicator data structure for better readability
Control Structures:
DO *HIVAL → Dow '1' = '1'
IFEQ/IFNE → If/EndIf
CHAIN operation with %Found() built-in function
Operations:
MOVEL → Direct assignment with %TrimR() for string trimming
SUB → Standard subtraction operator (-)
SETON/SETOF → Direct indicator assignment
Code Organization: Added comments in both Japanese and English for clarity
Modern RPG Features: Used built-in functions like %TrimR() and %Found()
The converted program maintains the same logic flow as the original while using modern Free-form RPG syntax that is more readable and maintainable.

だいたいわかりますが日本語の方が楽なのでw翻訳しました。なるほど分かりやすい説明が付記されています。


RPG III ソースコードをフリーフォーム RPG 形式に正常に変換しました。

変換概要:
ソース: D:\DEMO\PGM_SOURCE\RPG\IPH110.txt
ターゲット: D:\DEMO\PGM_SOURCE\ILERPG\IPH110FF.txt

主な変更点:
ヘッダー仕様: H仕様をCtl-Optディレクティブを含む**FREE形式に変換
ファイル宣言: F仕様を最新の構文を持つDcl-F文に変換
インジケータ管理: 可読性向上のため、インジケータデータ構造を作成

制御構造:
DO *HIVAL → Dow '1' = '1'
IFEQ/IFNE → If/EndIf
CHAIN演算 (組み込み関数%Found()を使用)
演算:
MOVEL → 文字列トリミングのための%TrimR()による直接代入
SUB → 標準的な減算演算子(-)
SETON/SETOF → インジケータの直接代入

コード構成: 分かりやすさを考慮し、日本語と英語のコメントを追加
最新のRPG機能: 以下のような組み込み関数を使用%TrimR() と %Found()
変換されたプログラムは、元のプログラムと同じロジックフローを維持しながら、より読みやすく保守性の高い最新のフリーフォームRPG構文を使用しています。

5.Bobが生成したFF RPGソースコードをUPLOADする①

3.のFF RPGのソーステキストをIFSにUPLOADしてコンパイルしてみます。
この辺も色々なやり方で自動化できますが、今回は手動コピーです。
IFSパスは /home/GOMA/PGM_SOURCE/ILERPG としました。
ACSのIFSブラウザーからUPLOADしました。
image.png

この時、UTF-8に変換、というオプションもありますが、いったんチェック無しでUPLOADします。image.png

UPLADしたファイルをPCエディター、5250のIFSエディターで見ると、IFSエディターで文字化けしました。
IFSにUPLOADしたファイルのCCSIDが1041(日本語PC拡張)でした。*
image.png

※参考:IBM i のサポートするCCSID

このままでは日本語が化けると予想されるので再度UPLOADしなおしてみます。上の方のACS IFSブラウザーのUTF-8をチェックしたところ、PCエディター、IFSエディターとも日本語が化けたため(バグ?設定?不明でした)、別な方法でUPLOADしました。(具体的にはCCSID1208のファイルを先に作成しておき、エディターでソースコードをコピペ)

6.Bobが生成したFF RPGのソースコードをコンパイルする

コンパイルコマンド手順はこちら。5250から実行しました。

** 1. ADDLIBLE で使用するファイルを参照可能に
ADDLIBLE DEMOLIB_B

** 2. コンパイル 注1
CRTBNDRPG PGM(DEMOLIB_G/IPH110FF) 
SRCSTMF('/home/GOMA/PGM_SOURCE/ILERPG/IPH110FF') TGTCCSID(1399) 

**注1 TGTCCSID(1399) は今回のIFS上のソースコードがUTF-8ユニコード属性のためです。(現時点でターゲットCCSID=プログラム実行時のデフォルトCCSID値にUTF-8は指定不可なため、1399,5035,(5026)等を指定する必要があります。

コンパイルはエラーなしであっさり通りました。

7. Bobが変換したFF RPGを実行してみる

CALL IPH110FF

CRTBNDRPG PGM(DEMOLIB_G/IPH110FF) SRCSTMF('/home/GOMA/PGM_SOURCE/ILERPG/I
PH110FF') PGMINFO(*PCML) INFOSTMF('/HOME/GOMA/PCML/IPH110FF.PCML') TGTCCS
ID(1399)

PANEL01
image.png

キー入力してエンターキー
PANEL02
image.png

正常系はOKですね。
エラー時は、、
存在しない得意先番号、、もエラーが出ました。(正常です)
image.png

結論:FF RPGへのリファクタリングはできました(超シンプルケース)

複雑な処理ロジックの場合はこの限りではないかもしれませんがいったんは使い物になりそうです。

次に5250 RPGをバッチ型プログラムに変換 しました。

2
0
2

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?