1.はじめに
本記事は、生成AI(ChatGPT)を使って RPGLE固定フォーマットで
「取引先マスタの登録/更新/削除」するプログラムを自動生成しようとした試みをまとめたものです。
目的は、AIがどこまでRPGの固定構造を理解し、
実機で動作する業務プログラムを構築できるかを検証することでした。
最終的に結果は——
登録・更新・削除のいずれも成功せず。
取引先コード入力直後に入出力装置エラーで停止してしまいました。
2.目標仕様
| 区分 | 内容 |
|---|---|
| 言語 | RPGLE固定フォーマット |
| ファイル | TRKMAST(取引先マスタ), DISP01(画面) |
| 機能 | 登録/更新/削除 |
| ファンクションキー | F3=終了、F5=検索 |
| 構造 | G1入力→G1SFL一覧→G2編集→G3確認 |
AIはC仕様書中心で画面遷移構造を自動生成し、
WRITE/UPDATE/DELETEを伴う雛形を提示しました。
3.プロンプト
何回かテストをしているうちに、生成AIは複雑なソースを回答することが多いと気づきました。
なので初級者でも分かりやすいように大まかな処理から作成することにしました。
あなたはシステムエンジニアで、AS400のプロフェッショナルです。
取引先マスタ新規登録のみの大まかなソースを教えてください。
構造は最もシンプルにお願いします。
使用言語はRPGLE固定フォーマットです。
画面遷移は以下です。
■初期画面
取引先コード、支店コードを入力
■第二画面
取引先コードで取引先マスタを、
取引先コード、支店コード、取引先名をサブファイルで出力
■第三画面
取引先情報を変更できるような画面を出力
■第四画面
確認画面を出力
(取引先情報を入力できない画面)
第四画面処理後は第一画面に戻ります
ファンクションキーは以下です。
F3:終了
F5:取引先コード上で検索(取引先コードにセット)
4.コンパイルまでの道:桁ずれとの戦い
AIの生成ソースをSEUに貼ると、
桁ずれエラー(列位置不正)が発生しました。
MOVE命令の箇所で桁ずれが起きていますなど、桁ずれが起きている箇所を
具体的に教えてあげることで正しい桁位置のソースを返してくれました。
5.コンパイルエラー
| No | エラーコード | 原因内容 | 修正概要 |
|---|---|---|---|
| 1 | RNF7030 | 名前または標識 TRKMAST が定義されていない |
ファイル定義(F-spec)に TRKMAST を追加し、外部記述ファイルとして参照できるよう修正 |
| 2 | RNF7031 | フィールド名が未定義 | DDSまたは内部定義に該当フィールドを追加 |
| 3 | RNF5347 | 変数型の不一致 | 定義箇所で桁数/データ型を合わせる |
| 4 | RNF7034 | フィールドが見つからない | 指定ファイルのフィールド名を確認し、誤記を修正 |
| 5 | RNF2121 | パラメータ不足 | サブルーチン呼び出し部の引数数を合わせる |
回答抜粋
*RNF7030 30 128 006200 名前または標識TRKMASTが定義されていない。
*RNF5198 30 1 演算項目2のファイルはUPDATEまたはDELETE演算命令に使用できない。

