# KS60760 詳細設計書

| 項目 | 内容 |
|---|---|
| プログラムID | KS60760（ソース名 KS60760P） |
| プログラム名 | 郵送集約データの代表分作成・優先印刷マスターによる振分け |
| 言語 | PL/I（OPTIONS(MAIN)）。パターン PPB0070P |
| 業務ID | KDHIRT00（ソースの +DC GYOM） |
| 起動JOB | DAISEQ4J ステップ No.17 |
| 作成日 | 2026/10/13 |
| 作成方法 | ソースコードからのリバース作成 |

## 前提

- INCLUDE の SSYUPRNT（優先印刷マスター）は、添付ソースを展開して解析した（付録A）。
- 入出力のレコード（18バイト）はソース内で定義されており、KS60750P の出力と同じ形式である。
- 外部手続きの CALL はなく、ブラックボックス（BB）として扱う部分はない。
- 帳票は出力しない。入出力ファイルのイメージを6章に示す（値は架空。KS60750 設計書 6章の例の続き）。
- ★印は、ソースから読み取れる潜在的な問題点または注意点を示す。

---

## 1. 概要

### 1.1 機能

ソース先頭のコメント：

> 請求集約コードから代表コード分のデータを出力する。
> 優先印刷マスターの有無でアウトファイルを分ける。

1. KS60750P が作った「荷主 → 集約代表」の対応表（集約代表コード順に並べ替え済み）を読む。
2. 集約代表コードが変わるたびに、**代表自身のレコード**（荷主コード＝集約代表コード）を1件作る。
3. 代表のレコードと、その代表に集約される各荷主のレコードを、**それぞれの荷主コードで優先印刷マスターを引き**、
   - マスターに**有る** → OUTFIL1
   - マスターに**無い** → OUTFIL2
   に書き分ける。
4. 終了時に入力件数・代表の件数を表示する。

### 1.2 処理概要図

```
 KS60750P → SORT1（集約代表順）
          │
          ▼
 TEMP.KS60750J.WORK0020 ──▶ INFILE ──▶ KS60760P ──┬─▶ OUTFIL1 ──▶ WORK0030（優先印刷マスターに有る）
                                         ▲          │        → SORT2 → WORK0060 → KS60780P → … → KS60790P 事業所用（KS607902）
          VKAD.SSYUPRNT.DTMASTER ──▶ VKSYUPR      └─▶ OUTFIL2 ──▶ WORK0040（優先印刷マスターに無い）
          （優先印刷マスター）                                → SORT2 → WORK0080 → KS60780P → … → KS60790P エコデリバー用（KS607901）
```

---

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

### 2.1 ファイル一覧

| DD名 | 編成／属性（DCL） | 入出力 | 内容 | 読込／書出領域 |
|---|---|---|---|---|
| INFILE | RECORD INPUT（順次） | 入力 | 郵送集約の対応表（集約代表順） | INAREA（18バイト） |
| VKSYUPR | RECORD KEYED DIRECT INPUT ENV(VSAM) | 入力 | 優先印刷マスター | PRAREA（SSYUPRNT、40バイト）。キー＝荷主コード7桁 |
| OUTFIL1 | RECORD OUTPUT（順次） | 出力 | 優先印刷マスターに**有る**荷主の対応表 | INAREA または OUTAREA（18バイト） |
| OUTFIL2 | RECORD OUTPUT（順次） | 出力 | 優先印刷マスターに**無い**荷主の対応表 | 同上 |

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

| DD名 | データセット | DISP | 属性 | 作成元／利用先 |
|---|---|---|---|---|
| VKSYUPR | VKAD.SSYUPRNT.DTMASTER | SHR | VSAM | KS60130P、KS60151P、KS60152P、KS60630P も使用 |
| INFILE | TEMP.KS60750J.WORK0020 | SHR | FB 18（推定） | 作成：No.16 SORT1（KS60750P の出力を 8,7＝集約代表で並替え） |
| OUTFIL1 | TEMP.KS60750J.WORK0030 | (NEW,KEEP,DELETE) | RECFM=FB、LRECL=18、BLKSIZE=9000、DASD09 | 利用：No.19 SORT2（1,7）→ WORK0060 → No.22 KS60780P → No.24 SORT4 → No.25 KS60790P（事業所用配信、SYSOUT ライター KS607902） |
| OUTFIL2 | TEMP.KS60750J.WORK0040 | (NEW,KEEP,DELETE) | 同上 | 利用：No.20 SORT2（1,7）→ WORK0080 → No.23 KS60780P → No.26 SORT4 → No.27 KS60790P（エコデリバー用配信、ライター KS607901） |

