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?

IBM Bobを使用した受注データプログラムと仕様書の作成(COBOL ILE + CL)

0
Last updated at Posted at 2026-09-14

目次

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. 作成の流れ

以下の流れで作成を実施しています。

  1. Bobに受注データ入力システムを作成依頼
  2. BobとChatGPTにレビュー
  3. レビューをもとにBobとChatGPTにプログラム修正依頼
  4. 修正したプログラムをもとに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 → 画面処理 → 登録・更新・削除)は整理されています。
一方で、現状のままでは「コンパイルできない可能性が高い箇所」「実行時に意図しない動作になる箇所」「データ整合性上の問題」が複数あります。

特に優先して確認すべき項目:

  1. ORDDTLのキー定義とアクセス方法
  2. ファンクションキーの判定ロジック
  3. WS-MODEの設定
  4. WS-SYSUSERが設定されていない
  5. ORDDTL削除処理のSTART/READロジック
  6. ファイルI/Oエラー時の処理
  7. 更新処理における明細削除→再登録のトランザクション制御
  8. 日付チェックが「8桁数字」のみ
  9. F6新規登録時の受注番号重複チェック
  10. 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:最優先】

  1. ORDDTLのキー構造確認
  2. ORDDTLのSTART/READ NEXT処理修正
  3. 8200/8400のPERFORM UNTIL条件修正
  4. F4削除確定処理の実装
  5. WS-SYSUSER設定
  6. 新規登録時の既存受注番号チェック
  7. WS-MODEの設計見直し
  8. 明細登録途中エラー時のデータ不整合対策

【B:高優先】

  1. F8の実装または仕様削除
  2. F3終了時の未保存確認
  3. 受注日を実在日付までチェック
  4. 担当者コード存在チェック
  5. 明細0件登録防止
  6. OPENエラー処理
  7. DELETE後のFILE STATUS確認
  8. 同時更新制御

【C:改善】

  1. 税率ハードコーディング解除
  2. 税計算の端数処理
  3. 未使用変数削除
  4. 未使用メッセージ削除
  5. コメント整理
  6. エラー時の詳細ログ強化

■ 特に重要な問題 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.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.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に帰属します。詳細はこちらを参照ください。

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?