前回の記事では
- 照会・編集対象となる物理ファイル(データベースファイル)
- フロント画面となる画面ファイル
のソースの生成を行いました。
今回の記事では、実際に照会・編集を行うRPGプログラムソースを生成してみます。
ソース生成してみる
とりあえずやってみる
使用するマスター(物理ファイル)のフィールドをプロンプトに含め、フィールド定義などを正確に生成できるようにします。
- プロンプト例
あなたはRPG(FFRPG) プログラマーです
**free で始まり、 Returnで終わるプログラムを作成してください。
マスタ名: EMPLOYEE (社員マスター)
EMCODE(社員コード) ...文字型、 5桁
EMNAME(社員名) ... 文字型、 20桁
EMDEPT(部署) ...文字型、 10桁
EMDATE(入社年月日) ...数値型8桁
EMSALA (給与) ...数値型9型
キー:EMCODE(社員コード)
上記の内容を元に、 社員マスターの照会プログラム作成を行ってください。
上記のプロンプトより、下記のソースが生成できました。
クリックしてソースを展開
**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;
画面ファイルは…?
コンパイルしたプログラムを実行すると、まずは社員コードの入力を求められます。
存在する社員コードを入力すると、以下のように合致する情報を返します。
存在しない社員コードを入力すると、メッセージ表示されます。
コンパイルは通ったものの、以下の条件が満たせていません。
- 画面ファイルを使用する
- 照会はできるが、編集ができない
画面ファイルでマスターの内容表示・編集ができるようなソースを生成できないか?ということで、色々試してみます。
コンパイル通らない…?
様々なプロンプトを試してソースを生成しますが、AI生成のみでは難航しました。
- プロンプト例
A EMCODE 5A
A EMNAME 20A
A EMDEPT 10A
A EMDATE L
A EMSALA 8S 2
A K EMCODE
以上のDDSを使って、追加・更新・削除できるプログラムをコーディングしてください。
- 生成されたコード
クリックしてソースを展開
** 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;
ぱっと見は問題ないFFRPGのソースコードが出力されますが、コンパイル時エラーとなりプログラム作成ができません。
AIに再出力させたり、手直しをするもののなかなかコンパイルが通るソースが作成できませんでした。
構文間違い・エラー例
まとめ
今回の調査の範囲では、要件を完全に満たすかつコンパイルが通るソースは生成できませんでした。
プログラムひとつで完結する(外部ファイルを使用しない)簡易的なプログラムは手直しせずとも作成できますが、外部ファイル・プログラムの呼び出しが必要な複雑なプログラムはAIのみでは簡単には作成できないようです。(時間をかければできるかもしれませんが・・・)
次の記事でも記載しますが、個々人のスキルの取得や倫理的な観点からは、AIはあくまで補助的なツールとして使うのが望ましいのかもしれません。