社内マーケティング調査用プログラム 詳細設計書
①ABC分析(得意先マスタ 信用限度額構成比)
| 項目 | 内容 |
|---|---|
| 文書名 | 得意先マスタ ABC分析 詳細設計書 |
| 対象環境 | IBM i(AS/400) RPG IV(固定形式) |
| 版数 | 1.00 |
1. システム概要
1.1 目的
得意先マスタファイル(TKMASP)に登録されている全得意先について、信用限度額(TKGEND) を分析軸としたABC分析を行い、得意先ごとのランク(A/B/C)を判定する。判定結果はワークファイルに書き込み、後続でユーザーがSQL文またはQUERYにより自由に検索・集計できる状態にする。
1.2 処理概要
- プログラムを起動する。
- 得意先マスタファイル(TKMASP)を丸ごとコピーし、結果格納用の項目をあらかじめ付加したワークファイルを作成する。
- ワークファイルに対してCHAINによる更新処理(UPDATE)を行い、ABC分析結果等を書き込む。
- 処理完了後、ワークファイルはそのままユーザーの検索対象として利用可能な状態で保持される。
1.3 前提条件(本書内で明記する不足情報の補足)
本要件書には明記されていないが、設計上必要となる事項を以下のとおり仮定する。
| No | 前提事項 | 内容 |
|---|---|---|
| 1 | ワークファイル名 |
TKMASW とする(TKMASPのコピー+分析結果項目付加) |
| 2 | TKNYUK(最終入金日)の小数桁 | DDS上 6P のみで小数桁の明記が無いため、日付項目(YYMMDD形式)とみなし小数桁 0 と仮定する(6P 0 相当)。本ABC分析処理では未使用項目。 |
| 3 | 構成比・累積構成比の格納要否 | 要件上必須なのは「結果」列のみだが、ユーザーがSQL/QUERYで根拠を検証できるよう、構成比・累積構成比・順位も付加項目として 提案 する(必須要件ではなく拡張提案。詳細は8章参照)。 |
| 4 | 信用限度額が同額の場合の順位付け | 信用限度額が同額の得意先が複数存在する場合、得意先番号(TKBANG)昇順を第二ソートキーとし、順位を一意に確定する。 |
| 5 | 信用限度額がマイナス値の場合 | データ不整合とみなし、集計対象からは除外せず合計には含めるが、E005(システム異常)として明細エラーログに記録することを推奨する。 |
| 6 | 10章「信用限度額80%以上判定ロジック」 | 要件文中に処理内容の詳細記載が無いため、業務上一般的な 与信超過注意判定(売掛金残高が信用限度額の80%以上に達した得意先を検出する)と仮定して設計する(詳細は10章参照)。 |
2. 業務概要
得意先の与信管理・営業戦略立案を目的として、信用限度額の大きい得意先から順に構成比・累積構成比を算出し、重要度をA・B・Cの3ランクに分類する。分類結果はワークファイルに保持し、営業部門・与信管理部門がSQL/QUERYで自由に抽出・集計できるようにする。
| ランク | 定義 | 位置付け |
|---|---|---|
| A | 累積構成比 ≦ 70.00% | 重点管理対象(上位得意先) |
| B | 70.00% < 累積構成比 ≦ 90.00% | 準重点管理対象 |
| C | 90.00% < 累積構成比 | 一般管理対象 |
3. 業務フロー
4. 処理フロー(プログラム内部処理)
RPG IV固定形式での実装を前提とした処理手順を以下に示す。
[開始]
①ワークファイル TKMASW の存在チェック
存在する場合 → CLRPFM 等で内容クリア(前回実行分の残存回避)
存在しない場合 → TKMASPのDDS定義を元に付加項目を加えたTKMASWを作成
②CPYF(または同等ロジック)で TKMASP の全件を TKMASW へコピー
コピー時、付加項目(JUNI/KOSEI/RUIKEI/KEKKA/YOCHUI)は初期値(ブランク/ゼロ)とする
③TKMASPファイルオープン(入力用)
OPEN失敗 → E002 出力し *ESCAPE で異常終了
④件数チェック(%EOF または COUNT)
0件 → E001 出力し正常終了扱いで終了(後続処理を行わない)
⑤信用限度額(TKGEND)降順、同額時は得意先番号(TKBANG)昇順でソート
OPNQRYF の ORDER (DESCEND)、または配列読込+SORTA で実現
⑥信用限度額合計(ZGOKEI)を算出
ZGOKEI = Σ(TKGEND) (全件加算)
ZGOKEI が 0 の場合 → E004 出力し *ESCAPE で異常終了(ゼロ除算回避)
⑦ソート順に1件ずつ処理(LOOP)
READ時エラー(%ERROR) → E003 出力し当該件をスキップしログ出力、次件へ継続
⑦-1 順位(JUNI)を採番(1から連番)
⑦-2 構成比(KOSEI)= TKGEND ÷ ZGOKEI × 100(9章の計算式参照)
⑦-3 累積構成比(RUIKEI)= 前件までのRUIKEI + 当件のKOSEI
⑦-4 ABCランク(KEKKA)判定(9章の判定基準参照)
⑦-5 与信超過注意フラグ(YOCHUI)判定(10章参照)
⑦-6 TKMASWをTKBANGでCHAINし、UPDATE(項目書込)
CHAIN失敗(該当なし) → E005 出力しログに記録、次件へ継続
⑧全件処理完了後、処理件数・エラー件数をジョブログへ出力
⑨ファイルクローズ
⑩正常終了メッセージ送信
[終了]
5. ER図
本処理で使用する実体は「得意先マスタ(TKMASP)」と、その分析結果を保持する「ワークファイル(TKMASW)」の2つであり、1対1(コピー元・コピー先)の関係となる。
6. ファイル関連図
7. 使用ファイル一覧
| No | ファイル名 | 種別 | 用途 | 装備 | キー |
|---|---|---|---|---|---|
| 1 | TKMASP | 物理ファイル(既存) | 得意先マスタ(分析元データ) | 入力専用(INPUT ONLY) | TKBANG(UNIQUE) |
| 2 | TKMASW | 物理ファイル(新規/提案) | ABC分析結果ワークファイル。TKMASPの全項目+分析結果項目 | 更新用(UPDATE) | TKBANG(UNIQUE) |
8. 項目定義
8.1 TKMASP(得意先マスタ/既存 レコード様式:TKMASR)
DDS上、全角項目は O(DBCS-OPEN)型、半角項目は A型、数値項目は P(パック10進)型で定義されている。
| No | 項目名 | 型 | 桁数 | 小数 | 日本語名 | 備考 |
|---|---|---|---|---|---|---|
| 1 | TKBANG | A | 5 | - | 得意先番号 | 主キー(UNIQUE) |
| 2 | TKNAKN | A | 20 | - | 得意先名+カナ | 半角カナ想定 |
| 3 | TKNAKJ | O | 20 | - | 得意先名-漢字 | 全角 |
| 4 | TKADR1 | O | 20 | - | 住所(1) | 全角 |
| 5 | TKADR2 | O | 20 | - | 住所(2) | 全角 |
| 6 | TKTIKU | A | 2 | - | 地区コード | 半角 |
| 7 | TKPOST | A | 6 | - | 郵便番号 | 半角 |
| 8 | TKTELE | A | 13 | - | 電話番号 | 半角 |
| 9 | TKGURI | P | 9 | 0 | 当月売上高 | パック10進 |
| 10 | TKNURI | P | 9 | 0 | 当年売上高 | パック10進 |
| 11 | TKZURI | P | 9 | 0 | 前年売上高 | パック10進 |
| 12 | TKUZAN | P | 9 | 0 | 売掛金残高 | パック10進 |
| 13 | TKGEND | P | 9 | 0 | 信用限度額 | ABC分析の基準項目 |
| 14 | TKNYUK | P | 6 | 0※ | 最終入金日 | ※前提条件No.2参照(YYMMDD想定・本処理未使用) |
| 15 | TKSIME | A | 1 | - | 締め日コード | 半角 |
8.2 TKMASW(ワークファイル/新規・提案)
TKMASPの全15項目をそのまま引き継ぎ(項目名・型・桁数は8.1と同一)、以下の分析結果項目を追加する。
| No | 項目名 | 型 | 桁数 | 小数 | 日本語名 | 要否 | 説明 |
|---|---|---|---|---|---|---|---|
| 16 | JUNI | P | 5 | 0 | 信用限度額順位 | 提案 | 降順ソート後の順位(1~) |
| 17 | KOSEI | P | 7 | 4 | 構成比(%) | 提案 | 小数点第4位まで保持し表示は四捨五入して小数第2位とする |
| 18 | RUIKEI | P | 7 | 4 | 累積構成比(%) | 提案 | 同上 |
| 19 | KEKKA | A | 1 | - | 結果(ABCランク) | 必須 | 'A' / 'B' / 'C' のいずれか1文字 |
| 20 | YOCHUI | A | 1 | - | 与信超過注意フラグ | 提案 | 'Y'=80%以上/' '(空白)=未該当(10章参照) |
初期化ルール:TKMASP→TKMASW コピー時点では JUNI=0、KOSEI=0、RUIKEI=0、KEKKA=' '、YOCHUI=' ' とする。
9. ABC分析ロジック
9.1 分析基準
分析対象項目:信用限度額(TKGEND)
9.2 処理手順と計算式
手順1:整列
TKMASPの全レコードを TKGEND の降順(同額の場合はTKBANG昇順)に整列する。
手順2:信用限度額合計の算出
ZGOKEI = Σ(TKGEND) ※TKMASP全件分の合計
-
ZGOKEI = 0の場合はゼロ除算防止のため以降の計算を行わず、エラー処理(13章 E004)へ分岐して処理を中断する。
手順3:得意先ごとの構成比の算出
KOSEI(i) = (TKGEND(i) ÷ ZGOKEI) × 100
- 演算は小数第4位まで保持(内部は
7P 4)。四捨五入は最終桁(第4位)で行う。
手順4:累積構成比の算出(手順1の整列順に先頭から累積)
RUIKEI(1) = KOSEI(1)
RUIKEI(i) = RUIKEI(i-1) + KOSEI(i) (i ≧ 2)
手順5:ABCランクの判定(判定は必ずRUIKEI(累積構成比)を用いる。KOSEI単体では判定しない)
| 判定式 | KEKKA |
|---|---|
| RUIKEI ≦ 70.0000 | 'A' |
| 70.0000 < RUIKEI ≦ 90.0000 | 'B' |
| RUIKEI > 90.0000 | 'C' |
境界値の丸め誤差防止のため、判定は比較演算を 小数第4位(内部保持桁) で行い、四捨五入後の表示値では判定しないこと。
9.3 出力
TKMASWの該当レコードへ JUNI/KOSEI/RUIKEI/KEKKA を CHAIN→UPDATE で書き込む。
10. 信用限度額80%以上判定ロジック(提案仕様/前提条件No.6)
本項目は元要件書に処理内容の明記が無いため、与信管理業務で一般的に必要とされる「与信超過注意判定」として設計する。実装前に業務部門との仕様確認を推奨する。
10.1 目的
売掛金残高(TKUZAN)が信用限度額(TKGEND)に対してどの程度まで達しているかを判定し、80%以上に達している得意先を注意対象として検出する。
10.2 計算式
利用率(RITU) = TKUZAN ÷ TKGEND × 100
10.3 判定基準
| 条件 | YOCHUI |
|---|---|
| TKGEND = 0 の場合 | 判定不能のため ' '(空白)とし、エラーログには記録しない(TKGENDゼロは個別に許容) |
| RITU ≧ 80.00 | 'Y'(与信超過注意) |
| RITU < 80.00 | ' '(空白) |
※ 得意先単位のTKGENDが0の場合と、9章のZGOKEI(全件合計)が0の場合は別事象である点に注意。前者は当該得意先のみ判定対象外とし処理は継続、後者は9章のとおり処理全体を中断する。
11. 抽出条件
| No | 条件 | 内容 |
|---|---|---|
| 1 | 対象範囲 | TKMASP全件を対象とする(WHERE条件なし、絞り込みは行わない) |
| 2 | 論理削除等の除外 | TKMASPには削除フラグ等の項目が存在しないため、除外条件は設けない |
| 3 | 信用限度額マイナス値 | 集計対象からは除外しない(合計・構成比計算にそのまま含める)。ただし前提条件No.5のとおりログに記録することを推奨 |
| 4 | 信用限度額ゼロの個別得意先 | 集計対象に含める(KOSEIは0となり、累積構成比にも影響しない)。エラーとはしない |
| 5 | ソート順 | TKGEND降順、同額時TKBANG昇順(9.2手順1) |
12. 集計条件
| No | 集計項目 | 集計方法 | 集計単位 |
|---|---|---|---|
| 1 | 信用限度額合計(ZGOKEI) | TKMASP全件のTKGENDを合算 | 全社(全得意先) |
| 2 | 構成比(KOSEI) | 得意先ごとのTKGEND ÷ ZGOKEI × 100 | 得意先単位 |
| 3 | 累積構成比(RUIKEI) | ソート順(TKGEND降順)に構成比を先頭から累積加算 | 得意先単位(累積) |
| 4 | ABC件数集計(参考/ユーザーSQLでの利用を想定) | SELECT KEKKA, COUNT(*) FROM TKMASW GROUP BY KEKKA |
ランク単位 |
| 5 | 与信超過件数集計(参考) | SELECT COUNT(*) FROM TKMASW WHERE YOCHUI = 'Y' |
全社 |
13. エラー処理
| コード | エラー内容 | 検出タイミング | 処理内容 | メッセージ例 |
|---|---|---|---|---|
| E001 | データなし | TKMASPオープン後、件数0件を検知した時点 | エラーメッセージ出力後、正常終了(後続処理は行わない) | 「E001:得意先マスタ(TKMASP)に対象データが存在しません。処理を終了します。」 |
| E002 | ファイルオープンエラー | TKMASPまたはTKMASWのOPEN時 | エラーメッセージ出力後、*ESCAPEメッセージ送信し異常終了 | 「E002:ファイルのオープンに失敗しました。ファイル名:TKMASP(または TKMASW)」 |
| E003 | レコード読込エラー | READ処理時に%ERRORが真となった場合 | 該当件をスキップし処理継続。エラー件数をカウントしジョブログへ出力 | 「E003:レコード読込中にエラーが発生しました。得意先番号:&1」 |
| E004 | 信用限度額ゼロによるゼロ除算 | 手順2でZGOKEI(信用限度額合計)=0を検知した場合 | 構成比算出処理を行わず、*ESCAPEメッセージ送信し異常終了 | 「E004:信用限度額合計がゼロのため、構成比を算出できません。処理を中断します。」 |
| E005 | システム異常 | 上記以外の予期しないエラー(CHAIN失敗、UPDATE失敗、%STATUS異常等) | エラー内容(ファイル名・レコード様式・%STATUS)をジョブログへ出力し、*ESCAPEメッセージ送信し異常終了 | 「E005:システム異常が発生しました。ファイル:&1 状態コード:&2 管理者に連絡してください。」 |
13.1 実装上の留意事項
- 各READ/CHAIN/UPDATE命令には必ず
MONITORまたはエラー表示指示子(%ERROR)でのエラー捕捉を実装し、無応答(ハング)を防止すること。 - E001・E004は業務ルール上の正常な分岐であるため、E005(システム異常)とは明確に区別してログ出力すること。
- すべてのエラーメッセージは得意先番号など識別可能な情報を付与し、原因調査を容易にすること。
当記事の著作権はIBMに帰属します。詳細はこちらをご参照ください。