Files
cobol-tna-system/詳細設計書/詳細設計書_SHA04TWO.md
qiuqiuqiu 71232af484 Add Subsystem D (SHA01-10): social insurance subsystem + design-resource consistency fixes
- Add SHA01CVT-SHA10S10: all 10 programs, COPY books (13), binaries,
  design docs, resource usage lists, DDL schema_sha.sql
- Add KYU01REC-KYU06REC COPY books (previously missing from git)
- Fix design-code inconsistencies detected in audit:
  - SHA07KBR: remove dead SHACHKAC COPY (SUB04CHK never called)
  - SHA02MNC: 2020TYPSOR paragraph -> inline EVALUATE; SUB04CHK = PARM val
  - SHA05TWN: REVISED-TYPE values 'C'/'N' -> 'A'(定期決定)/'B'(月変)
  - SHA03MNP: 2010CALCSOR/2020WRTSOR -> inline implementation
  - SHA04TWO: remove GRADE-HISTORY from DB table list (not accessed)
  - SHA06TWM: add SALARYDB.EMP-MASTER to DB table list
  - SHA10S10: fix error file W99OUTFIL, 10+1 file count
- Fix comment column alignment (Area A col 7) in SHA07KBR, SHA08SRT
- Update KYU source/design docs: BOM removal, classification comment cleanup
- Update README: Subsystem D added, program count 39
2026-07-15 20:32:51 +08:00

160 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA04TWO |
| 3 | プログラム名 | 事業所保険者マッチング処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:1→1:1 2段階) |
| 6 | 機能概要 | 被保険者データに対し、事業所マスタ(SHA02R02)と保険者マスタ(SHA03R03)の2段階1:1マッチングを実施する。 |
| 7 | | 第1段階:事業所番号(OFFICE-NO)で事業所マスタとマッチング |
| 8 | | 第2段階:保険者コード(INSURER-CODE)で保険者マスタとマッチング |
| 9 | | 両段階ともマッチした場合GRADED-LISTに出力、いずれかで不一致の場合はUNMATCHED-LISTに出力 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01INSURED-DATA | 事業所番号(OFFICE-NO)+社員番号(EMP-ID)の昇順ソート済 |
| 2 | ファイルR02OFFICE-MST | 事業所番号(OFFICE-NO)の昇順ソート済、重複なし |
| 3 | ファイルR03INSURER-MST | 保険者コード(INSURER-CODE)の昇順ソート済、重複なし |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | INSURED-DATA | R01 | SHA04R01 | I | SHA01REC | FB | | 200 | PS | 被保険者データ(SHA01CVT出力) |
| 2 | OFFICE-MST | R02 | SHA04R02 | I | 自前(80B) | FB | | 80 | PS | 事業所マスタ |
| 3 | INSURER-MST | R03 | SHA04R03 | I | 自前(80B) | FB | | 80 | PS | 保険者マスタ |
| 4 | GRADED-LIST | W01 | SHA04W01 | O | SHA04REC | FB | | 200 | PS | 両段階マッチ成功レコード |
| 5 | UNMATCHED-LIST | W02 | SHA04W02 | O | 自前(200B) | FB | | 200 | PS | いずれかの段階で不一致レコード |
| 6 | ERROR-LOG | W03 | SHA04W03 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
| 7 | INSURANCEDB | DB | — | I | — | DB2 | — | — | DASD | DB2: INSURED-MASTER |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | OFFICE-NO + EMP-ID | OFFICE-NO(第1段階) |
| 2 | ファイルR02 | OFFICE-NO | OFFICE-NO(第1段階, 1:1 |
| 3 | ファイルR03 | INSURER-CODE | INSURER-CODE(第2段階, 1:1 |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | SHADATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | SHAMSGAC |
| 3 | ABEND処理SUB | SUB03END | SHAENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R02OFFICE-MST)を全件読み込み、内部テーブル(OFFICE-TBL)に格納する。
(1110R02LDASOR)
1-7.R03INSURER-MST)を全件読み込み、内部テーブル(INSURER-TBL)に格納する。
(1120R03LDASOR)
1-8.DB接続
EXEC SQL CONNECT TO 'data/INSURANCEDB.db'
1-9.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.第1段階マッチング(OFFICE-NO vs OFFICE-TBL):1:1マッチング(2010STG1SOR
2-1-1.OFFICE-TBLをOFFICE-NOで線形探索
2-1-2.マッチ成功→第2段階へ
2-1-3.マッチ失敗→UNMATCHED-LISTに出力(STATUS='1'=事業所未達)
2-2.第2段階マッチング(INSURER-CODE vs INSURER-TBL):1:1マッチング(2020STG2SOR
2-2-1.INSURER-TBLをINSURER-CODEで線形探索
2-2-2.マッチ成功→GRADED-LISTに出力
2-2-3.マッチ失敗→UNMATCHED-LISTに出力(STATUS='2'=保険者未達)
2-3.DB2整合性検証(2030W01OUTSOR内でインライン実装)
2-3-1.GRADED-LIST出力時にINSURED-MASTERをSELECTし、
履歴整合性を確認
2-3-2.SQLCODE異常→ERROR-LOGに出力
2-4.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/GRADED-LIST
SHA04REC.cpyに従う。200B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01.EMP-ID | |
| 2 | EMP-NAME | R01.EMP-NAME | |
| 3 | OFFICE-NO | R01.OFFICE-NO | |
| 4 | OFFICE-NAME | OFFICE-TBL.OFFICE-NAME | 第1段階マッチ結果 |
| 5 | PREF-CODE | OFFICE-TBL.PREF-CODE | 第1段階マッチ結果 |
| 6 | INSURER-CODE | R01.INSURER-CODE | |
| 7 | INSURER-NAME | INSURER-TBL.INSURER-NAME | 第2段階マッチ結果 |
| 8 | FILLER | 初期値 | |
### 出力ファイル2W02/UNMATCHED-LIST
自前レイアウト(200B固定長)。
| No | 項目名 | 属性 | 設定元 | 備考 |
|----|--------|------|--------|------|
| 1 | EMP-ID | 9(8) | R01.EMP-ID | |
| 2 | EMP-NAME | X(40) | R01.EMP-NAME | |
| 3 | OFFICE-NO | X(4) | R01.OFFICE-NO | |
| 4 | OFFICE-NAME | X(40) | OFFICE-TBL.OFFICE-NAME | 未達時はSPACE |
| 5 | PREF-CODE | 9(2) | OFFICE-TBL.PREF-CODE | 未達時はZERO |
| 6 | INSURER-CODE | X(4) | R01.INSURER-CODE | |
| 7 | INSURER-NAME | X(60) | INSURER-TBL.INSURER-NAME | 未達時はSPACE |
| 8 | STATUS | X(1) | 固定 | '1'=事業所未達 / '2'=保険者未達 |
| 9 | FILLER | X(41) | 初期値 | |
### 出力ファイル3W03/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | DBエラー |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容(EMP-ID + SQLCODE |