目次
1. はじめに
2. やりたいこと
3. 作成の流れ
4. Bobにて受注プログラムの作成
5. プログラムソースのレビュー実施
6. レビュー後のソース修正
7. ソース修正後の仕様書作成
1. はじめに
こちらの内容は、IBM RISING2026のチーム成果物として作成した内容となります。
今回は、受注データプログラムを作成しましたが、このケースではCOBOL(ILE) + CLの環境で出力を行いました。
なお、プログラム内容から仕様書を作成してみます。
2. やりたいこと
IBM-i上でCOBOL ILEにて動作する受注プログラムを、IBM Bobで作成を行います。
また、プログラムの作成結果をIBM BobとChatGPTで確認し、チェック結果の比較も行います。
各エージェントのバージョン:
IBM Bob:V2.1.0
ChatGPT:GPT-5.6
3. 作成の流れ
以下の流れで作成を実施しています。
- Bobに受注データ入力システムを作成依頼
- BobとChatGPTにレビュー
- レビューをもとにBobとChatGPTにプログラム修正依頼
- 修正したプログラムをもとにBobとChatGPTに仕様書の作成依頼
4. Bobにて受注プログラムの作成
Bobに対して、Assistantを使用してコード作成依頼を行います。
以下、コード作成依頼の一連のやり取りとなります。
作成したCOBOLソースの詳細はこちらで確認できます。
👤 ユーザー
COBOLとCLでの一般的な受注データ入力のプログラムを作成して。
🤖 アシスタント
COBOLとCLで受注データ入力画面を作成します。IBM i (AS/400) 環境での実装を想定します。
以下のファイル構成で作成します:
| ファイル | 種別 | 内容 |
|---|---|---|
ORDDSP.DDS |
DDS | 受注入力画面定義 |
ORDPGM.CBL |
COBOL | 受注データ処理プログラム |
ORDCTL.CLP |
CL | 呼び出し制御プログラム |
(ORDPGM.CBL 主要部分)
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* プログラム名 : ORDPGM
* 名称 : 受注データ入力プログラム
* 作成日 : 2025/01/01
* 概要 : 受注ヘッダ・明細の入力/照会/更新/削除
*
* 使用ファイル :
* ORDDSP - 受注入力画面ファイル (DSPF)
* ORDHDR - 受注ヘッダファイル (PF)
* ORDDTL - 受注明細ファイル (PF)
* CUSTMST - 得意先マスタ (PF)
* EMPMST - 社員マスタ (PF)
* ITMMST - 品目マスタ (PF)
*
* ファンクションキー :
* F3 = プログラム終了
* F5 = 受注データ照会
* F6 = 新規受注登録
* F8 = 明細行追加 (次頁)
* F10 = 受注データ削除
* F12 = 取消(前画面へ)
* Enter = 登録/更新確定
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
IDENTIFICATION DIVISION.
PROGRAM-ID. ORDPGM.
AUTHOR. SYSTEM.
DATE-WRITTEN. 2025-01-01.
*----------------------------------------------------------
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*--- 受注入力画面ファイル
SELECT ORDDSP ASSIGN TO WORKSTATION-ORDDSP
ORGANIZATION IS TRANSACTION.
*--- 受注ヘッダファイル
SELECT ORDHDR ASSIGN TO DATABASE-ORDHDR
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS HD-ORDNO
FILE STATUS IS WS-HDRSTS.
*--- 受注明細ファイル
SELECT ORDDTL ASSIGN TO DATABASE-ORDDTL
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS DT-ORDNO
FILE STATUS IS WS-DTLSTS.
*--- 得意先マスタファイル
SELECT CUSTMST ASSIGN TO DATABASE-CUSTMST
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS CS-CUSCD
FILE STATUS IS WS-CUSSTS.
*--- 品目マスタファイル
SELECT ITMMST ASSIGN TO DATABASE-ITMMST
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS IT-ITMCD
FILE STATUS IS WS-ITMSTS.
*----------------------------------------------------------
DATA DIVISION.
FILE SECTION.
*--- 受注入力画面ファイル -----------------------------------
FD ORDDSP.
01 ORDDSP-REC.
COPY DDS-ALL-FORMATS OF ORDDSP.
*--- 受注ヘッダファイル ------------------------------------
FD ORDHDR.
01 ORDHDR-REC.
05 HD-ORDNO PIC X(7). *> 受注番号
05 HD-ORDDAT PIC X(8). *> 受注日
05 HD-CUSCD PIC X(6). *> 得意先コード
05 HD-EMPCD PIC X(4). *> 担当者コード
05 HD-DLVADR PIC X(30). *> 納品先
05 HD-DUEDAT PIC X(8). *> 納期
05 HD-RMRK PIC X(40). *> 備考
05 HD-ORDSTS PIC X(1). *> 受注状態
88 HD-STS-NYURYOKU VALUE '0'. *> 入力中
88 HD-STS-KAKUNIN VALUE '1'. *> 確認済
88 HD-STS-JYUCHU VALUE '2'. *> 受注済
88 HD-STS-CANCEL VALUE '9'. *> キャンセル
05 HD-REGDAT PIC X(8). *> 登録日
05 HD-REGUSR PIC X(10). *> 登録者
05 HD-UPDDAT PIC X(8). *> 更新日
05 HD-UPDUSR PIC X(10). *> 更新者
*--- 受注明細ファイル --------------------------------------
FD ORDDTL.
01 ORDDTL-REC.
05 DT-ORDNO PIC X(7). *> 受注番号
05 DT-DTLNO PIC 9(2). *> 明細行番号
05 DT-ITMCD PIC X(8). *> 品目コード
05 DT-QTY PIC 9(5)V99. *> 数量
05 DT-UPR PIC 9(9)V99. *> 単価
05 DT-AMT PIC 9(11)V99. *> 金額
05 DT-TAX PIC 9(9)V99. *> 消費税
*--- 得意先マスタファイル ----------------------------------
FD CUSTMST.
01 CUSTMST-REC.
05 CS-CUSCD PIC X(6). *> 得意先コード
05 CS-CUSNM PIC X(20). *> 得意先名
05 CS-ADDR PIC X(40). *> 住所
05 CS-TEL PIC X(13). *> 電話番号
*--- 品目マスタファイル ------------------------------------
FD ITMMST.
01 ITMMST-REC.
05 IT-ITMCD PIC X(8). *> 品目コード
05 IT-ITMNM PIC X(20). *> 品目名称
05 IT-STDPRC PIC 9(9)V99. *> 標準単価
05 IT-UNIT PIC X(5). *> 単位
*----------------------------------------------------------
WORKING-STORAGE SECTION.
(中略:フラグ・ファイルステータス・FKey・メッセージ・作業変数など)
*----------------------------------------------------------
PROCEDURE DIVISION.
*==========================================================
* メイン制御
*==========================================================
0000-MAIN.
PERFORM 9000-OPEN-FILES.
PERFORM 9100-INIT-SCREEN.
MOVE 'H' TO WS-MODE.
PERFORM UNTIL WS-END
EVALUATE TRUE
WHEN WS-MODE-HEADER
PERFORM 1000-HEADER-PROCESS
WHEN WS-MODE-DETAIL
PERFORM 2000-DETAIL-PROCESS
WHEN OTHER
MOVE 'Y' TO WS-END-FLG
END-EVALUATE
END-PERFORM.
PERFORM 9900-CLOSE-FILES.
STOP RUN.
(ORDCTL.CLP 主要部分)
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/* プログラム名 : ORDCTL */
/* 名称 : 受注処理 CLコントロールプログラム */
/* 作成日 : 2025/01/01 */
/* 概要 : 受注入力プログラムの起動・環境設定 */
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
PGM PARM(&USERID &LIBNAME)
DCL VAR(&USERID) TYPE(*CHAR) LEN(10)
DCL VAR(&LIBNAME) TYPE(*CHAR) LEN(10)
MONMSG MSGID(CPF0000 MCH0000) +
EXEC(GOTO CMDLBL(ERROR))
ADDLIBLE LIB(&LIBNAME) POSITION(*LAST)
MONMSG MSGID(CPF2103)
CALL PGM(&LIBNAME/ORDPGM)
MONMSG MSGID(CPF0000 MCH0000) +
EXEC(GOTO CMDLBL(ERROR))
ENDPGM:
RMVLIBLE LIB(&LIBNAME)
MONMSG MSGID(CPF2105)
ENDPGM
3ファイルを作成しました。
| ファイル | 内容 |
|---|---|
ORDDSP.DDS |
DDS 画面定義(3レコード形式) |
ORDPGM.CBL |
COBOL 受注入力プログラム |
ORDCTL.CLP |
CL 起動制御プログラム |
主な実装ポイント
DDS(ORDDSP.DDS)
-
HEADERレコード:受注番号入力画面 -
ORDDETレコード:ヘッダ+明細5行の入力画面(色分け表示) -
CONFIRMレコード:削除確認用オーバーレイ画面
COBOL(ORDPGM.CBL)
- F3/F5/F6/F8/F10/F12/Enter 全キー対応
- 得意先コード・品目コードのマスタ存在チェック+名称自動取得
- 金額=数量×単価、消費税10%を画面表示前に自動計算
- 新規 →
WRITE、既存 →REWRITE(明細は削除→再登録)
CL(ORDCTL.CLP)
- パラメータ:
&USERID(ユーザID)、&LIBNAME(ライブラリ名) -
ADDLIBLEでライブラリリスト自動設定、終了後RMVLIBLEでクリーン -
CHKOBJで5ファイルの存在を事前確認し、なければエスケープメッセージを返送 -
MONMSG CPF0000でCOBOL側の異常も捕捉・ログ記録
👤 ユーザー
上記のPGMの仕様書を作成して。
🤖 アシスタント
3ファイルの内容を読み込んで仕様書を作成します。全ファイルを確認しました。HTMLで詳細な仕様書を作成しました。
| 章 | 内容 |
|---|---|
| 1. システム概要 | 目的・動作環境・処理フロー |
| 2. ファイル構成 | 全7ファイルの種別・ライブラリ・役割 |
| 3. 画面仕様(ORDDSP) | 3レコード形式のレイアウト・全フィールド定義・FKey仕様 |
| 4. COBOLプログラム仕様(ORDPGM) | ファイル定義・レコード定義・WORKING-STORAGE・全段落一覧・画面遷移・入力チェック・DB保存処理 |
| 5. CLプログラム仕様(ORDCTL) | パラメータ・変数定義・処理ステップ・エラー処理 |
| 6. DBファイル仕様 | ORDHDR / ORDDTL / CUSTMST / ITMMST の全フィールド定義 |
| 7. エラーメッセージ一覧 | 全14メッセージの種別・内容 |
| 8. コンパイル・実行手順 | コンパイル順序・実行コマンド・前提条件 |
👤 ユーザー
レコードのDDSを作成して
🤖 アシスタント
COBOLのフィールド定義を確認しました。4つのDBファイル(ORDHDR、ORDDTL、CUSTMST、ITMMST)のDDSソースを作成します。
ORDDTL.DDS(受注明細PF)
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* ファイル名 : ORDDTL
* ファイル種別 : PF (物理ファイル)
* 名称 : 受注明細ファイル
* 主キー : ORDNO + DTLNO (受注番号 + 明細行番号)
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A UNIQUE
A R ORDDTLR TEXT('受注明細レコード')
A ORDNO 7A TEXT('受注番号')
A DTLNO 2P 0 TEXT('明細行番号 1-99')
A ITMCD 8A TEXT('品目コード')
A QTY 7P 2 TEXT('数量')
A UPR 11P 2 TEXT('単価')
A AMT 13P 2 TEXT('金額 数量×単価')
A TAX 11P 2 TEXT('消費税額 金額×10%')
A K ORDNO
A K DTLNO
4ファイルすべて作成しました。各ファイルの概要をまとめます。
作成したDBファイル DDS
ORDHDR.DDS — 受注ヘッダPF
| フィールド | 型 | 桁 | 説明 |
|---|---|---|---|
ORDNO |
A | 7 | 主キー 受注番号 |
ORDDAT |
A | 8 | 受注日(YYYYMMDD) |
CUSCD |
A | 6 | 得意先コード |
EMPCD |
A | 4 | 担当者コード |
DLVADR |
A | 30 | 納品先住所 |
DUEDAT |
A | 8 | 納期(YYYYMMDD) |
RMRK |
A | 40 | 備考 |
ORDSTS |
A | 1 | 受注状態(0/1/2/9)省略値=0
|
REGDAT/REGUSR |
A | 8/10 | 登録日・登録者 |
UPDDAT/UPDUSR |
A | 8/10 | 更新日・更新者 |
ORDDTL.DDS — 受注明細PF
| フィールド | 型 | 桁 | 説明 |
|---|---|---|---|
ORDNO |
A | 7 | 複合主キー① 受注番号 |
DTLNO |
P | 2,0 | 複合主キー② 明細行番号 |
ITMCD |
A | 8 | 品目コード |
QTY |
P | 7,2 | 数量(9(5)V99) |
UPR |
P | 11,2 | 単価(9(9)V99) |
AMT |
P | 13,2 | 金額(9(11)V99) |
TAX |
P | 11,2 | 消費税額(9(9)V99) |
CUSTMST.DDS — 得意先マスタPF(MASTERLIB)
| フィールド | 型 | 桁 | 説明 |
|---|---|---|---|
CUSCD |
A | 6 | 主キー 得意先コード |
CUSNM |
A | 20 | 得意先名称 |
CUSNMK |
A | 20 | 得意先名称カナ |
ADDR1/ADDR2 |
A | 30 | 住所1/2 |
ZIPCOD |
A | 7 | 郵便番号 |
TEL/FAX |
A | 13 | 電話番号/FAX |
PICEMPCD |
A | 4 | 担当者コード |
PAYTERM |
A | 2 | 支払条件コード |
CUSTSTS |
A | 1 | 状態(1=有効/9=無効)省略値=1
|
| 登録・更新情報 | — | — | 日付・ユーザID |
ITMMST.DDS — 品目マスタPF(MASTERLIB)
| フィールド | 型 | 桁 | 説明 |
|---|---|---|---|
ITMCD |
A | 8 | 主キー 品目コード |
ITMNM |
A | 20 | 品目名称 |
ITMNMK |
A | 20 | 品目名称カナ |
ITMGRP |
A | 4 | 品目グループコード |
UNIT |
A | 5 | 単位(個/箱/kg 等) |
STDPRC |
P | 11,2 | 標準単価(COBOLが参照) |
BUYPRC |
P | 11,2 | 仕入単価 |
STQTY |
P | 9,2 | 在庫数量 |
SAFEQTY |
P | 9,2 | 安全在庫数量 |
ITMSTS |
A | 1 | 状態(1=有効/2=中止/9=廃止)省略値=1
|
| 登録・更新情報 | — | — | 日付・ユーザID |
コンパイル順序
1. CRTSRCPF / ソースをライブラリに配置
2. CRTPF FILE(MASTERLIB/CUSTMST) SRCFILE(...) → 得意先マスタ
3. CRTPF FILE(MASTERLIB/ITMMST) SRCFILE(...) → 品目マスタ
4. CRTPF FILE(ORDLIB/ORDHDR) SRCFILE(...) → 受注ヘッダ
5. CRTPF FILE(ORDLIB/ORDDTL) SRCFILE(...) → 受注明細
6. CRTDSPF FILE(ORDLIB/ORDDSP) SRCFILE(...) → 画面ファイル
7. CRTCBLPGM PGM(ORDLIB/ORDPGM) SRCFILE(...) → COBOLプログラム
8. CRTCLPGM PGM(ORDLIB/ORDCTL) SRCFILE(...) → CL制御プログラム
一連の作成を見ると、初回で画面表示のDDSとCOBOLソース・CLファイルが作成され、
そのあとに仕様書を作成し、最後に物理ファイルの作成を実施するといった流れになっています。
これはテーブル定義を用意せずにCOBOLファイルとCLファイルを要求したことが影響していると思われますが、
一応プログラムの作成も、テーブルの作成も処理としては可能なようです。
なお、テーブル定義作成前にChatGPTでも仕様書を作成しています。(ORDCTL, ORDPGMのみ)
個別のプロシージャ説明であれば、ChatGPTのほうが内容としては良さそうですが、
こちらはDDS定義に関しては指摘にとどまっているので、DDS定義の作成を実施できるかは今回は不明でした。
指示内容によってはこちらでもDDS定義の作成は可能かもしれません。
5. プログラムソースのレビュー実施
作成したプログラムに対して、IBM BobとChatGPTの両方でチェックを実施してみます。
なお、IBM BobはDDSファイル込みのレビューを、ChatGPTはDDSファイルを除いたレビューを行います。
IBM Bob によるレビュー
受注処理システム コードレビュー報告書
- 対象ファイル:ORDHDR.DDS / ORDDTL.DDS / CUSTMST.DDS / ITMMST.DDS / ORDDSP.DDS / ORDPGM.CBL / ORDCTL.CLP
- レビュー日:2025-01-01
| 種別 | 件数 |
|---|---|
| バグ(要修正) | 4 |
| 警告(推奨修正) | 6 |
| 改善提案 | 5 |
| 構造・設計 | 良好 |
① ORDPGM.CBL — COBOLプログラム
| 重要度 | 場所 | 指摘内容 |
|---|---|---|
| バグ |
1300-INQUIRY 303–304行 |
照会後にモードが二重に上書きされる。MOVE 'I' TO WS-MODE の直後に MOVE 'D' TO WS-MODE と書かれており、照会モード 'I' は即座に上書きされて実際には使われない。 |
| バグ |
2500-SAVE-ORDER 513行 |
WRITE ORDHDR-REC FROM ORDHDR-REC は同じレコードから読んで書いており、直前の MOVE 群でセットした値が反映されない可能性がある。FROM 句を削除してFDレコードをそのまま書くこと。 |
| バグ |
2500-SAVE-ORDER 539行 |
明細 WRITE も同様に自己参照 FROM 句。WRITE ORDDTL-REC FROM ORDDTL-REC → WRITE ORDDTL-REC に修正。 |
| バグ |
8200-LOAD-DTL-FROM-FILE 624行 |
PERFORM UNTIL WS-DTLSTS NOT = '00' は START 直後 '00' から始まるため、ループに入る前に終了してしまう。8400-DELETE-DTL(658行)も同一問題。 |
* 修正後(AT END / NOT '00' はREAD内で処理)
PERFORM UNTIL EXIT
READ ORDDTL NEXT INTO ORDDTL-REC
AT END EXIT PERFORM
END-READ
IF WS-DTLSTS NOT = '00'
EXIT PERFORM
END-IF
IF DT-ORDNO NOT = WS-ORDNO
EXIT PERFORM
END-IF
...
END-PERFORM
| 重要度 | 場所 | 指摘内容 |
|---|---|---|
| 警告 |
FILE-CONTROL 49行 |
ORDDTL の RECORD KEY が単一キー指定になっている。複合キー DT-ORDNO DT-DTLNO を指定すること。 |
| 警告 |
2400-VALIDATE-INPUT 448行 |
WS-ORDDAT PIC X(8) に対して IF WS-ORDDAT NOT NUMERIC は正しく機能しないケースがある。FUNCTION TEST-NUMVAL を使うこと。 |
| 警告 |
2400-VALIDATE-INPUT 全体 |
入力チェック後の品目名・単価が画面に再反映されない。ループを最後まで回してから判定する構造が望ましい。 |
| 警告 |
2600-DELETE-ORDER 568行 |
削除確認の READ が FORMAT 指定なし。また F4 確認キーの IND(04) チェックが不足しており、Enter キーで削除されてしまう。 |
| 警告 |
WS-SYSUSER 169行 |
システムユーザIDが初期化のみで値がセットされていない。RTVJOBA CURUSER(&WS-SYSUSER) 相当の処理が必要。 |
| 警告 |
9000-OPEN-FILES 672行 |
ファイルオープン後のエラーチェックがない。各 OPEN 後に FILE STATUS チェックを追加すること。 |
| 重要度 | 場所 | 指摘内容 |
|---|---|---|
| 改善 |
1400-NEW-ORDER 310–311行 |
新規モード 'N' のセットが即座に 'D' で上書き。 |
| 改善 |
ORDDSP.DDS HEADER/ORDDET |
MSGLIN が2つのレコード形式に重複定義。COBOL 側での修飾(OF HEADER / OF ORDDET)が必須。 |
| 改善 |
ORDDSP.DDS 83行 ORDNO |
ORDDET レコードの ORDNO が両入出力(B)になっており、照会・更新時に受注番号を変更できてしまう。 |
| 改善 |
ORDHDR.DDS 31行 DFT |
DFT キーワードのインデント(列位置)がずれている。コンパイルエラーになる可能性あり。CUSTMST.DDS 36行・ITMMST.DDS 42行も同様。 |
| 改善 |
ORDCTL.CLP 56行 |
CHGJOB DATFMT(*ISO) で設定される日付区切りは YYYY-MM-DD だが、COBOL 側は YYYYMMDD(8桁英数)で管理している。整合性を確認すること。 |
② DBファイル DDS(ORDHDR / ORDDTL / CUSTMST / ITMMST)
✔ 良好な点
- 全ファイルに UNIQUE キーワードが正しく設定されている
- 数値フィールドはパック10進(P型)で定義され COBOL の PIC 9V99 と整合している
- TEXT 記述が全フィールドに付いており保守性が高い
- 登録・更新の監査証跡フィールド(REGDAT/REGUSR/UPDDAT/UPDUSR)が全PFに統一されている
| 重要度 | ファイル・場所 | 指摘内容 |
|---|---|---|
| バグ | ORDHDR.DDS 31行 / CUSTMST.DDS 36行 / ITMMST.DDS 42行 | DFT キーワードの列位置が不正(コンパイルエラー)。列1(Aフラグ桁)から始まる継続行に書く必要がある。 |
| 警告 | CUSTMST.DDS | ORDPGM.CBL の FILE-CONTROL には EMPMST が宣言されているが、当該ファイルの DDS が未作成。 |
| 改善 | ORDDTL.DDS QTY | QTY の桁数(7P 2)は COBOL の PIC 9(5)V99 と一致しているが、大量受注が発生する業務では桁あふれに注意。 |
③ ORDCTL.CLP — CLプログラム
✔ 良好な点
- グローバル MONMSG で予期せぬエラーを捕捉している
- 5ファイルの存在確認(CHKOBJ)を起動前に実施しており堅牢な設計
- 開始・終了ログを SNDPGMMSG で記録している
- ENDPGM ラベルでライブラリを必ず除去しており、リソースリークを防止している
| 重要度 | 場所 | 指摘内容 |
|---|---|---|
| 警告 | 119–121行 CALL ORDPGM | ERROR ラベル末に GOTO CMDLBL(ENDPGM) を追加すること。 |
| 警告 | 64–65行 RTVSYSVAL |
QDATE / QTIME の返値フォーマットが CHGJOB の DATFMT 変更前に取得されている。RTVSYSVAL を CHGJOB の後に移動すること。 |
| 改善 | 13–14行 PARM |
&LIBNAME のデフォルト値を CLP 側の DCL の VALUE に直接指定できる。 |
④ 修正優先順位まとめ
| # | 優先 | ファイル | 修正内容 |
|---|---|---|---|
| 1 | 今すぐ | ORDPGM.CBL | WRITE … FROM …REC の自己参照を削除(ORDHDR/ORDDTL 両方) |
| 2 | 今すぐ | ORDPGM.CBL | PERFORM UNTIL の終了条件を WS-DTLSTS NOT = '00' から正しいロジックに修正(8200/8400) |
| 3 | 今すぐ | ORDHDR/CUSTMST/ITMMST.DDS | DFT キーワードの列位置(A列)を修正 |
| 4 | 今すぐ | ORDPGM.CBL | FILE-CONTROL の ORDDTL RECORD KEY を複合キーに修正 |
| 5 | 優先高 | ORDPGM.CBL | 削除確認で F4 インジケータを確認するよう修正 |
| 6 | 優先高 | ORDPGM.CBL | WS-SYSUSER にユーザID取得処理を追加 |
| 7 | 優先高 | ORDPGM.CBL | OPEN 後のファイルステータスチェック追加 |
| 8 | 任意 | ORDPGM.CBL | 1300/1400 の不要な MOVE 'I'/'N' TO WS-MODE を削除または設計見直し |
| 9 | 任意 | ORDCTL.CLP | ERROR ラベル末に GOTO ENDPGM 追加 / RTVSYSVAL の順序修正 |
| 10 | 任意 | 全般 | EMPMST.DDS の作成 + 担当者名取得処理の実装 |
ChatGPT によるレビュー
対象:
- CL:ORDCTL(受注処理コントロールプログラム)
- COBOL:ORDPGM(受注データ入力プログラム)
総合評価:要修正。
基本的な処理構成(CLによる環境設定 → COBOL起動 → ファイルI/O → 画面処理 → 登録・更新・削除)は整理されています。
一方で、現状のままでは「コンパイルできない可能性が高い箇所」「実行時に意図しない動作になる箇所」「データ整合性上の問題」が複数あります。
特に優先して確認すべき項目:
- ORDDTLのキー定義とアクセス方法
- ファンクションキーの判定ロジック
- WS-MODEの設定
- WS-SYSUSERが設定されていない
- ORDDTL削除処理のSTART/READロジック
- ファイルI/Oエラー時の処理
- 更新処理における明細削除→再登録のトランザクション制御
- 日付チェックが「8桁数字」のみ
- F6新規登録時の受注番号重複チェック
- CLのMONMSGおよびエラー処理
■ 1. CL:ORDCTL レビュー
【1-1. グローバルMONMSGの位置】
MONMSG MSGID(CPF0000 MCH0000) +
EXEC(GOTO CMDLBL(ERROR))
プログラム全体のエラー監視を意図していると思われます。個別のMONMSGとの関係や、エラー発生後のメッセージ処理について十分注意が必要です。
改善案:
- 想定内エラーは各コマンド直後で個別に処理
- 想定外エラーだけ共通ERRORへ送る
- ERROR処理では発生元コマンドを特定できる情報をログに残す
【1-2. LIBNAMEの妥当性チェックがない】
空白の場合はORDLIBを設定していますが、指定されたライブラリが存在するかのチェックがありません。ADDLIBLEでエラーになるため最終的には異常終了しますが、ユーザー向けのエラーメッセージとしては不十分です。
【1-3. ファイル存在確認は良いが、対象が固定されている】
MASTERLIB が固定です。設計上MASTERLIBが常に固定なら問題ありませんが、環境依存性が高くなります。ORDLIBのようにパラメータ化する必要があるか確認してください。
【1-4. ORDDSPのCHKOBJ】
CHKOBJ OBJ(&LIBNAME/ORDDSP) OBJTYPE(*FILE) で確認すること自体は問題ありませんが、実際にDSPFとして使用できる状態かは別問題です。
【1-5. CALL失敗時のエラー処理】
基本的には良いですが、ORDPGM側で異常終了した場合に、どのメッセージを受け取るか、またORDPGM側のメッセージをどこまで呼び出し元へ返すかを設計として明確にした方がよいです。
【1-6. RMVLIBLE】
ADDLIBLEで「すでに存在していた場合」でも、終了時にRMVLIBLEを実行します。つまり、もともと呼び出し元のライブラリリストに存在していたライブラリまで削除してしまう可能性があります。
【重要】 ADDLIBLEした時点で「このプログラムが追加したか」をフラグ(
&LIB-ADDED = 'Y')で管理し、追加済みの場合だけRMVLIBLEする設計にしてください。MASTERLIBについても同様です。
■ 2. COBOL:ORDPGM レビュー
【2-1. ORDDTLのRECORD KEYが問題】
現在は RECORD KEY IS DT-ORDNO のみですが、受注明細は「受注番号+明細行番号」で一意になる設計が自然です。DB側のPF/LFが複合キーなら、COBOL側のRECORD KEY定義も見直しが必要です。
■ 3. ORDDTLのSTART処理に問題がある
MOVE WS-ORDNO TO DT-ORDNO.
MOVE 1 TO DT-DTLNO.
START ORDDTL KEY IS NOT LESS THAN DT-ORDNO
DT-DTLNOを設定しているにもかかわらず、KEY IS NOT LESS THAN DT-ORDNO となっているため、DT-DTLNOをキーとして使っていません。8200-LOAD-DTL-FROM-FILE と 8400-DELETE-DTL の両方に同様の問題があります。
■ 4. 明細削除処理が特に危険
READ失敗時のWS-DTLSTSの扱いが問題です。また DELETE後のステータス確認もありません。
改善案:
- READ NEXT後に明示的にファイルステータス確認
- DELETE後にもステータス確認
- 対象受注番号の明細だけを削除していることを保証
- キー構造に合わせてSTART条件を修正
■ 5. WS-SYSUSERが設定されていない
WS-SYSUSER PIC X(10) がありますが、コード内で値を設定している箇所が見当たりません。このため、登録者・更新者が空白になる可能性があります。IBM iのユーザーIDを取得してWS-SYSUSERへ設定してください。
■ 6. WS-MODEの設定が不自然
1300-INQUIRY で MOVE 'I' TO WS-MODE. の直後に MOVE 'D' TO WS-MODE. となっているため、常にDです。「画面モード」と「処理モード」を分離することを推奨します。
WS-SCREEN-MODE: H = ヘッダ / D = 明細
WS-EDIT-MODE: N = 新規 / U = 更新 / I = 照会
■ 7〜44. その他の指摘事項(抜粋)
| # | 指摘内容 |
|---|---|
| 7 | F6が明細画面で処理されていない |
| 8 | F8を取得しているが処理が存在しない(仕様と実装の不一致) |
| 9 | F10削除確認でF4のIND(04)チェックがない |
| 10 | 削除確認処理が画面入力を二重に行っている |
| 11 | 受注日チェックが不十分(20251399 のような不正日付が通る) |
| 12 | 受注番号の形式チェックがない |
| 13 | 新規登録時に既存受注番号を入力すると更新処理に進んでしまう |
| 14 |
MSG-ALREADY-EXISTS が定義されているのに使用されていない |
| 15 |
MSG-NORMAL も使用されていない |
| 16 |
WS-CONFIRM も使用されていない |
| 17 |
WS-DTL-CNT も使用されていない |
| 18 | 明細最大行数が5固定なのにF8(次頁)仕様と矛盾 |
| 19 | 税計算の端数処理がない |
| 20 | 税率10%がハードコーディング |
| 21 | 金額項目の桁あふれ確認が必要 |
| 22 | 得意先名の取得タイミングの確認 |
| 23 | 品目単価の自動取得の業務仕様確認 |
| 24 | 明細0件でも登録できる可能性 |
| 25 | 担当者コードの存在チェックがない |
| 26 | EMPMSTが「使用ファイル」にあるのに実装されていない |
| 27 | ORDDTLのREAD NEXTループの条件が危険(WS-DTLSTSの初期値がSPACES) |
| 28 | ファイルステータスの初期化が不明確 |
| 29 | OPEN処理のエラーハンドリング不足 |
| 30 | 更新処理のトランザクション制御がない(ヘッダ更新後に明細失敗で不整合) |
| 31 | 明細削除→再登録方式の監査・同時更新上の弱点 |
| 32 | 同時更新制御がない(楽観ロック等の検討が必要) |
| 33 | 照会モードと更新モードが明確に分かれていない |
| 34 | 新規登録直後に「確認済」状態にしているが業務的に正しいか確認 |
| 35 | キャンセル状態にする処理がない |
| 36 | WS-SYSUSERが未設定(再掲) |
| 37 | CLとCOBOLで日付取得方法が異なる |
| 38 | エラー処理が粗い(詳細ログが必要) |
| 39 | ファイルステータスをユーザー向けメッセージに含めていない |
| 40 | ORDDSPのWRITE/READ仕様とDDS定義の整合性確認 |
| 41 | F3押下時にファイルクローズされるか(構造自体は良好) |
| 42 | F3押下時にデータ保存状態を確認していない |
| 43 | F12処理で更新中の場合に確認を入れるべき |
| 44 | コメントと実装の整合性(F8未実装、F4未処理など) |
| 45 | 未使用変数・未使用メッセージ・モード管理の混在を整理 |
■ 優先度別の修正項目
【A:最優先】
- ORDDTLのキー構造確認
- ORDDTLのSTART/READ NEXT処理修正
- 8200/8400のPERFORM UNTIL条件修正
- F4削除確定処理の実装
- WS-SYSUSER設定
- 新規登録時の既存受注番号チェック
- WS-MODEの設計見直し
- 明細登録途中エラー時のデータ不整合対策
【B:高優先】
- F8の実装または仕様削除
- F3終了時の未保存確認
- 受注日を実在日付までチェック
- 担当者コード存在チェック
- 明細0件登録防止
- OPENエラー処理
- DELETE後のFILE STATUS確認
- 同時更新制御
【C:改善】
- 税率ハードコーディング解除
- 税計算の端数処理
- 未使用変数削除
- 未使用メッセージ削除
- コメント整理
- エラー時の詳細ログ強化
■ 特に重要な問題 TOP 5
| 順位 | 問題 |
|---|---|
| 第1位 | ORDDTLのキー/START処理 — 受注番号+明細番号の扱いが不整合になっている可能性。DDS/LF定義とCOBOLのRECORD KEYを最優先で確認。 |
| 第2位 |
8200/8400のREADループ — PERFORM UNTIL WS-DTLSTS NOT = '00' は WS-DTLSTSの初期値がSPACESのため、期待どおりループしない可能性がある。 |
| 第3位 | WS-SYSUSER未設定 — 登録者・更新者が空白になる可能性。 |
| 第4位 |
新規/更新モードの混在 — MOVE 'I' TO WS-MODE. → MOVE 'D' TO WS-MODE. は設計上見直すべき。 |
| 第5位 | トランザクション制御 — ヘッダ更新後に明細更新で失敗すると、ヘッダと明細の不整合が発生する可能性。 |
■ 推奨する修正後の構造
WS-SCREEN-MODE: H = ヘッダ画面 / D = 明細画面
WS-EDIT-MODE: N = 新規 / U = 更新 / I = 照会
WS-FUNCTION-KEY: F03 / F04 / F05 / F06 / F08 / F10 / F12
メイン
↓ ヘッダ画面
F5 → 照会 → 明細画面(I)
F6 → 新規 → 明細画面(N)
↓ 明細画面
Enter → 入力チェック → 新規 or 更新判定 → DB更新 → COMMIT → 完了
■ 最終判定
「構造は分かりやすいが、本番投入前に修正が必要」
特に単なるコーディングスタイル上の問題ではなく、明細取得・削除できない可能性、新規登録と更新の誤判定、登録者/更新者が空白、F4削除確定が機能しない可能性、F8が未実装、ヘッダ/明細の不整合といった実動作に影響する問題があります。
本番投入前には、少なくともAランクの項目をすべて修正し、実際のDDS(ORDDSP)、ORDHDR、ORDDTL、CUSTMST、ITMMST、EMPMSTの定義と突き合わせて再レビューすることを推奨します。
ここで注目したいのは、
- IBM Bobはプログラムの設計は正しいものとして、プログラムに含まれる重大箇所を指摘している
- ChatGPTではプログラムの設計自体のレビューを実施しており、想定される動作に関しての指摘も行っている
といった違いがあります。
プログラム自体の重大な修正箇所である、以下の個所に関しては両AIエージェントで共通して指摘しています。
・ORDDTL RECORD KEYが無効になる
・1300-INQUIRYでMOVE 'I' TO WS-MODEが意味をなさない
・PERFORM UNTILで処理が参照されない
指摘で気になったのは、IBM BobはWRITE 構文の FROM 句が自己参照になっているとの指摘がありますが、
処理としてはFROM対象のレコードに対してINTOしており、WRITE処理としては問題ないことから、
この指摘内容は適切でないよう感じられました。(ChatGPTでは指摘なし)
※読み込みフィールドと別にワークフィールドを用意する、といった指摘であれば適切ではありましたが…
単体レベルではIBM Bobの指摘は大半のケースで適切ではありますが、
結合以降のテスト等ではChatGPTの指摘箇所を考慮する必要がありそうです。
6. レビュー後のソース修正
レビュー後に各種ファイルの修正を実施してもらいます。
なお、IBM Bobは全ファイルが対象となりますが、
ChatGPTに関してはORDPGM.CBLとORDCTL.CLPのみ対象とします。
作成したCOBOLソースの詳細はこちらで確認できます。
ORDCTL.CLP
少し長いので折り畳みしています。
ORDCTL.CLP(IBM Bob)
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/* プログラム名 : ORDCTL */
/* 名称 : 受注処理 CLコントロールプログラム */
/* 作成日 : 2025/01/01 */
/* 概要 : 受注入力プログラムの起動・環境設定 */
/* ライブラリリストの設定、エラーハンドリング */
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
PGM PARM(&USERID &LIBNAME)
/*----------------------------------------------------------*/
/* パラメータ宣言 */
/*----------------------------------------------------------*/
DCL VAR(&USERID) TYPE(*CHAR) LEN(10)
DCL VAR(&LIBNAME) TYPE(*CHAR) LEN(10)
/*----------------------------------------------------------*/
/* ローカル変数宣言 */
/*----------------------------------------------------------*/
DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(100)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&ERRMSG) TYPE(*CHAR) LEN(100)
DCL VAR(&CPFMSG) TYPE(*CHAR) LEN(100)
DCL VAR(&SYSDATE) TYPE(*CHAR) LEN(8)
DCL VAR(&SYSTIME) TYPE(*CHAR) LEN(6)
DCL VAR(&RTNCODE) TYPE(*DEC) LEN(5 0) VALUE(0)
/*----------------------------------------------------------*/
/* グローバルエラーモニタ */
/*----------------------------------------------------------*/
MONMSG MSGID(CPF0000 MCH0000) +
EXEC(GOTO CMDLBL(ERROR))
/*----------------------------------------------------------*/
/* ライブラリ名デフォルト設定 */
/*----------------------------------------------------------*/
IF COND(&LIBNAME *EQ ' ') +
EXEC(CHGVAR VAR(&LIBNAME) VALUE('ORDLIB'))
/*----------------------------------------------------------*/
/* 1. ライブラリリストの設定 */
/* 受注処理に必要なライブラリをジョブのライブラリリスト */
/* に追加する */
/*----------------------------------------------------------*/
ADDLIBLE LIB(&LIBNAME) POSITION(*LAST)
MONMSG MSGID(CPF2103) /* すでに存在する場合は無視 */
ADDLIBLE LIB(MASTERLIB) POSITION(*LAST)
MONMSG MSGID(CPF2103)
/*----------------------------------------------------------*/
/* 2. ジョブ属性の設定 */
/*----------------------------------------------------------*/
/* 日付フォーマット: ISO (YYYY-MM-DD) */
CHGJOB DATFMT(*ISO) DATSEP(-)
/* メッセージキューの設定 */
CHGJOB INQMSGRPY(*SYSRPYL)
/*----------------------------------------------------------*/
/* 3. ログ:処理開始記録 */
/* ※ RTVSYSVAL は CHGJOB の後に実行して日付フォーマットを */
/* 統一する */
/*----------------------------------------------------------*/
RTVSYSVAL SYSVAL(QDATE) RTNVAR(&SYSDATE)
RTVSYSVAL SYSVAL(QTIME) RTNVAR(&SYSTIME)
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理開始 ユーザ:' *CAT +
&USERID *CAT ' 日時:' *CAT +
&SYSDATE *CAT &SYSTIME)
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*INFO)
/*----------------------------------------------------------*/
/* 4. 必要ファイルの存在確認 */
/* 受注ヘッダ・明細・マスタファイルの確認 */
/*----------------------------------------------------------*/
CHKOBJ OBJ(&LIBNAME/ORDHDR) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('ファイル ORDHDR が見つかりません: ' +
*CAT &LIBNAME)
GOTO CMDLBL(FILEERR)
ENDDO
CHKOBJ OBJ(&LIBNAME/ORDDTL) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('ファイル ORDDTL が見つかりません: ' +
*CAT &LIBNAME)
GOTO CMDLBL(FILEERR)
ENDDO
CHKOBJ OBJ(MASTERLIB/CUSTMST) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('マスタ CUSTMST が見つかりません: MASTERLIB')
GOTO CMDLBL(FILEERR)
ENDDO
CHKOBJ OBJ(MASTERLIB/ITMMST) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('マスタ ITMMST が見つかりません: MASTERLIB')
GOTO CMDLBL(FILEERR)
ENDDO
CHKOBJ OBJ(&LIBNAME/ORDDSP) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('画面ファイル ORDDSP が見つかりません: ' +
*CAT &LIBNAME)
GOTO CMDLBL(FILEERR)
ENDDO
/*----------------------------------------------------------*/
/* 5. COBOLプログラム呼び出し */
/*----------------------------------------------------------*/
CALL PGM(&LIBNAME/ORDPGM)
MONMSG MSGID(CPF0000 MCH0000) +
EXEC(GOTO CMDLBL(ERROR))
/*----------------------------------------------------------*/
/* 6. 正常終了処理 */
/*----------------------------------------------------------*/
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理正常終了 ユーザ:' *CAT &USERID)
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*INFO)
GOTO CMDLBL(ENDPGM)
/*----------------------------------------------------------*/
/* ファイルエラー処理 */
/*----------------------------------------------------------*/
FILEERR:
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA(&ERRMSG) +
TOPGMQ(*EXT) MSGTYPE(*ESCAPE)
GOTO CMDLBL(ENDPGM)
/*----------------------------------------------------------*/
/* 異常終了処理 */
/*----------------------------------------------------------*/
ERROR:
RCVMSG MSGTYPE(*EXCP) RMV(*NO) +
MSGID(&MSGID) MSG(&CPFMSG) +
MSGF(&MSGF) MSGFLIB(&MSGFLIB)
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理異常終了 MSGID:' *CAT +
&MSGID *CAT ' MSG:' *CAT &CPFMSG)
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*DIAG)
/* エスケープメッセージを再送して呼び出し元に通知 */
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA(&ERRMSG) +
TOPGMQ(*EXT) MSGTYPE(*ESCAPE)
GOTO CMDLBL(ENDPGM)
/*----------------------------------------------------------*/
/* 終了処理 */
/*----------------------------------------------------------*/
ENDPGM:
/* ライブラリリストから削除 */
RMVLIBLE LIB(&LIBNAME)
MONMSG MSGID(CPF2105) /* 存在しない場合は無視 */
RMVLIBLE LIB(MASTERLIB)
MONMSG MSGID(CPF2105)
ENDPGM
ORDCTL.CLP(ChatGPT)
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/* プログラム名 : ORDCTL */
/* 名称 : 受注処理 CLコントロールプログラム */
/* 作成日 : 2026/09/02 */
/* 概要 : 受注入力プログラムの起動・環境設定 */
/* ライブラリリスト設定、オブジェクト確認 */
/* エラーハンドリング */
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
PGM PARM(&USERID &LIBNAME)
/*----------------------------------------------------------*/
/* パラメータ宣言 */
/*----------------------------------------------------------*/
DCL VAR(&USERID) TYPE(*CHAR) LEN(10)
DCL VAR(&LIBNAME) TYPE(*CHAR) LEN(10)
/*----------------------------------------------------------*/
/* 作業変数 */
/*----------------------------------------------------------*/
DCL VAR(&JOBUSER) TYPE(*CHAR) LEN(10)
DCL VAR(&QDATETIME) TYPE(*CHAR) LEN(20)
DCL VAR(&SYSDATE) TYPE(*CHAR) LEN(8)
DCL VAR(&SYSTIME) TYPE(*CHAR) LEN(6)
DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(256)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&ERRMSG) TYPE(*CHAR) LEN(256)
DCL VAR(&LIBADDED) TYPE(*CHAR) LEN(1) +
VALUE('N')
DCL VAR(&MSTADDED) TYPE(*CHAR) LEN(1) +
VALUE('N')
DCL VAR(&RTNCODE) TYPE(*DEC) LEN(5 0)
/*----------------------------------------------------------*/
/* プログラムレベルエラーモニタ */
/*----------------------------------------------------------*/
/* 予期しないエラーはERRORへ分岐し、ライブラリ等を必ず */
/* 後処理してから終了する。 */
/*----------------------------------------------------------*/
MONMSG MSGID(CPF0000 MCH0000) +
EXEC(GOTO CMDLBL(ERROR))
/*----------------------------------------------------------*/
/* ユーザーID未指定時は現在のユーザーを取得 */
/*----------------------------------------------------------*/
IF COND(&USERID *EQ ' ') +
THEN(RTVJOBA USER(&JOBUSER))
IF COND(&USERID *EQ ' ') THEN(DO)
CHGVAR VAR(&USERID) VALUE(&JOBUSER)
ENDDO
/*----------------------------------------------------------*/
/* ライブラリ名デフォルト */
/*----------------------------------------------------------*/
IF COND(&LIBNAME *EQ ' ') THEN(DO)
CHGVAR VAR(&LIBNAME) VALUE('ORDLIB')
ENDDO
/*----------------------------------------------------------*/
/* 開始日時取得 */
/* QDATETIME = YYYYMMDDHHNNSSXXXXXX */
/*----------------------------------------------------------*/
RTVSYSVAL SYSVAL(QDATETIME) RTNVAR(&QDATETIME)
CHGVAR VAR(&SYSDATE) +
VALUE(%SST(&QDATETIME 1 8))
CHGVAR VAR(&SYSTIME) +
VALUE(%SST(&QDATETIME 9 6))
/*----------------------------------------------------------*/
/* 1. ライブラリリスト設定 */
/*----------------------------------------------------------*/
ADDLIBLE LIB(&LIBNAME) POSITION(*LAST)
MONMSG MSGID(CPF2103)
IF COND(&LIBNAME *NE ' ') THEN(DO)
/* CPF2103の場合は既存ライブラリなので削除しない */
/* 正常に追加された場合のみフラグをONにする */
ENDDO
/* ADDLIBLEの結果を厳密に保持するため、存在確認を行う */
RTVJOBA USRLIBL(&ERRMSG)
/* MASTERLIB追加 */
ADDLIBLE LIB(MASTERLIB) POSITION(*LAST)
MONMSG MSGID(CPF2103)
/*----------------------------------------------------------*/
/* 2. 必要オブジェクト存在確認 */
/*----------------------------------------------------------*/
CHKOBJ OBJ(&LIBNAME/ORDDSP) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(FILEERR))
CHKOBJ OBJ(&LIBNAME/ORDHDR) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(FILEERR))
CHKOBJ OBJ(&LIBNAME/ORDDTL) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(FILEERR))
CHKOBJ OBJ(MASTERLIB/CUSTMST) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(FILEERR))
CHKOBJ OBJ(MASTERLIB/ITMMST) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(FILEERR))
CHKOBJ OBJ(&LIBNAME/ORDPGM) OBJTYPE(*PGM)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(FILEERR))
/*----------------------------------------------------------*/
/* 3. 開始ログ */
/*----------------------------------------------------------*/
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理開始 ユーザ:' *CAT +
&USERID *CAT +
' 日時:' *CAT +
&SYSDATE *CAT &SYSTIME)
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*INFO)
/*----------------------------------------------------------*/
/* 4. COBOLプログラム呼び出し */
/*----------------------------------------------------------*/
/* USERIDをCOBOLへ渡す */
/*----------------------------------------------------------*/
CALL PGM(&LIBNAME/ORDPGM) +
PARM(&USERID)
/* COBOL側でRETURN-CODEを設定した場合に取得 */
RTVJOBA RTNCDE(&RTNCODE)
IF COND(&RTNCODE *NE 0) THEN(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理異常終了 COBOL RETURN-CODE:' +
*CAT &RTNCODE)
GOTO CMDLBL(ERROR)
ENDDO
/*----------------------------------------------------------*/
/* 5. 正常終了 */
/*----------------------------------------------------------*/
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理正常終了 ユーザ:' *CAT +
&USERID)
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*INFO)
GOTO CMDLBL(ENDPGM)
/*----------------------------------------------------------*/
/* ファイル/オブジェクトエラー */
/*----------------------------------------------------------*/
FILEERR:
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理 必要オブジェクトが存在しません')
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*DIAG)
GOTO CMDLBL(ENDPGM)
/*----------------------------------------------------------*/
/* 異常終了 */
/*----------------------------------------------------------*/
ERROR:
RCVMSG MSGTYPE(*EXCP) RMV(*NO) +
MSGID(&MSGID) +
MSGDTA(&MSGDTA) +
MSGF(&MSGF) +
MSGFLIB(&MSGFLIB)
MONMSG MSGID(CPF0000 MCH0000)
/* 受信できなかった場合でもERRMSGは設定する */
IF COND(&ERRMSG *EQ ' ') THEN(DO)
CHGVAR VAR(&ERRMSG) +
VALUE('受注処理異常終了 MSGID:' *CAT +
&MSGID *CAT +
' MSG:' *CAT &MSGDTA)
ENDDO
SNDPGMMSG MSG(&ERRMSG) TOPGMQ(*EXT) +
MSGTYPE(*DIAG)
/*----------------------------------------------------------*/
/* 終了処理 */
/*----------------------------------------------------------*/
ENDPGM:
/* ライブラリは、実際に追加したものだけ削除する設計にする */
/* ※運用環境で既存ライブラリを誤って削除しないため重要 */
IF COND(&LIBADDED *EQ 'Y') THEN(DO)
RMVLIBLE LIB(&LIBNAME)
MONMSG MSGID(CPF2105)
ENDDO
IF COND(&MSTADDED *EQ 'Y') THEN(DO)
RMVLIBLE LIB(MASTERLIB)
MONMSG MSGID(CPF2105)
ENDDO
ENDPGM
IBM Bob:最小限の修正範囲
| 評価 | 内容 |
|---|---|
| 良い点 | 内容のコメント化に関しては申し分ない。修正時にシステム固有の処理は比較的使用しないので、可読性や移植性に優れている。 |
| 悪い点 | レビューで指摘していた内容をベースにしているため、結果として修正範囲は広くない。結合テスト以降では障害が発生する可能性は高い。 |
ChatGPT:広範囲の修正範囲
| 評価 | 内容 |
|---|---|
| 良い点 | レビューで指摘していた点を網羅する形で修正しており、当初存在していない変数や処理を追加することで対応を行っている。プロシージャの説明はこちらの記載のほうが比較的わかりやすい。 |
| 悪い点 | コメントはIBM Bobと比較すると省略されている点が多い。また、システム固有(COBOL ILE)の機能(標識など)を使用しているため、可読性や移植性は劣る印象がある。 |
意外だったのは、ChatGPTのほうがシステム固有の処理を記載していたのに対して、IBM Bobのほうはシステム固有の処理は避けるような記載をしていた点でした。
立ち位置を考えると、IBM Bobのほうはシステム固有(COBOL ILE)の処理を記載しそうではありますが、
実際のAIの考えとしては、システム固有の処理は避けるようになっているのかもしれません。
この結果を考慮すると、
- ChatGPT:既存のCOBOL ILEユーザー向けの修正。新規でCOBOL ILEを作成する場合は可読性が悪い
- IBM Bob:COBOLユーザー向けの修正。COBOL ILEのシステム固有の処理は少ないので他COBOLのプログラマーでも容易
といえるかもしれません。
7. ソース修正後の仕様書作成
ソース修正後の仕様書を再度作成してもらいます。
ChatGPTは、ChatGPTで修正したソースと、DDSファイルを含める形で仕様書を作成してもらいます。
IBM Bobは以下の指示により、IBM Bobで修正したファイルで再度仕様書を作成してもらっています。
IBM Bob への指示内容
👤 ユーザー
再度仕様書を作成して
🤖 アシスタント
最新の全ファイルを確認してから仕様書を作成します(ORDCTL.CLP、ORDPGM.CBL を読み込み)。
レビュー修正後の最新状態を反映した仕様書を作成しました。全9章構成で以下の内容を網羅しています。
| 章 | 内容 |
|---|---|
| 1 | システム概要・構成ファイル一覧(7ファイル) |
| 2 | 画面構成(HEADER / ORDDET / CONFIRM の全フィールド) |
| 3 | ファンクションキー定義(F3〜F12 / Enter) |
| 4 | プログラム構造・処理フロー図・全段落一覧(18段落) |
| 5 | 入力チェック仕様(6項目・先頭エラー表示方式) |
| 6 | DBファイル仕様(ORDHDR / ORDDTL / CUSTMST / ITMMST) |
| 7 | CL制御プログラム仕様(ORDCTL の全処理フロー) |
| 8 | コンパイル手順(順序付き) |
| 9 | 既知の制約・今後の課題(EMPMST未実装等5件) |
作成した仕様書はこちらから確認できます。
両方の仕様書とも、DDS定義を参照した形で仕様書が作成されていることがわかります。
また、ChatGPTにおいては画面定義DDSを読み込んだため、結果として画面機能の仕様も含めた形の仕様書になっています。
気になった点としては、ChatGPTに関しては全ファイルを参照する形で仕様書を作成できたのに対して、IBM BobはORDDSP.DDSを含めない形での仕様書になっていた点です。
(初回の仕様書では、IBM BobはORDDSP.DDSを含めた形で画面イメージを表示できていましたが、今回は含まれていない仕様書になってしまいました)
これは、IBM Bobは修正したファイルに対して仕様書を作成したため、結果として修正が入らない形で仕様書を作成してしまったものと考えられます。
そのため、IBM Bobに仕様書を再作成してもらう際には、すべてのファイルを参照することを指示する必要がありそうです。
また、制約事項に関しては一部項目(担当者マスタ(EMPMST)が存在しない、明細が最大5行)などは共通していますが、それ以外では内部の処理が変わったことにより、制約事項にも差異が発生しているようです。
こちらに関しては、採用するソースによる差異の影響が大きいため、両AIにおいて同一ソースを読み込ませる形で仕様書を作成したほうが、明確な制約事項の洗い出しができるように見受けられました。
当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。