# KS60151P／KS60152P 差異分析報告書

| 項目 | 内容 |
|---|---|
| 対象 | KS60151P（新請求書電子帳票出力：通常分）と KS60152P（新請求書電子帳票出力：エコデリバー分） |
| 資料 | `KS60151P.txt`（2,104行）、`KS60152P.pl1`（2,274行）、`DAISEQ4J.jcl`、上流確認用の `KS60135P.pl1` |
| 体制 | 監督者が全体を統括し、作業者Aがソースから出力結果の差異を、作業者BがJCLから位置づけ・実行環境の差異を分析 |
| 作成日 | 2026-10-15 |

**表記**
- 行番号は各ファイルの物理行です。「151 L○○」「152 L○○」はソース、「JCL L○○」は JCL の行です。
- 推測を含む記述には「（推測）」と付けています。
- KS60151P.txt は Shift-JIS で保存されているため、日本語コメントが文字化けしています。根拠にはコード部分だけを使いました。

---

## 1. 結論（要旨）

1. **帳票を組み立てるロジックは実質的に同じです。** 見出し、明細、計、改ページ、住所の分割などは、行単位で比較しても差がありません。違いは次の3点に集中しています。
   - **どの顧客を、どのファイルに出すか**
   - **1行目の店所コード**（A-SPOOL の振分けキー）
   - **2行目の内容**
2. **出力の構成が違います。**
   - 151 は2本です。全顧客を「控え」（KS601511）に出し、明細不要以外の顧客は「送付用」（KS601512）にも**重ねて**出します。
   - 152 は3本です。優先印刷マスター（VKSYUPR）に顧客があるかどうかで、出力先を**どちらか一方**に決めます。
     - マスターに無い顧客：インフォコム（KS601521）とインフォコム送付用（KS601523）
     - マスターに有る顧客：事業所送付用（KS601522）
     - 明細不要の顧客：**どこにも出さない**
3. **152 だけが顧客法人管理マスター（VKCORPO）を読みます。** 読んだ値で、2行目に集約代表コードを印字し、KS601521 の1行目の店所を代表扱い店に置き換えます。JCL の DD が増えているのは、VKCORPO と OUTFIL3 の2つだけです。
4. **入力データの範囲が違います。** 151 は全配信店分のデータを、訂正分も含めて読みます。152 は KS60135P が郵送対象店所（SEQTRYTN）に絞り、訂正（データID 31〜33）を除いたデータを読みます。そのため、**郵送対象店所の請求先は、151 と 152 の両方の帳票に出ます。**
5. **要確認事項があります。**
   - 152 には不具合の可能性が1件あります（§4 の D-11）。
   - 明細不要の顧客が帳票に一切出ない点は、仕様どおりか確認が必要です。
   - 再実行すると帳票が二重に配信されるリスクがあります。

---

## 2. JCL 上の位置づけ（作業者B）

### 2.1 データフロー

```
            TEMP.DAISEQ4J.WORK0620（全件・訂正を含む）
        ┌──────────────┴───────────────────────┐
  【通常分（特積）】                     【郵送／エコデリバー】
  KS60144P 1回目 (L460)                  KS60135P (L528)
        │                                 ・SEQTRYTN の店所の荷主だけ抽出
        │                                 ・データID 31〜33（訂正）を除外
        │                                       ▼ WORK062S ──▶ KS60630P (CSV)
        │                                KS60144P 2回目 (L545)
        ▼ WORK0635                              ▼ WORK0700
  KS60151P (L494)                        KS60152P (L579)
   OUTFILE → KS601511 控え                OUTFILE → KS601521 インフォコム
   OUTFIL2 → KS601512 送付用              OUTFIL2 → KS601522 事業所送付用
                                          OUTFIL3 → KS601523 インフォコム送付用
```

151 と 152 の間でデータの受け渡しはありません。共通の上流は WORK0620 だけです。

### 2.2 DD の比較

| DD名 | DSN／SYSOUT | 151 | 152 | 備考 |
|---|---|---|---|---|
| ALTFILE | ADG.ALTLIB(SEQPRTNC) | ○ L497 | ○ L582 | 同じメンバー |
| SQHAIDA | 151＝**WORK0635**、152＝**WORK0700** | ○ L498 | ○ L583 | DD名は同じで、DSN だけ異なる |
| VKTENMS／VKBANKM／VKSYUPR | 店所マスター、銀行マスター、優先印刷マスター | ○ | ○ | 同じ |
| **VKCORPO** | VKAD.CORPOMAN.DTMASTER | × | **○ L590** | 152 だけ（152 L25 の宣言と一致） |
| MDMIKAN | VKAD.MISYUKAN.DTMASTER | ○ L505 | ○ L591 | **どちらのソースにも宣言がない**。外部手続き LKN0010 が使っていると推測 |
| VKCHINM | 地名マスター | コメント化 | コメント化 | ソース側の READ もコメントアウトされている（151 L1725／152 L1888） |
| OUTFILE | SYSOUT=(E,…,99) | KS601511 | KS601521 | |
| OUTFIL2 | 同上 | KS601512 | KS601522 | |
| **OUTFIL3** | 同上 | × | **KS601523** | 152 だけ（152 L28 の宣言と一致） |