- JCL に SYSPRINT の DD がない。DISPLAY のメッセージはジョブログに出る。
- VKSYUPR の OPEN 文はない。最初の READ で暗黙にオープンされ、終了時に自動でクローズされる。
- 後続の流れ（KS60780P 以降）は JCL からの推定。KS60780P・KS60790P のソースは未解析。

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

| 観点 | INFILE（入力） | OUTFIL1（出力） | OUTFIL2（出力） |
|---|---|---|---|
| 中身 | 代表以外の集約される荷主（KS60750P の抽出結果） | 優先印刷マスターに**有る**荷主 | 優先印刷マスターに**無い**荷主 |
| 代表自身のレコード | **含まない** | 代表がマスターに有れば含む | 代表がマスターに無ければ含む |
| レイアウト | 荷主7＋集約代表7＋店所4（18バイト） | 同じ | 同じ |
| 並び | 集約代表コード順 | 集約代表コード順（後で荷主コード順に並べ替え） | 同左 |
| 件数 | N | OUTFIL1＋OUTFIL2 ＝ N＋代表の数 | ← |
| 後続の用途（推定） | － | 事業所用の配信（KS60790P、KS607902） | エコデリバー用の配信（KS60790P、KS607901） |

- OUTFIL1／OUTFIL2 の振分けは、KS60152P（請求書）・KS60630P（CSV）と同じく「優先印刷マスターの有無」で行う。有る＝事業所（優先）、無い＝エコデリバー（インフォコム）という対応になる。
- ★ ただし本PG は UPRNASKB（明細不要 '6'）を見ない。明細不要の顧客もマスターに有れば OUTFIL1 に入る（KS60152P では出力しない、KS60630P では「不要」と区別している）。

---

## 3. データ定義

### 3.1 入出力エリア（18バイト）

| 名称 | 項目 | 位置 | 長さ | 属性 | 内容 |
|---|---|---|---|---|---|
| INAREA | INKOCD | 1 | 7 | CHAR(7) | 荷主コード |
|  | INDAIH | 8 | 7 | CHAR(7) | 集約代表コード |
|  | INTNCD | 15 | 4 | PIC'(4)9' | 代表扱い店 |
| OUTAREA | OUTKOCD | 1 | 7 | CHAR(7) | 荷主コード（代表のレコードでは集約代表コード） |
|  | OUTDAIH | 8 | 7 | CHAR(7) | 集約代表コード |
|  | OUTTNCD | 15 | 4 | PIC'(4)9' | 代表扱い店 |
| PRAREA | （SSYUPRNT） | － | 40 | － | 優先印刷マスターの読込域（項目は使わない） |

- 集約される荷主のレコードは、INAREA を**そのまま**書く。代表のレコードだけ OUTAREA で作る。

### 3.2 ワークエリア

| 名称 | 属性 | 初期値 | 内容 |
|---|---|---|---|
| EOF_SW | BIT(1) | '1'B | INFILE の終了で '0'B |
| MS_SW | CHAR(1) | － | 優先印刷マスターの該当（'Y'＝有る／'N'＝無い） |
| BREAKA | CHAR(7) | － | 処理中の集約代表コード（区切りの判定用） |
| ICNT | FIXED DEC(9) | 0 | 入力件数（集約される荷主の数） |
| OCNT | FIXED DEC(9) | 0 | 代表の件数（集約代表コードの種類数） |
| ECNT、II、JJ、NUMR | － | － | 未使用 |

---

## 4. 処理フロー

```
開始
 ├─ ON ENDFILE(INFILE) → EOF_SW='0'B、ON KEY(VKSYUPR) → MS_SW='N'
 ├─ OPEN INFILE、OUTFIL1、OUTFIL2
 ├─ INFILE を1件読む
 ├─ DO WHILE（INFILE が終わるまで）                      … 集約代表の単位
 │     BREAKA ← INDAIH
 │     【代表のレコードを作る】
 │       OUTAREA をクリア、OUTKOCD ← INDAIH、OUTDAIH ← INDAIH、OUTTNCD ← INTNCD
 │       MS_SW='Y'、VKSYUPR を KEY(OUTKOCD＝代表) で READ
 │       有る → OUTFIL1、無い → OUTFIL2 に OUTAREA を WRITE
 │       OCNT ＋1
 │     DO WHILE（終わっていない かつ INDAIH が BREAKA と同じ） … 集約される荷主の単位
 │         ICNT ＋1
 │         MS_SW='Y'、VKSYUPR を KEY(INKOCD＝荷主) で READ
 │         有る → OUTFIL1、無い → OUTFIL2 に INAREA を WRITE
 │         INFILE を1件読む
 │     END
 │  END
 ├─ DISPLAY 入力件数・代表件数
 ├─ CLOSE INFILE、OUTFIL1、OUTFIL2
終了
```

