社内マーケティング調査用プログラム 詳細設計書
①ABC分析結果
前提条件(重要)
本設計書作成にあたり、以下の前提を置いています。着手前に必ず発注元・業務担当者と確認してください。
| No | 項目 | 内容 |
|---|---|---|
| 1 | レコード様式名 | ご指示では「TKMASR」とありましたが、添付DDS上の実際のレコード様式名は TKMASPR です。本書はDDS実物を正とし、TKMASPR を採用します。 |
| 2 | データ型ルール | ご指示では「全角はO型、半角はA型、数値はP型」とのことでしたが、添付DDSでは氏名・住所等の文字項目を含め全項目が A型 または P型 で定義されており、O型 の項目は存在しません。本書はDDS実物を正とし、O型は使用しません。 |
| 3 | 信用限度額項目 | DDS上に「信用限度額」であることが明示された項目名がありません。項目名の並び(TKGURI/TKNURI/TKZURI/TKUZAN/TKGEND/TKNYUK)から、TKGEND(9P0)を 信用限度額 と推定して設計しています。実際の項目定義書(添付予定だったテキストファイル)と必ず突合してください。 |
| 4 | 添付テキストファイル | 「添付したテキストファイルを参照」とのご指示がありましたが、本セッションにファイルが確認できなかったため、ユーザー提示のDDSソースのみを設計根拠としています。 |
| 5 | ワークファイル名 | 未指定のため TKMASPW とします(TKMASP + Work)。 |
| 6 | 結果格納項目名 | 未指定のため TKKEKA(1A:ランク結果 "A"/"B"/"C")とします。 |
| 7 | 実行環境 | IBM i(AS/400)、RPG IV 固定長形式、CLプログラムから起動される単独バッチジョブを想定。 |
| 8 | 出力先 | 「最新のファイルではSQL/QUERYで検索可能」との要件より、最終結果はDB2/400物理ファイル(ワークファイル)に格納する方式とし、画面/帳票出力は行わない。 |
1. システム概要
1.1 システム名
社内マーケティング調査用プログラム
1.2 概要
得意先マスタファイル(TKMASP)を基に、得意先ごとの信用限度額を用いたABC分析を行い、分析結果(ランクA/B/C)を付与したワークファイルを作成するバッチプログラム。作成されたワークファイルはユーザーがSQL文やQUERY/400を用いて自由に検索・分析できる状態で保持される。
1.3 実行方式
- バッチ処理(オンライン起動可)
- 起動契機:業務担当者による都度実行(日次/月次等の定期実行は未定、必要な場合はジョブスケジューラ設定を別途検討)
1.4 処理概要フロー
- プログラム実行
- 得意先マスタ(TKMASP)を丸ごとコピーしたワークファイル(TKMASPW)を作成(結果カラム TKKEKA を追加済みの形式で作成)
- ワークファイルに対しCHAINによる読込・アップデート処理を実施し、ABC分析結果を反映
- 処理完了後、ワークファイルはSQL/QUERYで検索可能な状態となる
2. 業務概要
2.1 業務目的
得意先マスタに登録されている得意先の「信用限度額」をもとに、売上・与信管理上の重要度をABCの3ランクに分類し、マーケティング施策の優先順位付けの基礎データとする。
2.2 ABC分析の考え方(パレート分析)
信用限度額の降順に得意先を並べ、全体合計に対する累積構成比を算出し、以下の基準でランク付けする。
| ランク | 累積構成比の範囲 |
|---|---|
| A | 累積構成比 ≦ 70.00% |
| B | 70.00% < 累積構成比 ≦ 90.00% |
| C | 90.00% < 累積構成比 |
2.3 分析基準項目
- 分析基準:信用限度額(TKGEND、前提3参照)
2.4 出力
- ワークファイル
TKMASPWの各レコードに、分析結果ランク(TKKEKA:A/B/C)を格納する。 - 帳票・画面出力は行わない(ユーザーはSQL/QUERYで直接参照する)。
3. 業務フロー
┌─────────────────────┐
│ 業務担当者:実行指示 │
└──────────┬───────────┘
│
▼
┌─────────────────────────────┐
│ ABC分析プログラム 実行 │
│(得意先マスタTKMASPを読込) │
└──────────┬───────────────────┘
│
▼
┌─────────────────────────────┐
│ ワークファイル TKMASPW 作成 │
│(結果カラムTKKEKA付与済み) │
└──────────┬───────────────────┘
│
▼
┌─────────────────────────────┐
│ 信用限度額でソート・集計 │
│ 構成比/累積構成比算出 │
│ ランク(A/B/C)判定 │
└──────────┬───────────────────┘
│
▼
┌─────────────────────────────┐
│ TKMASPWへランク結果反映 │
│(CHAIN → UPDATE) │
└──────────┬───────────────────┘
│
▼
┌─────────────────────────────┐
│ 業務担当者:SQL/QUERYで分析 │
│ 結果を検索・活用 │
└─────────────────────────────┘
4. 処理フロー(プログラム内部)
[開始]
│
▼
①初期化処理
・ワークファイル TKMASPW をCLRPFM等でクリア(既存時)
・累計変数、件数変数を初期化
│
▼
②TKMASP 全件読込(OPEN)
・オープンエラー時 → エラー処理へ
│
▼
③TKMASPの内容をTKMASPWへ複写(結果カラムTKKEKAはスペース初期化)
・レコード読込エラー時 → エラー処理へ
・件数0件(データなし)の場合 → エラー処理へ
│
▼
④TKMASPWを信用限度額(TKGEND)降順にソート
(QSORT/SQL ORDER BY/論理ファイルのいずれかで実現。9章参照)
│
▼
⑤信用限度額合計(総合計)を算出
・合計が0の場合 → ゼロ除算エラー処理へ
│
▼
⑥ソート順に1件ずつ読込み、構成比・累積構成比を算出
│
▼
⑦累積構成比よりランク(A/B/C)を判定
│
▼
⑧該当キー(TKBANG)でTKMASPWをCHAINし、TKKEKAをUPDATE
・CHAIN失敗時 → エラー処理へ
│
▼
⑨全件処理完了まで⑥~⑧を繰返し
│
▼
⑩ファイルクローズ
│
▼
[終了]
5. ER図
本業務では得意先マスタ1ファイルのみを使用するため、複数ファイル間のリレーションは存在しない。参考として、得意先マスタとワークファイルの対応関係を示す。
┌───────────────────────┐ コピー・結果付与 ┌───────────────────────────┐
│ TKMASP(得意先マスタ) │ ─────────────────────────▶ │ TKMASPW(ワークファイル) │
│--------------------- │ (1レコード:1レコード) │ ----------------------------│
│ PK: TKBANG(得意先番号) │ │ PK: TKBANG(得意先番号) │
│ :(既存項目一式) │ │ :(既存項目一式) │
│ │ │ TKKEKA(結果:A/B/C)※追加項目 │
└───────────────────────┘ └───────────────────────────┘
- カーディナリティ:TKMASP:TKMASPW = 1:1(全件複写、レコード増減なし)
6. ファイル関連図
┌─────────────────┐
│ ABC分析プログラム │
│ (RPG IV 固定長) │
└───┬─────────┬────┘
│入力 │入出力
▼ ▼
┌───────────────┐ ┌────────────────────┐
│ TKMASP │ │ TKMASPW │
│(得意先マスタ) │ │(ワークファイル) │
│ 入力専用(INPUT)│ │ 更新可(UPDATE) │
└───────────────┘ └─────────┬──────────┘
│
▼
┌──────────────────────┐
│ ユーザー:SQL/QUERY検索 │
└──────────────────────┘
7. 使用ファイル一覧
| No | ファイル名 | 種別 | 用途 | 入出力モード | レコード様式 |
|---|---|---|---|---|---|
| 1 | TKMASP | 物理ファイル(既存マスタ) | 得意先マスタ(分析元データ) | INPUT(入力専用) | TKMASPR |
| 2 | TKMASPW | 物理ファイル(ワーク/新規作成) | TKMASPの複写+分析結果格納 | UPDATE(入出力) | TKMASPWR |
※TKMASPWはプログラム内、または前処理(CLプログラム/DDS)にてTKMASPのDDSを元に TKKEKA(1A)を追加した形式で作成する。作成方法は「9.1 ワークファイル作成方式」を参照。
8. 項目定義
8.1 TKMASP(得意先マスタ)項目定義
| No | 項目名 | 桁数/型 | 項目名(論理) | 備考 |
|---|---|---|---|---|
| 1 | TKBANG | 5A | 得意先番号 | キー項目(ユニークキー) |
| 2 | TKNAKN | 20A | 得意先名(漢字) | |
| 3 | TKNAKJ | 20A | 得意先名(カナ) | |
| 4 | TKADR1 | 20A | 住所1 | |
| 5 | TKADR2 | 20A | 住所2 | |
| 6 | TKTIKU | 2A | 地区コード | |
| 7 | TKPOST | 6A | 郵便番号 | |
| 8 | TKTELE | 13A | 電話番号 | |
| 9 | TKGURI | 9P0 | (要確認:前年繰越額等の可能性) | 本分析では未使用 |
| 10 | TKNURI | 9P0 | (要確認:年間売上高等の可能性) | 本分析では未使用 |
| 11 | TKZURI | 9P0 | (要確認:前年売上高等の可能性) | 本分析では未使用 |
| 12 | TKUZAN | 9P0 | (要確認:売掛残高等の可能性) | 本分析では未使用 |
| 13 | TKGEND | 9P0 | 信用限度額(推定) | ★ABC分析の基準項目。要現物確認(前提3) |
| 14 | TKNYUK | 6P0 | (要確認:入金日等 YYMMDD) | 本分析では未使用 |
| 15 | TKSIME | 1A | 締め日区分等 | 本分析では未使用 |
キー:TKBANG(ユニークキー、昇順)
8.2 TKMASPW(ワークファイル)項目定義
TKMASPの全15項目 + 以下1項目を追加。
| No | 項目名 | 桁数/型 | 項目名(論理) | 備考 |
|---|---|---|---|---|
| 16 | TKKEKA | 1A | 結果(ABCランク) | 初期値:スペース。処理後に "A"/"B"/"C" を設定 |
キー:TKBANG(TKMASPと同一。ユニークキー、昇順)
8.3 プログラム内部変数定義
| 変数名 | 桁数/型 | 内容 |
|---|---|---|
| #GAKUKEI | 11P0 | 信用限度額合計(全体) |
| #GAKUKUM | 11P0 | 累積信用限度額 |
| #KOSEI | 7P2 | 構成比(%) |
| #RUIKEI | 7P2 | 累積構成比(%) |
| #KENSU | 7P0 | 得意先総件数 |
| #RANK | 1A | 判定結果(A/B/C) |
| #ERRFLG | 1A | エラーフラグ('0'=正常、'1'=異常) |
| #ERRMSG | 80A | エラーメッセージ格納 |
9. ABC分析ロジック
9.1 ワークファイル作成方式
- TKMASPのDDSをコピーし、フィールド
TKKEKA(1A)を追加したDDSTKMASPWRを事前に用意する(物理ファイルソースとして保持)。 - プログラム実行時、CLプログラム側で以下を実施する。
-
TKMASPWが既存の場合:CLRPFM TKMASPW(内容クリア) -
TKMASPWが未作成の場合:CRTPF FILE(TKMASPW) SRCFILE(...) SRCMBR(TKMASPWR)
-
- RPGプログラム内でTKMASPを全件READし、TKMASPWへWRITE(複写)する。この時点で
TKKEKAはスペースで初期化する。
9.2 ソート処理
信用限度額(TKGEND)降順に並べ替える。以下いずれかの方式で実現する(実装者の環境に応じて選択、本書は方式Aを標準とする)。
-
方式A(推奨):TKGENDを降順キーとする論理ファイル(例:
TKMASPWL、キー:TKGEND DESCEND, TKBANG ASCEND)を作成し、RPGでその論理ファイルをREADする。 - 方式B:SQL RPG(EXEC SQL)でカーソルを
ORDER BY TKGEND DESC, TKBANG ASCとして定義し、順次FETCHする。 - 方式C:QSORT組込みサブルーチン/配列ソートを用いる(件数が配列サイズ上限内であることが前提)。
※同一信用限度額の場合は得意先番号(TKBANG)昇順で並べる(順序の一意性を担保するため)。
9.3 信用限度額合計の算出
#GAKUKEI = TKMASPW全件のTKGENDの合計値
- RPGでは、ソート前の複写処理時(8.1③工程)に合わせて積算するか、ソート後の1パス目で積算する。
- 合計が0の場合はゼロ除算エラーとして処理を中断する(13章参照)。
9.4 構成比・累積構成比の算出
信用限度額降順ソート済みTKMASPWを先頭から1件ずつ処理し、以下の計算を行う。
【1件ごとの構成比】
#KOSEI = (TKGEND ÷ #GAKUKEI) × 100 小数第2位まで(切捨てとする/要業務確認)
【累積構成比】
#GAKUKUM = #GAKUKUM + TKGEND(当該件までの累積信用限度額)
#RUIKEI = (#GAKUKUM ÷ #GAKUKEI) × 100 小数第2位まで(切捨てとする/要業務確認)
- 計算精度:中間演算は
11P2(パック10桁+小数2桁相当)以上の桁数を確保し、丸め誤差による累積構成比のズレ(特に最終件で100.00%にならない現象)に注意する。 - 端数処理(切捨て/四捨五入)の具体的な業務要件が未確定のため、本書では「切捨て」を暫定採用。業務担当者確認の上、確定させること。
9.5 ランク判定
「10.信用限度額80%以上判定ロジック」内の判定基準を用いて、#RUIKEI の値からA/B/Cを判定し、#RANK にセットする。
9.6 ワークファイルへの反映
CHAIN(TKBANG : TKMASPW)
IF %FOUND(TKMASPW);
TKKEKA = #RANK;
UPDATE TKMASPWR;
ELSE;
・CHAIN失敗(レコード不整合)→エラー処理へ(13章参照)
ENDIF;
10. 信用限度額80%以上判定ロジック
「80%以上」という表現は、業務要件のA/B/C分岐基準(70%・90%)とは別に、ご要望の章立てにある項目です。本書では、章立てのタイトルに従い、ランク判定処理全体(累積構成比によるA/B/C判定)をここで具体化します。80%はA・Bランクの境界(70%)とB・Cランクの境界(90%)の中間に位置する値であり、単独の「80%以上」という基準は業務要件本文中には明記されていないため、本章はABC判定ロジックの詳細仕様として扱います。80%を独立した判定基準として使う必要がある場合は、別途要件を確認してください。
10.1 判定基準(再掲)
| ランク | 条件式 |
|---|---|
| A | #RUIKEI ≦ 70.00 |
| B | 70.00 < #RUIKEI ≦ 90.00 |
| C | 90.00 < #RUIKEI |
10.2 RPG IV 判定ロジック(擬似コード)
IF #RUIKEI <= 70.00;
#RANK = 'A';
ELSEIF #RUIKEI <= 90.00;
#RANK = 'B';
ELSE;
#RANK = 'C';
ENDIF;
10.3 境界値の扱い
- 累積構成比がちょうど「70.00」の得意先は A ランクとする(≦のため)。
- 累積構成比がちょうど「90.00」の得意先は B ランクとする(≦のため)。
- 累積構成比が「90.00」を超える最初の得意先から C ランクとする。
10.4 全件Cにならないための考慮
信用限度額が全件同額、または極端に偏った分布の場合でも、上記の累積構成比計算により必ずA・B・Cいずれかに機械的に分類される。特殊な分布パターン(例:1件で100%を占める等)でも本ロジックで破綻しないことをテストケースで確認すること(14章に準ずるテスト観点は別紙とする)。
11. 抽出条件
| No | 条件 | 内容 |
|---|---|---|
| 1 | 対象ファイル | TKMASP 全件(絞り込みなし) |
| 2 | 除外条件 | なし(削除フラグ等の論理削除項目がDDS上に存在しないため、全件を有効データとして扱う) |
| 3 | 信用限度額がマイナスの場合 | 業務要件未確定。本書では マイナス値も含めて集計対象とする(符号付きのまま合計・構成比計算を行う)。マイナス値を除外すべき場合は要件確認の上、抽出条件に「TKGEND ≧ 0」を追加すること。 |
| 4 | 信用限度額が未設定(0)の得意先 | 集計対象には含めるが、構成比0%として扱う(全件0の場合はゼロ除算エラーとなるため13章のエラー処理に従う)。 |
12. 集計条件
| No | 集計項目 | 集計方法 |
|---|---|---|
| 1 | 信用限度額合計 | TKMASP(=TKMASPW複写後)の全件のTKGENDを単純合計 |
| 2 | 構成比 | 各得意先のTKGENDを信用限度額合計で除し100を乗算(9.4参照) |
| 3 | 累積構成比 | 信用限度額降順に並べた順に構成比を積み上げて算出(9.4参照) |
| 4 | 集計単位 | 得意先単位(TKBANG単位)。部門・地区等でのグルーピング集計は本要件には含まれない |
| 5 | ソート順 | 信用限度額(TKGEND)降順、同額の場合は得意先番号(TKBANG)昇順 |
13. エラー処理
13.1 エラー処理方針
各処理工程でエラーを検知した場合、以下のいずれかに該当する処理を行い、エラーメッセージをジョブログ/メッセージキューに出力の上、プログラムを異常終了(LR=*ON、リターンコード≠0)とする。処理途中でTKMASPWへの更新が一部完了している場合でも、ロールバック(コミットメント制御)は本要件では未定義のため、コミットメント制御を導入するかは別途確認し、暫定として非コミット運用とする。
13.2 エラー種別・処理内容・メッセージ例
| No | エラー種別 | 検知タイミング | 処理内容 | エラーメッセージ例 |
|---|---|---|---|---|
| 1 | データなし | TKMASP読込0件時 | ワークファイル作成をスキップし、異常終了 | E001: 得意先マスタ(TKMASP)にデータが存在しません。処理を中止します。 |
| 2 | ファイルオープンエラー | TKMASPまたはTKMASPWのOPEN失敗時 | 直後に処理中断、異常終了 | E002: ファイルオープンに失敗しました。ファイル名:&1 状態コード:&2 |
| 3 | レコード読込エラー | READ/CHAIN時の入出力エラー(%ERROR発生) | 当該レコードをスキップせず、即時処理中断、異常終了 | E003: レコード読込中にエラーが発生しました。ファイル名:&1 得意先番号:&2 |
| 4 | ゼロ除算(信用限度額合計が0) | 構成比算出前の合計チェック時 | 除算処理を実施せず、異常終了 | E004: 信用限度額の合計が0のため、構成比を算出できません。処理を中止します。 |
| 5 | システム異常 | 上記以外の予期しないRPGエラー(%STATUS等) | エラー内容をログ出力し、異常終了 | E999: システム異常が発生しました。プログラム名:&1 状態コード:&2 詳細:&3 |
13.3 エラーチェック実装位置(処理フロー対応)
| 処理フロー工程(4章) | 対応するエラー種別 |
|---|---|
| ②TKMASP読込(OPEN) | No.2 ファイルオープンエラー |
| ③TKMASP→TKMASPW複写 | No.1 データなし、No.3 レコード読込エラー |
| ⑤信用限度額合計算出 | No.4 ゼロ除算 |
| ⑥⑦構成比・ランク判定 | No.5 システム異常(想定外の演算エラー) |
| ⑧CHAIN・UPDATE | No.3 レコード読込エラー(CHAIN失敗を含む)、No.5 システム異常 |
13.4 RPG IV実装上の留意点
- ファイルOPEN時は
INFDS(ファイル情報データ構造)の状態コードを判定し、エラー時は分岐してエラー処理サブルーチン(*PSSRまたはEXSR $ERROR)へ制御を渡す。 - READ/CHAIN命令には
%ERROR組込関数を付加し、エラー検知を行う(例外を発生させずハンドリングする方式を推奨)。 - ゼロ除算は、除算実行前に必ず分母(#GAKUKEI)を事前チェックし、0の場合は演算自体を実行しない(RPGの
%ERRORに頼らず事前ガードを行うことで、意図しないMCH1211等のハード例外を防止する)。 - 想定外例外(システム異常)は
*PSSRグローバルエラーサブルーチンで捕捉し、状態コード・プログラム名をメッセージに含めてジョブログへ送出(QMHSNDPMAPI等)した上でLR=*ONにして終了する。
付録:未確定事項一覧(要業務確認)
- TKGEND が本当に「信用限度額」であるかの項目定義確認(最重要)
- 構成比・累積構成比の端数処理方式(切捨て/四捨五入/切上げ)
- 信用限度額がマイナスの場合の扱い(集計対象に含めるか除外するか)
- コミットメント制御の要否(処理途中エラー時のロールバック要否)
- ワークファイル(TKMASPW)の命名規則、および既存ファイルがある場合の再実行時の扱い(洗い替えでよいか)
- 定期実行の要否(ジョブスケジューラ登録の必要性)
当記事の著作権はIBMに帰属します。詳細はこちらをご参照ください。