生成AIでFFRPGプログラムは生成できるのか？ - ④プログラムで使用する外部ファイルのソース作成

IBMi上のデータベースファイル（物理ファイル/PF）および画面ファイル（DSPF)は、<B>DDS</B>という仕様を用いてソースコードを作成する必要があります。
このDDSソースについても、AIの力を借りて生成できるかを試してみます。

# 物理ファイル・ソース生成
#### ひとまず生成
+ プロンプト例
下記では`#DBのレイアウト`と`#キーフィールド`を明示的に指定することで正確な物理ファイルを作成することを目指しました。
```
#命令
あなたはIBMiを使用してコーディングを行うプログラマーです。
社員マスターのデータベースファイルのソースを作成してください。

#DBのレイアウト
フィールド数：5
フィールド名：EMCODE / タイプ：文字 / 長さ：5桁 / カラム名：社員コード
フィールド名：EMNAME / タイプ：文字 / 長さ：20桁 / カラム名：氏名
フィールド名：EMDEPT / タイプ：文字 / 長さ：10桁 / カラム名：部署名
フィールド名：EMDATE / タイプ：日付 / 長さ：8桁 / カラム名：入社年月日
フィールド名：EMSALA / タイプ：数値 / 長さ：8桁 / カラム名：給与

#キーフィールド
フィールド名：EMCODE
```

+ 生成されたソース例
```SQL:EMPLOYEE.SQL
CREATE TABLE EMPLOYEE (
    EMCODE CHAR(5) NOT NULL,
    EMNAME CHAR(20) NOT NULL,
    EMDEPT CHAR(10) NOT NULL,
    EMDATE DATE NOT NULL,
    EMSALA DECIMAL(8, 2) NOT NULL,
    PRIMARY KEY (EMCODE)
);
```
前段階で物理ファイルの作成にはDDSが必要…と記載しましたが、実はChatGPTの回答が示す通り、
<B>SQLでCREATE TABLE命令を実行すること</B>でも物理ファイルのソースは作成できます。
もちろん、INSERTやDELETEなど、他のSQL命令を使うことでデータベースの内容を編集したり、参照したりすることもできます。
上記では作成するファイルを格納するライブラリの指定がないので、ライブラリの指定を行う形で再度ChatGPTにSQL文を生成してもらい、ACSのSQLスクリプト実行機能でSQL文を実行してみたところ、想定通りの物理ファイルを作成することはできました。

が、ファイル記述をよく見ると…プロンプトではカラム名を指定したにも関わらず実際には設定されていません。
機能的には困りませんが、Queryでファイルを覗いたときなどはちょっと分かりづらいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/fdfbdaca-cb00-2681-16c7-29aee84782f9.png)

#### DDSソースは作成できる？
カラム名を含める形でDDSソースが生成できるか？も試してみます。
+ プロンプト例
プロンプトは前述のSQL文の生成後から、同じ会話内で実行しています。
```
SQL文を実行することでデータベースファイルを作成するよう提案してもらいましたが、
同じデータベースファイルが作成できるようDDSソースを生成してください。
```
+ 生成されたソース例
```DDS:EMPLOYEE
     A          R EMPLOYEE
     A            EMCODE        5A         TEXT('社員コード')
     A            EMNAME        20A        TEXT('氏名')
     A            EMDEPT        10A        TEXT('部署名')
     A            EMDATE        L          TEXT('入社年月日')
     A            EMSALA        8S 2       TEXT('給与')
     A          K EMCODE
```
それらしきソースは作成できました。
DDSソースは固定様式なので、位置を調整して貼り付け→ソース自体は編集せずコンパイルもできました。
`TEXT`パラメータでカラム名も指定されているので、しっかりカラム名も反映されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/6195b901-b4f2-b188-dd47-528c72258afc.png)

# 画面ファイル・ソース生成
#### ひとまず生成
物理ファイルと異なり画面ファイルはSQLでの作成ができない（はず）なので、はじめからDDSソースを作成してもらう必要があります。
+ プロンプト例
先に生成した物理ファイルに合わせプロンプトを実行します。
```
あなたは優秀なFFRPG(Free Format RPG)のプログラマーです。
上記のEMPLOY（社員マスター）を使用し、マスターへの登録・照会・削除を行うFFRPGのプログラムとDSPF（表示装置ファイル）を作成してください。
```
+ 生成されたソース例
```DSPF:EMPLOYDSPF
A                                      DSPSIZ(24 80)             
A                                      CF01(01 '登録')           
A                                      CF02(02 '照会')           
A                                      CF03(03 '削除')           
A                                      CF12(12 '終了')           
A          R EMPDISP                                                
A                                      CA12                     
A            EMCODE        5A  B  5 20                          
A            EMNAME       20A  B  7 20                          
A            EMDEPT       10A  B  9 20                          
A            EMDATE        8S 0B 11 20                          
A            EMSALA        8S 0B 13 20                          
A                                  15 20'F1=登録  F2=照会  F3=削除  F12=終了'
```
画面ファイルもそれらしきソースを生成することができました。
ですが実際にコンパイルするにあたってはファンクションキー機能の記述部を修正したり、物理ファイルのDDSと同様固定長の位置修正などが必要になりました。
上記を手直し→コンパイル後、以下のような画面ファイルを作成できました。
![DSPSRC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/0da5e048-d14f-6abc-3f3a-a776a15a1521.png)


# まとめなど
物理ファイル・画面ファイルソースの生成に関しては、DDSはそのままコンパイルとはいかずともほんの少し手直しすることでコンパイルが通るソースを生成できました。
次回は実際にデータの照会・変更を行うRPGプログラムのソースを生成してみます。

#### おまけ：物理ファイルのデータ入力
物理ファイルにテストデータを入れるためのSQL文も生成できるのでは？と思い、試してみました。
+ プロンプト例
物理ファイルのDDSソース作成の会話から続けて下記のプロンプトを実行します。
```
上記で作成したデータベースファイルに、ダミーのテストデータを入れるためのSQL文をいくつか作成してください。
```
+ 結果は・・・？
```SQL:ダミーデータの挿入
=-- ダミーのテストデータをEMPLOYEEテーブルに挿入するSQL文
INSERT INTO PRVISE.EMPLOYEE (EMCODE, EMNAME, EMDEPT, EMDATE, EMSALA) 
VALUES ('E0001', '佐藤 太郎', '営業部', '2020-01-15', 5000000.00);
....
```
SQL文は生成してくれました。
では、このSQLを実際に実行してみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872367/f70ba8b6-635e-d101-c198-44d57b33d35f.png)
…エラーで失敗してしまいました。
データベース作成時にDBCS対応の言語コードの環境で操作するなどが必要かもしれません。