# KS60750 詳細設計書

| 項目 | 内容 |
|---|---|
| プログラムID | KS60750（ソース名 KS60750P） |
| プログラム名 | 顧客法人マスター 郵送集約コード抽出 |
| 言語 | PL/I（OPTIONS(MAIN)）。パターン PPB0070P |
| 業務ID | KDHIRT00（ソースの +DC GYOM） |
| 起動JOB | DAISEQ4J ステップ No.15（JCL コメント「顧客法人管理マスター　郵送依頼店セット顧客出力」） |
| 作成日 | 2026/10/13 |
| 作成方法 | ソースコードからのリバース作成 |

## 前提

- INCLUDE の CORPOMAN（顧客法人管理マスター）は、添付ソースを展開して解析した（付録A）。
- 外部手続きの CALL はなく、ブラックボックス（BB）として扱う部分はない。
- 帳票は出力しない。出力ファイルのイメージを6章に示す（値は架空）。
- CORPOMAN の項目の意味（ZAND＝集約代表、ZDTN＝代表扱い店）は、KS60152P のソースのコメント（「集約代表コード」「代表コード扱い店」）からの推定である。
- ★印は、ソースから読み取れる潜在的な問題点または注意点を示す。

---

## 1. 概要

### 1.1 機能

ソース先頭のコメント：「顧客法人マスター（郵送集約コードのみ）」

1. 顧客法人管理マスター（INFILE）を先頭から全件読む。
2. 荷主コード（CORPNICD）と集約代表コード（CORPZAND）が**異なる**レコードだけを選ぶ。つまり「自分以外の代表に集約される顧客」を抜き出す。
3. 選んだレコードから「荷主コード・集約代表コード・代表扱い店」の3項目（18バイト）を OUTFILE に書く。
4. 終了時に入力件数・出力件数を表示する。

出力は、後続の SORT（集約代表コード順）を経て KS60760P が読み、最終的に KS60790P（事業所用・エコデリバー用の配信帳票）で、集約された顧客の請求をまとめる際の対応表として使われる（推定）。

### 1.2 処理概要図

```
 VKAD.CORPOMAN.DTMASTER ──▶ INFILE ──▶ KS60750P ──▶ OUTFILE ──▶ TEMP.KS60750J.WORK0010
 （顧客法人管理マスター）              │           （荷主→集約代表の対応表、18バイト）
                                       ▼                    │
                                 件数メッセージ               ▼
                                                  No.16 SORT1（8,7＝集約代表コード順）→ WORK0020
                                                            ▼
                                                  No.17 KS60760P（優先印刷マスターで2分割）→ …
```

---

## 2. 外部インターフェース

### 2.1 ファイル一覧

| DD名 | 編成／属性（DCL） | 入出力 | 内容 | 読込／書出領域 |
|---|---|---|---|---|
| INFILE | RECORD INPUT（順次） | 入力 | 顧客法人管理マスター | INAREA（CORPOMAN、120バイト） |
| OUTFILE | RECORD OUTPUT（順次） | 出力 | 郵送集約コードの対応表 | OUTAREA（18バイト） |

### 2.2 JCL との対応（DAISEQ4J No.15）

| DD名 | データセット | DISP | 属性 | 備考 |
|---|---|---|---|---|
| INFILE | VKAD.CORPOMAN.DTMASTER | SHR | VSAM KSDS（推定） | KS60152P・KS60630P・KS60790P がキー読みするマスターを、本PGは**順次に全件**読む。並びはキー（荷主コード）の昇順 |
| OUTFILE | TEMP.KS60750J.WORK0010 | (NEW,KEEP,DELETE) | RECFM=FB、LRECL=18、BLKSIZE=9000、SPACE=(9000,(1000,100),RLSE)、DASD09 | 事前削除：No.14。利用：No.16 SORT1 |

- プログラムの INFILE には ENV(VSAM) の指定がないが、DD が VSAM を指すため、順次の VSAM 読込みとして動作する。
- JCL に SYSPRINT の DD がない。DISPLAY のメッセージはジョブログ（コンソール）に出る（PL/I の DISPLAY の既定動作）。

### 2.3 入出力ファイルの違い

| 観点 | INFILE（入力） | OUTFILE（出力） |
|---|---|---|
| 中身 | 顧客法人管理マスターの全顧客 | 自分以外の代表に集約される顧客だけ |
| 1件の長さ | 120バイト（CORPOMAN） | 18バイト（3項目） |
| 項目 | 荷主コード、集約代表、各店所コード、名称、区分 等 | 荷主コード、集約代表コード、代表扱い店 |
| 並び | 荷主コードの昇順 | 同左（後続の SORT で集約代表コード順に並べ替える） |
| 件数 | 全件 | 入力以下 |

---

## 3. データ定義

### 3.1 入力エリア

| 名称 | 内容 |
|---|---|
| INAREA | `%INCLUDE CORPOMAN`（120バイト。付録A）。使う項目は CORPNICD、CORPZAND、CORPZDTN の3つ |