---

## 5. 処理詳細

### 5.1 代表のレコードの作成（集約代表コードが変わったとき）

| 手順 | 内容 |
|---|---|
| 1 | BREAKA ← INDAIH（集約代表コード） |
| 2 | OUTAREA をクリアし、OUTKOCD ← INDAIH、OUTDAIH ← INDAIH、OUTTNCD ← INTNCD |
| 3 | MS_SW ← 'Y'。`READ FILE(VKSYUPR) INTO(PRAREA) KEY(OUTKOCD)`（代表の荷主コードで引く） |
| 4 | MS_SW='Y'（有る）なら OUTFIL1、'N'（無い）なら OUTFIL2 に OUTAREA を書く |
| 5 | OCNT ＋1 |

- 代表は KS60750P の抽出条件（荷主≠集約代表）で除外されているため、入力には代表自身のレコードがない。本PG がここで補う（ソースコメント「代表コード分のデータを出力する」）。
- 代表のレコードの店所（OUTTNCD）は、そのグループの**先頭の荷主**の代表扱い店をそのまま使う。
- ★ 同じ代表のグループ内で荷主ごとに代表扱い店が違う場合でも、代表のレコードは先頭の荷主の値になる。

### 5.2 集約される荷主のレコード（同じ集約代表の間）

| 手順 | 内容 |
|---|---|
| 1 | ICNT ＋1 |
| 2 | MS_SW ← 'Y'。`READ FILE(VKSYUPR) INTO(PRAREA) KEY(INKOCD)`（その荷主自身のコードで引く） |
| 3 | 有る → OUTFIL1、無い → OUTFIL2 に INAREA をそのまま書く |
| 4 | INFILE を1件読む |

- 振分けは**荷主ごと**に行う。代表と、その代表に集約される荷主が、別々のファイルに分かれることがある（6章の例の 7654321 グループ）。
- ★ 優先印刷マスターのレコードの内容（UPRNASKB 等）は見ない。KEY 条件はキーなし以外のエラーでも MS_SW='N' になり、OUTFIL2 に入る。

### 5.3 終了処理

1. 次の2行を DISPLAY する。
   - `<<<  INPUT COUNT = ` ∥ ICNT（入力件数＝集約される荷主の数）
   - `<<< DAIHYO COUNT = ` ∥ OCNT（代表の数）
2. INFILE、OUTFIL1、OUTFIL2 を CLOSE する。

- 確認方法：`OUTFIL1 の件数 ＋ OUTFIL2 の件数 ＝ INPUT COUNT ＋ DAIHYO COUNT`。

---

## 6. 入出力イメージ

KS60750 設計書 6章の例の続き。優先印刷マスターには 0010083 と 1234567 だけが登録されているものとする。

### 6.1 入力（WORK0020、集約代表順）

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

- 1行目は、KS60750P で集約代表が空白のまま抽出された荷主（KS60750 設計書 8章 No.1）。空白は数字より小さいため先頭に来る。

### 6.2 処理の様子

| 順 | 区分 | 荷主コード | 集約代表 | 店所 | 優先印刷マスター | 出力先 |
|---|---|---|---|---|---|---|
| 1 | 代表（作成） | （空白） | （空白） | 0000 | 無い | OUTFIL2 |
| 2 | 集約される荷主 | 4567890 | （空白） | 0000 | 無い | OUTFIL2 |
| 3 | 代表（作成） | 0010083 | 0010083 | 1001 | **有る** | **OUTFIL1** |
| 4 | 集約される荷主 | 1209320 | 0010083 | 1001 | 無い | OUTFIL2 |
| 5 | 代表（作成） | 7654321 | 7654321 | 1002 | 無い | OUTFIL2 |
| 6 | 集約される荷主 | 1234567 | 7654321 | 1002 | **有る** | **OUTFIL1** |
| 7 | 集約される荷主 | 5678901 | 7654321 | 1002 | 無い | OUTFIL2 |

### 6.3 出力

**OUTFIL1（WORK0030：優先印刷マスターに有る）**

```
----+----1----+---
001008300100831001
123456776543211002
```

