生成AIでFFRPGプログラムは生成できるのか？ - ⑤照会・入力プログラムのソース作成

前回の記事では
+ 照会・編集対象となる物理ファイル（データベースファイル）
+ フロント画面となる画面ファイル
のソースの生成を行いました。

今回の記事では、実際に照会・編集を行うRPGプログラムソースを生成してみます。

# ソース生成してみる
#### とりあえずやってみる
使用するマスター（物理ファイル）のフィールドをプロンプトに含め、フィールド定義などを正確に生成できるようにします。
+ プロンプト例
```
あなたはRPG(FFRPG) プログラマーです
**free で始まり、 Returnで終わるプログラムを作成してください。

マスタ名: EMPLOYEE (社員マスター)
EMCODE(社員コード) ...文字型、 5桁
EMNAME(社員名) ... 文字型、 20桁
EMDEPT(部署) ...文字型、 10桁
EMDATE(入社年月日) ...数値型8桁
EMSALA (給与) ...数値型9型
キー:EMCODE(社員コード)

上記の内容を元に、 社員マスターの照会プログラム作成を行ってください。
```

上記のプロンプトより、下記のソースが生成できました。
<details><summary><b>クリックしてソースを展開</b></summary>

```RPG:DSPEMP
**free

// ファイル宣言
dcl-f EMPLOYEE keyed; // 社員マスターファイル (キー:EMCODE)

// フィールド宣言
dcl-s EMCODE char(5); // 社員コード
dcl-s EMNAME char(20);// 社員名
dc1-s EMDEPT char(10);// 部署
dcl-s EMDATE packed (80); // 入社年月日 (YYYYMMDD形式)
dcl-s EMSALA packed(9:0); // 給与
dcl-s EXIT char(1) inz ('N'); // 終了フラグ

// メインループ
dow EXIT = 'N';

  // 社員コードの入力を促す
  dsply '社員コードを入力してください (5桁): ' '' EMCODE;

  // 社員コードをキーにしてEMPLOYEE ファイルを検索
  chain (EMCODE) EMPLOYEE;

  // レコードが見つかった場合
  if %found(EMPLOYEE);
	// 社員情報を表示
	dsply('社員名:' + %trim(EMNAME));
	dsply('部署: ' + %trim(EMDEPT));
	dsply('入社年月日: ' + %char(EMDATE)); 
	dsply('給与: ' + %char(EMSALA));
  else;

	// 社員が見つからなかった場合
	dsply '社員が見つかりません。';
  endif;

  // プログラムを続けるかどうかを確認
  dsply '終了しますか? (Y/N):
enddo;

// プログラムの終了
return;
```

</details>
生成されたソースをそのまま貼り付け→コンパイル試行したところ、コンパイルできプログラムが作成されました。

#### 画面ファイルは…？
コンパイルしたプログラムを実行すると、まずは社員コードの入力を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/174c8e2f-981e-d8c4-9655-3676e878bb23.png)
存在する社員コードを入力すると、以下のように合致する情報を返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/8dd82f23-f244-a305-8422-d3a6ac336ef6.png)
存在しない社員コードを入力すると、メッセージ表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/b994f5a2-1ab6-5518-97c0-e689e22c23a5.png)

コンパイルは通ったものの、以下の条件が満たせていません。
+ 画面ファイルを使用する
+ 照会はできるが、編集ができない

画面ファイルでマスターの内容表示・編集ができるようなソースを生成できないか？ということで、色々試してみます。

# コンパイル通らない…？
様々なプロンプトを試してソースを生成しますが、AI生成のみでは難航しました。
+ プロンプト例
```
     A            EMCODE        5A    
     A            EMNAME        20A  
     A            EMDEPT        10A 
     A            EMDATE        L   
     A            EMSALA        8S 2
     A          K EMCODE
     
以上のDDSを使って、追加・更新・削除できるプログラムをコーディングしてください。
```
+ 生成されたコード
<details><summary><b>クリックしてソースを展開</b></summary>

```RPG:EMPMST
** Free
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-f EMPLY usage(*update) keyed;

dcl-s empCode char(6);
dcl-s empName char(30);
dcl-s empDept char(3);
dcl-s empSala packed(7:2);
dcl-s operation char(1);

dcl-s validCode char(1);

 // メイン処理
dow not %eof;

   // ユーザーから操作を受け付ける
   dsply '操作を選択してください: (A) 追加 (U) 更新 (D) 削除: ' operation;

   select;
     when operation = 'A';
       exsr addRecord;
     when operation = 'U';
       exsr updateRecord;
     when operation = 'D';
       exsr deleteRecord;
     other;
       dsply '無効な操作です';
   endsl;

enddo;

*inlr = *on;

 // 追加処理サブプロシージャ
begsr addRecord;
   dsply '従業員コード: ' empCode;
   dsply '従業員名: ' empName;
   dsply '部門コード: ' empDept;
   dsply '給与: ' empSala;

   chain empCode EMPLY;
   if %found(EMPLY);
     dsply '従業員コードが既に存在します';
   else;
     empCode = %trim(empCode);
     empName = %trim(empName);
     empDept = %trim(empDept);
     empSala = empSala;

     write EMPLY;
     if %error;
       dsply 'レコード追加に失敗しました';
     else;
       dsply 'レコードを追加しました';
     endif;
   endif;

endsr;

 // 更新処理サブプロシージャ
begsr updateRecord;
   dsply '従業員コード: ' empCode;
   chain empCode EMPLY;
   if not %found(EMPLY);
     dsply '従業員コードが見つかりません';
   else;
     dsply '新しい従業員名: ' empName;
     dsply '新しい部門コード: ' empDept;
     dsply '新しい給与: ' empSala;

     empName = %trim(empName);
     empDept = %trim(empDept);
     empSala = empSala;

     update EMPLY;
     if %error;
       dsply 'レコード更新に失敗しました';
     else;
       dsply 'レコードを更新しました';
     endif;
   endif;
endsr;

 // 削除処理サブプロシージャ
begsr deleteRecord;
   dsply '従業員コード: ' empCode;
   chain empCode EMPLY;
   if not %found(EMPLY);
     dsply '従業員コードが見つかりません';
   else;
     delete EMPLY;
     if %error;
       dsply 'レコード削除に失敗しました';
     else;
       dsply 'レコードを削除しました';
     endif;
   endif;
endsr;
```

</details>

ぱっと見は問題ないFFRPGのソースコードが出力されますが、コンパイル時エラーとなりプログラム作成ができません。
AIに再出力させたり、手直しをするもののなかなかコンパイルが通るソースが作成できませんでした。

#### 構文間違い・エラー例
+ 標識の演算子が * ではなく %になっている
+ `RETURN`命令がなくプログラム終了されない
+ 項目長が指定したものより短い
+ `WRITE`命令にエラー？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/78653c4d-cf9a-29b0-0335-888032229a4e.png)
・・・など他にも多数

# まとめ
今回の調査の範囲では、要件を完全に満たすかつコンパイルが通るソースは生成できませんでした。
プログラムひとつで完結する（外部ファイルを使用しない）簡易的なプログラムは手直しせずとも作成できますが、外部ファイル・プログラムの呼び出しが必要な複雑なプログラムはAIのみでは簡単には作成できないようです。（時間をかければできるかもしれませんが・・・）
次の記事でも記載しますが、個々人のスキルの取得や倫理的な観点からは、**AIはあくまで補助的なツールとして使う**のが望ましいのかもしれません。