IBM Bobを使用したマスター更新プログラム作成
目次
1. はじめに
2. やりたいこと
3. 一連の処理
4. 定価に加算を行うプログラム
5. 当月売上金額・当年売上金額を再計算するプログラム
6. まとめと今後の改善点
7. プログラムから設計書の作成
1. はじめに
本記事は IBM RISING2026 のチーム成果物として作成したものです。
今回は IBM Bob を活用して、品目マスター(HINMSP)に対する一括更新プログラムをRPG IIIで作成したケースを紹介します。
2. やりたいこと
サンプルとして用意した品目マスター(HINMSP)に対して、一括更新を実施できるプログラムを作成します。
対応言語: RPG III(RPG400)
更新内容
| 項目 | 内容 |
|---|---|
| A | 定価が 1,000以上 の場合、定価の値に 100 を加算 する |
| B | 定価が更新された場合、当月売上金額・当年売上金額をそれぞれ再計算する |
再計算式:
当月売上金額 = 定価 × 当月売上数量
当年売上金額 = 定価 × 当年売上数量
品目マスター(HINMSP)DDS定義
A* 品目マスター・ファイル
A UNIQUE
A R HINMSR TEXT('品目マスター・レコード')
A*
A HNBANG 5 COLHDG('品目番号')
A HNNAKN 20 COLHDG('品名' '仮名')
A HNNAKJ 20O COLHDG('品名' '漢字')
A HNVEND 5 COLHDG('仕入先' '番号')
A HNTEIK 5 0 COLHDG('定価')
A HNGENK 5 0 COLHDG('原価')
A HNGSUR 5 0 COLHDG('当月' '売上数量')
A HNNSUR 5 0 COLHDG('当年' '売上数量')
A HNGKIN 7 0 COLHDG('当月' '売上金額')
A HNNKIN 7 0 COLHDG('当年' '売上金額')
A*
A K HNBANG
3. 一連の処理
処理はA・Bの順で2つのプログラムを作成します。
A. 定価に加算を行うプログラム(HINUPD)
↓
B. 当月売上金額・当年売上金額を再計算するプログラム(KINUPD)
4. 定価に加算を行うプログラム(HINUPD)
以下はIBM Bobとのやり取りの記録です。
👤 User が入力、🤖 Assistant がIBM Bobの回答です。
👤 ファイルHINMSP.MBRを一括更新するプログラムをRPGⅢで作ってほしい
🤖 処理フロー概要(Plan)
対象ファイル: HINMSP(品目マスター) — キー: HNBANG(品目番号 5桁)
| ステップ | 内容 |
|---|---|
| ① | HINMSP を Update 用(UF)でオープン |
| ② | READ サイクルで先頭から順に全件処理 |
| ③ |
HNTEIK >= 1000 の場合、指標50をセット |
| ④ | 指標50がONの時、HNTEIK + 100 → HNTEIK
|
| ⑤ | 指標50がONの時、UPDAT HINMSR
|
| ⑥ | LRで正常終了 |
👤 定価が1,000以上の時、定価の値にプラス100をする
🤖 生成されたプログラム(HINUPD)
H* HINUPD - 品目マスター定価一括更新
F*
FHINMSP UF E K DISK
C*
C HNTEIK COMP 1000 50
C 50 HNTEIK ADD 100 HNTEIK
C 50 UPDAT HINMSR
F仕様書の説明:
| カラム | 値 | 意味 |
|---|---|---|
| 7–14 | HINMSP |
ファイル名 |
| 15 | U |
更新ファイル(Update) |
| 16 | F |
フルプロシジャー |
| 19–20 | E |
外部記述(DDSで定義済み) |
| 34 | K |
キー順アクセス |
| 40–46 | DISK |
ディスクファイル |
C仕様書の説明:
-
COMP 1000:HNTEIK >= 1000のとき 指標50をON -
ADD 100:指標50がONの時のみHNTEIK + 100 → HNTEIK -
UPDAT HINMSR:指標50がONの時のみレコードを書き戻す
👤 作成したプログラムHINUPDのテスト仕様書を作ってほしい。テストする観点を洗い出して
🤖 テスト観点(16ケース)
| グループ | 観点 | 重点 |
|---|---|---|
| A. 境界値 | 1,000(ON境界)/ 999(OFF境界)/ 1,001 | 最重要 |
| B. 同値分割 | 通常の更新対象・対象外・ゼロ値 | 基本動作確認 |
| C. 特殊値 | 99,900 / 99,999 の桁あふれ | リスク確認 |
| D. 件数・状態 | 0件 / 全件対象 / 全件対象外 / 混在 | 全体処理確認 |
| E. 副作用 | 他フィールド不変 / LR正常終了 / 再実行の累積 | 非破壊確認 |
桁あふれに注意: HNTEIK は5桁(最大 99,999)のため、99,900以上に +100 すると桁あふれが発生します。上限チェックの追加要否を確認してください。
👤 テストデータを作ってほしい
🤖 テストデータ(8件)
| No. | HNBANG | 品名 | HNTEIK(前) | HNTEIK(期待値) | テスト観点 |
|---|---|---|---|---|---|
| 1 | 00100 |
ショウヒンA | 500 | 500 | 更新対象外(中間値) |
| 2 | 00200 |
ショウヒンB | 999 | 999 | 境界値 OFF |
| 3 | 00300 |
ショウヒンC | 1,000 | 1,100 | 境界値 ON |
| 4 | 00400 |
ショウヒンD | 1,500 | 1,600 | 更新対象(中間値) |
| 5 | 00500 |
ショウヒンE | 200 | 200 | 更新対象外 |
| 6 | 00600 |
ショウヒンF | 2,500 | 2,600 | 更新対象(大きい値) |
| 7 | 00700 |
ショウヒンG | 0 | 0 | ゼロ値 |
| 8 | 00800 |
ショウヒンH | 99,900 | ⚠️桁あふれ確認 | 桁あふれ確認用 |
作成したプログラム:
| ファイル | 種別 | 役割 |
|---|---|---|
HINUPDTD.MBR |
RPG III | テストデータ投入プログラム(8件書き込み) |
HINUPDTS.MBR |
CL | テスト一連実行(バックアップ→投入→実行→確認) |
テスト実行手順:
① CRTRPGPGM PGM(HINUPDTD) SRCFILE(QRPGSRC) ← テストデータ投入PGM コンパイル
② CRTCLPGM PGM(HINUPDTS) SRCFILE(QCLSRC) ← テスト実行CL コンパイル
③ CALL PGM(HINUPDTS) ← テスト一括実行
👤 HINUPDのプログラムでCOMPを使わずに書き直して
🤖 COMP → IFGE への書き直し
変更前(COMP + 条件指標):
C HNTEIK COMP 1000 50
C 50 HNTEIK ADD 100 HNTEIK
C 50 UPDAT HINMSR
変更後(IFGE / END 構造化命令):
C HNTEIK IFGE 1000
C HNTEIK ADD 100 HNTEIK
C UPDAT HINMSR
C END
| 項目 | COMP版 | IFGE版 |
|---|---|---|
| 条件判定命令 | COMP 1000 |
IFGE 1000 |
| 条件指標 |
*IN50 を使用 |
不要(指標なし) |
| 可読性 | 指標の意味を別途把握する必要あり | ブロックで意図が明確 |
👤 品目マスターを読み込む処理がないので、修正してほしい
🤖 プライマリファイルへの変更 → さらにREADループへ
最初の提案(F仕様書を UP に変更)に対して、「プライマリファイルを使わずに作ってほしい」と指示。
READ 命令と DOWEQ ループによる実装に変更しました。
最終版 HINUPD.MBR:
H* HINUPD - 品目マスター定価一括更新(READループ版)
F*
FHINMSP UF E K DISK
C*
C* 先頭レコード読込(*IN99=EOFフラグ)
C READ HINMSP 99
C*
C *IN99 DOWEQ*OFF
C HNTEIK IFGE 1000
C HNTEIK ADD 100 HNTEIK
C UPDAT HINMSR
C END
C READ HINMSP 99
C ENDDO
C*
C SETON LR
処理フロー:
READ HINMSP ← 先頭レコードを読む(EOFなら *IN99 ON)
↓
DOWEQ *OFF ← *IN99がOFFの間(=レコードあり)ループ
├─ IFGE 1000 ← HNTEIK >= 1000 ?
│ ADD 100 ← 定価に +100
│ UPDAT ← レコード更新
│ END
└─ READ HINMSP ← 次のレコードを読む
ENDDO ← *IN99 ON になったらループ脱出
↓
SETON LR ← 正常終了
5. 当月売上金額・当年売上金額を再計算するプログラム(KINUPD)
4の対応内容を踏まえ、最初から適切な命令(IFGE・READループ) を使ったプログラムを作成します。
👤 以下の仕様のプログラムを作成してほしい(新規プログラム名:KINUPD)
品目マスターの定価が1000以上の場合、定価にプラス100をする
定価が更新された場合、当月売上金額、当年売上金額をそれぞれ更新する
当月売上金額 = 定価 × 当月売上数量
当年売上金額 = 定価 × 当年売上数量
🤖 処理フロー概要(Plan)
| ステップ | 処理内容 |
|---|---|
| ① |
HINMSP を更新モード(UF)でオープン |
| ② |
READ で先頭レコード読込(EOF: *IN99) |
| ③ |
DO *HIVAL でEOFまでループ |
| ④ |
HNTEIK >= 1000 の場合: 定価に +100 |
| ⑤ | 定価更新後: HNGKIN = HNTEIK × HNGSUR(当月売上金額) |
| ⑥ | 定価更新後: HNNKIN = HNTEIK × HNNSUR(当年売上金額) |
| ⑦ |
UPDAT HINMSR でレコード更新 |
| ⑧ | 次レコードを READ、ループ継続 |
| ⑨ |
SETON LR で正常終了 |
🤖 生成されたプログラム(KINUPD)
H* KINUPD - 品目マスター定価・売上金額一括更新
F*
FHINMSP UF E K DISK
C*
C DO *HIVAL
C READ HINMSP 99
C 99 LEAVE
C*
C HNTEIK IFGE 1000
C HNTEIK ADD 100 HNTEIK
C HNTEIK MULT HNGSUR HNGKIN 70
C HNTEIK MULT HNNSUR HNNKIN 70
C UPDAT HINMSR
C END
C*
C ENDDO
C*
C SETON LR
主要仕様ポイント:
| 項目 | 内容 |
|---|---|
| ファイル |
HINMSP(品目マスター)更新モード UF
|
| EOF 指標 |
*IN99(ON = ファイル終端) |
| 定価加算条件 |
HNTEIK >= 1000(IFGE 1000) |
| 当月売上金額 |
HNGKIN(7,0) = HNTEIK × HNGSUR
|
| 当年売上金額 |
HNNKIN(7,0) = HNTEIK × HNNSUR
|
| 更新フォーマット | UPDAT HINMSR |
👤 READ HINMSPがソース上に二回あるけど1個に修正してほしい
🤖 READ を1か所に集約した最終版
DO ループの先頭で1回だけ READ するシンプルな構造に変更しました。
H* KINUPD - 品目マスター定価・売上金額一括更新(最終版)
F*
FHINMSP UF E K DISK
C*
C DO *HIVAL
C READ HINMSP 99
C 99 LEAVE
C*
C HNTEIK IFGE 1000
C HNTEIK ADD 100 HNTEIK
C HNTEIK MULT HNGSUR HNGKIN 70
C HNTEIK MULT HNNSUR HNNKIN 70
C UPDAT HINMSR
C END
C*
C ENDDO
C*
C SETON LR
最終的な処理フロー:
DO *HIVAL
READ HINMSP ← ここで読む(1回だけ)
*IN99=ON → LEAVE(EOF脱出)
HNTEIK >= 1000 の場合:
定価 +100
当月売上金額 再計算
当年売上金額 再計算
UPDAT HINMSR
END
ENDDO
↓
SETON LR(正常終了)
6. まとめと今後の改善点
内容のまとめ
初めに概要の説明、および言語の選択
→ファイル定義を読み込ませる
→更新内容を説明
→IBM BOBよりプログラムの定義説明
→IBM BOBがプログラムを作成し、プログラム内容を説明
(対象プログラム:HINUPD.rpg)
→テストケースの作成を依頼
→IBM BOBより、テストデータとテストプログラムを提示
(テストデータ :HINUPDTD.rpg
テストプログラム:HINUPDTS.clp)
→細かい点を個別に修正
4・5の比較:Bobとの対話から得られた学び
4の処理と異なるのは、
・COMPによる条件は使用せず、IFGEによる条件で処理を行っている
・RPGサイクルを使用しない形で、レコードリード処理が記載されている
といった点が異なり、先の対応内容が反映された形でプログラムが作成されています。
| 観点 | 4. HINUPD | 5. KINUPD | 備考 |
|---|---|---|---|
| 条件判定命令 |
COMP → 指摘後 IFGE に修正 |
最初から IFGE
|
✅ 初期プロンプトに反映済み |
| ループ方式 | RPGサイクル前提 → 指摘後 DO/READ に修正 |
最初から DO/READ
|
✅ 初期プロンプトに反映済み |
| READ重複 | — | DO前後に2回 → 指摘後1回に修正 | ⚠️ 引き続き要確認 |
| ファイル定義 |
UP 指定漏れ → 指摘後修正 |
UF で正しく定義 |
✅ |
初期プロンプトへの推奨記載事項
今後の開発では以下を最初のプロンプトに含めると修正往復が減ります。
・条件判定は COMP を使わず IFGE / IFLT 等の構造化命令を使用すること
・RPGサイクルは使用せず、READ命令と DOWEQ ループで全件処理すること
・ファイルは UF(更新専用)で定義し、プライマリファイル指定は不要
・演算結果の中間フィールドはI仕様書で明示定義すること
注意点
MULT の結果桁数指定について
外部記述(E)でDDSのフィールドをそのまま使う場合、結果フィールドの桁数指定(70)はコンパイラが無視することがあります。桁数不一致によるランタイムエラーのリスクがあるため、中間作業フィールド(I仕様書で定義)を使う方がより安全です。
べき等ではない点に注意
複数回実行すると定価が累積加算されます。運用上の実行管理(二重実行防止)が必要です。
テスト前は CPYF コマンドで HINMSP を事前退避することを推奨します。
7. プログラムから設計書の作成
Bobにプログラムから設計書を作成してもらいます。
今回は以下の4つのパターンで作成を行いました。
| 使用AI | 指示内容 | |
|---|---|---|
| 1 | IBM Bob | 具体的に指示をする |
| 2 | IBM Bob | 抽象的に指示をする |
| 3 | gemini | 具体的に指示をする |
| 4 | gemini | 抽象的に指示をする |
Bob 具体的指示と抽象的指示の比較
まず、Bobを使用した2つの仕様書の比較を行います。
以下が実際にBobに依頼した内容です。
Bob 具体的指示内容
依頼:RPGプログラム仕様書(HTML形式)の作成
提示するRPGソースコード(KINUPD.rpg)を解析し、以下の【基本ルール】および【ドキュメント構成標準】
に従ってプログラム仕様書をHTML形式で作成してください。
他プログラムの仕様書作成時にも同様のフォーマットを使用するため、指定したHTML構造およびスタイルを
厳密に遵守してください。
【基本ルール】
1.出力形式: HTML5(CSSは<style>タグ内に内包し、単一ファイルとして完結させる)
2.デザイン方針: 視認性の高いモダンで清潔感のあるデザイン(レスポンシブ対応、標準的なシステムドキュ
メント風のスタイリング)
3.推測の明記: ソースコード上に定義がない項目(項目名日本語等)は、ソースコード内のコメントや文脈
から推測して記載し、「※推測」と注記を入れてください。
【ドキュメント構成標準】(必須セクション)
生成するHTMLは以下の目次・構成を含めて作成してください。
1.ヘッダー情報
1.プログラムID(例: KINUPD)
2.プログラム名(例: 品目マスター一括更新プログラム)
3.対象ファイル名(例: KINUPD.rpg)
4.作成日(現在日付)
2.プログラム概要
1.処理の目的・全体概要(要約)
3.使用ファイル一覧
1.ファイル名、アクセスモード(更新/参照/追加等)、キー指定有無、レコードフォーマット名
4.使用フィールド(変数)一覧
1.フィールド名、役割・用途、処理内での扱い(入力/出力/作業用)
5.詳細処理フロー・ロジック
1.処理の開始から終了までの流れをステップ順(1, 2, 3...)に明記
2.条件分岐(IF条件等)やループ処理(DOループ等)のロジック詳細
3.計算式の明示
6.使用インジケーター(フラグ)一覧
1.インジケーター(例: 99, LR等)の名称、役割、ON/OFFの条件
【デザイン・HTML構造指定】
・<h1> : プログラム名・ID
・<h2> : 各主要セクション(プログラム概要、使用ファイル一覧など)
・テーブル表示: ファイル一覧、フィールド一覧、インジケーター一覧は必ず <table> タグを使用
(ヘッダー背景色付き、交互の行背景色指定)
・強調表示: 条件分岐や重要な計算式は <mark> やコードブロック <code> を使用
対象ファイル名: KINUPD.rpg
Bob 抽象的指示内容
KINUPD.rpgとHINUPD.rpgの仕様書をそれぞれhtml形式で作成して
指示内容による結果の違い
<具体的指示>
デザイン・HTML構造を指定しているため、全体的にまとまった印象があります。重要なところは赤で強調表示しており、視覚的に整っている仕様書になりました。一度作成ルールを文書化しておけば、毎回指示する必要なく、同じ構成・デザインの仕様書を作成してくれます。
<抽象的指示>
抽象的に指示した場合でも、Bobが構成を決めて仕様書を作成してくれました。処理内容を確認する程度なら十分かもしれませんが、文書として残すのなら具体的に構成やデザインを指示していた方がよさそうです。
※当記事の著作権はIBMに帰属します。詳細はこちらを参照ください。