0
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?

サブプログラム②を作成してみた ~マスタの存在チェックと郵便番号のハイフン付与~

Last updated at Posted at 2025-10-17

1.はじめに

当記事では、
『取引先マスタの保守アプリ内の サブプログラム生成AI(Chat GPT) を用いて作成してみよう!』
という試みの中で、実施したことをまとめています。

初心者が探り探りで行って検証となっておりますので、
至らない点も多々あるかと思いますが、何卒ご容赦くださいませ...

2.目標

チームメンバーとの相談の結果、
以下の機能を持ったサブプログラム2つを作成することにいたしました。

  1. 取引先マスタの保守画面にて使用する想定の、
    取引先コードの有無を検索しエラーチェックをする サブプログラム
  2. 取引先マスタの登録の際に使用する想定の、
    入力した郵便番号にハイフンを付与し登録する サブプログラム

この2つのサブプログラムについて

第一目標:「コンパイルが通る
努力目標:「プログラムの想定していた動作ができる」

と目標を据えた上で作成することにしました。

3.使用した環境

区分 内容
言語 RPGLE
サーバー PUB400(IBMiが無料で提供されているパブリックサーバー)
環境 IBMi 7.5
開発ツール IBMi Access Client Solutions(ACS)
生成AI ChatGPT

「PUB400」の仕様上、日本語表記にすることでエラーが生じる懸念があったため、
エラーメッセージ等を途中で英語に変更しています。

4.目標仕様

区分 内容
言語 RPGLE固定フォーマット
環境 PUB400(IBM提供のパブリック環境)
ファイル TRMAST(取引先マスタ)

5-1.検証① 取引先コードのエラーチェックサブプログラム

プロンプトとして用意したのは以下のようなものです。

プロンプト例
あなたはシステムエンジニアで、データベースの設計のプロフェッショナルです。
取引先マスタの管理画面で用いることのできるサブプログラムの完全固定フォームのRPGLEのソースを提示してください。
変数名はわかりやすいように名付けてください。
プログラムの仕様は以下の通りです。

取引先マスタ名:TRMAST
取引先コード名:TRTRCD(10ケタ)

■ 仕様
・メインプログラム内で取引先コードを入力する欄で取引先コードを入れた状態で任意のFnキーを押下すると、
 その欄に入力されている取引先コードが取引先マスタ内に存在するかを確認する。
・もし存在しない場合は「naiyo」というエラーメッセージが出る
・欄に取引先コードが未入力だと「irete」、10桁に満たない数字を入力した状態で任意のFnキーを押下したら、「tarinai」とエラーメッセージを出してほしい

■ 各画面共通Fnキーは
F3=終了
F12=前画面に戻る です。

以上

5-2.検証① 最初の結果

出力されたソースコードをそのまま入力した結果、

  • 固定式フォームを指定したのにフリーフォームで記述
  • CHAINなど演算項目の順序の反転
  • そのままコピペしても起きる桁ずれ

等の問題が生じ、コンパイルが通ることはありませんでした。

下記に最初に出力したものを記載します。
(取引先コードの桁数やエラーメッセージが異なるのは私のミスなので見て見ぬふりを...)

最初に出力されたソースコード
ソースコード(各文頭の桁ずれは修正済)
FTRDSPF   CF   E             WORKSTN
FTRMAST   IF   E           K DISK

D MsgID           S              7A
D PartnerCode     S              6S 0
D PartnerCodeC    S              6A
D FoundFlag       S              1A   INZ('N')
D Blank6          C                   CONST('      ')

C     *IN03        IF                  RETURN
C     *IN12        IF                  RETURN

C                   EXFMT     TRDSP01

C                   EVAL      PartnerCodeC = %EDITC(PartnerCode: 'X')

C                   IF        PartnerCodeC = *BLANKS OR %LEN(%TRIMR(PartnerCodeC)) < 6
C                   EVAL      MsgID = 'MSG001'
C                   GOTO      ErrorDisplay
C                   ENDIF