### 3.2 出力エリア（OUTAREA、18バイト）

| 項目 | 位置 | 長さ | 属性 | 内容 | 編集元 |
|---|---|---|---|---|---|
| OUTKOCD | 1 | 7 | CHAR(7) | 荷主コード（顧客） | CORPNICD |
| OUTDAIH | 8 | 7 | CHAR(7) | 集約代表コード | CORPZAND |
| OUTTNCD | 15 | 4 | PIC'(4)9' | 代表扱い店 | CORPZDTN |

- JCL の LRECL=18 と一致する。
- 後続の SORT1 のキー（8,7）は OUTDAIH（集約代表コード）。

### 3.3 ワークエリア

| 名称 | 属性 | 初期値 | 内容 |
|---|---|---|---|
| EOF_SW | BIT(1) | '1'B | INFILE の終了で '0'B |
| ICNT | FIXED DEC(9) | 0 | 入力件数 |
| OCNT | FIXED DEC(9) | 0 | 出力件数 |
| ECNT | FIXED DEC(9) | 0 | 未使用（エラー件数用と推定） |
| MS_SW、II、JJ、NUMR | － | － | 未使用（NUMR は '0123456789'。数字チェック用の名残と推定） |

---

## 4. 処理フロー

```
開始
 ├─ ON ENDFILE(INFILE) → EOF_SW='0'B
 ├─ OPEN INFILE、OUTFILE
 ├─ INFILE を1件読む
 ├─ DO WHILE（INFILE が終わるまで）
 │     ICNT ＋1
 │     CORPNICD ≠ CORPZAND ？
 │       ├ YES → OUTAREA をクリア
 │       │        OUTKOCD ← CORPNICD、OUTDAIH ← CORPZAND、OUTTNCD ← CORPZDTN
 │       │        OUTFILE に WRITE、OCNT ＋1
 │       └ NO  → 何もしない（自分が代表の顧客）
 │     INFILE を1件読む
 │  END
 ├─ DISPLAY 入力件数・出力件数
 ├─ CLOSE INFILE、OUTFILE
終了
```

---

## 5. 処理詳細

### 5.1 抽出条件

| CORPNICD と CORPZAND | 意味（推定） | 出力 |
|---|---|---|
| 同じ | 自分自身が集約代表（または集約なし） | しない |
| 異なる（CORPZAND に別の荷主コード） | 別の代表に集約される顧客 | **する** |
| 異なる（CORPZAND が空白） | 集約代表が未設定 | ★ **する**（集約代表コード＝空白の行になる） |

- 比較は CHAR(7) どうしの文字比較。
- ★ ソースのコメントは「郵送集約コードのみ」だが、CORPZAND が空白（未設定）の顧客も「異なる」と判定されて出力される。マスターで未設定の顧客が CORPZAND に自分の荷主コードを入れている運用なら問題ない。空白の顧客がいる場合、後続の SORT1 で集約代表コード＝空白の行が先頭にまとまる（要確認）。

### 5.2 出力の編集

1. `OUTAREA = ''` でクリアする。
2. OUTKOCD ← CORPNICD、OUTDAIH ← CORPZAND、OUTTNCD ← CORPZDTN。
3. `WRITE FILE(OUTFILE) FROM(OUTAREA)`。OCNT ＋1。

- OUTTNCD と CORPZDTN はどちらも PIC'(4)9'。CORPZDTN に数字以外が入っている場合、代入時に CONVERSION 条件の可能性がある（ON 定義なし）。

### 5.3 終了処理

1. 次の2行を DISPLAY する。
   - `<<<  INPUT COUNT = ` ∥ ICNT
   - `<<< OUTPUT COUNT = ` ∥ OCNT
2. INFILE と OUTFILE を CLOSE する。

---

## 6. 入出力イメージ

### 6.1 入力（顧客法人管理マスター、主な項目のみ）

| No | CORPNICD（荷主） | CORPZAND（集約代表） | CORPZDTN（代表扱い店） | 判定 |
|---|---|---|---|---|
| 1 | 0010083 | 0010083 | 1001 | 同じ → 出力しない |
| 2 | 1209320 | 0010083 | 1001 | 異なる → 出力 |
| 3 | 1234567 | 7654321 | 1002 | 異なる → 出力 |
| 4 | 2345678 | 2345678 | 1003 | 同じ → 出力しない |
| 5 | 4567890 | （空白） | 0000 | ★ 異なる → 出力 |
| 6 | 5678901 | 7654321 | 1002 | 異なる → 出力 |
| 7 | 7654321 | 7654321 | 1002 | 同じ → 出力しない |

### 6.2 出力（TEMP.KS60750J.WORK0010、FB 18バイト）

```
----+----1----+---
120932000100831001
123456776543211002
4567890       0000
567890176543211002
```

| 位置 | 1～7 | 8～14 | 15～18 |
|---|---|---|---|
| 項目 | 荷主コード | 集約代表コード | 代表扱い店 |

- すべて文字（数字）項目のため、ダンプでもそのまま読める。

