3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

登録/更新/削除のトランザクション処理の作成に挑戦

3
Last updated at Posted at 2025-10-17

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が定義されていない。スクリーンショット 2025-08-28 180317.png

*RNF5198 30 1 演算項目2のファイルはUPDATEまたはDELETE演算命令に使用できない。
RNF5198回答.png

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.ソース

qiita.rpgle
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に帰属します。詳細はこちらを参照ください。

3
2
3

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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?