C     PartnerCode   CHAIN     TRMAST                    FoundFlag

C                   IF        %FOUND
C                   EVAL      FoundFlag = 'Y'
C                   ELSE
C                   EVAL      MsgID = 'MSG002'
C                   GOTO      ErrorDisplay
C                   ENDIF

C                   GOTO      ProcessEnd

 /FREE
 // --- エラー表示処理 ---
 /END-FREE
C     ErrorDisplay  TAG

C                   SELECT
C                   WHEN      MsgID = 'MSG001'
C                   EVAL      MSGFLD = '取引先コードは6桁の半角数字で入力してください。'
C                   WHEN      MsgID = 'MSG002'
C                   EVAL      MSGFLD = 'この取引先は存在しません。'
C                   ENDSL

C                   EVAL      *IN99 = *ON   // MSGFLD 表示用(仮想フィールド制御)

C                   EVAL      *IN50 = *ON   // PartnerCode入力欄を反転表示(仮定)

C                   EXFMT     TRDSP01

C                   GOTO      *INZSR

C     ProcessEnd    TAG
C                   // 正常処理があればここに続ける

C                   GOTO      *INZSR

C     *INZSR        BEGSR
C                   Z-ADD     0       PartnerCode
C                   CLEAR                MSGFLD
C                   *INLR      = *ON
C                   ENDSR

その中でもフリーフォームの記述はプロンプト内で指摘をしたところ、
すぐに改善が見られたのですが...

5-3.検証① 問題点

前述の問題点の中でも、

  • CHAINなど演算項目の順序の反転
  • そのままコピペしても起きる桁ずれ

この2点では何度指摘をしても同じ返答があるだけで改善がなかなか見られず
なかなか苦戦を強いられました。

今回は初学者を想定して行った(私自身もほぼほぼ初学者であった)ため、

  • そもそもどこで桁ずれが起こっているのかわからない
  • どれほどズラせば改善するのかがわからない

と大きく分けて2つの点において困難な点がありました。

5-4.検証① 対策

そこで、対策方法として取ったのが
コンパイルのエラーメッセージを生成AIにそのまま送る
という手法でした。

wrkoutq [username]

というコマンドを利用し、

スクリーンショット 2025-10-17 105515.png

このエラーメッセージをコピペして生成AIに原因を聞く。

あるいは、

スクリーンショット 2025-10-17 104759.png

SEUで表示される下のエラーメッセージと原因となっている文を一緒にコピペして生成AIに原因を聞く。

このようにコンパイルのエラーメッセージを生成AIにそのまま送ることで
かなり無意味なやりとりが減り、なるべく最短経路でエラーを減らせると感じました。

5-5.検証① 結果

結果としては、
上述の対策を何度か行いブラッシュアップを行うことで、
無事コンパイルを通すことができました。
また動作に関しては、
(生成AIに聞きながら)テストプログラムを作ったところ、
取引先コードの桁数の要件は満たしているものの取引先マスタにはないコードを入力した場合のみ、
想定通りのエラーメッセージが出ず、
他は想定通りのエラーメッセージが表示されました。

おそらく、当初は取引先マスタにある「取引先コード」のみをキーとして設定していたのですが、
もう一つキーを追加した影響かと思われますが、
原因究明・修正まではいくことができませんでした。

ご参考までに、以下に最終的なソースコードを記載します。

ソースコード例
H DFTACTGRP(*NO) ACTGRP(*CALLER)                                 
                                                                 
FTRMAST    IF   E           K DISK    USROPN                     
                                                                 
D CustCode        S             10A                              
D TRTRSC          S              3A                              
D ErrorMessage    S             50A                              
                                                                 
                                                                 
C     *ENTRY        PLIST                                        
C                   PARM                    CustCode             
C                   PARM                    ErrorMessage         
                                                                 