### 6.3 参考：後続 SORT1（8,7）後の並び（WORK0020）

```
----+----1----+---
4567890       0000
120932000100831001
123456776543211002
567890176543211002
```

- 集約代表コードの順に並ぶ。空白（X'40'）は数字（X'F0'～）より小さいため、集約代表が空白の行が先頭に来る。
- 同じ集約代表に集約される顧客（1234567 と 5678901 → 7654321）が隣り合う。

### 6.4 メッセージ（ジョブログ）

```
<<<  INPUT COUNT =            7
<<< OUTPUT COUNT =            4
```

- 件数の前の空白は、FIXED DEC(9) を文字に変換する規則によるもので、イメージは目安である。

---

## 7. 異常処理

| 事象 | 検出 | 処理 |
|---|---|---|
| INFILE の終了 | ENDFILE 条件 | EOF_SW='0'B でループを終える（正常） |
| INFILE が0件 | なし | 出力0件で正常終了 |
| CORPZDTN が数字でない | CONVERSION 条件（の可能性） | ON 定義なし → 異常終了 |
| その他 | － | ON ERROR の定義なし → PL/I 標準のエラー処理（異常終了） |
| リターンコード | － | 設定なし（正常時は 0） |

---

## 8. 留意事項（★）

1. **集約代表が空白の顧客も出力される**（5.1）。
2. **CORPZAND が自分の荷主コードと違えば、代表側のマスター登録の有無は確認しない**。代表の荷主コードがマスターに存在しなくても出力される。
3. **代表扱い店（CORPZDTN）を出力する**。KS60630P の CSV の「扱い店」は CORPATTN で、別の項目である（KS60630 設計書 2.4）。
4. **SYSPRINT の DD がない**：DISPLAY はジョブログに出る。
5. **未使用の変数**：MS_SW、II、JJ、NUMR、ECNT（パターンからの流用と推定）。
6. **業務ID が他と異なる**：本PG は KDHIRT00、KS60135P・KS60630P は NSSQNN50。別の業務（顧客法人管理側）で作られたプログラムを流用していると推定。

---

## 9. 未使用項目

| 項目 | 内容 |
|---|---|
| CORPOMAN の CORPNICD、CORPZAND、CORPZDTN 以外 | 参照なし |
| MS_SW、II、JJ、NUMR、ECNT | 宣言のみ |
| BUILTIN の ADDR、SUBSTR、HIGH、LOW、ROUND、STRING、VERIFY、UNSPEC | 宣言のみ |

---

## 付録A CORPOMAN（顧客法人管理マスター、120バイト）

| LV | 項目名 | 属性 | 繰返し | 位置 | 長さ | 本PGでの使用 |
|---|---|---|---|---|---|---|
| 02 | CORPVKEY | （集団項目） |  | 1 | 7 |  |
| 03 | 　CORPNICD | CHAR(7) |  | 1 | 7 | キー（荷主コード）→ OUTKOCD。CORPZAND と比較 |
| 02 | CORPAIX1 | （集団項目） |  | 8 | 7 |  |
| 03 | 　CORPTKCD | CHAR(7) |  | 8 | 7 |  |
| 02 | CORPAIX2 | （集団項目） |  | 15 | 7 |  |
| 03 | 　CORPZAND | CHAR(7) |  | 15 | 7 | 集約代表コード → OUTDAIH。CORPNICD と比較 |
| 02 | CORPATTN | PIC'(4)9' |  | 22 | 4 |  |
| 02 | CORPTKTN | PIC'(4)9' |  | 26 | 4 |  |
| 02 | CORPZDTN | PIC'(4)9' |  | 30 | 4 | 代表扱い店 → OUTTNCD |
| 02 | CORPJGKB | CHAR(1) |  | 34 | 1 |  |
| 02 | CORPTKJG | CHAR(1) |  | 35 | 1 |  |
| 02 | CORPDLKB | CHAR(1) |  | 36 | 1 |  |
| 02 | CORPNINM | CHAR(42) |  | 37 | 42 |  |
| 02 | CORPCOKB | CHAR(1) |  | 79 | 1 |  |
| 02 | CORPDSTK | CHAR(1) |  | 80 | 1 |  |
| 02 | CORPWARI | FIXED DEC(3) |  | 81 | 2 |  |
| 02 | CORPNMKB | CHAR(1) |  | 83 | 1 |  |
| 02 | CORPSPAC | CHAR(14) |  | 84 | 14 |  |
| 02 | CORPPUDL | CHAR(1) |  | 98 | 1 |  |
| 02 | CORPPUMD | CHAR(6) |  | 99 | 6 |  |
| 02 | CORPJYCD | CHAR(6) |  | 105 | 6 |  |
| 02 | CORPTRMD | CHAR(4) |  | 111 | 4 |  |
| 02 | CORPUYMD | CHAR(6) |  | 115 | 6 |  |

- CORPVKEY（CORPNICD）がキー、CORPAIX1（CORPTKCD）・CORPAIX2（CORPZAND）は代替索引（AIX）のキーと推定される（集団項目名より）。