6. 実行テスト:画面表示までは成功
実行時、DISP01画面は正しく表示されました。
しかし、取引先コードを入力して実行キーを押すと即エラー発生し、
以下のメッセージが表示されました
メッセージ. . : ファイルDISP01でセッションまたは入出力装置エラーが起こった。
原因 : ステートメント110で入出力装置のエラーが発生。
メジャー戻りコード 83(入出力操作でエラー)
6.原因:相対レコード番号(RRN)の未定義
AIが生成したサブファイル定義には、RRN(相対レコード番号)が存在しませんでした。
なので、サブファイルに対してWRITEしようとしたとき、
「どの行(レコード番号)に書き込むか」がわからない状態になってしまった。。
RRN(相対レコード番号)はサブファイルでは必須
サブファイルに対して WRITE を行う場合、
SFLRCDNBR に相当する相対レコード番号変数を指定する必要があります。
これをDDS側またはRPG側で明示しないと、
WRITE命令の実行時に 入出力装置エラー(メジャーコード83)が発生します。
7. 相対レコード番号(RRN)の定義
今回の取り組みとは逸れますが、
通常は次のような定義が必要です。
D SFLRRN S 4 0
...
C ADD 1 SFLRRN
C WRITE SFL01
AIにはこの「相対レコード番号のインクリメント概念」が存在せず、
DDSと同期できないため、1レコード目からWRITEできずに強制停止しました。
8. まとめ
学んだこと
-
RPGLE固定フォーマットでは「桁」だけでなく「状態」もコードの一部
-
サブファイルでは相対レコード番号(RRN)が絶対に必要
-
AIは文法的には正しいが、DDSの動的制御構造を理解できていない
-
桁ずれ修正は自身で行った方が早い
99.ソース
H DFTACTGRP(*NO)
H
FTRMAST UF A E K DISK
FDISP01 CF E WORKSTN
F
D SCRN1 C CONST('1')
D SCRN2 C CONST('2')
D SCRN3 C CONST('3')
D SCRN4 C CONST('4')
D
D CURRENT_SCREEN S 1A INZ('1')
D
C* *ENTRY PLIST
C*
C DOU *IN03 = *ON
C SELECT
C WHEN CURRENT_SCREEN = SCRN1
C EXSR SR_SCREEN1
C WHEN CURRENT_SCREEN = SCRN2
C EXSR SR_SCREEN2
C WHEN CURRENT_SCREEN = SCRN3
C EXSR SR_SCREEN3
C WHEN CURRENT_SCREEN = SCRN4
C EXSR SR_SCREEN4
C ENDSL
C ENDDO
C SETON LR
C
C SR_SCREEN1 BEGSR
C EXFMT G1
C IF *IN03 = *ON
C RETURN
C ENDIF
C IF *IN05 = *ON
C EXSR SR_SEARCH
C ENDIF
C IF G1TRCD <> *BLANKS
C MOVE SCRN2 CURRENT_SCREEN
C ENDIF
C ENDSR
C
C SR_SCREEN2 BEGSR
C EXSR SR_LOADSFL
C EXFMT G1CTL
C MOVE SCRN3 CURRENT_SCREEN
C ENDSR
C
C SR_SCREEN3 BEGSR
C EXFMT G2
C MOVE SCRN4 CURRENT_SCREEN
C ENDSR
C
C SR_SCREEN4 BEGSR
C EXFMT G3
C EXSR SR_WRITE
C MOVE SCRN1 CURRENT_SCREEN
C ENDSR
C
C SR_LOADSFL BEGSR
C SETON 40
C SETOFF 41
C G1TRCD SETLL TRMASTR
C G1TRCD READE TRMASTR
C DOW NOT %EOF
C MOVE TRTRCD S1TRCD
C MOVE TRTRSC S1TRSC
C MOVE TRNM01 S1NM01
C WRITE G1SFL
C G1TRCD READE TRMASTR
C ENDDO
C SETOFF 41
C ENDSR
C
C
C SR_WRITE BEGSR
C KYTRK KLIST
C KFLD G2TRCD
C KFLD G2TRSC
C KYTRK CHAIN TRMASTR
C IF %FOUND
C MOVE G2TRCD TRTRCD
C MOVE G2TRSC TRTRSC
C MOVE G2NM01 TRNM01
C MOVE G2NM02 TRNM02
C MOVE G2POST TRPOST
C MOVE G2ADR1 TRADR1
C MOVE G2ADR2 TRADR2
C MOVE G2TELN TRTELN
C MOVE G2FAXN TRFAXN
C MOVE G2MAIL TRMAIL
C MOVE G2URKN TRURKN
C MOVE G2SIKN TRSIKN
C MOVE G2URZN TRURZN
C MOVE G2SIZN TRSIZN
C
C MOVE G2BKNM TRBKNM
C MOVE G2BKCD TRBKCD
C MOVE G2BRCD TRBRCD
C MOVE G2ACCD TRACCD
C MOVE G2KUBN TRKUBN
C MOVE G2TNTM TRTNTM
C UPDATE TRMASTR
C ELSE
C MOVE G2TRCD TRTRCD
C MOVE G2TRSC TRTRSC
C MOVE G2NM01 TRNM01
C MOVE G2NM02 TRNM02
C MOVE G2POST TRPOST
C MOVE G2ADR1 TRADR1
C MOVE G2ADR2 TRADR2
C MOVE G2TELN TRTELN
C MOVE G2FAXN TRFAXN
C MOVE G2MAIL TRMAIL
C MOVE G2URKN TRURKN
C MOVE G2SIKN TRSIKN
C MOVE G2URZN TRURZN
C MOVE G2SIZN TRSIZN
C MOVE G2BKNM TRBKNM
C MOVE G2BKCD TRBKCD
C MOVE G2BRCD TRBRCD
C MOVE G2ACCD TRACCD
C MOVE G2KUBN TRKUBN
C MOVE G2TNTM TRTNTM
C WRITE TRMASTR
C ENDIF
C ENDSR
C
C SR_SEARCH BEGSR
C ENDSR
■ 当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。