**OUTFIL2（WORK0040：優先印刷マスターに無い）**

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

- 代表 0010083 は OUTFIL1、その配下の 1209320 は OUTFIL2 に分かれる。代表 7654321 は OUTFIL2、配下の 1234567 は OUTFIL1 に分かれる。
- ★ 集約代表が空白のグループでは、荷主コード・集約代表がともに空白の「代表のレコード」が作られ、OUTFIL2 に入る。

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

```
<<<  INPUT COUNT =            4
<<< DAIHYO COUNT =            3
```

- OUTFIL1（2件）＋OUTFIL2（5件）＝ 7件 ＝ 入力 4件＋代表 3件。

---

## 7. 異常処理

| 事象 | 検出 | 処理 |
|---|---|---|
| INFILE の終了 | ENDFILE 条件 | EOF_SW='0'B でループを終える（正常） |
| INFILE が0件 | なし | 出力0件で正常終了 |
| 優先印刷マスターに該当なし・キーエラー | KEY 条件 | MS_SW='N'。OUTFIL2 に出力（メッセージなし） |
| 優先印刷マスターの DD がない | UNDEFINEDFILE 条件 | ON 定義なし → 異常終了 |
| INTNCD が数字でない（代表のレコード作成時） | CONVERSION 条件（の可能性） | ON 定義なし → 異常終了 |
| その他 | － | ON ERROR の定義なし → PL/I 標準のエラー処理 |
| リターンコード | － | 設定なし（正常時は 0） |

---

## 8. 留意事項（★）

1. **代表と配下の荷主が別のファイルに分かれる**：振分けは荷主ごとに優先印刷マスターを引いて決める。後続（KS60780P・KS60790P）で、代表と配下が別々の配信になる可能性がある（要確認）。
2. **明細不要（UPRNASKB＝'6'）を区別しない**：マスターに有れば OUTFIL1。KS60152P・KS60630P とは扱いが異なる。
3. **集約代表が空白のグループ**：KS60750P の抽出条件により、集約代表が空白の荷主が入ってくる。本PG では「荷主コード空白の代表のレコード」が作られ、OUTFIL2 に入る（6.3）。
4. **代表のレコードの店所は先頭の荷主の値**（5.1）。
5. **キーエラーも「無い」扱い**：優先印刷マスターの読込エラーが、メッセージなしで OUTFIL2 に振り分けられる。
6. **VKSYUPR の OPEN 文がない**、**SYSPRINT の DD がない**（2.2）。
7. **未使用の変数**：ECNT、II、JJ、NUMR（KS60750P と同じパターンからの流用と推定）。
8. **INFILE の並びに依存**：集約代表コード順に並んでいることが前提。並んでいないと、同じ代表のレコードが複数作られる。

---

## 9. 未使用項目

| 項目 | 内容 |
|---|---|
| SSYUPRNT の全項目 | 読込域として使うだけで、項目は参照しない（該当の有無だけを使う） |
| ECNT、II、JJ、NUMR | 宣言のみ |
| BUILTIN の ADDR、SUBSTR、HIGH、LOW、ROUND、STRING、VERIFY、UNSPEC | 宣言のみ |

---

## 付録A SSYUPRNT（優先印刷マスター、40バイト）

| LV | 項目名 | 属性 | 繰返し | 位置 | 長さ | 本PGでの使用 |
|---|---|---|---|---|---|---|
| 02 | UPRNNICD | PIC'(7)9' |  | 1 | 7 | キー（荷主コード7桁）。該当の有無だけを判定に使う |
| 02 | UPRNKUBN | PIC'(1)9' |  | 8 | 1 |  |
| 02 | UPRNTHKB | CHAR(1) |  | 9 | 1 |  |
| 02 | UPRNSPAC | CHAR(1) |  | 10 | 1 |  |
| 02 | UPRNAIXK | （集団項目） |  | 11 | 23 |  |
| 03 | 　UPRNATEN | PIC'(4)9' |  | 11 | 4 |  |
| 03 | 　UPRNAKBK | PIC'(1)9' |  | 15 | 1 |  |
| 03 | 　UPRNAKUB | PIC'(1)9' |  | 16 | 1 |  |
| 03 | 　UPRNASKB | CHAR(1) |  | 17 | 1 |  |
| 03 | 　UPRNASCN | CHAR(9) |  | 18 | 9 |  |
| 03 | 　UPRNANIC | PIC'(7)9' |  | 27 | 7 |  |
| 02 | UPRNSPA2 | CHAR(7) |  | 34 | 7 |  |