**整合性チェックの結果**
- ソースで宣言しているのに JCL に DD が無いファイルは、2本ともありません。
- JCL にだけあってソースに宣言が無いのは MDMIKAN だけです。

### 2.3 実行・運用面の差異と注意点

- **COND**：各ステップに COND は指定されておらず、効くのは JOB 文の `COND=(9,LT)` だけです。そのため、151 が異常終了または RC≥10 になると、データ上は関係のない **152 も実行されません**。
- **RC**：どちらのソースにも RC を設定する処理（PLIRETC）がありません。異常で止まるのは ABEND のときだけです。
- **再実行**：どちらも SYSOUT に直接出力するため、**再実行すると帳票が二重に配信されます**。また KS60144P のステップ名が重複しているので（L460／L545）、RESTART でステップ名を指定すると、どちらの KS60144P から始まるかが一意に決まりません。
- **KS60144P の副出力**：WORK0642・0646・0701・0702 は、151 と 152 のどちらでも読まれていません。JCL 全体でも、作成と SCRATCH の行にしか出てきません。
- **後片付けの非対称**：最終削除ステップ（L833〜838）は WORK0635 を消しますが、WORK0700 は消しません。

---

## 3. 出力結果の差異（作業者A）

### 3.1 顧客の状態と出力先

| 顧客の状態（優先印刷マスター VKSYUPR） | KS60151P | KS60152P |
|---|---|---|
| マスターに**無い** | 控え（KS601511）＋送付用（KS601512） | KS601521＋KS601523 |
| マスターに有る（UPRNASKB≠'6'） | 控え＋送付用 | KS601522 だけ |
| マスターに有る（UPRNASKB='6'：明細不要） | 控えだけ（1行目57桁目に `#`） | **どこにも出さない** |

根拠：151 L556〜569、L648〜661／152 L572〜585、L676〜700

- 151 の控え（OUTFILE）は、OUT_SW に関係なく**全行を無条件に**書き出します（151 L648〜649 ほか）。
- 152 には無条件に書き出す行が無く、すべての WRITE が OUT_SW で振り分けられます。そのため、**152 には全顧客分がそろった帳票がありません。**

### 3.2 差異一覧

| No | 分類 | KS60151P | KS60152P | 根拠 |
|---|---|---|---|---|
| D-1 | 出力本数 | 2本（KS601511／512） | 3本（KS601521／522／523） | 151 L23〜24、152 L26〜28 |
| D-2 | 振分け区分 OUT_SW | 2値（'1'＝控え＋送付、'0'＝控えのみ） | 3値（'1'＝OUTFILE＋OUTFIL3、'2'＝OUTFIL2、'0'＝出力なし） | 151 L556〜569／152 L572〜585 |
| D-5 | 明細不要の顧客 | 控えに `#` を付けて出力する | 出力しない。`#` を設定する処理は残っているが、使われない死にコードになっている（152 L655〜657） | |
| D-7 | 1行目の店所CD | 控え＝発行店。送付用＝条件を満たせば未収管理店（MISYU_TC） | KS601521＝**代表扱い店**（CORPZDTN）。KS601523＝発行店。KS601522＝151 の送付用と同じ規則 | 151 L622、L655〜656／152 L680〜685、L692〜693 |
| D-8 | 2行目 | 西暦表示の案内文。最初のレコードの終了日が 190610 より後なら空白になるため、**今のデータでは空白行** | **集約代表コード**（7桁、ASA を除いた印字位置で126〜132桁）を3本すべてに出す | 151 L122〜127、L531〜534／152 L131〜134、L601 |
| D-9 | 参照マスター | VKTENMS、VKBANKM、VKSYUPR | 左記に加えて **VKCORPO** | 152 L587〜597 |
| D-10 | CORPOMAN に該当が無いとき | － | 集約代表コード＝自分の荷主CD、代表扱い店＝発行店。このとき KS601521 と KS601523 は**完全に同じ内容**になる | 152 L588、L591〜597 |
| D-11 | 2ページ目以降の2行目 | － | **不具合の可能性あり**（§4 参照） | 152 L566〜601 |
| D-12 | OUTFIL3 の OPEN／CLOSE | － | OPEN 文と CLOSE 文に OUTFIL3 が無い。最初の WRITE で暗黙に開かれる | 152 L514〜521、L2153〜2160 |
| D-14 | ALTFILE（SEQPRTNC） | 送付用の1行目の店所置換にだけ効く | 事業所送付用（KS601522）にだけ効く。インフォコム系の2本には効かない | 151 L602〜618／152 L630〜646 |
| D-15 | 0件のとき | 入力が0件なら2本とも0行 | 入力が0件なら3本とも0行。顧客の構成によっては、一部の帳票だけ0行になりやすい | |

