1. はじめに
本記事では、生成AI(ChatGPT)を活用して、RPGLE固定フォーマットを使ったプログラム開発にチャレンジした体験を紹介します。
RPGLE初心者が、ChatGPTをどのように活用して開発を進めたのか、実際のプロンプト例やコードも交えながらお伝えします。
2. 背景・動機
業務でAS400 (IBM i) の保守に関わることがある中で、RPGLEプログラムの構造や書き方を理解しておく必要性を感じていました。
ただし、RPGLEは古い言語であり、ネット上の情報も限られており、初心者が一から独学するにはハードルが高いです。
今回IBM-i RiSINGに参加し、自分と同じような業務状況のメンバーと交流する中で、生成AIを使えば効率的に学べるのでは?という話になり、ChatGPTを活用してRPGLEプログラムを作ることになりました。
生成AIの中でも特にChatGPTを選んだ理由は、一番メジャーであり、柔軟に会話できる点に期待したためです。
3. 使用した技術・環境
本記事で使用した技術や開発環境は以下の通りです。
言語:RPGLE(ILE RPG/固定長形式)
IBM i 上で動作するRPGプログラム。今回は固定長形式で記述。
実行環境:IBM i 7.5(AS400)
開発・実行環境として使用。
利用サーバー:pub400.com
IBM i を無料で体験できるパブリックサーバーを利用しました。
URL:https://pub400.com
開発ツール:IBM i Access Client Solutions(ACS)
IBM i への接続、操作、ソース編集、画面確認、コンパイル等に使用します。
特に 5250エミュレーター を用いて開発作業を実施しました。
生成AI:ChatGPT(使用時はGPT-4)
主にプロンプトベースでコード生成や質問への回答を得ながら開発を進めました。
4. 目標
以下の仕様で作成した取引先マスタの参照プログラムが、問題なく動作することです。
| 区分 | 内容 |
|---|---|
| 言語 | RPGLE固定フォーマット |
| ファイル | 取引先マスタ(TRMAST)、画面ファイル(DISP01) |
| 機能 | 参照 |
| ファンクションキー | F3:終了 F5:検索 |
| 各画面の機能と遷移 | G1:入力 → G1SFL:一覧 → G3:確認 |
5. プロンプトの実行とChatGPTの回答
以下の3つの質問に対応するプロンプトを用意します。
- 質問①:取引先マスタ照会プログラムの画面遷移と主な機能を提示する
- 質問②:画面ファイルのDDSソースの情報を提示する
- 質問③:取引先マスタの情報を提示する
質問①~③に相当するプロンプト①~③の内容は下記の通りです。
プロンプト⓵:
取引先マスタの照会プログラムを作成したいです。使用する言語はRPGLE固定フォーマットです。
画面遷移は下記を想定しています。
初期画面
取引先コード、支店コードの入力
第2画面
取引先コードで取引先マスタを検索
取引先コード、支店コード、取引先名をサブファイルで出力
エンターキー押下で第3画面へ進む
第3画面
取引先情報を照会できる画面を出力
ファンクションキーは以下の通りです
F3:終了
F5:取引先コード上で検索(取引先コードにセット)
プロンプト②:
画面ファイルの情報は下記のとおりです。
これに合わせて先ほどのプログラムを修正してください。
なお画面G2は今回使用しません。
画面ファイル
A DSPSIZ(24 80 *DS3)
A PRINT(*LIBL/QPRINT)
A**************************************************************************
A*画面1 *
A**************************************************************************
A R G1
A TEXT('画面1')
A CF03(03 '終了')
A CF05(05 '検索画面')
A OVERLAY
A 1 2'G1'
A G1DATE 16O 1 54
A 3 2'取引先コード:'
A G1TRCD 10A B 3 18
AO 30 31 DSPATR(RI)
AO 30 31 DSPATR(PC)
A 4 2'取引先支店コード:'
A G1TRSC 3A B 4 22
A G1NM01 50O O 3 30
A 23 2'F3 =終了'
A 23 14'F5 =検索'
A*
A**************************************************************************
A*SUB FILE *
A**************************************************************************
A R G1SFL SFL
A S1SLCT 1A B 10 2
A S1TRCD 10A O 10 4
A S1TRSC 3A O 10 18
A S1NM01 50O O 10 30
A*
A**************************************************************************
A*SUB FILE CONTROL *
A**************************************************************************
A R G1CTL SFLCTL(G1SFL)
A SFLSIZ(0011)
A SFLPAG(0010)
A CF03(03 '終了')
A CF12(12 '前画面')
A OVERLAY
A 40 SFLCLR
A 41 SFLDSPCTL
A 41 SFLDSP
A 7 2'----------------------------------+
A ----------------------------------+
A ----------'
A 8 3'取引先コード 支店コード +
A 取引先名称'
A 9 2'----------------------------------+
A ----------------------------------+
A ----------'
A*
A**************************************************************************
A*フッター *
A**************************************************************************
A R G1FTR
A 23 2'実行=選択'
A 23 17'F3 =終了'
A 23 29'F12 =前画面'
A 23 44'PGUP =次頁'
A 23 58'PGDN =前頁'
A*
A**************************************************************************
A*画面2 *
A**************************************************************************
A R G2 TEXT('画面2')
A CF03(03 '終了')
A CF05(05 '削除')
A CF12(12 '前画面')
A OVERLAY
A 1 2'G2'
A G2DATE 16O 1 54
A 3 2'取引先コード:'
A G2TRCD 10A O 3 18
A 4 2'取引先支店コード:'
A G2TRSC 3A O 4 22
A G2NM01 50O O 3 30
A 4 33'取引先略称:'
A G2NM02 20A B 4 47
A 6 6'郵便番号:'
A G2POST 7A B 6 18
A 7 6'住所1 :'
A G2ADR1 50O B 7 18
A 8 6'住所2 :'
A G2ADR2 50O B 8 18
A 9 6'住所3 :'
A G2ADR3 50O B 9 18
A 10 6'電話番号:'
A G2TELN 15A B 10 18
A 10 45'FAX番号:'
A G2FAXN 15A B 10 56
A 11 6'xーモan゙ロヌ :'
A G2MAIL 60A B 11 18
A 13 6'売上金額累計:'
A G2URKN 15S 2B 13 22
A 13 44'仕入金額累計:'
A G2SIKN 15S 2B 13 60
A 14 6'売掛残高 :'
A G2URZN 15S 2B 14 22
A 14 44'買掛残高 :'
A G2SIZN 15S 2B 14 60
A 16 6'銀行コード:'
A G2BKCD 4A B 16 20
A 16 36'銀行名:'
A G2BKNM 30O B 16 46
A 17 6'支店コード:'
A G2BRCD 3A B 17 20
A 17 30'口座区分:'
A G2KUBN 3A B 17 42
A 17 50'口座番号 :'
A G2ACCD 3A B 17 64
A 18 6'担当者名 :'
A G2TNTM 30O B 18 20
A 23 2'F3 =終了'
A 23 14'F5 =削除'
A 23 26'F12 =前画面'
A*
A**************************************************************************
A*画面3 *
A**************************************************************************
A R G3 TEXT('画面3')
A CF03(03 '終了')
A CF05(05 '削除')
A CF12(12 '前画面')
A OVERLAY
A 1 2'G3'
A G3DATE 16O 1 54
A 3 2'取引先コード:'
A G3TRCD 10A O 3 18
A 4 2'取引先支店コード:'
A G3TRSC 3A O 4 22
A G3NM01 50O O 3 30
A 4 33'取引先略称:'
A G3NM02 20A O 4 47
A 6 6'郵便番号:'
A G3POST 7A O 6 18
A 7 6'住所1 :'
A G3ADR1 50O O 7 18
A 8 6'住所2 :'
A G3ADR2 50O O 8 18
A 9 6'住所3 :'
A G3ADR3 50O O 9 18
A 10 6'電話番号:'
A G3TELN 15A O 10 18
A 10 45'FAX番号:'
A G3FAXN 15A O 10 56
A 11 6'xーモan゙ロヌ :'
A G3MAIL 60A O 11 18
A 13 6'売上金額累計:'
A G3URKN 15S 2O 13 22
A 13 44'仕入金額累計:'
A G3SIKN 15S 2O 13 60
A 14 6'売掛残高 :'
A G3URZN 15S 2O 14 22
A 14 44'買掛残高 :'
A G3SIZN 15S 2O 14 60
A 16 6'銀行コード:'
A G3BKCD 4A O 16 20
A 16 36'銀行名:'
A G3BKNM 30O O 16 46
A 17 6'支店コード:'
A G3BRCD 3A O 17 20
A 17 30'口座区分:'
A G3KUBN 3A O 17 42
A 17 50'口座番号 :'
A G3ACCD 3A O 17 64
A 18 6'担当者名 :'
A G3TNTM 30O O 18 20
A 23 2'F3 =終了'
A 23 14'F5 =削除'
A 23 26'F12 =前画面'
A*
プロンプト③:
取引先マスタの情報は下記のとおりです。
これに合わせて先ほどのプログラムを修正してください。
取引先マスタの設計書 ファイル名:TRMAST、レコード:TRMASTR
項番 キー フィールド名(物理) フィールドテキスト_JP(論理) フィールドテキスト_EN(論理) データ型 桁数 小数
1 K1 TRTRCD 取引先コード Customer Code A 10
2 K2 TRTRSC 取引先支店コード Customer Branch Code A 3
3 TRNM01 取引先名 Customer Name O 50
4 TRNM02 取引先略称 Customer Short Name A 20
5 TRPOST 郵便番号 Postal Code A 8
6 TRADR1 住所1 Address Line 1 O 50
7 TRADR2 住所2 Address Line 2 O 50
6 TRADR3 住所3 Address Line 3 O 50
8 TRTELN 電話番号 Phone Number A 15
9 TRFAXN FAX番号 Fax Number A 15
10 TRMAIL メールアドレス Email Address A 60
11 TRURKN 売上金額累計 Total Sales Amount S 15 2
12 TRSIKN 仕入金額累計 Total Purchas Amount S 15 2
13 TRURZN 売掛残高 Accounts Receivable S 15 2
14 TRSIZN 買掛残高 Accounts Payable S 15 2
15 TRBKNM 銀行名 Bank Name O 30
16 TRBKCD 銀行コード Bank Code A 4
17 TRBRCD 支店コード Branch Code A 3
18 TRACCD 口座番号 Account Number A 7
19 TRKUBN 口座区分 Account Type A 1
20 TRTNTM 担当者名 Contact Person O 30
21 TRRGDT 登録日 Created Date S 8 0
22 TRRGTM 登録時間 Created Time S 6 0
23 TRUPDT 更新日 Updated Date S 8 0
24 TRUPTM 更新時間 Updated Time S 6 0
プロンプト①~③を順に実行し、最終的に返ってきたソースコードは下記のとおりです。
📄 ソースコード
FTRMAST IF E K DISK
FCRT100D CF E WORKSTN SFILE(G1SFL:RRN)
*------------------------------------------------------------
* ワーク変数定義
*------------------------------------------------------------
D G1TRCD S 10A INZ // 検索条件:取引先コード
D G1TRSC S 3A INZ // 検索条件:取引先支店コード
D RRN S 4S 0 INZ(1) // サブファイル行番号
D S1SLCT S 1A INZ(*BLANK) // 行選択フィールド
D WKTRCD S 10A // 選択行取引先コード
D WKTRSC S 3A // 選択行支店コード
*------------------------------------------------------------
* メイン処理
*------------------------------------------------------------
C *ENTRY PLIST
C MAIN TAG
* 検索画面(G1)表示
C EXFMT G1
* F3=終了
C IF *IN03
C RETURN
C ENDIF
* F5=検索押下時 → サブファイルロード&表示
C IF *IN05
C EXSR LOADSFL
C EXSR DISPSFL
C GOTO MAIN
C ENDIF
C RETURN
*------------------------------------------------------------
* サブルーチン:サブファイルロード処理
*------------------------------------------------------------
C LOADSFL BEGSR
* サブファイル初期化
C Z-ADD 1 RRN
C EVAL *IN40 = *ON // SFLCLR
C WRITE G1CTL
C EVAL *IN40 = *OFF
C EVAL *IN41 = *ON // SFLDSP/SFLDSPCTL 有効
* マスタ読み込み開始
C SETLL *LOVAL TRMAST
C READ TRMAST
C DOW NOT %EOF(TRMAST)
* 検索条件に一致するレコードのみ表示
C IF (G1TRCD = *BLANK OR TRTRCD = G1TRCD) AND
C (G1TRSC = *BLANK OR TRTRSC = G1TRSC)
* サブファイル行出力
C MOVEL TRTRCD S1TRCD
C MOVEL TRTRSC S1TRSC
C MOVEL TRNM01 S1NM01
C WRITE G1SFL
C ADD 1 RRN
C ENDIF
C READ TRMAST
C ENDDO
C ENDSR
*------------------------------------------------------------
* サブルーチン:サブファイル表示処理
*------------------------------------------------------------
C DISPSFL BEGSR
C EXFMT G1CTL
* F3=終了
C IF *IN03
C RETURN
C ENDIF
* 行選択あり → 詳細照会へ
C IF S1SLCT <> *BLANK
C EVAL WKTRCD = S1TRCD
C EVAL WKTRSC = S1TRSC
C EXSR DETAIL
C ENDIF
C ENDSR
*------------------------------------------------------------
* サブルーチン:詳細照会処理(G3)
*------------------------------------------------------------
C DETAIL BEGSR
* 対象レコード取得
C EVAL TRTRCD = WKTRCD
C EVAL TRTRSC = WKTRSC
C TRTRCD CHAIN TRMAST
C IF %FOUND
C MOVEL TRTRCD G3TRCD
C MOVEL TRTRSC G3TRSC
C MOVEL TRNM01 G3NM01
C MOVEL TRNM02 G3NM02
C MOVEL TRPOST G3POST
C MOVEL TRADR1 G3ADR1
C MOVEL TRADR2 G3ADR2
C MOVEL TRADR3 G3ADR3
C MOVEL TRTELN G3TELN
C MOVEL TRFAXN G3FAXN
C MOVEL TRMAIL G3MAIL
C MOVE TRURKN G3URKN
C MOVE TRSIKN G3SIKN
C MOVE TRURZN G3URZN
C MOVE TRSIZN G3SIZN
C MOVEL TRBKCD G3BKCD
C MOVEL TRBKNM G3BKNM
C MOVEL TRBRCD G3BRCD
C MOVEL TRKUBN G3KUBN
C MOVEL TRACCD G3ACCD
C MOVEL TRTNTM G3TNTM
* 詳細画面表示
C EXFMT G3
C ENDIF
C ENDSR
6. エラー(コンパイル実行前)
5.にて得られたソースコードを以下のように貼り付けしたところ、F定義やD定義、MOVE命令等で桁ずれによるエラーが発生しました。
※以下に一部を抜粋して表示
ChatGPTに解消するよう再度命令を送ったところ、一部は返ってきたソースを貼り付けることで桁ずれを解消することができました。
しかし別の聞き方をしても、全く同じソースを返してくる箇所もあったため、その箇所については手作業で修正をしました。
7. エラー(コンパイル実行時)
6.で桁ずれを解消したソースを得られたので、コンパイルを実行したところ、以下のようなエラーが発生しました。こちらもChatGPTに修正内容を聞き、ソースコードを修正しました。
| エラーコード | エラー内容と原因 | 修正内容 |
|---|---|---|
| RNF2120 | CRT100Dという外部ファイルがない | 画面ファイル名として誤ってCRT100Dを指定していたため、CRT100D→DISP01へ変更 |
| RNF5164 | PLISTで引数を受け取る用の変数が未設定 | 今回引数を受け取らないので、PLIST自体を削除 |
| RNF7066 | G1FTR, G2を使用していない | それぞれについて呼び出し箇所を追加 |
修正後再度コンパイルを実行すると、コンパイルは無事に通すことができました。
最終的なソースコードは下記のとおりです
FTRMAST IF E K DISK
FDISP01 CF E WORKSTN SFILE(G1SFL:RRN)
D G1TRCD S 10A INZ
D G1TRSC S 3A INZ
D RRN S 4S 0 INZ(1)
D S1SLCT S 1A INZ(*BLANK)
D WKTRCD S 10A
D WKTRSC S 3A
*------------------------------------------------------------
*mainProcess
*------------------------------------------------------------
*C *ENTRY
C GOTO DUMMYG2
C DUMMYG2 TAG
C EVAL *INLR = *OFF
C GOTO MAIN
C MAIN TAG
*display G1
C EXFMT G1
* F3= end
C IF *IN03
C RETURN
C ENDIF
* F5= pushKensakuTODisplaySFL
C IF *IN05
C EXSR LOADSFL
C EXSR DISPSFL
C GOTO MAIN
C ENDIF
C RETURN
*LoadSFLProcess
C LOADSFL BEGSR
*InitSFL
C Z-ADD 1 RRN
C EVAL *IN40 = *ON
C WRITE G1CTL
C EXFMT G1FTR
C EVAL *IN40 = *OFF
C EVAL *IN41 = *ON
*LoadMastStart
C *LOVAL SETLL TRMASTR
C READ TRMAST
C DOW NOT %EOF(TRMAST)
*
C IF (G1TRCD = *BLANK OR TRTRCD = G1TRCD) AND
C (G1TRSC = *BLANK OR TRTRSC = G1TRSC)
*displaySFL
C MOVEL TRTRCD S1TRCD
C MOVEL TRTRSC S1TRSC
C MOVEL TRNM01 S1NM01
C WRITE G1SFL
C ADD 1 RRN
C ENDIF
C READ TRMAST
C ENDDO
C ENDSR
*displaySFLProcess
C DISPSFL BEGSR
C EXFMT G1CTL
C EXFMT G1FTR
* F3=Finish
C IF *IN03
C RETURN
C ENDIF
*RecordChoiceExistToShosaiDisplay
C IF S1SLCT <> *BLANK
C EVAL WKTRCD = S1TRCD
C EVAL WKTRSC = S1TRSC
C EXSR DETAIL
C ENDIF
C ENDSR
*ShosaiDisplayProcessG3
C DETAIL BEGSR
*GetTargetRecord
C EVAL TRTRCD = WKTRCD
C EVAL TRTRSC = WKTRSC
C TRTRCD CHAIN TRMAST
C IF %FOUND
C MOVEL TRTRCD G3TRCD
C MOVEL TRTRSC G3TRSC
C MOVEL TRNM01 G3NM01
C MOVEL TRNM02 G3NM02
C MOVEL TRPOST G3POST
C MOVEL TRADR1 G3ADR1
C MOVEL TRADR2 G3ADR2
C MOVEL TRADR3 G3ADR3
C MOVEL TRTELN G3TELN
C MOVEL TRFAXN G3FAXN
C MOVEL TRMAIL G3MAIL
C MOVE TRURKN G3URKN
C MOVE TRSIKN G3SIKN
C MOVE TRURZN G3URZN
C MOVE TRSIZN G3SIZN
C MOVEL TRBKCD G3BKCD
C MOVEL TRBKNM G3BKNM
C MOVEL TRBRCD G3BRCD
C MOVEL TRKUBN G3KUBN
C MOVEL TRACCD G3ACCD
C MOVEL TRTNTM G3TNTM
*ShosaiGamenHyoji
C EXFMT G3
C ENDIF
C ENDSR
8. 実行
プログラムを実行時の画面は下記のとおりです。
初期画面であるG1(入力画面)が表示されるので、取引先コードと取引先支店コード入力し、F5キーを押下します
※あらかじめ取引先マスタにデータを登録しておきます
するとG1SFL(一覧画面)に遷移しましたが、レコードをうまく抽出できておらず、画面にはフッター部しか表示がされませんでした。
F3、F12、PGUP、PGDNキーは機能せず、実行キーを押下した際はエラーが発生し、以下の画面に遷移しました。

プログラムCALL画面に戻ると、
「Application error. RNX1299 unmonitored by SANSHOPGM at statement 0000000118」
とあり、ソースの該当箇所は
「0118.00 C MOVEL TRBKCD G3BKCD」
であるため、TRBKCDとG3BKCDの型が一致していることが原因とのこと。
・上記のエラー
・G1SFL(一覧画面)でファンクションキーが機能しなかったこと
・G1SFL(一覧画面)で表示するレコードをうまく抽出できなかったこと
の原因については改めて調査したいと思っています。
9. おわりに
本記事では、生成AI(ChatGPT)を活用して、RPGLE固定フォーマットを使ったプログラム開発にチャレンジしました。
その結果、RPGLE初学者でも、ChatGPTからの回答だけでほぼほぼコンパイルが通るプログラムの開発までは行えることがわかりました。
実際にプログラムを動作させることを目指す場合は、ChatGPTをただ使うのみでは難しく、プロンプトの工夫やRPGLE経験者の知見が別途必要になるかもしれません。
ただ今後ChatGPTの精度が上がったり、ほかの生成AIを活用することで、動作可能なプログラム開発が可能になるかもしれません。
※当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。