C                   IF        %Trim(CustCode) = *BLANKS          
C                   EVAL      ErrorMessage = 'irete'              
C                   RETURN                                       
C                   ENDIF                                        
                                                                 
C                   IF        %Len(%Trim(CustCode)) < 10         
C                   EVAL      ErrorMessage = 'tarinai'               
C                   RETURN                                       
C                   ENDIF                                        

C                   EVAL      TRTRSC = *Blanks                         
C                   OPEN      TRMAST                                  
                                                                      
C     CustKey       KLIST                                             
C                   KFLD                    CustCode                  
C                   KFLD                    TRTRSC                     
C     CustKey       CHAIN     TRMAST                             90   
C                   IF        *IN90 = *ON                             
C                   EVAL      ErrorMessage = 'naiyo'                   
C                   ELSE                                              
C                   EVAL      ErrorMessage = *BLANKS                  
C                   ENDIF                                             
                                                                      
C                   CLOSE     TRMAST                                  
                                                                      
C                   RETURN                                

6-1.検証② 郵便番号にハイフンを付与するサブプログラム

プロンプトとして用意したのは以下のようなものです。

プロンプト例
命令文
あなたはシステムエンジニアで、データベースの設計のプロフェッショナルです。
取引先マスタの保守画面で用いることのできるサブプログラムの完全固定フォームのRPGLEのソースを提示してください。 
変数名はわかりやすいように名付けてください。

プログラムの仕様は以下の通りです。
 
取引先マスタ名:TRMAST

#条件
・取引先マスタの保守のメインプログラム内で取引先マスタを登録・更新する際に、
 7桁の郵便番号を入力すると最初の3桁と後ろの4桁の間に-(ハイフン)を入れて
 取引先マスタに登録するサブプログラム

6-2.検証② 結果

結果から申し上げると、
上述で学んだコンパイルのエラーメッセージを生成AIにそのまま送るという手法で、
およそ3回ほどのやりとりでコンパイルを通すことができました。

また動作も、想定していた通りに渡したPARMの間にハイフンを付与してくれます。

スクリーンショット 2025-10-17 120321.png

このようにシンプルなプログラムであれば、
生成AIだけで作成するというのもあながち難しいことではないのかもしれません。

ご参考までに、以下に最終的なソースコードを記載します。

ソースコード例
H DFTACTGRP(*NO) ACTGRP(*CALLER)                                           
                                                                           
D ZIPGPT          PR                  EXTPGM('ZIPGPT')                     
D  In_ZipCode                    7A   CONST                                
D  Out_ZipCode                   8A                                        
                                                                           
D ZIPGPT          PI                                                       
D  In_ZipCode                    7A   CONST                                
D  Out_ZipCode                   8A                                        
                                                                           
D workZip3        S              3A                                        
D workZip4        S              4A                                        
D dash            S              1A                             INZ('-')   
                                                                           
C                   EVAL      workZip3 = %SUBST(In_ZipCode:1:3)            
C                   EVAL      workZip4 = %SUBST(In_ZipCode:4:4)            
C                   EVAL      Out_ZipCode = workZip3 + dash + workZip4     
C                   RETURN       

7.まとめ

結果として、
既に生成AIはある程度プログラム作成のサポートを行えるほどの能力はあり、
画面表示の伴わないシンプルなサブプログラムくらいであれば、
生成AIだけでも作成ができる可能性
を感じました。

ですが、同時に

  • 桁ずれなどに関しては何度聞いても同じことを返してくる場合も多々あり、
    自力で直す必要がある場面も見られる
  • 生成AI特有のハルシネーションが多々見られる

といった点を鑑みると、
完全な初学者が生成AIのみを用いてプログラム作成をするのは少し難しいような感じを受けました。

とはいえ、

  • プログラムを作成しはじめるまでのコマンド等の手順
  • 既存のソースコードの解説

などは非常に精度の高い回答をしていたので、
プログラムを自力で作成したい人の足掛かりとしては非常に有効だと考えられます。


■ 当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。

0
0
0

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
0
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?