### 3.3 違いが無い部分

次の部分は、行単位で比較して差がないことを確認しています。
- 出力行のレイアウト（OUT_2 を除く）
- 1行目の編集（店所CD と `#` を除く）
- 見出し2（1ページ目と2ページ目以降）
- 検品料・サーチャージの処理
- 小計・合計
- 明細行
- 改ページと行数の制御
- 住所・荷主名の分割サブルーチン
- マスターの読み方
- エラー処理（ON ERROR が無いこと、PLIRETC が無いことを含む）

---

## 4. 監督者による検証結果

作業者の報告のうち、影響の大きいものについて、監督者がソースを直接確認しました。

| 対象 | 確認内容 | 結果 |
|---|---|---|
| 振分けロジック | 151 L548〜662、152 L555〜700 を読み合わせた | ✅ 作業者A・Bの報告どおり |
| VKCORPO と OUTFIL3 の宣言 | 152 L25、L28 | ✅ 確認した |
| MDMIKAN | 両ソースを Grep した | ✅ どちらのソースにも宣言が無い |
| **D-11** | 152 L566〜601 を確認した | ✅ **作業者Aの指摘は正しい** |

### D-11 の詳細（KS60152P の不具合の可能性）

- 152 では、見出し1のたびに `DISKEY = SQNO_1_7`（自分の荷主CD）に戻しています（L567）。
- 一方、VKCORPO を読んで DISKEY に集約代表コードを入れる処理（L587〜597）は、`IF UPRNNICD = SYUKEY THEN ; ELSE DO …` の **ELSE 側の中**（L568〜598）にあります。つまり、優先印刷マスターのキーが前回と変わったときにしか実行されません。
- **優先印刷マスターに有る顧客**（KS601522 に出る顧客）の場合、マスターの読み込みに成功するので UPRNNICD がこの顧客の荷主CDになります。そのため、同じ荷主の2回目以降の見出し1（2ページ目以降や枝番違い）では ELSE 側に入らず、**2行目が集約代表コードではなく自分の荷主CDになります。**
- **マスターに無い顧客**（KS601521／523 に出る顧客）の場合、読み込みに失敗して UPRNNICD が更新されないため、見出し1のたびに読み直します。そのため、正しい値が出ます。
- 既存の `KS60152_詳細設計書.md` 6.5 は、この現象がインフォコム側で起きると書いていますが、**ソースとは逆**です。設計書の修正が必要です。

---

## 5. 要確認事項（業務・運用担当への確認依頼）

| No | 内容 | 出典 |
|---|---|---|
| 1 | **D-11**：152 の事業所送付用（KS601522）で、2ページ目以降の2行目が自分の荷主CDになる。不具合として扱うか、現行仕様として Java 移行でも同じ動きにするか | A・監督者 |
| 2 | 152 では明細不要の顧客が帳票に一切出ない（151 では控えに `#` 付きで残る）。意図どおりか | A |
| 3 | 郵送対象店所の請求先は、151（特積）と 152（郵送）の両方に出る。しかも訂正を含むかどうかで、金額が違う帳票が2種類出る可能性がある。業務上の想定どおりか | B |
| 4 | MDMIKAN が LKN0010 の内部で使われているか、LKN0010 のソースで確認する | A・B |
| 5 | OUTFIL3 が OPEN 文から漏れている。対象が0件のとき、KS601523 が空の帳票として出るのかどうか、実機で確認する | A・B |
| 6 | SYSOUT のライター名（KS601511〜523）が、A-SPOOL でどこへ振り分けられるか。インフォコム、NEOSS、事業所の対応を運用定義で確認する（本書の用途名は推測を含む） | B |
| 7 | KS60144P の副出力（WORK0642／0646／0701／0702）がジョブの外で使われているか。WORK0700 などを最終削除しないのは意図的か | B |
| 8 | ALTFILE が101件以上のとき、範囲外の TAB_PRTN(101) を参照する（151・152 共通）。KS60135P の SEQTRYTN テーブルには件数の上限チェックが無い | A・B |

---

## 6. 付録：作業の経過

| 担当 | 作業内容 | 所要時間 |
|---|---|---|
| 作業者B | JCL・DD・データフローの分析。KS60135P も確認 | 約3分半（ツール操作23回） |
| 作業者A | 両ソースを全行読み、行単位の差分を取って確認 | 約5分（ツール操作30回） |
| 監督者 | 主要な指摘をソースで裏付け、報告を統合 | － |

作業者ごとの詳細レポート（全差異 D-1〜D-15、要確認 Q-1〜Q-9、DD 整合性の全表）は、セッションの一時フォルダにあります。必要であれば作業フォルダにコピーします。
