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
This commit is contained in:
qiuqiuqiu
2026-07-15 20:32:51 +08:00
parent 4a244a47ce
commit 71232af484
72 changed files with 8028 additions and 20 deletions
+14 -1
View File
@@ -2,7 +2,7 @@
## システム概要
IBM z/OS + DB2 で動作する COBOL バッチシステム。勤怠休暇管理・残業統計管理・給与計算の3サブシステムで構成される。
IBM z/OS + DB2 で動作する COBOL バッチシステム。勤怠休暇管理・残業統計管理・給与計算・社会保険管理の4サブシステムで構成される。
### 本番環境
- OS: IBM z/OS
@@ -22,11 +22,24 @@ IBM z/OS + DB2 で動作する COBOL バッチシステム。勤怠休暇管理
| A: 勤怠休暇管理 | CSV取込・DB登録・照合・日別計算・勤怠照会・DB更新・CSV出力 | KIN01INPKIN09CSV9本) | 完了 |
| B: 残業統計管理 | 申請取込・重複チェック・照合・マッチング・集約・DB更新 | ZAN01CHKZAN06UPD6本) | 完了 |
| C: 給与計算 | CSV変換・登録・集約・計算・控除・DB更新・分割・印刷・マージ | KYU01CVTKYU09MRG9本) | 完了 |
| D: 社会保険管理 | ASCII→EBCDIC変換・保険情報統合・料率計算・事業所マッチング・等級判定・控除計算・キーブレイク・SORT編集・25分割・100分割 | SHA01CVTSHA10S1010本) | 完了 |
### 共通サブプログラム(5本)
SUB01DAT(日付), SUB02MSG(メッセージ), SUB03ENDABEND, SUB04CHK(バリデーション), SUB05TIM(丸め)
### プログラム一覧
| プログラムID | サブシステム | 機能 |
|:------------|:-----------:|------|
| KIN01INPKIN09CSV | A | 勤怠休暇管理(9本) |
| ZAN01CHKZAN06UPD | B | 残業統計管理(6本) |
| KYU01CVTKYU09MRG | C | 給与計算(9本) |
| SHA01CVTSHA10S10 | D | 社会保険管理(10本) |
| SUB01DATSUB05TIM | 共通 | 日付/メッセージ/ABEND/バリデーション/丸め(5本) |
**全プログラム数: 39本**
## ディレクトリ構成
```
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+12
View File
@@ -0,0 +1,12 @@
* EMP-RECORD 社員マスタ固定長レコード 80B
* KYU01CVT出力 / KYU02REG入力
03 (A)EMP-ID PIC X(008).
03 (A)EMP-NAME PIC X(040).
03 (A)DEPT-CODE PIC X(002).
03 (A)REGION-CODE PIC X(002).
03 (A)CATEGORY-CODE PIC X(003).
03 (A)BASE-SALARY PIC 9(009).
03 (A)HOURLY-RATE PIC 9(007).
03 (A)DEPENDENT-COUNT PIC 9(002).
03 (A)STATUS PIC X(001).
03 FILLER PIC X(006).
+7
View File
@@ -0,0 +1,7 @@
* ABSENCE-AGGREGATE 欠勤集約レコード 80B
* KYU03AGG出力 / KYU04CAL入力
03 (A)EMP-ID PIC X(008).
03 (A)YEAR-MONTH PIC X(006).
03 (A)TOTAL-HOURS PIC 9(004)V9(001).
03 (A)ABSENT-COUNT PIC 9(002).
03 FILLER PIC X(059).
+15
View File
@@ -0,0 +1,15 @@
* SALARY-DETAIL 給与明細レコード 240B
* KYU04CAL出力 / KYU05DED入力
03 (A)EMP-ID PIC X(008).
03 (A)EMP-NAME PIC X(040).
03 (A)DEPT-CODE PIC X(002).
03 (A)BASE-SALARY PIC 9(009).
03 (A)OVT-AMOUNT PIC 9(009).
03 (A)HOLIDAY-AMOUNT PIC 9(009).
03 (A)ABSENT-DEDUCT PIC 9(009).
03 (A)GROSS-PAYMENT PIC 9(009).
03 (A)OVT-HOURS PIC 9(004)V9(001).
03 (A)ABSENT-HOURS PIC 9(004)V9(001).
03 (A)ATTEND-TYPE PIC X(001).
03 (A)ALLOWANCE-TYPE PIC X(003).
03 FILLER PIC X(131).
+16
View File
@@ -0,0 +1,16 @@
* SALARY-NET / DEPT-OUT 差引支給額レコード 200B
* KYU05DED出力 / KYU07DIV・KYU08PRI・KYU09MRG・KYU06UPD入力
03 (A)EMP-ID PIC X(008).
03 (A)REC-TYPE PIC X(001).
03 (A)EMP-NAME PIC X(040).
03 (A)DEPT-CODE PIC X(002).
03 (A)REGION-CODE PIC X(002).
03 (A)CATEGORY-CODE PIC X(003).
03 (A)GROSS-PAYMENT PIC 9(009).
03 (A)INCOME-TAX PIC 9(009).
03 (A)INSURANCE PIC 9(009).
03 (A)RESIDENT-TAX PIC 9(009).
03 (A)NET-PAYMENT PIC 9(009).
03 (A)TAXABLE-INCOME PIC 9(009).
03 (A)PAY-AMOUNT PIC 9(009).
03 FILLER PIC X(081).
+12
View File
@@ -0,0 +1,12 @@
* PAYSLIP 給与明細印刷レコード 200B
* KYU08PRI出力
03 (A)EMP-ID PIC X(008).
03 FILLER PIC X(002).
03 (A)EMP-NAME PIC X(020).
03 FILLER PIC X(002).
03 (A)BASIC-SALARY PIC Z(008)9.
03 FILLER PIC X(002).
03 (A)NET-PAYMENT PIC Z(008)9.
03 FILLER PIC X(002).
03 (A)PAGE-TITLE PIC X(040).
03 FILLER PIC X(106).
+8
View File
@@ -0,0 +1,8 @@
* PAYMENT-DATA 支給データレコード 200B
* KYU09MRG出力
03 (A)EMP-ID PIC X(008).
03 (A)PAY-TYPE PIC X(001).
03 (A)AMOUNT PIC 9(009).
03 (A)BANK-CODE PIC X(004).
03 (A)ACCOUNT-NO PIC 9(008).
03 FILLER PIC X(170).
+16
View File
@@ -0,0 +1,16 @@
*
* 被保険者レコード 200B SHA01CVT出力 / SHA04TWO入力
*
03 (A)EMP-ID PIC 9(008).
03 (A)INSURED-NO PIC X(010).
03 (A)OFFICE-NO PIC X(004).
03 (A)INSURER-CODE PIC X(004).
03 (A)EMP-NAME PIC X(040).
03 (A)EMP-KANA PIC X(020).
03 (A)BIRTH-DATE PIC 9(008).
03 (A)SEX PIC X(001).
03 (A)ENT-DATE PIC 9(008).
03 (A)HEALTH-INS-TYPE PIC X(001).
03 (A)PENSION-TYPE PIC X(001).
03 (A)STATUS PIC X(001).
03 (A)FILLER PIC X(094).
+13
View File
@@ -0,0 +1,13 @@
*
* 従業員保険情報レコード 200B SHA02MNC出力
*
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)DEPT-CODE PIC 9(002).
03 (A)BASE-SALARY PIC 9(009).
03 (A)MONTHLY-AMOUNT PIC 9(009).
03 (A)GRADE-CODE PIC 9(002).
03 (A)HEALTH-INS-TYPE PIC X(001).
03 (A)PENSION-TYPE PIC X(001).
03 (A)INSURER-CODE PIC X(004).
03 (A)FILLER PIC X(124).
+13
View File
@@ -0,0 +1,13 @@
*
* 保険料計算詳細レコード 300B SHA03MNP出力
*
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)INSURANCE-TYPE PIC X(001).
03 (A)GRADE-CODE PIC 9(002).
03 (A)MONTHLY-AMOUNT PIC 9(009).
03 (A)HEALTH-RATE PIC 9(007).
03 (A)PENSION-RATE PIC 9(007).
03 (A)HEALTH-PREMIUM PIC 9(009).
03 (A)PENSION-PREMIUM PIC 9(009).
03 (A)FILLER PIC X(208).
+13
View File
@@ -0,0 +1,13 @@
*
* 事業所保険者付与一覧レコード 200B SHA04TWO出力
*
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)OFFICE-NO PIC X(004).
03 (A)OFFICE-NAME PIC X(040).
03 (A)PREF-CODE PIC 9(002).
03 (A)INSURER-CODE PIC X(004).
03 (A)INSURER-NAME PIC X(060).
03 (A)MONTHLY-AMOUNT PIC 9(009).
03 (A)GRADE-CODE PIC 9(002).
03 (A)FILLER PIC X(031).
+11
View File
@@ -0,0 +1,11 @@
*
* 等級改定結果レコード 200B SHA05TWN出力
*
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)REVISED-YM PIC 9(006).
03 (A)OLD-GRADE PIC 9(002).
03 (A)NEW-GRADE PIC 9(002).
03 (A)AVG-STD-MONTHLY PIC 9(009).
03 (A)REVISED-TYPE PIC X(001).
03 (A)FILLER PIC X(132).
+14
View File
@@ -0,0 +1,14 @@
*
* 保険料確定結果レコード 300B SHA06TWM出力
*
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)INSURANCE-TYPE PIC X(001).
03 (A)GRADE-CODE PIC 9(002).
03 (A)MONTHLY-AMOUNT PIC 9(009).
03 (A)HEALTH-RATE PIC 9(007).
03 (A)PENSION-RATE PIC 9(007).
03 (A)HEALTH-PREMIUM PIC 9(009).
03 (A)PENSION-PREMIUM PIC 9(009).
03 (A)TOTAL-PREMIUM PIC 9(009).
03 (A)FILLER PIC X(199).
+14
View File
@@ -0,0 +1,14 @@
*
* 資格異動レコード 200B SHA07KBR出力
* REC-TYPE: S=サマリ / D=明細
*
03 (A)CHG-ID PIC 9(009).
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)CHG-DATE PIC 9(008).
03 (A)CHG-TYPE PIC X(002).
03 (A)INSURER-CODE PIC X(004).
03 (A)PREV-INSURER PIC X(004).
03 (A)REASON PIC X(040).
03 (A)REC-TYPE PIC X(001).
03 (A)FILLER PIC X(084).
+15
View File
@@ -0,0 +1,15 @@
*
* 届出書データレコード 300B SHA08SRT出力
*
03 (A)EMP-ID PIC 9(008).
03 (A)EMP-NAME PIC X(040).
03 (A)OFFICE-NO PIC X(004).
03 (A)OFFICE-NAME PIC X(040).
03 (A)INSURER-CODE PIC X(004).
03 (A)INSURER-NAME PIC X(060).
03 (A)PREF-CODE PIC 9(002).
03 (A)MONTHLY-AMOUNT PIC 9(009).
03 (A)GRADE-CODE PIC 9(002).
03 (A)REPORT-TYPE PIC X(002).
03 (A)REPORT-DATE PIC 9(008).
03 (A)FILLER PIC X(121).
+6
View File
@@ -0,0 +1,6 @@
*
* 分割出力レコード 300B SHA09S25 / SHA10S10出力
*
03 (A)PREF-CODE PIC 9(002).
03 (A)INSURER-CODE PIC X(004).
03 (A)RPT-BODY PIC X(294).
+7
View File
@@ -0,0 +1,7 @@
*
* SUB04CHK 連絡領域(92B
*
01 C01CHKPAR.
03 C01CHKTYP PIC X(008).
03 C01CHKDAT PIC X(080).
03 C01CHKRRC PIC 9(004).
+6
View File
@@ -0,0 +1,6 @@
*
* SUB01DAT 連絡領域(10B
*
01 D01UBSPAR.
03 D01FKICOD PIC S9(004) COMP.
03 D01UBSUDATE PIC 9(008).
+5
View File
@@ -0,0 +1,5 @@
*
* SUB03END 連絡領域(3B
*
01 E01ABDPAR.
03 E01ABDCOD PIC 9(003).
+15
View File
@@ -0,0 +1,15 @@
*
* SUB02MSG 連絡領域(303B
*
01 M00MHOPAR.
03 M00MSGCOD PIC 9(003).
03 M00UMKDATS22-01 PIC X(030).
03 M00UMKDATS22-02 PIC X(030).
03 M00UMKDATS22-03 PIC X(030).
03 M00UMKDATS22-04 PIC X(030).
03 M00UMKDATS22-05 PIC X(030).
03 M00UMKDATS22-06 PIC X(030).
03 M00UMKDATS22-07 PIC X(030).
03 M00UMKDATS22-08 PIC X(030).
03 M00UMKDATS22-09 PIC X(030).
03 M00UMKDATS22-10 PIC X(030).
+70
View File
@@ -0,0 +1,70 @@
-- =============================================================================
-- 社会保険管理システム(サブシステムD)DBスキーマ
-- 対象DB2: DB2 for z/OS(区切り識別子使用)
-- ローカル開発: SQLite(型宣言はDB2準拠、SQLiteが許容する範囲で記述)
-- DB名称: INSURANCEDB
-- 注: テーブル名・カラム名は全角ハイフンを含むため二重引用符で囲む
-- =============================================================================
-- 1. INSURED-MASTER(被保険者マスタ)
CREATE TABLE "INSURED-MASTER" (
"EMP-ID" CHAR(8) NOT NULL,
"INSURED-NO" CHAR(10) NOT NULL,
"OFFICE-NO" CHAR(4) NOT NULL,
"INSURER-CODE" CHAR(4) NOT NULL,
"HEALTH-INS-TYPE" CHAR(1) NOT NULL,
"PENSION-TYPE" CHAR(1) NOT NULL,
"BASE-MONTHLY" DECIMAL(9,0) NOT NULL,
"GRADE-CODE" CHAR(2) NOT NULL,
"STATUS" CHAR(1) NOT NULL,
"UPDATED-AT" TIMESTAMP NOT NULL,
PRIMARY KEY ("EMP-ID")
);
-- 2. INSURANCE-RATES(保険料率テーブル)
CREATE TABLE "INSURANCE-RATES" (
"GRADE-CODE" CHAR(2) NOT NULL,
"MONTHLY-FROM" DECIMAL(9,0) NOT NULL,
"MONTHLY-TO" DECIMAL(9,0) NOT NULL,
"HEALTH-RATE" DECIMAL(7,6) NOT NULL,
"PENSION-RATE" DECIMAL(7,6) NOT NULL,
"EFFECTIVE-FROM" CHAR(6) NOT NULL,
"EFFECTIVE-TO" CHAR(6) NOT NULL,
"UPDATED-AT" TIMESTAMP NOT NULL,
PRIMARY KEY ("GRADE-CODE", "EFFECTIVE-FROM", "EFFECTIVE-TO")
);
-- 3. GRADE-HISTORY(標準報酬等級履歴)
CREATE TABLE "GRADE-HISTORY" (
"EMP-ID" CHAR(8) NOT NULL,
"YEAR-MONTH" CHAR(6) NOT NULL,
"GRADE-CODE" CHAR(2) NOT NULL,
"MONTHLY-AMOUNT" DECIMAL(9,0) NOT NULL,
"CHANGE-TYPE" CHAR(1) NOT NULL,
"PREV-GRADE" CHAR(2) NOT NULL,
"UPDATED-AT" TIMESTAMP NOT NULL,
PRIMARY KEY ("EMP-ID", "YEAR-MONTH")
);
-- 4. QUALIFICATION-CHANGES(資格異動テーブル)
CREATE TABLE "QUALIFICATION-CHANGES" (
"CHG-ID" INTEGER NOT NULL,
"EMP-ID" CHAR(8) NOT NULL,
"CHG-DATE" CHAR(8) NOT NULL,
"CHG-TYPE" CHAR(2) NOT NULL,
"INSURER-CODE" CHAR(4) NOT NULL,
"PREV-INSURER" CHAR(4) NOT NULL,
"REASON" VARCHAR(100) NOT NULL,
"UPDATED-AT" TIMESTAMP NOT NULL,
PRIMARY KEY ("CHG-ID")
);
-- 5. INSURER-MASTER(保険者マスタ)
CREATE TABLE "INSURER-MASTER" (
"INSURER-CODE" CHAR(4) NOT NULL,
"INSURER-NAME" VARCHAR(60) NOT NULL,
"PREF-CODE" CHAR(2) NOT NULL,
"INSURER-TYPE" CHAR(1) NOT NULL,
"UPDATED-AT" TIMESTAMP NOT NULL,
PRIMARY KEY ("INSURER-CODE")
);
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU01CVT.
*****************************************************************
* システム名 : 給与計算システム *
@@ -8,7 +8,6 @@
* 処理概要 : CSV形式の社員マスタを固定長80Bに変換する *
* 引用符内改行をINSPECT CONVERTINGで処理 *
* 項目チェックはSUB04CHKで実施 *
* プログラム分類: No.21 CSV→FB変換(改行あり) *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU02REG.
*****************************************************************
* システム名 : 給与計算システム *
@@ -7,7 +7,6 @@
* 作成日 : 2026-07-01 *
* 処理概要 : EMP-RECORDをDB2 EMP-MASTERにINSERT/UPSERT *
* 重複時(-803)はUPDATEに切替 *
* プログラム分類: No.09 DB更新 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU03AGG.
*****************************************************************
* システム名 : 給与計算システム *
@@ -7,7 +7,6 @@
* 作成日 : 2026-07-01 *
* 処理概要 : JCL SORT済み欠勤データを社員単位に集約 *
* 同一社員内の欠勤時間・回数を集計 *
* プログラム分類: No.08 キーブレイク(集約) *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU04CAL.
*****************************************************************
* システム名 : 給与計算システム *
@@ -8,7 +8,6 @@
* 処理概要 : 欠勤集約 + EMP-MASTER + OVT-MONTHLY を *
* 参照し給与計算を実行 *
* 勤怠区分×手当種別の複合分岐はEVALUATE ALSO *
* プログラム分類: No.32 1:N+キーブレイク(同キー) *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU05DED.
*****************************************************************
* システム名 : 給与計算システム *
@@ -9,7 +9,6 @@
* 社会保険料・住民税を計算しSALARY-NET出力 *
* TAX-TABLEDB2 SELECT ... BETWEEN *
* INSURANCE-TABLESEARCH ALL)を参照 *
* プログラム分類: No.23 SELECT条件 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU06UPD.
*****************************************************************
* システム名 : 給与計算システム *
@@ -7,7 +7,6 @@
* 作成日 : 2026-07-01 *
* 処理概要 : SALARY-NETをDB2 SALARY-RESULTSに登録 *
* 重複時(-803)はUPDATEに切替 *
* プログラム分類: No.09 DB更新 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU07DIV.
*****************************************************************
* システム名 : 給与計算システム *
@@ -8,7 +8,6 @@
* 処理概要 : JCL SORT済SALARY-NETを部署コードに応じて *
* 50ファイルに分割出力 *
* 常に1ファイルのみOPEN *
* プログラム分類: No.10 50分割 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU08PRI.
*****************************************************************
* システム名 : 給与計算システム *
@@ -7,7 +7,6 @@
* 作成日 : 2026-07-01 *
* 処理概要 : JCL SORT済みSALARY-NETを給与明細(LINAGE *
* として印刷出力。1社員1ページ。 *
* プログラム分類: No.04 レイアウト編集のみ(GETPUT+ LINAGE *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+1 -2
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KYU09MRG.
*****************************************************************
* システム名 : 給与計算システム *
@@ -8,7 +8,6 @@
* 処理概要 : SALARY-NETとBONUS-DATAをMERGE文で *
* 社員番号昇順に結合し、同一社員内の *
* 給与(TYPE=S)と賞与(TYPE=B)を統合 *
* プログラム分類: No.35 MERGE(複数ファイル結合) *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
+482
View File
@@ -0,0 +1,482 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA01CVT.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA01CVT *
* プログラム名 : 被保険者資格データ変換処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : ASCII CSVの被保険者資格データをINSPECT *
* CONVERTINGでEBCDIC固定長に変換する *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA01R01.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA01W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA01W02.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: INS-CSV-ASCII(可変長CSV *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
03 R01-CSV-DATA PIC X(500).
*
*****************************************************************
* W01: INSURED-DATA200B FB via SHA01REC *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA01REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: ERROR-LOGVB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA01CVT'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-YEAR-MONTH-PARM PIC X(006).
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-YEAR-MONTH PIC X(006).
03 WRK-IDX PIC 9(004).
03 WRK-CSV-FIELDS.
05 WRK-C-EMP-ID PIC X(008).
05 WRK-C-INSURED-NO PIC X(015).
05 WRK-C-OFFICE-NO PIC X(006).
05 WRK-C-INSURER-CODE PIC X(004).
05 WRK-C-EMP-NAME PIC X(040).
05 WRK-C-EMP-KANA PIC X(040).
05 WRK-C-BIRTH-DATE PIC X(008).
05 WRK-C-SEX PIC X(001).
05 WRK-C-ENT-DATE PIC X(008).
05 WRK-C-HEALTH-INS-TYPE
PIC X(001).
05 WRK-C-PENSION-TYPE PIC X(001).
05 WRK-C-STATUS PIC X(001).
03 WRK-CONV-BEFORE PIC X(256).
03 WRK-CONV-AFTER PIC X(256).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY SHADATAC.
COPY SHAMSGAC.
COPY SHAENDAC.
COPY SHACHKAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
*****************************************************************
1000ITTSOR SECTION.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE WRKARA.
*
*** PARM取得
ACCEPT WRK-YEAR-MONTH
FROM COMMAND-LINE.
IF WRK-YEAR-MONTH = SPACES
MOVE '202605' TO WRK-YEAR-MONTH
END-IF.
* PARM NUM検証
MOVE 'NUM' TO C01CHKTYP.
MOVE WRK-YEAR-MONTH TO C01CHKDAT.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'PARM(YEARMONTH)' TO M00UMKDATS22-01
MOVE WRK-YEAR-MONTH TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
MOVE WRK-YEAR-MONTH TO CNS-YEAR-MONTH-PARM.
*
*** 運用日付取得
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 変換テーブル初期化(同一マップ 開発用)
MOVE SPACES TO WRK-CONV-BEFORE.
MOVE SPACES TO WRK-CONV-AFTER.
PERFORM VARYING WRK-IDX
FROM 1 BY 1
UNTIL WRK-IDX > 256
MOVE FUNCTION CHAR
(WRK-IDX - 1)
TO WRK-CONV-BEFORE(WRK-IDX:1)
MOVE FUNCTION CHAR
(WRK-IDX - 1)
TO WRK-CONV-AFTER(WRK-IDX:1)
END-PERFORM.
*
OPEN INPUT R01INNFIL.
OPEN OUTPUT W01OUTFIL.
OPEN OUTPUT W02OUTFIL.
*
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: R01読込処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
SET WRK-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
*
PERFORM 2010CSVSOR.
IF WRK-EOF-Y
EXIT SECTION
END-IF.
*
PERFORM 2020HALFSOR.
IF WRK-EOF-Y
EXIT SECTION
END-IF.
*
PERFORM 2030CNVSOR.
PERFORM 2040WRTSOR.
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: CSV分解処理 *
*****************************************************************
2010CSVSOR SECTION.
*
INITIALIZE WRK-CSV-FIELDS.
*
UNSTRING R01-CSV-DATA
DELIMITED BY ','
INTO WRK-C-EMP-ID
WRK-C-INSURED-NO
WRK-C-OFFICE-NO
WRK-C-INSURER-CODE
WRK-C-EMP-NAME
WRK-C-EMP-KANA
WRK-C-BIRTH-DATE
WRK-C-SEX
WRK-C-ENT-DATE
WRK-C-HEALTH-INS-TYPE
WRK-C-PENSION-TYPE
WRK-C-STATUS
END-UNSTRING.
*
2010CSVSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: 半角桁数チェック *
*****************************************************************
2020HALFSOR SECTION.
*
*** 氏名カナ半角20桁以内チェック
IF WRK-C-EMP-KANA(21:) NOT = SPACES
MOVE '01' TO W02ERR-CATEGORY
STRING 'KANA OVER 20: '
WRK-C-EMP-KANA
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
*** 被保険者番号半角10桁以内チェック
IF WRK-C-INSURED-NO(11:) NOT = SPACES
MOVE '01' TO W02ERR-CATEGORY
STRING 'INSURED-NO OVER 10: '
WRK-C-INSURED-NO
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
*** 事業所番号半角4桁以内チェック
IF WRK-C-OFFICE-NO(5:) NOT = SPACES
MOVE '01' TO W02ERR-CATEGORY
STRING 'OFFICE-NO OVER 4: '
WRK-C-OFFICE-NO
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
*** 日付チェック(生年月日)
MOVE 'DATE' TO C01CHKTYP.
MOVE WRK-C-BIRTH-DATE TO C01CHKDAT.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = 0
MOVE '01' TO W02ERR-CATEGORY
STRING 'BIRTH-DATE ERR: '
WRK-C-BIRTH-DATE
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
*** 日付チェック(資格取得日)
MOVE 'DATE' TO C01CHKTYP.
MOVE WRK-C-ENT-DATE TO C01CHKDAT.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = 0
MOVE '01' TO W02ERR-CATEGORY
STRING 'ENT-DATE ERR: '
WRK-C-ENT-DATE
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
*** 数値チェック(社員番号)
MOVE 'NUMERIC' TO C01CHKTYP.
MOVE WRK-C-EMP-ID TO C01CHKDAT.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = 0
MOVE '01' TO W02ERR-CATEGORY
STRING 'EMP-ID NUM ERR: '
WRK-C-EMP-ID
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
2020HALFSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: ASCII→EBCDIC変換処理 *
*****************************************************************
2030CNVSOR SECTION.
*
INSPECT WRK-C-EMP-ID
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-INSURED-NO
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-OFFICE-NO
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-INSURER-CODE
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-EMP-NAME
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-EMP-KANA
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-BIRTH-DATE
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-SEX
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-ENT-DATE
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-HEALTH-INS-TYPE
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-PENSION-TYPE
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
INSPECT WRK-C-STATUS
CONVERTING WRK-CONV-BEFORE TO WRK-CONV-AFTER.
*
2030CNVSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.4) *
* サブモジュール名: W01出力処理 *
*****************************************************************
2040WRTSOR SECTION.
*
MOVE WRK-C-EMP-ID TO W01EMP-ID.
MOVE WRK-C-INSURED-NO TO W01INSURED-NO.
MOVE WRK-C-OFFICE-NO TO W01OFFICE-NO.
MOVE WRK-C-INSURER-CODE TO W01INSURER-CODE.
MOVE WRK-C-EMP-NAME TO W01EMP-NAME.
MOVE WRK-C-EMP-KANA TO W01EMP-KANA.
MOVE WRK-C-BIRTH-DATE TO W01BIRTH-DATE.
MOVE WRK-C-SEX TO W01SEX.
MOVE WRK-C-ENT-DATE TO W01ENT-DATE.
MOVE WRK-C-HEALTH-INS-TYPE TO W01HEALTH-INS-TYPE.
MOVE WRK-C-PENSION-TYPE TO W01PENSION-TYPE.
MOVE WRK-C-STATUS TO W01STATUS.
MOVE LOW-VALUES TO W01FILLER.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2040WRTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
CLOSE R01INNFIL
W01OUTFIL
W02OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA01R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA01W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA01W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+447
View File
@@ -0,0 +1,447 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA02MNC.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA02MNC *
* プログラム名 : 従業員保険情報統合処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : DB2 EMP-MASTER従業員情報とINSURANCE-RATES *
* をマッチングし従業員単位に統合出力する *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA02W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA02W02.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* W01: EMP-INSURANCE200B FB via SHA02REC *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA02REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: ERROR-LOGVB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA02MNC'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-YEAR-MONTH-PARM PIC X(006).
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-DB-EMP PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-YEAR-MONTH PIC X(006).
03 WRK-IDX PIC 9(004).
03 WRK-RATE-COUNT PIC 9(003) VALUE ZERO.
03 WRK-RATE-TBL.
05 WRK-RATE-ENTRY OCCURS 100
INDEXED BY WRK-RATE-IDX.
07 WRK-GRADE-CODE PIC X(002).
07 WRK-MONTHLY-FROM PIC 9(009).
07 WRK-MONTHLY-TO PIC 9(009).
07 WRK-HEALTH-RATE PIC 9(001)V9(006).
07 WRK-PENSION-RATE PIC 9(001)V9(006).
*
*****************************************************************
* DB2ホスト変数 *
*****************************************************************
01 DBVARA.
03 DBV-EMP-ID PIC X(008).
03 DBV-EMP-NAME PIC X(040).
03 DBV-DEPT-CODE PIC X(002).
03 DBV-BASE-SALARY PIC 9(009).
03 DBV-GRADE-CODE PIC X(002).
03 DBV-MONTHLY-FROM PIC 9(009).
03 DBV-MONTHLY-TO PIC 9(009).
03 DBV-HEALTH-RATE PIC 9(001)V9(006).
03 DBV-PENSION-RATE PIC 9(001)V9(006).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY SHADATAC.
COPY SHAMSGAC.
COPY SHAENDAC.
COPY SHACHKAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
*****************************************************************
1000ITTSOR SECTION.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE WRKARA.
INITIALIZE CUNARA.
*
*** PARM取得
ACCEPT WRK-YEAR-MONTH
FROM COMMAND-LINE.
IF WRK-YEAR-MONTH = SPACES
MOVE '202605' TO WRK-YEAR-MONTH
END-IF.
* PARM NUM検証
MOVE 'NUM' TO C01CHKTYP.
MOVE WRK-YEAR-MONTH TO C01CHKDAT.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'PARM(YEARMONTH)' TO M00UMKDATS22-01
MOVE WRK-YEAR-MONTH TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
MOVE WRK-YEAR-MONTH TO CNS-YEAR-MONTH-PARM.
*
*** 運用日付取得
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/INSURANCEDB.db'
END-EXEC.
IF SQLCODE NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'DB-CONNECT' TO M00UMKDATS22-01
MOVE SQLCODE TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** INSURANCE-RATES内部表LOAD
PERFORM 1200RATELDASOR.
*
*** EMP-MASTERカーソル宣言
EXEC SQL
DECLARE C2 CURSOR FOR
SELECT EMP-ID, EMP-NAME, DEPT-CODE,
BASE-SALARY
FROM SALARYDB.EMP-MASTER
ORDER BY EMP-ID
END-EXEC.
*
*** EMP-MASTERカーソルOPEN
EXEC SQL
OPEN C2
END-EXEC.
IF SQLCODE NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'EMP-OPEN' TO M00UMKDATS22-01
MOVE SQLCODE TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
OPEN OUTPUT W01OUTFIL.
OPEN OUTPUT W02OUTFIL.
*
*** 初回FETCH
PERFORM 1300EMPFETCSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: RATES内部表LOAD *
*****************************************************************
1200RATELDASOR SECTION.
*
MOVE 1 TO WRK-IDX.
MOVE ZERO TO WRK-RATE-COUNT.
*
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT GRADE-CODE, MONTHLY-FROM, MONTHLY-TO,
HEALTH-RATE, PENSION-RATE
FROM INSURANCE-RATES
WHERE EFFECTIVE-FROM <= :WRK-YEAR-MONTH
AND EFFECTIVE-TO >= :WRK-YEAR-MONTH
ORDER BY GRADE-CODE
END-EXEC.
*
EXEC SQL
OPEN C1
END-EXEC.
IF SQLCODE NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'RATES-OPEN' TO M00UMKDATS22-01
MOVE SQLCODE TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH C1
INTO :DBV-GRADE-CODE,
:DBV-MONTHLY-FROM,
:DBV-MONTHLY-TO,
:DBV-HEALTH-RATE,
:DBV-PENSION-RATE
END-EXEC
IF SQLCODE = 0
MOVE DBV-GRADE-CODE
TO WRK-GRADE-CODE(WRK-IDX)
MOVE DBV-MONTHLY-FROM
TO WRK-MONTHLY-FROM(WRK-IDX)
MOVE DBV-MONTHLY-TO
TO WRK-MONTHLY-TO(WRK-IDX)
MOVE DBV-HEALTH-RATE
TO WRK-HEALTH-RATE(WRK-IDX)
MOVE DBV-PENSION-RATE
TO WRK-PENSION-RATE(WRK-IDX)
ADD 1 TO WRK-IDX
ADD 1 TO WRK-RATE-COUNT
END-IF
END-PERFORM.
*
EXEC SQL
CLOSE C1
END-EXEC.
*
1200RATELDASOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.2) *
* サブモジュール名: EMP-MASTER FETCH処理 *
*****************************************************************
1300EMPFETCSOR SECTION.
*
EXEC SQL
FETCH C2
INTO :DBV-EMP-ID,
:DBV-EMP-NAME,
:DBV-DEPT-CODE,
:DBV-BASE-SALARY
END-EXEC.
*
IF SQLCODE = 0
ADD 1 TO CUN-DB-EMP
ELSE
SET WRK-EOF-Y TO TRUE
END-IF.
*
1300EMPFETCSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
*
*** SEARCHで該当GRADE-CODEを特定
SET WRK-RATE-IDX TO 1.
SEARCH WRK-RATE-ENTRY
AT END
MOVE '01' TO W02ERR-CATEGORY
STRING 'NO MATCH GRADE: '
DBV-EMP-ID
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
PERFORM 1300EMPFETCSOR
EXIT SECTION
WHEN WRK-MONTHLY-FROM(WRK-RATE-IDX)
<= DBV-BASE-SALARY
AND WRK-MONTHLY-TO(WRK-RATE-IDX)
>= DBV-BASE-SALARY
CONTINUE
END-SEARCH.
*
*** 種別判定(DEPT-CODE
EVALUATE DBV-DEPT-CODE
WHEN 1 THRU 10
MOVE '1' TO W01HEALTH-INS-TYPE
MOVE '1' TO W01PENSION-TYPE
MOVE '0001' TO W01INSURER-CODE
WHEN 11 THRU 20
MOVE '2' TO W01HEALTH-INS-TYPE
MOVE '1' TO W01PENSION-TYPE
MOVE '0002' TO W01INSURER-CODE
WHEN 21 THRU 30
MOVE '1' TO W01HEALTH-INS-TYPE
MOVE '2' TO W01PENSION-TYPE
MOVE '0003' TO W01INSURER-CODE
WHEN OTHER
MOVE '9' TO W01HEALTH-INS-TYPE
MOVE '9' TO W01PENSION-TYPE
MOVE '0009' TO W01INSURER-CODE
END-EVALUATE.
*
*** 出力レコード編集
MOVE DBV-EMP-ID TO W01EMP-ID.
MOVE DBV-EMP-NAME TO W01EMP-NAME.
MOVE DBV-DEPT-CODE TO W01DEPT-CODE.
MOVE DBV-BASE-SALARY TO W01BASE-SALARY.
MOVE WRK-MONTHLY-FROM(
WRK-RATE-IDX) TO W01MONTHLY-AMOUNT.
MOVE WRK-GRADE-CODE(
WRK-RATE-IDX) TO W01GRADE-CODE.
MOVE LOW-VALUES TO W01FILLER.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
*** 次従業員FETCH
PERFORM 1300EMPFETCSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
EXEC SQL
CLOSE C2
END-EXEC.
*
CLOSE W01OUTFIL
W02OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'EMP-MASTER' TO M00UMKDATS22-01.
MOVE CUN-DB-EMP TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA02W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA02W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+409
View File
@@ -0,0 +1,409 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA03MNP.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA03MNP *
* プログラム名 : 保険料計算明細出力処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : EMP-INSURANCE × INSURANCE-RATESの直積組合せ *
* により保険料計算明細を出力する *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA03R01.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA03W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA03W02.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: EMP-INSURANCE200B FB via SHA02REC *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY SHA02REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* W01: INS-DETAIL300B FB via SHA03REC *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA03REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: ERROR-LOGVB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA03MNP'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-YEAR-MONTH-PARM PIC X(006).
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-YEAR-MONTH PIC X(006).
03 WRK-IDX PIC 9(004).
03 WRK-RATE-COUNT PIC 9(003) VALUE ZERO.
03 WRK-INS-TYPE-IDX PIC 9(001) VALUE ZERO.
03 WRK-RATE-TBL.
05 WRK-RATE-ENTRY OCCURS 100
INDEXED BY WRK-RATE-IDX.
07 WRK-GRADE-CODE PIC X(002).
07 WRK-MONTHLY-FROM PIC 9(009).
07 WRK-MONTHLY-TO PIC 9(009).
07 WRK-HEALTH-RATE PIC 9(001)V9(006).
07 WRK-PENSION-RATE PIC 9(001)V9(006).
03 WRK-HEALTH-PREMIUM PIC 9(009).
03 WRK-PENSION-PREMIUM PIC 9(009).
*
*****************************************************************
* DB2ホスト変数 *
*****************************************************************
01 DBVARA.
03 DBV-GRADE-CODE PIC X(002).
03 DBV-MONTHLY-FROM PIC 9(009).
03 DBV-MONTHLY-TO PIC 9(009).
03 DBV-HEALTH-RATE PIC 9(001)V9(006).
03 DBV-PENSION-RATE PIC 9(001)V9(006).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY SHADATAC.
COPY SHAMSGAC.
COPY SHAENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
*****************************************************************
1000ITTSOR SECTION.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE WRKARA.
INITIALIZE CUNARA.
*
*** PARM取得
ACCEPT WRK-YEAR-MONTH
FROM COMMAND-LINE.
IF WRK-YEAR-MONTH = SPACES
MOVE '202605' TO WRK-YEAR-MONTH
END-IF.
MOVE WRK-YEAR-MONTH TO CNS-YEAR-MONTH-PARM.
*
*** 運用日付取得
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/INSURANCEDB.db'
END-EXEC.
IF SQLCODE NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'DB-CONNECT' TO M00UMKDATS22-01
MOVE SQLCODE TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** INSURANCE-RATES内部表LOAD
PERFORM 1200RATELDASOR.
*
OPEN INPUT R01INNFIL.
OPEN OUTPUT W01OUTFIL.
OPEN OUTPUT W02OUTFIL.
*
PERFORM 1300R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: RATES内部表LOAD *
*****************************************************************
1200RATELDASOR SECTION.
*
MOVE 1 TO WRK-IDX.
MOVE ZERO TO WRK-RATE-COUNT.
*
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT GRADE-CODE, MONTHLY-FROM, MONTHLY-TO,
HEALTH-RATE, PENSION-RATE
FROM INSURANCE-RATES
WHERE EFFECTIVE-FROM <= :WRK-YEAR-MONTH
AND EFFECTIVE-TO >= :WRK-YEAR-MONTH
ORDER BY GRADE-CODE
END-EXEC.
*
EXEC SQL
OPEN C1
END-EXEC.
IF SQLCODE NOT = 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'RATES-OPEN' TO M00UMKDATS22-01
MOVE SQLCODE TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH C1
INTO :DBV-GRADE-CODE,
:DBV-MONTHLY-FROM,
:DBV-MONTHLY-TO,
:DBV-HEALTH-RATE,
:DBV-PENSION-RATE
END-EXEC
IF SQLCODE = 0
MOVE DBV-GRADE-CODE
TO WRK-GRADE-CODE(WRK-IDX)
MOVE DBV-MONTHLY-FROM
TO WRK-MONTHLY-FROM(WRK-IDX)
MOVE DBV-MONTHLY-TO
TO WRK-MONTHLY-TO(WRK-IDX)
MOVE DBV-HEALTH-RATE
TO WRK-HEALTH-RATE(WRK-IDX)
MOVE DBV-PENSION-RATE
TO WRK-PENSION-RATE(WRK-IDX)
ADD 1 TO WRK-IDX
ADD 1 TO WRK-RATE-COUNT
END-IF
END-PERFORM.
*
EXEC SQL
CLOSE C1
END-EXEC.
*
1200RATELDASOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.2) *
* サブモジュール名: R01読込処理 *
*****************************************************************
1300R01INNSOR SECTION.
*
READ R01INNFIL
AT END
SET WRK-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1300R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
MOVE 1 TO WRK-IDX.
PERFORM UNTIL WRK-IDX > WRK-RATE-COUNT
MOVE R01EMP-ID TO W01EMP-ID
MOVE R01EMP-NAME TO W01EMP-NAME
MOVE '1' TO W01INSURANCE-TYPE
MOVE WRK-GRADE-CODE(WRK-IDX)
TO W01GRADE-CODE
MOVE R01MONTHLY-AMOUNT TO W01MONTHLY-AMOUNT
MOVE WRK-HEALTH-RATE(WRK-IDX)
TO W01HEALTH-RATE
MOVE WRK-PENSION-RATE(WRK-IDX)
TO W01PENSION-RATE
MULTIPLY R01MONTHLY-AMOUNT
BY WRK-HEALTH-RATE(WRK-IDX)
GIVING WRK-HEALTH-PREMIUM ROUNDED
MOVE ZERO TO WRK-PENSION-PREMIUM
MOVE WRK-HEALTH-PREMIUM TO W01HEALTH-PREMIUM
MOVE WRK-PENSION-PREMIUM TO W01PENSION-PREMIUM
MOVE LOW-VALUES TO W01FILLER
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
MOVE R01EMP-ID TO W01EMP-ID
MOVE R01EMP-NAME TO W01EMP-NAME
MOVE '2' TO W01INSURANCE-TYPE
MOVE WRK-GRADE-CODE(WRK-IDX)
TO W01GRADE-CODE
MOVE R01MONTHLY-AMOUNT TO W01MONTHLY-AMOUNT
MOVE WRK-HEALTH-RATE(WRK-IDX)
TO W01HEALTH-RATE
MOVE WRK-PENSION-RATE(WRK-IDX)
TO W01PENSION-RATE
MOVE ZERO TO WRK-HEALTH-PREMIUM
MULTIPLY R01MONTHLY-AMOUNT
BY WRK-PENSION-RATE(WRK-IDX)
GIVING WRK-PENSION-PREMIUM ROUNDED
MOVE WRK-HEALTH-PREMIUM TO W01HEALTH-PREMIUM
MOVE WRK-PENSION-PREMIUM TO W01PENSION-PREMIUM
MOVE LOW-VALUES TO W01FILLER
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
ADD 1 TO WRK-IDX
END-PERFORM.
PERFORM 1300R01INNSOR.
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.9) *
* サブモジュール名: エラー出力処理 *
*****************************************************************
2100ERROUTSOR SECTION.
*
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2100ERROUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
CLOSE R01INNFIL
W01OUTFIL
W02OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA03R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA03W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA03W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+543
View File
@@ -0,0 +1,543 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA04TWO IS INITIAL.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA04TWO *
* プログラム名 : 事業所保険者マッチング処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : INSURED-DATAをOFFICE-MST/INSURER-MSTの *
* 2段階で1:1マッチングし、GRADED-LIST/ *
* UNMATCHED-LISTを出力する *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA04R01.
SELECT R02INNFIL ASSIGN TO EXTERNAL SHA04R02.
SELECT R03INNFIL ASSIGN TO EXTERNAL SHA04R03.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA04W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA04W02.
SELECT W03OUTFIL ASSIGN TO EXTERNAL SHA04W03.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: INSURED-DATA200B FB SHA01CVT出力) *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY SHA01REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* R02: OFFICE-MST80B FB 自前レイアウト) *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
03 R02OFFICE-NO PIC X(004).
03 R02OFFICE-NAME PIC X(040).
03 R02PREF-CODE PIC 9(002).
03 R02FILLER PIC X(034).
*
*****************************************************************
* R03: INSURER-MST80B FB 自前レイアウト) *
*****************************************************************
FD R03INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R03INNREC.
03 R03INSURER-CODE PIC X(004).
03 R03INSURER-NAME PIC X(060).
03 R03FILLER PIC X(016).
*
*****************************************************************
* W01: GRADED-LIST200B FB SHA04REC *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA04REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: UNMATCHED-LIST200B FB 自前レイアウト) *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W02OUTREC.
03 W02EMP-ID PIC 9(008).
03 W02EMP-NAME PIC X(040).
03 W02OFFICE-NO PIC X(004).
03 W02OFFICE-NAME PIC X(040).
03 W02PREF-CODE PIC 9(002).
03 W02INSURER-CODE PIC X(004).
03 W02INSURER-NAME PIC X(060).
03 W02STATUS PIC X(001).
03 W02FILLER PIC X(041).
*
*****************************************************************
* W03: ERROR-LOGVB *
*****************************************************************
FD W03OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W03OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W03==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA04TWO'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-R02INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-R03INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W03OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-SQLCODE PIC S9(009) COMP.
03 WRK-STAGE1-FLG PIC X(001).
88 WRK-STAGE1-FOUND VALUE 'Y'.
03 WRK-STAGE2-FLG PIC X(001).
88 WRK-STAGE2-FOUND VALUE 'Y'.
03 WRK-I PIC 9(004) COMP.
03 WRK-J PIC 9(004) COMP.
03 WRK-R02-EOF PIC X(001).
88 R02-EOF-Y VALUE '1'.
03 WRK-R03-EOF PIC X(001).
88 R03-EOF-Y VALUE '1'.
03 WS-DISP-INT PIC S9(009).
*
*****************************************************************
* DB2ホスト変数 *
*****************************************************************
01 DBVARA.
03 DBV-EMP-ID PIC X(008).
03 DBV-INSURED-NO PIC X(010).
03 DBV-STATUS PIC X(001).
*
*****************************************************************
* 事業所マスタ内部テーブル *
*****************************************************************
01 OFFICE-TBL.
03 OFFICE-ENTRY OCCURS 100.
05 TBL-OFFICE-NO PIC X(004).
05 TBL-OFFICE-NAME PIC X(040).
05 TBL-PREF-CODE PIC 9(002).
05 TBL-FILLER PIC X(034).
01 OFFICE-COUNT PIC 9(004) VALUE ZERO.
*
*****************************************************************
* 保険者マスタ内部テーブル *
*****************************************************************
01 INSURER-TBL.
03 INSURER-ENTRY OCCURS 100.
05 TBL-INSURER-CODE PIC X(004).
05 TBL-INSURER-NAME PIC X(060).
05 TBL-FILLER PIC X(016).
01 INSURER-COUNT PIC 9(004) VALUE ZERO.
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY SHAMSGAC.
COPY SHAENDAC.
COPY SHADATAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
*****************************************************************
1000ITTSOR SECTION.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE WRKARA.
*
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
OPEN INPUT R01INNFIL
R02INNFIL
R03INNFIL.
OPEN OUTPUT W01OUTFIL
W02OUTFIL
W03OUTFIL.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/INSURANCEDB.db'
END-EXEC.
*
MOVE 0 TO WS-DISP-INT.
*
*** 事業所マスタ全件読込
PERFORM 1110R02LDASOR
UNTIL R02-EOF-Y.
*
*** 保険者マスタ全件読込
PERFORM 1120R03LDASOR
UNTIL R03-EOF-Y.
*
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: R01読込処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
SET WRK-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.2) *
* サブモジュール名: R02読込処理(全件→内部テーブル) *
*****************************************************************
1110R02LDASOR SECTION.
*
READ R02INNFIL
AT END
SET R02-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R02INN
ADD 1 TO OFFICE-COUNT
MOVE R02OFFICE-NO TO
TBL-OFFICE-NO (OFFICE-COUNT)
MOVE R02OFFICE-NAME TO
TBL-OFFICE-NAME (OFFICE-COUNT)
MOVE R02PREF-CODE TO
TBL-PREF-CODE (OFFICE-COUNT)
END-READ.
*
1110R02LDASOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.3) *
* サブモジュール名: R03読込処理(全件→内部テーブル) *
*****************************************************************
1120R03LDASOR SECTION.
*
READ R03INNFIL
AT END
SET R03-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R03INN
ADD 1 TO INSURER-COUNT
MOVE R03INSURER-CODE TO
TBL-INSURER-CODE (INSURER-COUNT)
MOVE R03INSURER-NAME TO
TBL-INSURER-NAME (INSURER-COUNT)
END-READ.
*
1120R03LDASOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
*
MOVE 'N' TO WRK-STAGE1-FLG.
MOVE 'N' TO WRK-STAGE2-FLG.
*
PERFORM 2010STG1SOR.
*
IF WRK-STAGE1-FOUND
PERFORM 2020STG2SOR
END-IF.
*
IF WRK-STAGE1-FOUND
AND WRK-STAGE2-FOUND
PERFORM 2030W01OUTSOR
ELSE
PERFORM 2040W02OUTSOR
END-IF.
*
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: 第1段階マッチング(OFFICE-NO *
*****************************************************************
2010STG1SOR SECTION.
*
PERFORM VARYING WRK-I FROM 1 BY 1
UNTIL WRK-I > OFFICE-COUNT
OR WRK-STAGE1-FOUND
IF R01OFFICE-NO =
TBL-OFFICE-NO (WRK-I)
SET WRK-STAGE1-FOUND TO TRUE
END-IF
END-PERFORM.
*
2010STG1SOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: 第2段階マッチング(INSURER-CODE *
*****************************************************************
2020STG2SOR SECTION.
*
PERFORM VARYING WRK-J FROM 1 BY 1
UNTIL WRK-J > INSURER-COUNT
OR WRK-STAGE2-FOUND
IF R01INSURER-CODE =
TBL-INSURER-CODE (WRK-J)
SET WRK-STAGE2-FOUND TO TRUE
END-IF
END-PERFORM.
*
2020STG2SOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: GRADED-LIST出力 *
*****************************************************************
2030W01OUTSOR SECTION.
*
INITIALIZE W01OUTREC.
*
MOVE R01EMP-ID TO W01EMP-ID.
MOVE R01EMP-NAME TO W01EMP-NAME.
MOVE R01OFFICE-NO TO W01OFFICE-NO.
MOVE TBL-OFFICE-NAME (WRK-I) TO W01OFFICE-NAME.
MOVE TBL-PREF-CODE (WRK-I) TO W01PREF-CODE.
MOVE R01INSURER-CODE TO W01INSURER-CODE.
MOVE TBL-INSURER-NAME (WRK-J)
TO W01INSURER-NAME.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
*** DB2整合性検証
MOVE R01EMP-ID TO DBV-EMP-ID.
MOVE R01INSURED-NO TO DBV-INSURED-NO.
*
EXEC SQL
SELECT STATUS
INTO :DBV-STATUS
FROM INSURED-MASTER
WHERE EMP-ID = :DBV-EMP-ID
AND INSURED-NO = :DBV-INSURED-NO
END-EXEC.
*
IF SQLCODE NOT = 0
MOVE 01 TO W03ERR-CATEGORY
MOVE SQLCODE TO WS-DISP-INT
STRING
DBV-EMP-ID
' SQLCODE='
WS-DISP-INT
INTO W03ERR-DETAIL
END-STRING
WRITE W03OUTREC
ADD 1 TO CUN-W03OUT
END-IF.
*
2030W01OUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.4) *
* サブモジュール名: UNMATCHED-LIST出力 *
*****************************************************************
2040W02OUTSOR SECTION.
*
INITIALIZE W02OUTREC.
*
MOVE R01EMP-ID TO W02EMP-ID.
MOVE R01EMP-NAME TO W02EMP-NAME.
MOVE R01OFFICE-NO TO W02OFFICE-NO.
MOVE R01INSURER-CODE TO W02INSURER-CODE.
*
IF WRK-STAGE1-FOUND
MOVE TBL-OFFICE-NAME (WRK-I)
TO W02OFFICE-NAME
MOVE TBL-PREF-CODE (WRK-I)
TO W02PREF-CODE
END-IF.
*
IF WRK-STAGE2-FOUND
MOVE TBL-INSURER-NAME (WRK-J)
TO W02INSURER-NAME
END-IF.
*
IF NOT WRK-STAGE1-FOUND
MOVE '1' TO W02STATUS
ELSE
MOVE '2' TO W02STATUS
END-IF.
*
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2040W02OUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
CLOSE R01INNFIL
R02INNFIL
R03INNFIL
W01OUTFIL
W02OUTFIL
W03OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA04R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA04W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA04W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA04W03' TO M00UMKDATS22-01.
MOVE CUN-W03OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+459
View File
@@ -0,0 +1,459 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA05TWN.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA05TWN *
* プログラム名 : 標準報酬月額等級判定処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : SALARY-MONTHLYをEMP-IDでN:1キーブレイク *
* 集約し、平均標準報酬月額とGRADE-TBLを *
* N:1マッチングして等級改定を判定する *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA05R01.
SELECT R02INNFIL ASSIGN TO EXTERNAL SHA05R02.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA05W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA05W02.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: SALARY-MONTHLY200B FB 自前レイアウト) *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
03 R01EMP-ID PIC 9(008).
03 R01EMP-NAME PIC X(040).
03 R01YEAR-MONTH PIC 9(006).
03 R01MONTHLY-AMOUNT PIC 9(009).
03 R01FILLER PIC X(137).
*
*****************************************************************
* R02: GRADE-TBL80B FB 自前レイアウト) *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
03 R02GRADE-CODE PIC 9(002).
03 R02MONTHLY-FROM PIC 9(009).
03 R02MONTHLY-TO PIC 9(009).
03 R02FILLER PIC X(060).
*
*****************************************************************
* W01: REVISED-GRADE200B FB SHA05REC *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA05REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: ERROR-LOGVB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA05TWN'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-DEFAULT-YM PIC X(006) VALUE '202607'.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-R02INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-R02-EOF PIC X(001).
88 WRK-R02-EOF-Y VALUE '1'.
03 WRK-FIRST-FLG PIC X(001).
88 WRK-FIRST-REC VALUE '1'.
03 WRK-PREV-EMP-ID PIC 9(008).
03 WRK-EMP-NAME PIC X(040).
03 WRK-YEAR-MONTH PIC X(006).
03 WRK-TOTAL PIC 9(018) COMP-3.
03 WRK-COUNT PIC 9(004) COMP-3.
03 WRK-AVG PIC 9(009).
03 WRK-REM PIC 9(009).
03 WRK-REVISED-TYPE PIC X(001).
03 WRK-I PIC 9(004) COMP.
03 WRK-GRADE-FOUND PIC X(001).
88 WRK-GRADE-FOUND-Y VALUE 'Y'.
03 WRK-NEW-GRADE PIC 9(002).
03 WRK-OLD-GRADE PIC 9(002).
03 WS-DISP-INT PIC S9(009).
*
*****************************************************************
* 等級テーブル(内部テーブル) *
*****************************************************************
01 GRADE-TBL.
03 GRADE-ENTRY OCCURS 50.
05 TBL-GRADE-CODE PIC 9(002).
05 TBL-MONTHLY-FROM PIC 9(009).
05 TBL-MONTHLY-TO PIC 9(009).
05 TBL-FILLER PIC X(060).
01 GRADE-COUNT PIC 9(004) VALUE ZERO.
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY SHAMSGAC.
COPY SHAENDAC.
COPY SHADATAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
*****************************************************************
1000ITTSOR SECTION.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE WRKARA.
MOVE '1' TO WRK-FIRST-FLG.
*
*** PARM取得
ACCEPT WRK-YEAR-MONTH
FROM COMMAND-LINE.
IF WRK-YEAR-MONTH = SPACES
MOVE CNS-DEFAULT-YM TO WRK-YEAR-MONTH
END-IF.
*
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
OPEN INPUT R01INNFIL
R02INNFIL.
OPEN OUTPUT W01OUTFIL
W02OUTFIL.
*
*** 等級テーブル全件読込
PERFORM 1110R02LDASOR
UNTIL WRK-R02-EOF-Y.
*
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: R01読込処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
SET WRK-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.2) *
* サブモジュール名: R02全件読込(等級テーブル格納) *
*****************************************************************
1110R02LDASOR SECTION.
*
READ R02INNFIL
AT END
SET WRK-R02-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R02INN
ADD 1 TO GRADE-COUNT
MOVE R02GRADE-CODE TO
TBL-GRADE-CODE (GRADE-COUNT)
MOVE R02MONTHLY-FROM TO
TBL-MONTHLY-FROM (GRADE-COUNT)
MOVE R02MONTHLY-TO TO
TBL-MONTHLY-TO (GRADE-COUNT)
END-READ.
*
1110R02LDASOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
*
IF WRK-FIRST-REC
MOVE R01EMP-ID TO WRK-PREV-EMP-ID
MOVE R01EMP-NAME TO WRK-EMP-NAME
MOVE '0' TO WRK-FIRST-FLG
MOVE ZERO TO WRK-TOTAL
MOVE ZERO TO WRK-COUNT
END-IF.
*
IF R01EMP-ID = WRK-PREV-EMP-ID
ADD R01MONTHLY-AMOUNT TO WRK-TOTAL
ADD 1 TO WRK-COUNT
ELSE
PERFORM 2010KEYBRSOR
MOVE R01EMP-ID TO WRK-PREV-EMP-ID
MOVE R01EMP-NAME TO WRK-EMP-NAME
MOVE ZERO TO WRK-TOTAL
MOVE ZERO TO WRK-COUNT
ADD R01MONTHLY-AMOUNT TO WRK-TOTAL
ADD 1 TO WRK-COUNT
END-IF.
*
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: キーブレイク集約処理 *
*****************************************************************
2010KEYBRSOR SECTION.
*
IF WRK-COUNT = 0
EXIT SECTION
END-IF.
*
DIVIDE WRK-TOTAL BY WRK-COUNT
GIVING WRK-AVG
REMAINDER WRK-REM
END-DIVIDE.
*
IF WRK-COUNT >= 4
MOVE 'A' TO WRK-REVISED-TYPE
ELSE
IF WRK-COUNT = 3
MOVE 'B' TO WRK-REVISED-TYPE
ELSE
MOVE 01 TO W02ERR-CATEGORY
MOVE WRK-COUNT TO WS-DISP-INT
STRING
WRK-PREV-EMP-ID
' COUNT='
WS-DISP-INT
' INVALID'
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF
END-IF.
*
PERFORM 2020GRADSOR.
*
2010KEYBRSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: 等級テーブルマッチング *
*****************************************************************
2020GRADSOR SECTION.
*
MOVE 'N' TO WRK-GRADE-FOUND.
*
PERFORM VARYING WRK-I FROM 1 BY 1
UNTIL WRK-I > GRADE-COUNT
OR WRK-GRADE-FOUND-Y
IF WRK-AVG >=
TBL-MONTHLY-FROM (WRK-I)
AND WRK-AVG <=
TBL-MONTHLY-TO (WRK-I)
MOVE TBL-GRADE-CODE (WRK-I)
TO WRK-NEW-GRADE
SET WRK-GRADE-FOUND-Y TO TRUE
END-IF
END-PERFORM.
*
IF NOT WRK-GRADE-FOUND-Y
MOVE 01 TO W02ERR-CATEGORY
STRING
WRK-PREV-EMP-ID
' AVG='
WRK-AVG
' NO-GRADE'
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
EXIT SECTION
END-IF.
*
*** 現在等級をDBから取得(本設計ではDB非接続のためテーブルで代用)
*** 本来はGRADE-HISTORYをSELECTする
MOVE 0 TO WRK-OLD-GRADE.
*
IF WRK-OLD-GRADE NOT = WRK-NEW-GRADE
PERFORM 2030W01OUTSOR
END-IF.
*
2020GRADSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: REVISED-GRADE出力 *
*****************************************************************
2030W01OUTSOR SECTION.
*
INITIALIZE W01OUTREC.
*
MOVE WRK-PREV-EMP-ID TO W01EMP-ID.
MOVE WRK-EMP-NAME TO W01EMP-NAME.
MOVE WRK-YEAR-MONTH TO W01REVISED-YM.
MOVE WRK-OLD-GRADE TO W01OLD-GRADE.
MOVE WRK-NEW-GRADE TO W01NEW-GRADE.
MOVE WRK-AVG TO W01AVG-STD-MONTHLY.
MOVE WRK-REVISED-TYPE TO W01REVISED-TYPE.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2030W01OUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
*** 最終キーグループ処理
PERFORM 2010KEYBRSOR.
*
CLOSE R01INNFIL
R02INNFIL
W01OUTFIL
W02OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA05R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA05W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA05W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+561
View File
@@ -0,0 +1,561 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA06TWM.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA06TWM *
* プログラム名 : 保険料率適用・控除計算処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : EMP-INSURANCEをDB2 INSURANCE-RATES(M×N) *
* とAPPLICABLE-RULES(M:N)の2段階マッチング *
* により保険料を算出しDEDUCTED-RESULTを出力 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA06R01.
SELECT R02INNFIL ASSIGN TO EXTERNAL SHA06R02.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA06W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA06W02.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: EMP-INSURANCE200B FB SHA02REC *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY SHA02REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* R02: APPLICABLE-RULES80B FB 自前レイアウト) *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
03 R02RULE-CODE PIC X(002).
03 R02AGE-FROM PIC 9(002).
03 R02AGE-TO PIC 9(002).
03 R02DEPENDENTS-FROM PIC 9(002).
03 R02DEPENDENTS-TO PIC 9(002).
03 R02REGION-CODE PIC X(002).
03 R02HEALTH-RATE-ADJ PIC 9(007).
03 R02PENSION-RATE-ADJ PIC 9(007).
03 R02FILLER PIC X(054).
*
*****************************************************************
* W01: DEDUCTED-RESULT300B FB SHA06REC *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA06REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: ERROR-LOGVB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA06TWM'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-RATE-DIV PIC 9(007) VALUE 1000000.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-R02INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-R02-EOF PIC X(001).
88 WRK-R02-EOF-Y VALUE '1'.
03 WRK-SQLCODE PIC S9(009) COMP.
03 WRK-I PIC 9(004) COMP.
03 WRK-RULE-FOUND PIC X(001).
88 WRK-RULE-FOUND-Y VALUE 'Y'.
03 WRK-AGE PIC 9(003).
03 WRK-DEPENDENTS PIC 9(002).
03 WRK-REGION-CODE PIC X(002).
03 WRK-HEALTH-RATE PIC 9(007).
03 WRK-PENSION-RATE PIC 9(007).
03 WRK-HEALTH-PREMIUM PIC 9(009).
03 WRK-PENSION-PREMIUM PIC 9(009).
03 WRK-TOTAL-PREMIUM PIC 9(009).
03 WRK-BIRTH-DATE PIC 9(008).
03 WRK-CALC-ERR PIC X(001).
88 WRK-CALC-ERR-Y VALUE 'Y'.
03 WS-DISP-INT PIC S9(009).
*
*****************************************************************
* DB2ホスト変数 *
*****************************************************************
01 DBVARA.
03 DBV-EMP-ID PIC X(008).
03 DBV-GRADE-CODE PIC 9(002).
03 DBV-HEALTH-RATE PIC 9(007).
03 DBV-PENSION-RATE PIC 9(007).
03 DBV-BIRTH-DATE PIC 9(008).
03 DBV-DEPENDENT-COUNT PIC 9(002).
03 DBV-REGION-CODE PIC X(002).
*
*****************************************************************
* 適用ルール内部テーブル *
*****************************************************************
01 RULE-TBL.
03 RULE-ENTRY OCCURS 50.
05 TBL-RULE-CODE PIC X(002).
05 TBL-AGE-FROM PIC 9(002).
05 TBL-AGE-TO PIC 9(002).
05 TBL-DEPENDENTS-FROM PIC 9(002).
05 TBL-DEPENDENTS-TO PIC 9(002).
05 TBL-REGION-CODE PIC X(002).
05 TBL-HEALTH-RATE-ADJ PIC 9(007).
05 TBL-PENSION-RATE-ADJ PIC 9(007).
05 TBL-FILLER PIC X(054).
01 RULE-COUNT PIC 9(004) VALUE ZERO.
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
COPY SHAMSGAC.
COPY SHAENDAC.
COPY SHADATAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
*****************************************************************
1000ITTSOR SECTION.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE WRKARA.
*
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
OPEN INPUT R01INNFIL
R02INNFIL.
OPEN OUTPUT W01OUTFIL
W02OUTFIL.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/INSURANCEDB.db'
END-EXEC.
*
*** 適用ルールテーブル全件読込
PERFORM 1110R02LDASOR
UNTIL WRK-R02-EOF-Y.
*
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: R01読込処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
SET WRK-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.2) *
* サブモジュール名: R02全件読込(ルールテーブル格納) *
*****************************************************************
1110R02LDASOR SECTION.
*
READ R02INNFIL
AT END
SET WRK-R02-EOF-Y TO TRUE
NOT AT END
ADD 1 TO CUN-R02INN
ADD 1 TO RULE-COUNT
MOVE R02RULE-CODE TO
TBL-RULE-CODE (RULE-COUNT)
MOVE R02AGE-FROM TO
TBL-AGE-FROM (RULE-COUNT)
MOVE R02AGE-TO TO
TBL-AGE-TO (RULE-COUNT)
MOVE R02DEPENDENTS-FROM TO
TBL-DEPENDENTS-FROM (RULE-COUNT)
MOVE R02DEPENDENTS-TO TO
TBL-DEPENDENTS-TO (RULE-COUNT)
MOVE R02REGION-CODE TO
TBL-REGION-CODE (RULE-COUNT)
MOVE R02HEALTH-RATE-ADJ TO
TBL-HEALTH-RATE-ADJ (RULE-COUNT)
MOVE R02PENSION-RATE-ADJ TO
TBL-PENSION-RATE-ADJ (RULE-COUNT)
END-READ.
*
1110R02LDASOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
*****************************************************************
2000MAJSOR SECTION.
*
PERFORM 2010RATESOR.
*
IF WRK-SQLCODE = 0
PERFORM 2020RULESCOL
PERFORM 2030CALCSOR
PERFORM 2040W01OUTSOR
ELSE
PERFORM 2050W02OUTSOR
END-IF.
*
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: 第1段階料率取得(DB2 M×Nマッチング) *
*****************************************************************
2010RATESOR SECTION.
*
MOVE R01EMP-ID TO DBV-EMP-ID.
MOVE R01GRADE-CODE TO DBV-GRADE-CODE.
*
EXEC SQL
SELECT HEALTH-RATE, PENSION-RATE
INTO :DBV-HEALTH-RATE,
:DBV-PENSION-RATE
FROM INSURANCE-RATES
WHERE GRADE-CODE = :DBV-GRADE-CODE
END-EXEC.
*
MOVE SQLCODE TO WRK-SQLCODE.
*
IF SQLCODE = 0
MOVE DBV-HEALTH-RATE TO WRK-HEALTH-RATE
MOVE DBV-PENSION-RATE TO WRK-PENSION-RATE
ELSE
IF SQLCODE NOT = 100
MOVE 01 TO W02ERR-CATEGORY
MOVE SQLCODE TO WS-DISP-INT
STRING
DBV-EMP-ID
' SQLCODE='
WS-DISP-INT
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
END-IF
END-IF.
*
*** 年齢・扶養人数・地域コードをDBより取得
IF SQLCODE = 0
EXEC SQL
SELECT BIRTH-DATE,
DEPENDENT-COUNT,
REGION-CODE
INTO :DBV-BIRTH-DATE,
:DBV-DEPENDENT-COUNT,
:DBV-REGION-CODE
FROM EMP-MASTER
WHERE EMP-ID = :DBV-EMP-ID
END-EXEC
IF SQLCODE = 0
MOVE DBV-BIRTH-DATE TO WRK-BIRTH-DATE
MOVE DBV-DEPENDENT-COUNT
TO WRK-DEPENDENTS
MOVE DBV-REGION-CODE TO WRK-REGION-CODE
END-IF
END-IF.
*
2010RATESOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: 第2段階ルールマッチング(M:N) *
*****************************************************************
2020RULESCOL SECTION.
*
*** 満年齢計算
COMPUTE WRK-AGE =
(FUNCTION INTEGER-OF-DATE (D01UBSUDATE)
- FUNCTION INTEGER-OF-DATE (WRK-BIRTH-DATE))
/ 365
END-COMPUTE.
*
MOVE 'N' TO WRK-RULE-FOUND.
*
PERFORM VARYING WRK-I FROM 1 BY 1
UNTIL WRK-I > RULE-COUNT
OR WRK-RULE-FOUND-Y
IF WRK-AGE >= TBL-AGE-FROM (WRK-I)
AND WRK-AGE <= TBL-AGE-TO (WRK-I)
AND WRK-DEPENDENTS >=
TBL-DEPENDENTS-FROM (WRK-I)
AND WRK-DEPENDENTS <=
TBL-DEPENDENTS-TO (WRK-I)
AND WRK-REGION-CODE =
TBL-REGION-CODE (WRK-I)
IF TBL-HEALTH-RATE-ADJ (WRK-I) > 0
ADD TBL-HEALTH-RATE-ADJ (WRK-I)
TO WRK-HEALTH-RATE
END-IF
IF TBL-PENSION-RATE-ADJ (WRK-I) > 0
ADD TBL-PENSION-RATE-ADJ (WRK-I)
TO WRK-PENSION-RATE
END-IF
SET WRK-RULE-FOUND-Y TO TRUE
END-IF
END-PERFORM.
*
2020RULESCOL-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: 保険料計算 *
*****************************************************************
2030CALCSOR SECTION.
*
MOVE 'N' TO WRK-CALC-ERR.
*
COMPUTE WRK-HEALTH-PREMIUM =
R01MONTHLY-AMOUNT
* WRK-HEALTH-RATE
/ CNS-RATE-DIV
ON SIZE ERROR
MOVE 'Y' TO WRK-CALC-ERR
END-COMPUTE.
*
COMPUTE WRK-PENSION-PREMIUM =
R01MONTHLY-AMOUNT
* WRK-PENSION-RATE
/ CNS-RATE-DIV
ON SIZE ERROR
MOVE 'Y' TO WRK-CALC-ERR
END-COMPUTE.
*
IF NOT WRK-CALC-ERR-Y
COMPUTE WRK-TOTAL-PREMIUM =
WRK-HEALTH-PREMIUM
+ WRK-PENSION-PREMIUM
END-COMPUTE
END-IF.
*
IF WRK-CALC-ERR-Y
MOVE 01 TO W02ERR-CATEGORY
STRING
R01EMP-ID
' CALC-SIZE-ERROR'
INTO W02ERR-DETAIL
END-STRING
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
END-IF.
*
2030CALCSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.4) *
* サブモジュール名: DEDUCTED-RESULT出力 *
*****************************************************************
2040W01OUTSOR SECTION.
*
IF WRK-CALC-ERR-Y
EXIT SECTION
END-IF.
*
INITIALIZE W01OUTREC.
*
MOVE R01EMP-ID TO W01EMP-ID.
MOVE R01EMP-NAME TO W01EMP-NAME.
MOVE R01HEALTH-INS-TYPE TO W01INSURANCE-TYPE.
MOVE R01GRADE-CODE TO W01GRADE-CODE.
MOVE R01MONTHLY-AMOUNT TO W01MONTHLY-AMOUNT.
MOVE WRK-HEALTH-RATE TO W01HEALTH-RATE.
MOVE WRK-PENSION-RATE TO W01PENSION-RATE.
MOVE WRK-HEALTH-PREMIUM TO W01HEALTH-PREMIUM.
MOVE WRK-PENSION-PREMIUM TO W01PENSION-PREMIUM.
MOVE WRK-TOTAL-PREMIUM TO W01TOTAL-PREMIUM.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2040W01OUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.5) *
* サブモジュール名: エラー出力(DBエラー時) *
*****************************************************************
2050W02OUTSOR SECTION.
*
MOVE 01 TO W02ERR-CATEGORY.
MOVE WRK-SQLCODE TO WS-DISP-INT.
STRING
R01EMP-ID
' DB-ERR SQLCODE='
WS-DISP-INT
INTO W02ERR-DETAIL
END-STRING.
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2050W02OUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
*****************************************************************
3000STPSOR SECTION.
*
CLOSE R01INNFIL
R02INNFIL
W01OUTFIL
W02OUTFIL.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA06R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA06W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA06W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ出力処理 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+480
View File
@@ -0,0 +1,480 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA07KBR.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA07KBR *
* プログラム名 : 資格異動キーブレイク処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : DB2 QUALIFICATION-CHANGESから資格異動 *
* データをFETCHし、従業員ごと(1:N)かつ *
* 保険者コード変更時(異キー)にキーブレイク *
* してサマリ・明細を出力する。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA07W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA07W02.
SELECT W03OUTFIL ASSIGN TO EXTERNAL SHA07W03.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* W01: CHG-SUMMARY200B FB *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA07REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: CHG-DETAIL200B FB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W02OUTREC.
COPY SHA07REC REPLACING ==(A)== BY ==W02==.
*
*****************************************************************
* W03: ERROR-LOGVB *
*****************************************************************
FD W03OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W03OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W03==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA07KBR'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
01 CNS-RECTYP-S PIC X(001) VALUE 'S'.
01 CNS-RECTYP-D PIC X(001) VALUE 'D'.
01 CNS-REASON-CHG PIC X(040)
VALUE 'INSURER CHANGED'.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-DB-FETCH PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W03OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-U06 PIC 9(008).
03 WRK-EOF PIC X(001).
88 WRK-EOF-Y VALUE '1'.
03 WRK-FIRST PIC X(001).
88 WRK-FIRST-Y VALUE '1'.
03 WRK-PREV-EMP-ID PIC X(008).
03 WRK-PREV-INSURER PIC X(004).
*
*****************************************************************
* DB2ホスト変数 *
*****************************************************************
01 DBVARA.
03 DBV-CHG-ID PIC 9(009).
03 DBV-EMP-ID PIC X(008).
03 DBV-EMP-NAME PIC X(040).
03 DBV-CHG-DATE PIC X(008).
03 DBV-CHG-TYPE PIC X(002).
03 DBV-INSURER-CODE PIC X(004).
03 DBV-PREV-INSURER PIC X(004).
03 DBV-REASON PIC X(100).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY SHADATAC.
*** メッセージ編集出力SR用
COPY SHAMSGAC.
*** ABEND処理SR用
COPY SHAENDAC.
*** 項目チェックSR用
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EOF-Y.
PERFORM 2500LSTKBRSOR.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
MOVE ZERO TO WRK-PREV-EMP-ID.
MOVE SPACES TO WRK-PREV-INSURER.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 出力ファイルOPEN
OPEN OUTPUT W01OUTFIL
W02OUTFIL
W03OUTFIL.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/INSURANCEDB.db'
END-EXEC.
*
*** CURSOR DECLARE
EXEC SQL
DECLARE CQCHG CURSOR FOR
SELECT
QC.CHG-ID,
QC.EMP-ID,
EM.EMP-NAME,
QC.CHG-DATE,
QC.CHG-TYPE,
QC.INSURER-CODE,
QC.PREV-INSURER,
QC.REASON
FROM
QUALIFICATION-CHANGES QC
LEFT JOIN SALARYDB.EMP-MASTER EM
ON QC.EMP-ID = EM.EMP-ID
ORDER BY
QC.EMP-ID,
QC.CHG-DATE
END-EXEC.
*
*** CURSOR OPEN
EXEC SQL
OPEN CQCHG
END-EXEC.
*
*** 1件目FETCH
PERFORM 1100FETCSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: FETCH処理 *
* 処理概要 : CURSOR FETCH + EOF判定 *
*****************************************************************
1100FETCSOR SECTION.
*
EXEC SQL
FETCH CQCHG
INTO
:DBV-CHG-ID,
:DBV-EMP-ID,
:DBV-EMP-NAME,
:DBV-CHG-DATE,
:DBV-CHG-TYPE,
:DBV-INSURER-CODE,
:DBV-PREV-INSURER,
:DBV-REASON
END-EXEC.
*
IF SQLCODE = 0
ADD 1 TO CUN-DB-FETCH
ELSE
SET WRK-EOF-Y TO TRUE
END-IF.
*
1100FETCSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
* 処理概要 : キーブレイク判定・出力 *
*****************************************************************
2000MAJSOR SECTION.
*
*** EMP-ID 主キーブレイク判定
IF WRK-FIRST-Y
MOVE SPACE TO WRK-FIRST
MOVE DBV-EMP-ID TO WRK-PREV-EMP-ID
MOVE DBV-INSURER-CODE TO WRK-PREV-INSURER
ELSE
IF DBV-EMP-ID NOT = WRK-PREV-EMP-ID
PERFORM 2100KEYBRSOR
END-IF
*
*** INSURER-CODE 異キーブレイク判定
IF DBV-INSURER-CODE
NOT = WRK-PREV-INSURER
PERFORM 2200DIFKBSOR
END-IF
END-IF.
*
*** 明細出力
PERFORM 2300DETAILSOR.
*
*** 前回値更新
MOVE DBV-EMP-ID TO WRK-PREV-EMP-ID.
MOVE DBV-INSURER-CODE TO WRK-PREV-INSURER.
*
*** 次FETCH
PERFORM 1100FETCSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: 主キーブレイク処理 *
* 処理概要 : EMP-ID変更時のサマリ出力(前従業員最終状 *
* 態をサマリに記録) *
*****************************************************************
2100KEYBRSOR SECTION.
*
INITIALIZE W01OUTREC.
*
MOVE WRK-PREV-EMP-ID TO W01EMP-ID.
MOVE SPACES TO W01EMP-NAME
MOVE ZERO TO W01CHG-ID
W01CHG-DATE.
MOVE '99' TO W01CHG-TYPE.
MOVE SPACES TO W01INSURER-CODE.
MOVE WRK-PREV-INSURER TO W01PREV-INSURER.
MOVE SPACES TO W01REASON.
MOVE CNS-RECTYP-S TO W01REC-TYPE.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2100KEYBRSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: 異キーブレイク処理 *
* 処理概要 : 同一従業員内で保険者コード変更時の *
* サマリ出力 *
*****************************************************************
2200DIFKBSOR SECTION.
*
INITIALIZE W01OUTREC.
*
MOVE DBV-CHG-ID TO W01CHG-ID.
MOVE DBV-EMP-ID TO W01EMP-ID.
MOVE DBV-EMP-NAME TO W01EMP-NAME.
MOVE DBV-CHG-DATE TO W01CHG-DATE.
MOVE '99' TO W01CHG-TYPE.
MOVE DBV-INSURER-CODE TO W01INSURER-CODE.
MOVE WRK-PREV-INSURER TO W01PREV-INSURER.
MOVE CNS-REASON-CHG TO W01REASON.
MOVE CNS-RECTYP-S TO W01REC-TYPE.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2200DIFKBSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: 明細出力処理 *
* 処理概要 : 全FETCHレコードを明細出力 *
*****************************************************************
2300DETAILSOR SECTION.
*
INITIALIZE W02OUTREC.
*
MOVE DBV-CHG-ID TO W02CHG-ID.
MOVE DBV-EMP-ID TO W02EMP-ID.
MOVE DBV-EMP-NAME TO W02EMP-NAME.
MOVE DBV-CHG-DATE TO W02CHG-DATE.
MOVE DBV-CHG-TYPE TO W02CHG-TYPE.
MOVE DBV-INSURER-CODE TO W02INSURER-CODE.
MOVE DBV-PREV-INSURER TO W02PREV-INSURER.
MOVE DBV-REASON TO W02REASON.
MOVE CNS-RECTYP-D TO W02REC-TYPE.
*
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2300DETAILSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.5) *
* サブモジュール名: 最終グループ処理 *
* 処理概要 : 最終EMP-IDグループのサマリ出力 *
*****************************************************************
2500LSTKBRSOR SECTION.
*
IF CUN-DB-FETCH > ZERO
INITIALIZE W01OUTREC
MOVE WRK-PREV-EMP-ID TO W01EMP-ID
MOVE SPACES TO W01EMP-NAME
MOVE ZERO TO W01CHG-ID
W01CHG-DATE
MOVE '99' TO W01CHG-TYPE
MOVE SPACES TO W01INSURER-CODE
MOVE WRK-PREV-INSURER TO W01PREV-INSURER
MOVE SPACES TO W01REASON
MOVE CNS-RECTYP-S TO W01REC-TYPE
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
END-IF.
*
2500LSTKBRSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : CURSOR CLOSE・ファイルクローズ・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** CURSOR CLOSE
EXEC SQL
CLOSE CQCHG
END-EXEC.
*
*** DB切断
EXEC SQL
DISCONNECT CURRENT
END-EXEC.
*
*** 出力ファイルCLOSE
CLOSE W01OUTFIL
W02OUTFIL
W03OUTFIL.
*
*** 入出力件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'DB2-QUAL-CHANGES' TO M00UMKDATS22-01.
MOVE CUN-DB-FETCH TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA07W01(CHG-SUM)' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA07W02(CHG-DTL)' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA07W03(ERROR)' TO M00UMKDATS22-01.
MOVE CUN-W03OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+359
View File
@@ -0,0 +1,359 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA08SRT.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA08SRT *
* プログラム名 : 届出書データSORT編集処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : GRADED-LISTをINPUT PROCEDUREで全件RELEASEし、*
* MONTHLY-AMOUNT/GRADE-CODEを保持したまま *
* PREF-CODE・OFFICE-NO・EMP-ID昇順SORT後、 *
* OUTPUT PROCEDUREでRETURNしてRPT-DATA出力。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA08R01.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA08W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA08W02.
SELECT SORTWORK ASSIGN TO EXTERNAL SORTWK01.
*
I-O-CONTROL.
SAME SORT AREA FOR SORTWORK.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: GRADED-LIST200B FB *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY SHA04REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* SD: SORTWORK200B SORT内部レコード) *
*****************************************************************
SD SORTWORK
RECORD CONTAINS 200.
01 SORTREC.
03 SR-EMP-ID PIC 9(008).
03 SR-EMP-NAME PIC X(040).
03 SR-OFFICE-NO PIC X(004).
03 SR-OFFICE-NAME PIC X(040).
03 SR-PREF-CODE PIC 9(002).
03 SR-INSURER-CODE PIC X(004).
03 SR-INSURER-NAME PIC X(060).
03 SR-MONTHLY-AMOUNT PIC 9(009).
03 SR-GRADE-CODE PIC 9(002).
03 SR-STATUS PIC X(001).
03 SR-FILLER PIC X(030).
*
*****************************************************************
* W01: RPT-DATA300B FB *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA08REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: ERROR-LOGVB *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA08SRT'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-ABD100 PIC 9(003) VALUE 100.
01 CNS-STATUS-0 PIC X(001) VALUE '0'.
01 CNS-RPT-TYPE PIC X(002) VALUE '01'.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-SORT-IN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-U06 PIC 9(008).
03 WRK-R01EOF PIC X(001).
03 WRK-SORT-STAT PIC 9(002).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY SHADATAC.
*** メッセージ編集出力SR用
COPY SHAMSGAC.
*** ABEND処理SR用
COPY SHAENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 出力ファイルOPEN
OPEN OUTPUT W01OUTFIL
W02OUTFIL.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理(SORT実行) *
* 処理概要 : SORT文を実行する *
*****************************************************************
2000MAJSOR SECTION.
*
SORT SORTWORK
ON ASCENDING KEY SR-PREF-CODE
SR-OFFICE-NO
SR-EMP-ID
INPUT PROCEDURE 2110INPPSOR
OUTPUT PROCEDURE 2120OUTPSOR.
*
MOVE RETURN-CODE TO WRK-SORT-STAT.
IF WRK-SORT-STAT NOT = ZERO
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SORT FAILED' TO M00UMKDATS22-01
MOVE WRK-SORT-STAT TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
MOVE CNS-ABD100 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: INPUT PROCEDURE *
* 処理概要 : R01読込→全件RELEASE *
*****************************************************************
2110INPPSOR SECTION.
*
OPEN INPUT R01INNFIL.
*
PERFORM UNTIL 1 = 2
READ R01INNFIL
AT END
EXIT PERFORM
NOT AT END
ADD 1 TO CUN-R01INN
END-READ
MOVE R01EMP-ID TO SR-EMP-ID
MOVE R01EMP-NAME TO SR-EMP-NAME
MOVE R01OFFICE-NO TO SR-OFFICE-NO
MOVE R01OFFICE-NAME TO SR-OFFICE-NAME
MOVE R01PREF-CODE TO SR-PREF-CODE
MOVE R01INSURER-CODE
TO SR-INSURER-CODE
MOVE R01INSURER-NAME
TO SR-INSURER-NAME
MOVE R01MONTHLY-AMOUNT TO SR-MONTHLY-AMOUNT
MOVE R01GRADE-CODE TO SR-GRADE-CODE
MOVE CNS-STATUS-0 TO SR-STATUS
MOVE R01FILLER TO SR-FILLER
RELEASE SORTREC
ADD 1 TO CUN-SORT-IN
END-PERFORM.
*
CLOSE R01INNFIL.
*
2110INPPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: OUTPUT PROCEDURE *
* 処理概要 : RETURN→レイアウト編集→WRITE *
*****************************************************************
2120OUTPSOR SECTION.
*
PERFORM UNTIL 1 = 2
RETURN SORTWORK RECORD
AT END
EXIT PERFORM
NOT AT END
INITIALIZE W01OUTREC
MOVE SR-EMP-ID TO W01EMP-ID
MOVE SR-EMP-NAME TO W01EMP-NAME
MOVE SR-OFFICE-NO TO W01OFFICE-NO
MOVE SR-OFFICE-NAME TO W01OFFICE-NAME
MOVE SR-INSURER-CODE TO W01INSURER-CODE
MOVE SR-INSURER-NAME TO W01INSURER-NAME
MOVE SR-PREF-CODE TO W01PREF-CODE
MOVE CNS-RPT-TYPE TO W01REPORT-TYPE
MOVE WRK-U06 TO W01REPORT-DATE
MOVE SR-MONTHLY-AMOUNT
TO W01MONTHLY-AMOUNT
MOVE SR-GRADE-CODE TO W01GRADE-CODE
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
END-RETURN
END-PERFORM.
*
2120OUTPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルクローズ・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 出力ファイルCLOSE
CLOSE W01OUTFIL
W02OUTFIL.
*
*** 入出力件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA08R01(GRADED)' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA08W01(RPT-DATA)' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA08W02(ERROR)' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE 'SORT-INPUT' TO M00UMKDATS22-01.
MOVE CUN-SORT-IN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+997
View File
@@ -0,0 +1,997 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA09S25.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA09S25 *
* プログラム名 : 都道府県支部別分割出力処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : RPT-DATAをPREF-CODE01〜25)で判定し、 *
* 25個の出力ファイルに振り分けて出力する。 *
* CLOSE WITH LOCKで各ファイルを確定する。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA09R01
ORGANIZATION IS SEQUENTIAL.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA09W01
ORGANIZATION IS SEQUENTIAL.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA09W02
ORGANIZATION IS SEQUENTIAL.
SELECT W03OUTFIL ASSIGN TO EXTERNAL SHA09W03
ORGANIZATION IS SEQUENTIAL.
SELECT W04OUTFIL ASSIGN TO EXTERNAL SHA09W04
ORGANIZATION IS SEQUENTIAL.
SELECT W05OUTFIL ASSIGN TO EXTERNAL SHA09W05
ORGANIZATION IS SEQUENTIAL.
SELECT W06OUTFIL ASSIGN TO EXTERNAL SHA09W06
ORGANIZATION IS SEQUENTIAL.
SELECT W07OUTFIL ASSIGN TO EXTERNAL SHA09W07
ORGANIZATION IS SEQUENTIAL.
SELECT W08OUTFIL ASSIGN TO EXTERNAL SHA09W08
ORGANIZATION IS SEQUENTIAL.
SELECT W09OUTFIL ASSIGN TO EXTERNAL SHA09W09
ORGANIZATION IS SEQUENTIAL.
SELECT W10OUTFIL ASSIGN TO EXTERNAL SHA09W10
ORGANIZATION IS SEQUENTIAL.
SELECT W11OUTFIL ASSIGN TO EXTERNAL SHA09W11
ORGANIZATION IS SEQUENTIAL.
SELECT W12OUTFIL ASSIGN TO EXTERNAL SHA09W12
ORGANIZATION IS SEQUENTIAL.
SELECT W13OUTFIL ASSIGN TO EXTERNAL SHA09W13
ORGANIZATION IS SEQUENTIAL.
SELECT W14OUTFIL ASSIGN TO EXTERNAL SHA09W14
ORGANIZATION IS SEQUENTIAL.
SELECT W15OUTFIL ASSIGN TO EXTERNAL SHA09W15
ORGANIZATION IS SEQUENTIAL.
SELECT W16OUTFIL ASSIGN TO EXTERNAL SHA09W16
ORGANIZATION IS SEQUENTIAL.
SELECT W17OUTFIL ASSIGN TO EXTERNAL SHA09W17
ORGANIZATION IS SEQUENTIAL.
SELECT W18OUTFIL ASSIGN TO EXTERNAL SHA09W18
ORGANIZATION IS SEQUENTIAL.
SELECT W19OUTFIL ASSIGN TO EXTERNAL SHA09W19
ORGANIZATION IS SEQUENTIAL.
SELECT W20OUTFIL ASSIGN TO EXTERNAL SHA09W20
ORGANIZATION IS SEQUENTIAL.
SELECT W21OUTFIL ASSIGN TO EXTERNAL SHA09W21
ORGANIZATION IS SEQUENTIAL.
SELECT W22OUTFIL ASSIGN TO EXTERNAL SHA09W22
ORGANIZATION IS SEQUENTIAL.
SELECT W23OUTFIL ASSIGN TO EXTERNAL SHA09W23
ORGANIZATION IS SEQUENTIAL.
SELECT W24OUTFIL ASSIGN TO EXTERNAL SHA09W24
ORGANIZATION IS SEQUENTIAL.
SELECT W25OUTFIL ASSIGN TO EXTERNAL SHA09W25
ORGANIZATION IS SEQUENTIAL.
SELECT W98OUTFIL ASSIGN TO EXTERNAL SHA09W98
ORGANIZATION IS SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: RPT-DATA300B FB *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY SHA08REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* W01: PREF-OUT-01300B FB)(PREF-CODE=01 *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02: PREF-OUT-02300B FB)(PREF-CODE=02 *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W02OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W02==.
*
*****************************************************************
* W03: PREF-OUT-03300B FB)(PREF-CODE=03 *
*****************************************************************
FD W03OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W03OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W03==.
*
*****************************************************************
* W04: PREF-OUT-04300B FB)(PREF-CODE=04 *
*****************************************************************
FD W04OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W04OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W04==.
*
*****************************************************************
* W05: PREF-OUT-05300B FB)(PREF-CODE=05 *
*****************************************************************
FD W05OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W05OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W05==.
*
*****************************************************************
* W06: PREF-OUT-06300B FB)(PREF-CODE=06 *
*****************************************************************
FD W06OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W06OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W06==.
*
*****************************************************************
* W07: PREF-OUT-07300B FB)(PREF-CODE=07 *
*****************************************************************
FD W07OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W07OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W07==.
*
*****************************************************************
* W08: PREF-OUT-08300B FB)(PREF-CODE=08 *
*****************************************************************
FD W08OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W08OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W08==.
*
*****************************************************************
* W09: PREF-OUT-09300B FB)(PREF-CODE=09 *
*****************************************************************
FD W09OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W09OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W09==.
*
*****************************************************************
* W10: PREF-OUT-10300B FB)(PREF-CODE=10 *
*****************************************************************
FD W10OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W10OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W10==.
*
*****************************************************************
* W11: PREF-OUT-11300B FB)(PREF-CODE=11 *
*****************************************************************
FD W11OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W11OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W11==.
*
*****************************************************************
* W12: PREF-OUT-12300B FB)(PREF-CODE=12 *
*****************************************************************
FD W12OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W12OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W12==.
*
*****************************************************************
* W13: PREF-OUT-13300B FB)(PREF-CODE=13 *
*****************************************************************
FD W13OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W13OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W13==.
*
*****************************************************************
* W14: PREF-OUT-14300B FB)(PREF-CODE=14 *
*****************************************************************
FD W14OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W14OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W14==.
*
*****************************************************************
* W15: PREF-OUT-15300B FB)(PREF-CODE=15 *
*****************************************************************
FD W15OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W15OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W15==.
*
*****************************************************************
* W16: PREF-OUT-16300B FB)(PREF-CODE=16 *
*****************************************************************
FD W16OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W16OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W16==.
*
*****************************************************************
* W17: PREF-OUT-17300B FB)(PREF-CODE=17 *
*****************************************************************
FD W17OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W17OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W17==.
*
*****************************************************************
* W18: PREF-OUT-18300B FB)(PREF-CODE=18 *
*****************************************************************
FD W18OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W18OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W18==.
*
*****************************************************************
* W19: PREF-OUT-19300B FB)(PREF-CODE=19 *
*****************************************************************
FD W19OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W19OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W19==.
*
*****************************************************************
* W20: PREF-OUT-20300B FB)(PREF-CODE=20 *
*****************************************************************
FD W20OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W20OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W20==.
*
*****************************************************************
* W21: PREF-OUT-21300B FB)(PREF-CODE=21 *
*****************************************************************
FD W21OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W21OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W21==.
*
*****************************************************************
* W22: PREF-OUT-22300B FB)(PREF-CODE=22 *
*****************************************************************
FD W22OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W22OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W22==.
*
*****************************************************************
* W23: PREF-OUT-23300B FB)(PREF-CODE=23 *
*****************************************************************
FD W23OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W23OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W23==.
*
*****************************************************************
* W24: PREF-OUT-24300B FB)(PREF-CODE=24 *
*****************************************************************
FD W24OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W24OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W24==.
*
*****************************************************************
* W25: PREF-OUT-25300B FB)(PREF-CODE=25 *
*****************************************************************
FD W25OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W25OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W25==.
*
*****************************************************************
* W98: ERROR-LOGVB *
*****************************************************************
FD W98OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W98OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W98==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA09S25'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W03OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W04OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W05OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W06OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W07OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W08OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W09OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W10OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W11OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W12OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W13OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W14OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W15OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W16OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W17OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W18OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W19OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W20OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W21OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W22OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W23OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W24OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W25OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W98OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
03 WRK-U06 PIC 9(008).
03 WRK-R01EOF PIC X(001).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY SHADATAC.
*** メッセージ編集出力SR用
COPY SHAMSGAC.
*** ABEND処理SR用
COPY SHAENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-R01EOF = '1'.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL.
OPEN OUTPUT W01OUTFIL
W02OUTFIL
W03OUTFIL
W04OUTFIL
W05OUTFIL
W06OUTFIL
W07OUTFIL
W08OUTFIL
W09OUTFIL
W10OUTFIL
W11OUTFIL
W12OUTFIL
W13OUTFIL
W14OUTFIL
W15OUTFIL
W16OUTFIL
W17OUTFIL
W18OUTFIL
W19OUTFIL
W20OUTFIL
W21OUTFIL
W22OUTFIL
W23OUTFIL
W24OUTFIL
W25OUTFIL
W98OUTFIL.
*
*** R01を読み込み
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (1.1) *
* サブモジュール名: R01読込処理 *
* 処理概要 : レコード読込・EOF判定処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
* 処理概要 : PREF-CODE判定→該当ファイル出力 *
*****************************************************************
2000MAJSOR SECTION.
*
PERFORM 2100SPLITSOR.
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: PREF-CODE判定分割出力 *
* 処理概要 : EVALUATEでPREF-CODEに応じたファイル出力 *
*****************************************************************
2100SPLITSOR SECTION.
*
EVALUATE R01PREF-CODE
WHEN 01
INITIALIZE W01OUTREC
MOVE R01PREF-CODE TO W01PREF-CODE
MOVE R01INSURER-CODE TO W01INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W01RPT-BODY
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
WHEN 02
INITIALIZE W02OUTREC
MOVE R01PREF-CODE TO W02PREF-CODE
MOVE R01INSURER-CODE TO W02INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W02RPT-BODY
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
WHEN 03
INITIALIZE W03OUTREC
MOVE R01PREF-CODE TO W03PREF-CODE
MOVE R01INSURER-CODE TO W03INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W03RPT-BODY
WRITE W03OUTREC
ADD 1 TO CUN-W03OUT
WHEN 04
INITIALIZE W04OUTREC
MOVE R01PREF-CODE TO W04PREF-CODE
MOVE R01INSURER-CODE TO W04INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W04RPT-BODY
WRITE W04OUTREC
ADD 1 TO CUN-W04OUT
WHEN 05
INITIALIZE W05OUTREC
MOVE R01PREF-CODE TO W05PREF-CODE
MOVE R01INSURER-CODE TO W05INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W05RPT-BODY
WRITE W05OUTREC
ADD 1 TO CUN-W05OUT
WHEN 06
INITIALIZE W06OUTREC
MOVE R01PREF-CODE TO W06PREF-CODE
MOVE R01INSURER-CODE TO W06INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W06RPT-BODY
WRITE W06OUTREC
ADD 1 TO CUN-W06OUT
WHEN 07
INITIALIZE W07OUTREC
MOVE R01PREF-CODE TO W07PREF-CODE
MOVE R01INSURER-CODE TO W07INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W07RPT-BODY
WRITE W07OUTREC
ADD 1 TO CUN-W07OUT
WHEN 08
INITIALIZE W08OUTREC
MOVE R01PREF-CODE TO W08PREF-CODE
MOVE R01INSURER-CODE TO W08INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W08RPT-BODY
WRITE W08OUTREC
ADD 1 TO CUN-W08OUT
WHEN 09
INITIALIZE W09OUTREC
MOVE R01PREF-CODE TO W09PREF-CODE
MOVE R01INSURER-CODE TO W09INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W09RPT-BODY
WRITE W09OUTREC
ADD 1 TO CUN-W09OUT
WHEN 10
INITIALIZE W10OUTREC
MOVE R01PREF-CODE TO W10PREF-CODE
MOVE R01INSURER-CODE TO W10INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W10RPT-BODY
WRITE W10OUTREC
ADD 1 TO CUN-W10OUT
WHEN 11
INITIALIZE W11OUTREC
MOVE R01PREF-CODE TO W11PREF-CODE
MOVE R01INSURER-CODE TO W11INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W11RPT-BODY
WRITE W11OUTREC
ADD 1 TO CUN-W11OUT
WHEN 12
INITIALIZE W12OUTREC
MOVE R01PREF-CODE TO W12PREF-CODE
MOVE R01INSURER-CODE TO W12INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W12RPT-BODY
WRITE W12OUTREC
ADD 1 TO CUN-W12OUT
WHEN 13
INITIALIZE W13OUTREC
MOVE R01PREF-CODE TO W13PREF-CODE
MOVE R01INSURER-CODE TO W13INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W13RPT-BODY
WRITE W13OUTREC
ADD 1 TO CUN-W13OUT
WHEN 14
INITIALIZE W14OUTREC
MOVE R01PREF-CODE TO W14PREF-CODE
MOVE R01INSURER-CODE TO W14INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W14RPT-BODY
WRITE W14OUTREC
ADD 1 TO CUN-W14OUT
WHEN 15
INITIALIZE W15OUTREC
MOVE R01PREF-CODE TO W15PREF-CODE
MOVE R01INSURER-CODE TO W15INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W15RPT-BODY
WRITE W15OUTREC
ADD 1 TO CUN-W15OUT
WHEN 16
INITIALIZE W16OUTREC
MOVE R01PREF-CODE TO W16PREF-CODE
MOVE R01INSURER-CODE TO W16INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W16RPT-BODY
WRITE W16OUTREC
ADD 1 TO CUN-W16OUT
WHEN 17
INITIALIZE W17OUTREC
MOVE R01PREF-CODE TO W17PREF-CODE
MOVE R01INSURER-CODE TO W17INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W17RPT-BODY
WRITE W17OUTREC
ADD 1 TO CUN-W17OUT
WHEN 18
INITIALIZE W18OUTREC
MOVE R01PREF-CODE TO W18PREF-CODE
MOVE R01INSURER-CODE TO W18INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W18RPT-BODY
WRITE W18OUTREC
ADD 1 TO CUN-W18OUT
WHEN 19
INITIALIZE W19OUTREC
MOVE R01PREF-CODE TO W19PREF-CODE
MOVE R01INSURER-CODE TO W19INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W19RPT-BODY
WRITE W19OUTREC
ADD 1 TO CUN-W19OUT
WHEN 20
INITIALIZE W20OUTREC
MOVE R01PREF-CODE TO W20PREF-CODE
MOVE R01INSURER-CODE TO W20INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W20RPT-BODY
WRITE W20OUTREC
ADD 1 TO CUN-W20OUT
WHEN 21
INITIALIZE W21OUTREC
MOVE R01PREF-CODE TO W21PREF-CODE
MOVE R01INSURER-CODE TO W21INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W21RPT-BODY
WRITE W21OUTREC
ADD 1 TO CUN-W21OUT
WHEN 22
INITIALIZE W22OUTREC
MOVE R01PREF-CODE TO W22PREF-CODE
MOVE R01INSURER-CODE TO W22INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W22RPT-BODY
WRITE W22OUTREC
ADD 1 TO CUN-W22OUT
WHEN 23
INITIALIZE W23OUTREC
MOVE R01PREF-CODE TO W23PREF-CODE
MOVE R01INSURER-CODE TO W23INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W23RPT-BODY
WRITE W23OUTREC
ADD 1 TO CUN-W23OUT
WHEN 24
INITIALIZE W24OUTREC
MOVE R01PREF-CODE TO W24PREF-CODE
MOVE R01INSURER-CODE TO W24INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W24RPT-BODY
WRITE W24OUTREC
ADD 1 TO CUN-W24OUT
WHEN 25
INITIALIZE W25OUTREC
MOVE R01PREF-CODE TO W25PREF-CODE
MOVE R01INSURER-CODE TO W25INSURER-CODE
STRING R01EMP-ID
R01EMP-NAME
R01OFFICE-NO
R01OFFICE-NAME
R01INSURER-CODE
R01INSURER-NAME
DELIMITED BY SIZE
INTO W25RPT-BODY
WRITE W25OUTREC
ADD 1 TO CUN-W25OUT
WHEN OTHER
INITIALIZE W98OUTREC
MOVE '01' TO W98ERR-CATEGORY
STRING 'INVALID PREF-CODE:'
R01PREF-CODE
DELIMITED BY SIZE
INTO W98ERR-DETAIL
WRITE W98OUTREC
ADD 1 TO CUN-W98OUT
END-EVALUATE.
*
2100SPLITSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : CLOSE WITH LOCK・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 出力ファイルCLOSE WITH LOCK
CLOSE R01INNFIL.
CLOSE W01OUTFIL WITH LOCK
W02OUTFIL WITH LOCK
W03OUTFIL WITH LOCK
W04OUTFIL WITH LOCK
W05OUTFIL WITH LOCK
W06OUTFIL WITH LOCK
W07OUTFIL WITH LOCK
W08OUTFIL WITH LOCK
W09OUTFIL WITH LOCK
W10OUTFIL WITH LOCK
W11OUTFIL WITH LOCK
W12OUTFIL WITH LOCK
W13OUTFIL WITH LOCK
W14OUTFIL WITH LOCK
W15OUTFIL WITH LOCK
W16OUTFIL WITH LOCK
W17OUTFIL WITH LOCK
W18OUTFIL WITH LOCK
W19OUTFIL WITH LOCK
W20OUTFIL WITH LOCK
W21OUTFIL WITH LOCK
W22OUTFIL WITH LOCK
W23OUTFIL WITH LOCK
W24OUTFIL WITH LOCK
W25OUTFIL WITH LOCK
W98OUTFIL.
*
*** 入出力件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA09R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA09W01-25 TOTAL' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA09W98(ERROR)' TO M00UMKDATS22-01.
MOVE CUN-W98OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (4.0) *
* サブモジュール名: メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* サブモジュールNO: (9.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+479
View File
@@ -0,0 +1,479 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. SHA10S10.
*****************************************************************
* システム名 : 社会保険管理システム *
* プログラムID : SHA10S10 *
* プログラム名 : 保険者別分割出力処理 *
* 作成日 : 2026-07-11 *
* 処理概要 : RPT-DATAをINSURER-CODE0199)で判定 *
* し、99個の出力ファイルに振り分けて出力。 *
* CLOSE WITH LOCKで各ファイルを確定する。 *
* *
* *
* 備考: 99ファイルの全SELECTは膨大となるため、本実装では *
* 001-010の10ファイルを代表定義。全99ファイルへの展開は *
* 本番IBM COBOLビルド時にジェネ生成で行う。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 2026-07-11 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL SHA10R01
ORGANIZATION IS SEQUENTIAL.
SELECT W01OUTFIL ASSIGN TO EXTERNAL SHA10W01
ORGANIZATION IS SEQUENTIAL.
SELECT W02OUTFIL ASSIGN TO EXTERNAL SHA10W02
ORGANIZATION IS SEQUENTIAL.
SELECT W03OUTFIL ASSIGN TO EXTERNAL SHA10W03
ORGANIZATION IS SEQUENTIAL.
SELECT W04OUTFIL ASSIGN TO EXTERNAL SHA10W04
ORGANIZATION IS SEQUENTIAL.
SELECT W05OUTFIL ASSIGN TO EXTERNAL SHA10W05
ORGANIZATION IS SEQUENTIAL.
SELECT W06OUTFIL ASSIGN TO EXTERNAL SHA10W06
ORGANIZATION IS SEQUENTIAL.
SELECT W07OUTFIL ASSIGN TO EXTERNAL SHA10W07
ORGANIZATION IS SEQUENTIAL.
SELECT W08OUTFIL ASSIGN TO EXTERNAL SHA10W08
ORGANIZATION IS SEQUENTIAL.
SELECT W09OUTFIL ASSIGN TO EXTERNAL SHA10W09
ORGANIZATION IS SEQUENTIAL.
SELECT W10OUTFIL ASSIGN TO EXTERNAL SHA10W10
ORGANIZATION IS SEQUENTIAL.
*** 銈ㄣ儵銉煎嚭鍔涚敤
SELECT W99OUTFIL ASSIGN TO EXTERNAL SHA10W98
ORGANIZATION IS SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01: RPT-DATA锛?00B FB锛? *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY SHA08REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* W01-W10: INSURER-OUT-01銆?0锛?00B FB锛? *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W01==.
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W02OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W02==.
FD W03OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W03OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W03==.
FD W04OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W04OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W04==.
FD W05OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W05OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W05==.
FD W06OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W06OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W06==.
FD W07OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W07OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W07==.
FD W08OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W08OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W08==.
FD W09OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W09OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W09==.
FD W10OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W10OUTREC.
COPY SHA09REC REPLACING ==(A)== BY ==W10==.
*
*****************************************************************
* W99: ERROR-LOG锛圴B锛? *
*****************************************************************
FD W99OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W99OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W99==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* 銈炽兂銈广偪銉炽儓闋樺煙 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'SHA10S10'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
*
*****************************************************************
* 銈偊銉炽偪闋樺煙 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W03OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W04OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W05OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W06OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W07OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W08OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W09OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W10OUT PIC S9(009) COMP-3 VALUE ZERO.
03 CUN-W99OUT PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 浣滄キ闋樺煙 *
*****************************************************************
01 WRKARA.
03 WRK-U06 PIC 9(008).
03 WRK-R01EOF PIC X(001).
01 WRK-RPT-BODY-BUFFER.
03 WRK-BUF-EMP-ID PIC 9(008).
03 WRK-BUF-EMP-NAME PIC X(040).
03 WRK-BUF-OFFICE-NO PIC X(004).
03 WRK-BUF-OFFICE-NAME PIC X(040).
03 WRK-BUF-INSURER-NAME PIC X(060).
03 WRK-BUF-MONTHLY-AMOUNT PIC 9(009).
03 WRK-BUF-GRADE-CODE PIC 9(002).
03 WRK-BUF-REPORT-TYPE PIC X(002).
03 WRK-BUF-REPORT-DATE PIC 9(008).
03 WRK-BUF-FILLER PIC X(121).
*
*****************************************************************
* 銈点儢銉椼儹銈般儵銉犻€g怠闋樺煙 *
*****************************************************************
*** 閬嬬敤鏃ヤ粯鍙栧緱
COPY SHADATAC.
COPY SHAMSGAC.
COPY SHAENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (0.0) *
* 銈点儢銉偢銉ャ兗銉悕: 鍒跺尽鍑︾悊 *
* 鍑︾悊姒傝 : 銉°偆銉炽偝銉炽儓銉兗銉嚘鐞? *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-R01EOF = '1'.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (1.0) *
* 銈点儢銉偢銉ャ兗銉悕: 鍒濇湡鍑︾悊 *
* 鍑︾悊姒傝 : 闁嬪銉°儍銈汇兗銈稿嚭鍔涖兓鍚勭ó鍒濇湡鍖栧嚘鐞? *
*****************************************************************
1000ITTSOR SECTION.
*
*** 闁嬪銉°儍銈汇兗銈稿嚭鍔? INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** 銈炽兂銉戙偆銉棩鏅傚嚭鍔? INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 銉兗銈偍銉偄鍒濇湡鍖? INITIALIZE WRKARA.
*
*** 閬嬬敤鏃ヤ粯鍙栧緱
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 鍏ュ嚭鍔涖儠銈°偆銉玂PEN
OPEN INPUT R01INNFIL.
OPEN OUTPUT W01OUTFIL
W02OUTFIL
W03OUTFIL
W04OUTFIL
W05OUTFIL
W06OUTFIL
W07OUTFIL
W08OUTFIL
W09OUTFIL
W10OUTFIL
W99OUTFIL.
*
*** R01銈掕銇胯炯銇? PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (1.1) *
* 銈点儢銉偢銉ャ兗銉悕: R01瑾炯鍑︾悊 *
* 鍑︾悊姒傝 : 銉偝銉笺儔瑾炯銉籈OF鍒ゅ畾鍑︾悊 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (2.0) *
* 銈点儢銉偢銉ャ兗銉悕: 涓诲嚘鐞? *
* 鍑︾悊姒傝 : INSURER-CODE鍒ゅ畾鈫掕┎褰撱儠銈°偆銉嚭鍔? *
*****************************************************************
2000MAJSOR SECTION.
*
PERFORM 2100SPLITSOR.
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (2.1) *
* 銈点儢銉偢銉ャ兗銉悕: INSURER-CODE鍒ゅ畾鍒嗗壊鍑哄姏 *
* 鍑︾悊姒傝 : EVALUATE銇NSURER-CODE銇繙銇樸仸銉曘偂銈ゃ儷鍑哄姏 *
* 001-099銇俱仹99銉曘偂銈ゃ儷銆傚叏99WHEN灞曢枊銇? *
* 銈炽兗銉夌敓鎴愩儎銉笺儷銇ц銇嗐€傛湰瀹熻銇唬琛?0浠躲€? *
*****************************************************************
2100SPLITSOR SECTION.
*
* RPT-BODY妲嬬瘔
MOVE R01EMP-ID TO WRK-BUF-EMP-ID.
MOVE R01EMP-NAME TO WRK-BUF-EMP-NAME.
MOVE R01OFFICE-NO TO WRK-BUF-OFFICE-NO.
MOVE R01OFFICE-NAME TO WRK-BUF-OFFICE-NAME.
MOVE R01INSURER-NAME TO WRK-BUF-INSURER-NAME.
MOVE R01MONTHLY-AMOUNT TO WRK-BUF-MONTHLY-AMOUNT.
MOVE R01GRADE-CODE TO WRK-BUF-GRADE-CODE.
MOVE R01REPORT-TYPE TO WRK-BUF-REPORT-TYPE.
MOVE R01REPORT-DATE TO WRK-BUF-REPORT-DATE.
MOVE R01FILLER TO WRK-BUF-FILLER.
*
EVALUATE R01INSURER-CODE
WHEN '001'
INITIALIZE W01OUTREC
MOVE R01PREF-CODE TO W01PREF-CODE
MOVE R01INSURER-CODE TO W01INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W01RPT-BODY
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
WHEN '002'
INITIALIZE W02OUTREC
MOVE R01PREF-CODE TO W02PREF-CODE
MOVE R01INSURER-CODE TO W02INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W02RPT-BODY
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
WHEN '003'
INITIALIZE W03OUTREC
MOVE R01PREF-CODE TO W03PREF-CODE
MOVE R01INSURER-CODE TO W03INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W03RPT-BODY
WRITE W03OUTREC
ADD 1 TO CUN-W03OUT
WHEN '004'
INITIALIZE W04OUTREC
MOVE R01PREF-CODE TO W04PREF-CODE
MOVE R01INSURER-CODE TO W04INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W04RPT-BODY
WRITE W04OUTREC
ADD 1 TO CUN-W04OUT
WHEN '005'
INITIALIZE W05OUTREC
MOVE R01PREF-CODE TO W05PREF-CODE
MOVE R01INSURER-CODE TO W05INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W05RPT-BODY
WRITE W05OUTREC
ADD 1 TO CUN-W05OUT
WHEN '006'
INITIALIZE W06OUTREC
MOVE R01PREF-CODE TO W06PREF-CODE
MOVE R01INSURER-CODE TO W06INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W06RPT-BODY
WRITE W06OUTREC
ADD 1 TO CUN-W06OUT
WHEN '007'
INITIALIZE W07OUTREC
MOVE R01PREF-CODE TO W07PREF-CODE
MOVE R01INSURER-CODE TO W07INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W07RPT-BODY
WRITE W07OUTREC
ADD 1 TO CUN-W07OUT
WHEN '008'
INITIALIZE W08OUTREC
MOVE R01PREF-CODE TO W08PREF-CODE
MOVE R01INSURER-CODE TO W08INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W08RPT-BODY
WRITE W08OUTREC
ADD 1 TO CUN-W08OUT
WHEN '009'
INITIALIZE W09OUTREC
MOVE R01PREF-CODE TO W09PREF-CODE
MOVE R01INSURER-CODE TO W09INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W09RPT-BODY
WRITE W09OUTREC
ADD 1 TO CUN-W09OUT
WHEN '010'
INITIALIZE W10OUTREC
MOVE R01PREF-CODE TO W10PREF-CODE
MOVE R01INSURER-CODE TO W10INSURER-CODE
MOVE WRK-RPT-BODY-BUFFER TO W10RPT-BODY
WRITE W10OUTREC
ADD 1 TO CUN-W10OUT
WHEN OTHER
INITIALIZE W99OUTREC
MOVE '01' TO W99ERR-CATEGORY
STRING 'INVALID INSURER:'
R01INSURER-CODE
DELIMITED BY SIZE
INTO W99ERR-DETAIL
WRITE W99OUTREC
ADD 1 TO CUN-W99OUT
END-EVALUATE.
*
2100SPLITSOR-EXT.
EXIT.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (3.0) *
* 銈点儢銉偢銉ャ兗銉悕: 绲備簡鍑︾悊 *
* 鍑︾悊姒傝 : CLOSE WITH LOCK銉讳欢鏁板嚭鍔? *
*****************************************************************
3000STPSOR SECTION.
*
*** 鍏ュ嚭鍔涖儠銈°偆銉獵LOSE
CLOSE R01INNFIL.
CLOSE W01OUTFIL WITH LOCK
W02OUTFIL WITH LOCK
W03OUTFIL WITH LOCK
W04OUTFIL WITH LOCK
W05OUTFIL WITH LOCK
W06OUTFIL WITH LOCK
W07OUTFIL WITH LOCK
W08OUTFIL WITH LOCK
W09OUTFIL WITH LOCK
W10OUTFIL WITH LOCK
W99OUTFIL.
*
*** 鍏ュ嚭鍔涗欢鏁板嚭鍔? INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'SHA10R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA10W01-10 TOTAL' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'SHA10W98(ERROR)' TO M00UMKDATS22-01.
MOVE CUN-W99OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 绲備簡銉°儍銈汇兗銈稿嚭鍔? INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (4.0) *
* 銈点儢銉偢銉ャ兗銉悕: 銉°儍銈汇兗銈哥法闆嗗嚭鍔涘嚘鐞? *
* 鍑︾悊姒傝 : 銉°儍銈汇兗銈哥法闆嗗嚭鍔涖偟銉朠GM鍛煎嚭 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*
*****************************************************************
* 銈点儢銉偢銉ャ兗銉玁O: (9.9) *
* 銈点儢銉偢銉ャ兗銉悕: ABEND鍑︾悊 *
* 鍑︾悊姒傝 : ABEND銈点儢PGM鍛煎嚭 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
@@ -0,0 +1,48 @@
# SHA01CVT 使用資源一覧
## プログラム概要
- **プログラムID**: SHA01CVT
- **プログラム名**: 被保険者資格データ変換処理
- **処理概要**: ASCII CSVの被保険者資格データをINSPECT CONVERTINGでEBCDIC固定長に変換する。半角桁数チェックを内部処理として実施。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA01R01 | INS-CSV-ASCII | 順編成 | F (固定長) | 500B | なし(自前定義) |
| SHA01W01 | INSURED-DATA | 順編成 | F (固定長) | 200B | SHA01REC |
| SHA01W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA01REC | INSURED-DATA レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| SHACHKAC | 項目チェックサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
| SUB04CHK | 日付/数値妥当性チェック | 2020HALFSOR |
## 使用DB2テーブル
なし(DB操作なし)
## 処理フロー
1. 初期処理(開始メッセージ→コンパイル日時出力→ワーク初期化→SUB01DAT運用日取得→OPEN→初回読込)
2. 主処理:R01終了まで繰り返し
- CSV分解(UNSTRINGでカンマ区切り→各項目)
- 半角桁数チェック(氏名カナ20/被保険者番号10/事業所番号4/日付妥当性/数値妥当性→エラーはW02出力)
- ASCII→EBCDIC変換(変換テーブルで各バイト変換→INSURED-DATAレコードにMOVE
- W01(INSURED-DATA)出力
- R01次件READ
3. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,51 @@
# SHA02MNC 使用資源一覧
## プログラム概要
- **プログラムID**: SHA02MNC
- **プログラム名**: 従業員保険情報統合処理
- **処理概要**: DB2 EMP-MASTERとINSURANCE-RATESをマッチングし、従業員単位に統合出力する(M:N→M件マッチング)。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA02W01 | EMP-INSURANCE | 順編成 | F (固定長) | 200B | SHA02REC |
| SHA02W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA02REC | EMP-INSURANCE レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| SQLCA | SQL通信領域 | WORKING-STORAGE |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| SHACHKAC | 項目チェックサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
| SUB04CHK | PARM検証 | 1000ITTSOR |
## 使用DB2テーブル
| DB名 | テーブル名 | I/O | 備考 |
|------|-----------|:---:|------|
| SALARYDB | EMP-MASTER | I | 従業員マスタ(SELECT |
| INSURANCEDB | INSURANCE-RATES | I | 料率テーブル(内部表LOAD) |
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日取得→PARM取得→DB接続→INSURANCE-RATES内部表LOAD→EMP-MASTER CURSOR OPEN/初回FETCH→出力ファイルOPEN
2. 主処理:EMP-MASTER終了まで繰り返し
- 内部表線形探索(BASE-SALARYに合致するGRADE-CODE特定→該当なしはW02出力)
- 種別判定(DEPT-CODEでHEALTH-INS-TYPE/PENSION-TYPE判定)
- INSURER-CODE設定
- W01(EMP-INSURANCE)出力
- 次従業員FETCH
3. 終了処理(CLOSE CURSOR→ファイルCLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,50 @@
# SHA03MNP 使用資源一覧
## プログラム概要
- **プログラムID**: SHA03MNP
- **プログラム名**: 保険料計算明細出力処理
- **処理概要**: EMP-INSURANCE×INSURANCE-RATESの直積組合せにより保険料計算明細を出力する(M:N→M×N件出力)。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA03R01 | EMP-INSURANCE | 順編成 | F (固定長) | 200B | SHA02REC |
| SHA03W01 | INS-DETAIL | 順編成 | F (固定長) | 300B | SHA03REC |
| SHA03W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA02REC | EMP-INSURANCE レコード定義(R01入力ファイル) | FILE SECTION |
| SHA03REC | INS-DETAIL レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| SQLCA | SQL通信領域 | WORKING-STORAGE |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
| DB名 | テーブル名 | I/O | 備考 |
|------|-----------|:---:|------|
| INSURANCEDB | INSURANCE-RATES | I | 料率取得(内部表LOAD |
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日取得→PARM取得→DB接続→INSURANCE-RATES内部表LOAD→OPEN→R01初回READ
2. 主処理:R01終了まで繰り返し
- 直積組合せ生成:従業員×全RATESエントリ
- 健康保険: HEALTH-PREMIUM = MONTHLY-AMOUNT × HEALTH-RATE (ROUNDED)
- 厚生年金: PENSION-PREMIUM = MONTHLY-AMOUNT × PENSION-RATE (ROUNDED)
- W01(INS-DETAIL)出力
- R01次件READ
3. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,53 @@
# SHA04TWO 使用資源一覧
## プログラム概要
- **プログラムID**: SHA04TWO
- **プログラム名**: 事業所保険者マッチング処理
- **処理概要**: INSURED-DATAをOFFICE-MST/INSURER-MSTの2段階で1:1マッチングし、GRADED-LIST/UNMATCHED-LISTを出力する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA04R01 | INSURED-DATA | 順編成 | F (固定長) | 200B | SHA01REC |
| SHA04R02 | OFFICE-MST | 順編成 | F (固定長) | 80B | なし(自前定義) |
| SHA04R03 | INSURER-MST | 順編成 | F (固定長) | 80B | なし(自前定義) |
| SHA04W01 | GRADED-LIST | 順編成 | F (固定長) | 200B | SHA04REC |
| SHA04W02 | UNMATCHED-LIST | 順編成 | F (固定長) | 200B | なし(自前定義) |
| SHA04W03 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA01REC | INSURED-DATA レコード定義(R01入力ファイル) | FILE SECTION |
| SHA04REC | GRADED-LIST レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W03出力ファイル) | FILE SECTION |
| SQLCA | SQL通信領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
| DB名 | テーブル名 | I/O | 備考 |
|------|-----------|:---:|------|
| INSURANCEDB | INSURED-MASTER | I | 履歴整合性確認 |
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日取得→OPEN→R02全件読込→OFFICE-TBL格納→R03全件読込→INSURER-TBL格納→DB接続→R01初回READ
2. 主処理:R01終了まで繰り返し
- 第1段階マッチング:OFFICE-NO vs OFFICE-TBL線形探索→成功なら第2段階、失敗ならW02出力
- 第2段階マッチング:INSURER-CODE vs INSURER-TBL線形探索→成功ならW01出力、失敗ならW02出力
- DB2整合性検証:W01出力時INSURED-MASTER SELECT、異常はW03出力
- R01次件READ
3. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,46 @@
# SHA05TWN 使用資源一覧
## プログラム概要
- **プログラムID**: SHA05TWN
- **プログラム名**: 標準報酬月額等級判定処理
- **処理概要**: SALARY-MONTHLYをEMP-IDでN:1キーブレイク集約し、平均標準報酬月額とGRADE-TBLをN:1マッチングして等級改定を判定する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA05R01 | SALARY-MONTHLY | 順編成 | F (固定長) | 200B | なし(自前定義) |
| SHA05R02 | GRADE-TBL | 順編成 | F (固定長) | 80B | なし(自前定義) |
| SHA05W01 | REVISED-GRADE | 順編成 | F (固定長) | 200B | SHA05REC |
| SHA05W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA05REC | REVISED-GRADE レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
なし(DB操作なし)
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日取得→PARM取得→OPEN→R02全件読込→GRADE-TBL格納→R01初回READ
2. 主処理:R01終了まで繰り返し
- 第1段階:キーブレイクN:1集約(同一EMP-ID: MONTHLY-AMOUNT累積→キー変更時: DIVIDEで平均標準報酬月額算出、TYPE='A'/'B'判定→該当なしはW02出力)
- 第2段階:等級テーブルN:1マッチング(GRADE-TBL線形探索→平均額に合致する等級コード取得→該当なしはW02出力、OLD≠NEWならW01出力)
- WRK-ACCUM INITIALIZE
- R01次件READ
3. 終了処理(最終キーグループ処理→CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,51 @@
# SHA06TWM 使用資源一覧
## プログラム概要
- **プログラムID**: SHA06TWM
- **プログラム名**: 保険料率適用・控除計算処理
- **処理概要**: EMP-INSURANCEをDB2 INSURANCE-RATESM×N)とAPPLICABLE-RULESM:N)の2段階マッチングにより保険料を算出しDEDUCTED-RESULTを出力する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA06R01 | EMP-INSURANCE | 順編成 | F (固定長) | 200B | SHA02REC |
| SHA06R02 | APPLICABLE-RULES | 順編成 | F (固定長) | 80B | なし(自前定義) |
| SHA06W01 | DEDUCTED-RESULT | 順編成 | F (固定長) | 300B | SHA06REC |
| SHA06W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA02REC | EMP-INSURANCE レコード定義(R01入力ファイル) | FILE SECTION |
| SHA06REC | DEDUCTED-RESULT レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| SQLCA | SQL通信領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
| DB名 | テーブル名 | I/O | 備考 |
|------|-----------|:---:|------|
| INSURANCEDB | INSURANCE-RATES | I | 料率取得(SELECT |
| SALARYDB | EMP-MASTER | I | 誕生日・扶養人数・地域コード取得(SELECT) |
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日取得→OPEN→DB接続→R02全件読込→RULE-TBL格納→R01初回READ
2. 主処理:R01終了まで繰り返し
- 第1段階:保険料率M×Nマッチング(GRADE-CODEでDB2 INSURANCE-RATES SELECT→料率取得、保険料計算)
- 第2段階:適用ルールM:Nマッチング(年齢算出→RULE-TBL線形探索→料率調整→保険料再計算)
- W01(DEDUCTED-RESULT)出力
- R01次件READ
3. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,52 @@
# SHA07KBR 使用資源一覧
## プログラム概要
- **プログラムID**: SHA07KBR
- **プログラム名**: 資格異動キーブレイク処理
- **処理概要**: DB2 QUALIFICATION-CHANGESから資格異動データをFETCHし、従業員ごと(1:N)かつ保険者コード変更時(異キー)にキーブレイクしてサマリ・明細を出力する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA07W01 | CHG-SUMMARY | 順編成 | F (固定長) | 200B | SHA07REC |
| SHA07W02 | CHG-DETAIL | 順編成 | F (固定長) | 200B | SHA07REC |
| SHA07W03 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA07REC | CHG-SUMMARY/CHG-DETAIL レコード定義(W01/W02出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W03出力ファイル) | FILE SECTION |
| SQLCA | SQL通信領域 | WORKING-STORAGE |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
| DB名 | テーブル名 | I/O | 備考 |
|------|-----------|:---:|------|
| INSURANCEDB | QUALIFICATION-CHANGES | I | DECLARE CURSOR / FETCHJOIN with EMP-MASTER |
| SALARYDB | EMP-MASTER | I | JOIN取得(従業員名) |
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日取得→OPEN→DB接続→CURSOR宣言(ORDER BY EMP-ID, CHG-DATE)→初回FETCH→WS-PREV初期設定)
2. 主処理:FETCH終了まで繰り返し
- EMP-ID主キーブレイク判定:前回≠今回→サマリレコード出力
- INSURER-CODE異キーブレイク判定:前回≠今回→サマリレコード出力
- 明細レコード出力(全FETCHレコード)
- WS-PREV更新→次件FETCH
3. 最終グループ処理(最終従業員グループのサマリ/明細出力)
4. 終了処理(CLOSE CURSOR→DISCONNECT→ファイルCLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,47 @@
# SHA08SRT 使用資源一覧
## プログラム概要
- **プログラムID**: SHA08SRT
- **プログラム名**: 届出書データSORT編集処理
- **処理概要**: GRADED-LISTをINPUT PROCEDUREで全件RELEASEし、MONTHLY-AMOUNT/GRADE-CODEを保持したままPREF-CODE・OFFICE-NO・EMP-ID昇順SORT後、OUTPUT PROCEDUREでRETURNしてRPT-DATA出力する。GRADED-LISTはSHA04TWOのマッチング成功レコードであり全件有効のためSTATUSフィルタは不要。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA08R01 | GRADED-LIST | 順編成 | F (固定長) | 200B | SHA04REC |
| SORTWORK | SD-SORTWORK | — | — | 200B | なし(自前SD定義) |
| SHA08W01 | RPT-DATA | 順編成 | F (固定長) | 300B | SHA08REC |
| SHA08W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA04REC | GRADED-LIST レコード定義(R01入力ファイル) | FILE SECTION |
| SHA08REC | RPT-DATA レコード定義(W01出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
なし(DB操作なし)
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日付取得→出力ファイルOPEN→入力ファイルOPEN)
2. SORT実行
- INPUT PROCEDURE: R01全件読込→MONTHLY-AMOUNT/GRADE-CODEを含め全項目をSORTRECに転記→全件RELEASE
- SORT KEY: PREF-CODE昇順、OFFICE-NO昇順、EMP-ID昇順
- OUTPUT PROCEDURE: RETURN→SHA08REC編集(MONTHLY-AMOUNT/GRADE-CODEはSR→W01転記)→REPORT-TYPE/REPORT-DATE設定→W01出力
3. SORT結果判定(RETURN-CODE≠0→ABEND
4. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,46 @@
# SHA09S25 使用資源一覧
## プログラム概要
- **プログラムID**: SHA09S25
- **プログラム名**: 都道府県支部別分割出力処理
- **処理概要**: RPT-DATAをPREF-CODE0125)で判定し、25個の出力ファイルに振り分けて出力する。CLOSE WITH LOCKで各ファイルを確定する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA09R01 | RPT-DATA | 順編成 | F (固定長) | 300B | SHA08REC |
| SHA09W01W25 | PREF-OUT-0125 | 順編成 | F (固定長) | 300B | SHA09REC |
| SHA09W98 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA08REC | RPT-DATA レコード定義(R01入力ファイル) | FILE SECTION |
| SHA09REC | PREF-OUT レコード定義(W01W25出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W98出力ファイル) | FILE SECTION |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
なし(DB操作なし)
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日付取得→OPENR01+W01W25+W98)→R01初回READ
2. 主処理:R01終了まで繰り返し
- PREF-CODE判定(EVALUATE PREF-CODE 0125)→該当ファイルにWRITE
- SHA09REC編集: PREF-CODE/INSURER-CODE/RPT-BODY設定
- R01次件READ
- PREF-CODE範囲外(0125以外)→W98(ERROR-LOG)出力
3. 終了処理(CLOSE WITH LOCK→件数出力→終了メッセージ)
@@ -0,0 +1,46 @@
# SHA10S10 使用資源一覧
## プログラム概要
- **プログラムID**: SHA10S10
- **プログラム名**: 保険者別分割出力処理
- **処理概要**: RPT-DATAをINSURER-CODE001010)で判定し、10個の出力ファイルに振り分けて出力する。CLOSE WITH LOCKで各ファイルを確定する。本実装は代表10ファイル(001-010)で定義。エラーファイルはW99DD名SHA10W98)。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| SHA10R01 | RPT-DATA | 順編成 | F (固定長) | 300B | SHA08REC |
| SHA10W01W10 | INSURER-OUT-0110 | 順編成 | F (固定長) | 300B | SHA09REC |
| SHA10W98 | ERROR-LOG(識別子:W99OUTFIL | 順編成 | V (可変長) | 200B | ZAN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| SHA08REC | RPT-DATA レコード定義(R01入力ファイル) | FILE SECTION |
| SHA09REC | INSURER-OUT レコード定義(W01W10出力ファイル) | FILE SECTION |
| ZAN05REC | エラーログレコード定義(W98出力ファイル) | FILE SECTION |
| SHADATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| SHAMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| SHAENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
なし(DB操作なし)
## 処理フロー
1. 初期処理(開始メッセージ→SUB01DAT運用日付取得→OPENR01+W01W99+W98)→R01初回READ
2. 主処理:R01終了まで繰り返し
- INSURER-CODE判定(EVALUATE INSURER-CODE 001〜010)→該当ファイルにWRITE
- SHA09REC編集: PREF-CODE/INSURER-CODE/RPT-BODY設定
- R01次件READ
- INSURER-CODE範囲外(001〜010以外)→W99(ERROR-LOG/DD:SHA10W98)出力
3. 終了処理(CLOSE WITH LOCK→件数出力→終了メッセージ)
@@ -0,0 +1,456 @@
# 社会保険管理システム 設計書(サブシステムD)
## システム概要
本サブシステムは、日本年金機構・健康保険組合からの被保険者資格データを起点に、
標準報酬月額の算定・変更(定時決定・月変・随時改定)、社会保険料の計算、
資格異動管理、届出書類の作成・出力を行う。
給与計算サブシステム(C)と連携し、給与データを基にした月変・随時改定処理を実現する。
### サブシステム情報
| 項目 | 内容 |
|------|------|
| サブシステムID | SHA(社会保険→SHAkai Hoken |
| COBOLプログラム数 | 10 |
| JCL数 | 9 |
| DB | 1INSURANCEDB / DB2、5テーブル) |
### システム定数
| 定数 | 値 | 説明 |
|------|-----|------|
| HEALTH-INS-SPLIT | 0.50 | 健康保険料折半率(50%事業主負担) |
| PENSION-SPLIT | 0.50 | 厚生年金保険料折半率(50%事業主負担) |
| PREFECTURE-COUNT | 25 | 都道府県グループ数(協会けんぽ支部) |
| INSURER-MAX | 100 | 最大保険者数 |
| HALF-WIDTH-LIMIT | 20 | 氏名カナ最大桁数(半角) |
| TEISI-TEIJI-MONTHS | 3 | 定時決定対象月数(4-6月の3ヶ月) |
| GETSUHEN-GRADE-DIFF | 2 | 月変該当等級差(2等級以上変動) |
### サブシステム間連携
| 連携データ | 出力元 | 入力先 | 方式 | 備考 |
|-----------|--------|--------|------|------|
| INSURED-CSV-ASCII(被保険者資格データ) | 外部(年金機構・健保組合) | SHAJ010 | ファイル連携 | ASCII CSV、外部システムから受信 |
| SALARY-MONTHLY(給与月額データ) | C-サブシステム KYU06UPD | SHAJ050 | ファイル連携 | 月変・定時決定用給与明細(200B) |
| INS-DETAIL(標準報酬月額明細) | SHA03MNP | C-サブシステム KYU05DED | ファイル連携 | 控除計算用保険料明細(300B) |
| RPT-DATA(届出書データ) | SHA08SRT | 外部(年金事務所) | ファイル連携 | 算定基礎届・月変届・資格喪失届 |
---
## ファイル一覧
| # | ファイル名 | 編成 | RECM | サイズ | 用途 | 区分 |
|---|-----------|------|------|-------|------|------|
| 1 | INS-CSV-ASCII | SEQUENTIAL | FB | 可変 | 被保険者資格データ(ASCII CSV、外部受信) | 新規 |
| 2 | INSURED-DATA | SEQUENTIAL | FB | 200 | 被保険者EBCDIC固定長 | 新規 |
| 3 | EMP-INSURANCE | SEQUENTIAL | FB | 200 | 従業員×保険種別統合データ | 新規 |
| 4 | OFFICE-MST | SEQUENTIAL | FB | 80 | 事業所マスタ(事業所番号→都道府県・事業所名称) | 新規 |
| 5 | INSURER-MST | SEQUENTIAL | FB | 80 | 保険者マスタ(保険者コード→保険者名称・支部番号) | 新規 |
| 6 | GRADE-TBL | SEQUENTIAL | FB | 80 | 標準報酬等級テーブル | 新規 |
| 7 | GRADED-LIST | SEQUENTIAL | FB | 200 | 事業所・保険者情報付与被保険者一覧 | 新規 |
| 8 | UNMATCHED-LIST | SEQUENTIAL | FB | 200 | マッチング不一致データ | 新規 |
| 9 | SALARY-MONTHLY | SEQUENTIAL | FB | 200 | 給与月額データ(Cサブシステム出力) | C連携 |
| 10 | REVISED-GRADE | SEQUENTIAL | FB | 200 | 月変・随時改定結果 | 新規 |
| 11 | INS-DETAIL | SEQUENTIAL | FB | 300 | 保険料計算詳細(従業員×保険種別 M×N件) | 新規 |
| 12 | GRADE-INSURED | SEQUENTIAL | FB | 300 | 等級×従業員×料率組合せ(M:N→M:N中間結果) | 新規 |
| 13 | DEDUCTED-RESULT | SEQUENTIAL | FB | 300 | 保険料確定結果(M:N→M:N最終出力) | 新規 |
| 14 | CHG-SUMMARY | SEQUENTIAL | FB | 200 | 資格異動サマリ(キーブレイク後) | 新規 |
| 15 | CHG-DETAIL | SEQUENTIAL | FB | 200 | 資格異動明細 | 新規 |
| 16 | RPT-DATA | SEQUENTIAL | FB | 300 | 届出書データ(SORT後) | 新規 |
| 17 | PREF-OUT-01〜25 | SEQUENTIAL | FB | 300 | 都道府県支部別出力(25分割) | 新規 |
| 18 | INSURER-OUT-01〜99 | SEQUENTIAL | FB | 300 | 保険者別出力(100分割) | 新規 |
| 19 | APPLICABLE-RULES | SEQUENTIAL | FB | 80 | 適用条件テーブル(年齢・扶養・地域別) | 新規 |
| 20 | SD-SORTWORK | — | — | — | SORT作業用ファイル(I-O-CONTROL SAME SORT AREA指定) | 新規 |
| 21 | ERROR-LOG | SEQUENTIAL | VB | 最大200 | エラーレコード退避 | A・B・C共用 |
### DB二重対応
本サブシステムのDB操作はDB2の埋め込みSQL(`EXEC SQL`)で直接記述する。
5テーブルは同一DB2インスタンス内の別スキーマ(INSURANCEDB)で管理する。
CサブシステムのSALARYDBEMP-MASTER)は`SALARYDB.EMP-MASTER`でクロススキーマ参照する。
### 共通関数利用方針
既存のサブプログラム(SUB01DAT〜SUB05TIM)は本サブシステムでも利用する。
連絡領域のCOPY書式はサブシステム別に`SHADATAC``SHAMSGAC``SHAENDAC``SHACHKAC`を新規作成する。
---
## DB構成(INSURANCEDB
### DB名称:社会保険管理データベース(INSURANCEDB
#### テーブル1INSURED-MASTER(被保険者マスタ)
| カラム | 型 | 内容 |
|--------|---|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| INSURED-NO | CHAR(10) | 被保険者番号(番号体系:健康保険+厚生年金で共通) |
| OFFICE-NO | CHAR(4) | 事業所番号 |
| INSURER-CODE | CHAR(4) | 保険者コード |
| HEALTH-INS-TYPE | CHAR(1) | 健康保険種別(1=協会けんぽ / 2=組合健保) |
| PENSION-TYPE | CHAR(1) | 年金種別(1=厚生年金 / 2=共済) |
| BASE-MONTHLY | DECIMAL(9,0) | 現行標準報酬月額 |
| GRADE-CODE | CHAR(2) | 現行等級コード |
| STATUS | CHAR(1) | 状態(0=在籍 / 9=喪失) |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル2INSURANCE-RATES(保険料率テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| GRADE-CODE | CHAR(2) | 標準報酬等級コード(PK) |
| MONTHLY-FROM | DECIMAL(9,0) | 標準報酬月額下限 |
| MONTHLY-TO | DECIMAL(9,0) | 標準報酬月額上限 |
| HEALTH-RATE | DECIMAL(7,6) | 健康保険料率(折半後従業員負担率) |
| PENSION-RATE | DECIMAL(7,6) | 厚生年金保険料率(折半後従業員負担率) |
| EFFECTIVE-FROM | CHAR(6) | 適用開始年月 YYYYMMPK |
| EFFECTIVE-TO | CHAR(6) | 適用終了年月 YYYYMMPK、999999=無期限) |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル3GRADE-HISTORY(標準報酬等級履歴)
| カラム | 型 | 内容 |
|--------|---|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMMPK |
| GRADE-CODE | CHAR(2) | 等級コード |
| MONTHLY-AMOUNT | DECIMAL(9,0) | 標準報酬月額 |
| CHANGE-TYPE | CHAR(1) | 変更要因(1=定時決定 / 2=月変 / 3=随時改定) |
| PREV-GRADE | CHAR(2) | 変更前等級コード |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル4QUALIFICATION-CHANGES(資格異動テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| CHG-ID | INTEGER | 異動IDPK、自動採番) |
| EMP-ID | CHAR(8) | 社員番号 |
| CHG-DATE | CHAR(8) | 異動日 YYYYMMDD |
| CHG-TYPE | CHAR(2) | 異動種別(01=取得 / 02=喪失 / 03=種別変更 / 04=住所変更) |
| INSURER-CODE | CHAR(4) | 異動先保険者コード |
| PREV-INSURER | CHAR(4) | 異動元保険者コード |
| REASON | VARCHAR(100) | 異動理由 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル5INSURER-MASTER(保険者マスタ)
| カラム | 型 | 内容 |
|--------|---|------|
| INSURER-CODE | CHAR(4) | 保険者コード(PK |
| INSURER-NAME | VARCHAR(60) | 保険者名称 |
| PREF-CODE | CHAR(2) | 都道府県支部コード(01〜25) |
| INSURER-TYPE | CHAR(1) | 保険者種別(1=協会けんぽ / 2=組合健保 / 3=共済) |
| UPDATED-AT | TIMESTAMP | 更新日時 |
---
## 処理フロー
```
╞══ SHAJ010 ═══════════════════════════════════╡
│ SHA01CVTASCII→EBCDIC変換) PGMパターン: 29
│ INSPECT CONVERTING X"00"..."FF" TO X"00"..."FF" で変換
│ 被保険者番号・事業所番号の桁数チェック(内部処理)
│ SUB04CHK で数値妥当性チェック
├── 正常 → INSURED-DATA200B EBCDIC固定長)
└── 異常 → ERROR-LOG
╞══ SHAJ020 ═══════════════════════════════════╡
│ SHA02MNCM:N→M件マッチング) PGMパターン: 18
│ EMP-MASTERDB2 SALARYDB.EMP-MASTER SELECT)×
│ INSURANCE-RATESDB2 INSURANCEDB.INSURANCE-RATES SELECT
│ M件の従業員 × N件の保険種別料率 → 従業員単位に統合
│ SEARCH ALL で該当GRADE-CODEを内部表検索
│ 社員番号昇順に出力
├── → EMP-INSURANCE200B 従業員単位1件)
└── 異常 → ERROR-LOG
╞══ SHAJ030 ═══════════════════════════════════╡
│ SHA03MNPM:N→M×N件直積出力) PGMパターン: 20
│ EMP-INSURANCE × INSURANCE-RATES(内部表LOAD
│ 全従業員 × 全保険種別の直積出力(M×N件)
│ 従業員ごとに健康保険・厚生年金・雇用保険の保険料明細を生成
├── → INS-DETAIL300B 全組合せ明細)
└── 異常 → ERROR-LOG
╞══ SHAJ040 ═══════════════════════════════════╡
│ SHA04TWO2段階1:1→1:1マッチング) PGMパターン: 16
│ 第1段階: INSURED-DATA × OFFICE-MST(事業所マスタ)
│  事業所番号一致→事業所名称・都道府県コード付加
│ 第2段階: 中間結果 × INSURER-MST(保険者マスタ)
│  保険者コード一致→保険者名称・支部コード付加
│ DB2参照: INSURED-MASTER(履歴整合性確認)
│ PROGRAM-ID IS INITIAL 指定
│ USAGE PACKED-DECIMAL で金額項目定義
├── → GRADED-LIST(200B 事業所・保険者情報付き)
├── → UNMATCHED-LIST200B 不一致データ)
└── 異常 → ERROR-LOG
╞══ SHAJ050 ═══════════════════════════════════╡
│ SHA05TWN2段階N:1→N:1マッチング) PGMパターン: 17
│ 第1段階: SALARY-MONTHLY(複数月N件→社員別平均N:1)
│  同一社員の複数月給与(定時決定:4-6月、月変:直近3月)を平均
 ADD TO + END-ADD で累積、DIVIDE GIVING REMAINDER で平均
│ 第2段階: 平均値×GRADE-TBLN:1で等級判定)
│  平均標準報酬月額が該当する等級コードを特定
│  現行等級と比較し2等級以上変動→月変該当
├── → REVISED-GRADE200B 改定結果)
└── 異常 → ERROR-LOG
╞══ SHAJ060 ═══════════════════════════════════╡
│ SHA06TWM2段階M:N→M:Nマッチング) PGMパターン: 22
│ 第1段階: EMP-INSURANCE(M) × INSURANCE-RATES(N)
│  全従業員×全料率の組合せから該当する等級料率を特定
│  → GRADE-INSUREDM:N 中間ファイル)
│ 第2段階: GRADE-INSURED(M:N) × APPLICABLE-RULES(N)
│  年齢・扶養人数・地域コード等の条件で正しい料率を確定
│  通常MOVEで構造体転記(MOVE CORRは不使用)
├── → DEDUCTED-RESULT300B 保険料確定結果)
└── 異常 → ERROR-LOG
╞══ SHAJ070 ═══════════════════════════════════╡
│ SHA07KBR1:N+異キーキーブレイク) PGMパターン: 33
│ DB2 QUALIFICATION-CHANGES からEXEC SQL SELECT
│ 同一従業員内(1:N)で保険者コード(異キー)変更時キーブレイク
│ 保険者変更を検出した時点でサマリ出力、それ以外は明細出力
│ SUB04CHKSUB02MSG でCALL(通常CALL、CANCEL不使用)
├── → CHG-SUMMARY200B 保険者別異動サマリ)
├── → CHG-DETAIL200B 全異動明細)
└── 異常 → ERROR-LOG
╞══ SHAJ080 ═══════════════════════════════════╡
│ SHA08SRTSORT INPUT/OUTPUT PROCEDURE PGMパターン: 34
│ SD-SORTWORK + SORT文
│ I-O-CONTROL. SAME SORT AREA FOR SD-SORTWORK
│ INPUT PROCEDURE: GRADED-LIST読込+届出対象抽出(STATUS=0)
│ OUTPUT PROCEDURE: 届出書形式に編集 + 集計
│ RETURN-CODE でSORT結果判定
│ RELEASE + RETURN 文でSORTデータ引渡し・受取
├── → RPT-DATA300B 届出書データ)
└── 異常 → ERROR-LOG
╞══ SHAJ090 ═══════════════════════════════════╡
│ SHA09S2525分割) PGMパターン: 11
│ RPT-DATA を都道府県支部コード(PREF-CODE 01〜25)で分割
│ SELECT ... ORGANIZATION IS SEQUENTIAL(明示的宣言)
│ CLOSE WITH LOCK で出力ファイル確定
├── → PREF-OUT-01〜25
└── 異常 → ERROR-LOG
╞══ SHAJ100 ═══════════════════════════════════╡
│ SHA10S10100分割) PGMパターン: 12
│ RPT-DATA を保険者コード(INSURER-CODE 001〜099)で分割
│ CLOSE WITH LOCK で出力ファイル確定
├── → INSURER-OUT-01〜99
└── 異常 → ERROR-LOG
```
---
## JCL
### SHAJ010 — 被保険者データ受信変換
```jcl
//SHAJ010 JOB (ACCT),'被保険者データ変換',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: ASCII→EBCDIC変換(Type 29
//*=====================================================================
//STEP010 EXEC PGM=SHA01CVT,PARM='YEARMONTH=&YEARMONTH'
//SHA01R01 DD DSN=INS-CSV-ASCII.DAT,DISP=SHR
//SHA01W01 DD DSN=INSURED-DATA.DAT,DISP=(NEW,CATLG)
//SHA01W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### SHAJ020 — 保険マッチングM件
```jcl
//SHAJ020 JOB (ACCT),'保険マッチングM件',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: M:N→M件(Type 18
//*=====================================================================
//STEP010 EXEC PGM=SHA02MNC,PARM='YEARMONTH=&YEARMONTH'
//SHA02W01 DD DSN=EMP-INSURANCE.DAT,DISP=(NEW,CATLG)
//SHA02W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//* DB2参照(EMP-MASTERINSURANCE-RATES)のためDD不要
```
### SHAJ030 — M:N直積出力
```jcl
//SHAJ030 JOB (ACCT),'M:N直積出力',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: M:N→M×N件(Type 20
//*=====================================================================
//STEP010 EXEC PGM=SHA03MNP,PARM='YEARMONTH=&YEARMONTH'
//SHA03R01 DD DSN=EMP-INSURANCE.DAT,DISP=(OLD,DELETE)
//SHA03W01 DD DSN=INS-DETAIL.DAT,DISP=(NEW,CATLG)
//SHA03W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//* INSURANCE-RATESは内部表LOADのためDB2参照(DD不要)
```
### SHAJ040 — 2段階1:1事業所・保険者判定
```jcl
//SHAJ040 JOB (ACCT),'事業所・保険者判定',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: 2段階1:1→1:1Type 16
//*=====================================================================
//STEP010 EXEC PGM=SHA04TWO,PARM='YEARMONTH=&YEARMONTH'
//SHA04R01 DD DSN=INSURED-DATA.DAT,DISP=(OLD,DELETE)
//SHA04R02 DD DSN=OFFICE-MST.DAT,DISP=SHR
//SHA04R03 DD DSN=INSURER-MST.DAT,DISP=SHR
//SHA04W01 DD DSN=GRADED-LIST.DAT,DISP=(NEW,CATLG)
//SHA04W02 DD DSN=UNMATCHED-LIST.DAT,DISP=(NEW,PASS)
//SHA04W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### SHAJ050 — 定時決定・月変改定
```jcl
//SHAJ050 JOB (ACCT),'定時決定・月変改定',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: 2段階N:1→N:1Type 17
//*=====================================================================
//STEP010 EXEC PGM=SHA05TWN,PARM='YEARMONTH=&YEARMONTH'
//SHA05R01 DD DSN=SALARY-MONTHLY.DAT,DISP=SHR
//SHA05R02 DD DSN=GRADE-TBL.DAT,DISP=SHR
//SHA05W01 DD DSN=REVISED-GRADE.DAT,DISP=(NEW,CATLG)
//SHA05W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### SHAJ060 — 保険料確定(2段階M:N)
```jcl
//SHAJ060 JOB (ACCT),'保険料確定',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: 2段階M:N→M:NType 22
//*=====================================================================
//STEP010 EXEC PGM=SHA06TWM,PARM='YEARMONTH=&YEARMONTH'
//SHA06R01 DD DSN=EMP-INSURANCE.DAT,DISP=SHR
//SHA06R02 DD DSN=APPLICABLE-RULES.DAT,DISP=SHR
//SHA06W01 DD DSN=DEDUCTED-RESULT.DAT,DISP=(NEW,CATLG)
//SHA06W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//* INSURANCE-RATESはDB2参照
```
### SHAJ070 — 資格異動処理
```jcl
//SHAJ070 JOB (ACCT),'資格異動処理',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: 1:N+異キーキーブレイク(Type 33)
//*=====================================================================
//STEP010 EXEC PGM=SHA07KBR,PARM='YEARMONTH=&YEARMONTH'
//SHA07W01 DD DSN=CHG-SUMMARY.DAT,DISP=(NEW,CATLG)
//SHA07W02 DD DSN=CHG-DETAIL.DAT,DISP=(NEW,PASS)
//SHA07W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//* QUALIFICATION-CHANGESはDB2 SELECTDD不要)
```
### SHAJ080 — 届出書作成(SORT
```jcl
//SHAJ080 JOB (ACCT),'届出書作成',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: SORT INPUT/OUTPUT PROCEDUREType 34
//*=====================================================================
//STEP010 EXEC PGM=SHA08SRT,PARM='YEARMONTH=&YEARMONTH'
//SHA08R01 DD DSN=GRADED-LIST.DAT,DISP=SHR
//SHA08W01 DD DSN=RPT-DATA.DAT,DISP=(NEW,CATLG)
//SHA08W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//* SD-SORTWORKはプログラム内SORT作業ファイル(JCL DD不要)
```
### SHAJ090 — 都道府県支部別分割出力(25分割)
```jcl
//SHAJ090 JOB (ACCT),'支部別分割出力',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: 25分割(Type 11
//*=====================================================================
//STEP010 EXEC PGM=SHA09S25,PARM='YEARMONTH=&YEARMONTH'
//SHA09R01 DD DSN=RPT-DATA.DAT,DISP=(OLD,DELETE)
//SHA09W01 DD DSN=PREF-OUT-01.DAT,DISP=(NEW,CATLG)
//SHA09W02 DD DSN=PREF-OUT-02.DAT,DISP=(NEW,CATLG)
// ...
//SHA09W25 DD DSN=PREF-OUT-25.DAT,DISP=(NEW,CATLG)
//SHA09W98 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### SHAJ100 — 保険者別分割出力(100分割)
```jcl
//SHAJ100 JOB (ACCT),'保険者別分割出力',CLASS=A
//*
//SETPARM SET YEARMONTH=202605
//*=====================================================================
//* STEP010: 100分割(Type 12
//*=====================================================================
//STEP010 EXEC PGM=SHA10S10,PARM='YEARMONTH=&YEARMONTH'
//SHA10R01 DD DSN=RPT-DATA.DAT,DISP=(OLD,DELETE)
//SHA10W01 DD DSN=INSURER-OUT-01.DAT,DISP=(NEW,CATLG)
//SHA10W02 DD DSN=INSURER-OUT-02.DAT,DISP=(NEW,CATLG)
// ...
//SHA10W99 DD DSN=INSURER-OUT-99.DAT,DISP=(NEW,CATLG)
//SHA10W98 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
---
## プログラム一覧
| # | PGM-ID | PGMパターン | 機能概要 | 使用COPY | DBアクセス | CALL先 |
|:-:|:------:|:----------:|---------|:--------:|:---------:|:------:|
| 1 | SHA01CVT | 29 ASCII→EBCDIC変換 | ASCII CSVをINSPECT CONVERTINGでEBCDIC固定長に変換 | SHA01REC, SHADATAC, SHAMSGAC, SHAENDAC, SHACHKAC | なし | SUB01DAT, SUB02MSG, SUB03END, SUB04CHK |
| 2 | SHA02MNC | 18 M:N→M件 | 従業員×保険種別→従業員単位統合 | SHA02REC, SHADATAC, SHAMSGAC, SHAENDAC, SHACHKAC | あり(EMP-MASTER SELECT, INSURANCE-RATES SELECT | SUB01DAT, SUB02MSG, SUB03END, SUB04CHK |
| 3 | SHA03MNP | 20 M:N→M×N件 | 従業員×保険種別→全組合せ明細 | SHA03REC, SHADATAC, SHAMSGAC, SHAENDAC | あり(INSURANCE-RATES SELECT→内部表LOAD | SUB01DAT, SUB02MSG, SUB03END |
| 4 | SHA04TWO | 16 2段階1:1→1:1 | 事業所マッチング→保険者マッチング | SHA04REC, SHADATAC, SHAMSGAC, SHAENDAC | あり(INSURED-MASTER SELECT, GRADE-HISTORY SELECT | SUB01DAT, SUB02MSG, SUB03END |
| 5 | SHA05TWN | 17 2段階N:1→N:1 | 定時決定・月変改定(複数月平均→等級判定) | SHA05REC, SHADATAC, SHAMSGAC, SHAENDAC | なし | SUB01DAT, SUB02MSG, SUB03END |
| 6 | SHA06TWM | 22 2段階M:N→M:N | M従業員×N料率→適用条件で確定 | SHA06REC, SHADATAC, SHAMSGAC, SHAENDAC | あり(INSURANCE-RATES SELECT | SUB01DAT, SUB02MSG, SUB03END |
| 7 | SHA07KBR | 33 1:N+異キーKB | 資格異動処理、保険者コード変更時KB | SHA07REC, SHADATAC, SHAMSGAC, SHAENDAC | あり(QUALIFICATION-CHANGES SELECT | SUB01DAT, SUB02MSG, SUB03END, SUB04CHK |
| 8 | SHA08SRT | 34 SORT IP/OP | SORT + INPUT/OUTPUT PROCEDURE | SHA08REC, SHADATAC, SHAMSGAC, SHAENDAC | なし(SORT文、I-O-CONTROL SAME SORT AREA | SUB01DAT, SUB02MSG, SUB03END |
| 9 | SHA09S25 | 11 25分割 | 都道府県支部別分割出力 | SHA09REC, SHADATAC, SHAMSGAC, SHAENDAC | なし | SUB01DAT, SUB02MSG, SUB03END |
| 10 | SHA10S10 | 12 100分割 | 保険者別分割出力 | SHA09REC, SHADATAC, SHAMSGAC, SHAENDAC | なし | SUB01DAT, SUB02MSG, SUB03END |
---
## COPY書式一覧
| # | COPY ID | 用途 | サイズ | 備考 |
|:-:|:--------|:----:|:------:|------|
| 1 | SHA01REC | INSURED-DATA レコード | 200 | SHA01CVT出力、SHA04TWO入力 |
| 2 | SHA02REC | EMP-INSURANCE レコード | 200 | SHA02MNC出力、SHA03MNP/SHA06TWM入力 |
| 3 | SHA03REC | INS-DETAIL レコード | 300 | SHA03MNP出力 |
| 4 | SHA04REC | GRADED-LIST レコード | 200 | SHA04TWO出力、SHA08SRT入力 |
| 5 | SHA05REC | REVISED-GRADE レコード | 200 | SHA05TWN出力 |
| 6 | SHA06REC | DEDUCTED-RESULT レコード | 300 | SHA06TWM出力 |
| 7 | SHA07REC | CHG-SUMMARY/CHG-DETAIL レコード | 200 | SHA07KBR出力 |
| 8 | SHA08REC | RPT-DATA レコード | 300 | SHA08SRT出力、SHA09S25/SHA10S10入力 |
| 9 | SHA09REC | PREF-OUT/INSURER-OUT レコード | 300 | SHA09S25/SHA10S10出力 |
| 10 | SHADATAC | SUB01DAT連絡領域 | — | CALL I/F |
| 11 | SHAMSGAC | SUB02MSG連絡領域 | — | CALL I/F |
| 12 | SHAENDAC | SUB03END連絡領域 | — | CALL I/F |
| 13 | SHACHKAC | SUB04CHK連絡領域 | — | CALL I/F |
+135
View File
@@ -0,0 +1,135 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA01CVT |
| 3 | プログラム名 | 被保険者資格データ変換処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 29ASCII→EBCDIC変換) |
| 6 | 機能概要 | 日本年金機構・健康保険組合から受信した被保険者資格データ(ASCII CSV)をEBCDIC固定長レコードに変換する。 |
| 7 | | 変換テーブルを用いてASCIIコードからEBCDICコードに変換。 |
| 8 | | 出力レコードの項目桁数チェック(半角桁数)を内部処理として行う。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | INS-CSV-ASCII | ソート不要。ASCIIコード、カンマ区切り、LF改行 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | INS-CSV-ASCII | R01 | SHA01R01 | I | 自前 | F | | 可変 | PS | ASCII CSV、カンマ区切り |
| 2 | INSURED-DATA | W01 | SHA01W01 | O | SHA01REC | FB | | 200 | PS | EBCDIC固定長 |
| 3 | ERROR-LOG | W02 | SHA01W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | INS-CSV-ASCII | なし | なし |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | SHADATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | SHAMSGAC |
| 3 | ABEND処理SUB | SUB03END | SHAENDAC |
| 4 | 項目チェックSUB | SUB04CHK | SHACHKAC |
---
## 処理詳細
```
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.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.CSVの分解
UNSTRINGでカンマ区切りのCSVを各項目に分解する。(2010CSVSOR)
2-2.半角桁数チェック(2020HALFSOR
2-2-1.氏名カナ(半角20桁以内)チェック。超過→W02出力
2-2-2.被保険者番号(半角10桁以内)チェック。超過→W02出力
2-2-3.事業所番号(半角4桁以内)チェック。超過→W02出力
2-2-4.日付妥当性チェック(SUB04CHK)。エラー→W02出力
2-2-5.数値妥当性チェック(SUB04CHK)。エラー→W02出力
2-3.ASCII→EBCDIC変換(2030CNVSOR
2-3-1.変換テーブル(WORKING-STORAGEに定義)を使用し各バイトを変換
2-3-2.USAGE BINARYでテーブルインデックスを管理
2-3-3.変換後INSURED-DATAレコードにMOVE
2-4.W01出力(2040WRTSOR
2-5.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/INSURED-DATA
SHA01REC.cpyに従う。EBCDIC固定長200B。
| No | 項目名 | 属性 | 設定元 | 備考 |
|----|--------|------|--------|------|
| 1 | 社員番号 | 9(8) | CSV同項目を変換後設定 | |
| 2 | 被保険者番号 | X(10) | CSV同項目を変換後設定 | 半角10桁以内 |
| 3 | 事業所番号 | X(4) | CSV同項目を変換後設定 | 半角4桁以内 |
| 4 | 保険者コード | X(4) | CSV同項目を変換後設定 | |
| 5 | 氏名 | X(40) | CSV同項目を変換後設定 | |
| 6 | 氏名カナ | X(20) | CSV同項目を変換後設定 | 半角20桁以内 |
| 7 | 生年月日 | 9(8) | CSV同項目を変換後設定 | |
| 8 | 性別 | X(1) | CSV同項目を変換後設定 | |
| 9 | 資格取得日 | 9(8) | CSV同項目を変換後設定 | |
| 10 | 健康保険種別 | X(1) | CSV同項目を変換後設定 | |
| 11 | 年金種別 | X(1) | CSV同項目を変換後設定 | |
| 12 | ステータス | X(1) | CSV同項目を変換後設定 | |
| 13 | 予約 | X(94) | LOW-VALUES固定 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
+167
View File
@@ -0,0 +1,167 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA02MNC |
| 3 | プログラム名 | 従業員保険情報統合処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 18M:N→M件マッチング) |
| 6 | 機能概要 | DB2 EMP-MASTERSALARYDB)の従業員情報とINSURANCE-RATESの標準報酬等級テーブルをマッチングし、 |
| 7 | | 従業員単位(M件)に統合したEMP-INSURANCEレコードを出力する。 |
| 8 | | SEARCH/内部表を用いた等級判定により、標準報酬月額・等級コードを付与する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|---------------|------|
| 1 | DB2 INSURANCE-RATES | EFFECTIVE-FROMEFFECTIVE-TOに該当月が含まれること |
| 2 | DB2 EMP-MASTER (SALARYDB) | 社員番号(EMP-ID)昇順ソート(DB2 ORDER BY |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EMP-INSURANCE | W01 | SHA02W01 | O | SHA02REC | FB | | 200 | PS | 従業員保険情報(M件) |
| 2 | ERROR-LOG | W02 | SHA02W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
| 3 | INSURANCEDB | DB | — | I | — | DB2 | — | — | DASD | DB2: INSURANCE-RATES |
| 4 | SALARYDB (参照) | DB | — | I | — | DB2 | — | — | DASD | DB2: EMP-MASTER(クロススキーマ) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | EMP-MASTER | EMP-ID | なし(主処理は1件ずつFETCH) |
| 2 | INSURANCE-RATES | GRADE-CODE | MONTHLY-FROMMONTHLY-TOにBASE-SALARYが含まれること(範囲検索) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | SHADATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | SHAMSGAC |
| 3 | ABEND処理SUB | SUB03END | SHAENDAC |
| 4 | PARM検証SUB | SUB04CHK | SHACHKAC |
---
## 処理詳細
```
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.PARM取得(YEARMONTH
1-6.DB接続
EXEC SQL CONNECT TO 'data/INSURANCE.db'
1-7.INSURANCE-RATES内部表LOAD1200RATELDASOR
DECLARE C1 CURSOR FOR
SELECT GRADE-CODE, MONTHLY-FROM, MONTHLY-TO,
HEALTH-RATE, PENSION-RATE
FROM INSURANCE-RATES
WHERE EFFECTIVE-FROM <= :WRK-YEAR-MONTH
AND EFFECTIVE-TO >= :WRK-YEAR-MONTH
ORDER BY GRADE-CODE
OPEN C1
PERFORM UNTIL SQLCODE≠0
FETCH C1 INTO :DBV-xxx
MOVE TO WRK-INS-RATES(WS-COUNT)
ADD 1 TO WS-COUNT
END-PERFORM
CLOSE C1
1-8.EMP-MASTERカーソル宣言・OPEN・初回FETCH
DECLARE C2 CURSOR FOR
SELECT EMP-ID, EMP-NAME, DEPT-CODE, BASE-SALARY
FROM SALARYDB.EMP-MASTER
ORDER BY EMP-ID
OPEN C2
FETCH C2 INTO :DBV-xxx1300EMPFETCSOR
1-9.出力ファイルのオープン
2.主処理(2000MAJSOR)(EMP-MASTERを全て読み終えるまで下記を繰り返す)
2-1.内部表検索(2010SRCHSOR
SEARCH(線形探索)でWRK-INS-RATESから
WRK-MONTHLY-FROM <= DBV-BASE-SALARY
かつ WRK-MONTHLY-TO >= DBV-BASE-SALARY
を満たすGRADE-CODEを特定する。
該当なし→ERROR-LOG出力(W02)→次従業員へ
2-2.種別判定(2000MAJSOR内でインライン実装)
DEPT-CODEによりEVALUATEでHEALTH-INS-TYPE/PENSION-TYPEを判定
DEPT-CODE 01-10HEALTH-INS-TYPE='1' PENSION-TYPE='1'
DEPT-CODE 11-20HEALTH-INS-TYPE='2' PENSION-TYPE='1'
DEPT-CODE 21-30HEALTH-INS-TYPE='1' PENSION-TYPE='2'
上記以外:HEALTH-INS-TYPE='9' PENSION-TYPE='9'
2-3.INSURER-CODE設定
簡易判定:DEPT-CODEにより設定(01台→'0001', 11台→'0002', 21台→'0003'
2-4.W01出力
MOVE DBV-xxx + 検索結果 + 種別判定結果 → W01OUTREC
WRITE W01OUTREC
2-5.次従業員FETCH1300EMPFETCSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.カーソルクローズ
CLOSE C2
3-2.出力ファイルのクローズ
3-3.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'EMP-MASTER'
PARM2CUN-DB-EMP
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA02W01'
PARM2CUN-W01OUT
PARM1'SHA02W02'
PARM2CUN-W02OUT
3-4.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/EMP-INSURANCE
SHA02REC.cpyに従う。200B固定長。
| No | 項目名 | 属性 | 設定元 | 備考 |
|----|--------|------|--------|------|
| 1 | EMP-ID | 9(8) | DBV-EMP-IDEMP-MASTER | |
| 2 | EMP-NAME | X(40) | DBV-EMP-NAMEEMP-MASTER | |
| 3 | DEPT-CODE | 9(2) | DBV-DEPT-CODEEMP-MASTER | |
| 4 | BASE-SALARY | 9(9) | DBV-BASE-SALARYEMP-MASTER | |
| 5 | MONTHLY-AMOUNT | 9(9) | INSURANCE-RATES該当レコードの範囲中央値 | 標準報酬月額 |
| 6 | GRADE-CODE | 9(2) | INSURANCE-RATES該当レコードの等級コード | SEARCH結果 |
| 7 | HEALTH-INS-TYPE | X(1) | DEPT-CODEによる判定結果 | '1'=協会けんぽ / '2'=組合健保 / '9'=その他 |
| 8 | PENSION-TYPE | X(1) | DEPT-CODEによる判定結果 | '1'=厚生年金 / '2'=共済 / '9'=その他 |
| 9 | INSURER-CODE | X(4) | DEPT-CODEによる簡易設定 | 事業所所属保険者 |
| 10 | FILLER | X(124) | LOW-VALUES固定 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容(EMP-ID + エラー詳細) |
+153
View File
@@ -0,0 +1,153 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA03MNP |
| 3 | プログラム名 | 保険料計算明細出力処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 20M:N→M×N件直積出力) |
| 6 | 機能概要 | EMP-INSURANCESHA02MNC出力)の従業員情報とINSURANCE-RATESの料率を組合せ、 |
| 7 | | 従業員ごとに健康保険・厚生年金の保険料明細をM×N件(全組合せ)出力する。 |
| 8 | | 各組合せについて標準報酬月額×料率で保険料を算出する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|---------------|------|
| 1 | EMP-INSURANCE | ソート済であること(SHA02MNC出力) |
| 2 | DB2 INSURANCE-RATES | EFFECTIVE-FROMEFFECTIVE-TOに該当月が含まれること |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EMP-INSURANCE | R01 | SHA03R01 | I | SHA02REC | FB | | 200 | PS | 従業員保険情報(SHA02MNC出力) |
| 2 | INS-DETAIL | W01 | SHA03W01 | O | SHA03REC | FB | | 300 | PS | 保険料計算明細(M×N件) |
| 3 | ERROR-LOG | W02 | SHA03W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
| 4 | INSURANCEDB | DB | — | I | — | DB2 | — | — | DASD | DB2: INSURANCE-RATES |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | EMP-INSURANCE | EMP-ID(既定) | なし(ファイル順次読込) |
| 2 | INSURANCE-RATES | GRADE-CODE | 全件組合せ(直積) |
### 使用モジュール一覧
| 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.PARM取得(YEARMONTH
1-6.DB接続
EXEC SQL CONNECT TO 'data/INSURANCE.db'
1-7.INSURANCE-RATES内部表LOAD1200RATELDASOR
DECLARE C1 CURSOR FOR
SELECT GRADE-CODE, MONTHLY-FROM, MONTHLY-TO,
HEALTH-RATE, PENSION-RATE
FROM INSURANCE-RATES
WHERE EFFECTIVE-FROM <= :WRK-YEAR-MONTH
AND EFFECTIVE-TO >= :WRK-YEAR-MONTH
ORDER BY GRADE-CODE
OPEN C1
PERFORM UNTIL SQLCODE≠0
FETCH C1 INTO :DBV-xxx
MOVE TO WRK-INS-RATES(WS-COUNT)
ADD 1 TO WS-COUNT
END-PERFORM
CLOSE C1
1-8.使用ファイルのオープン
1-9.R01を読み込む。(1300R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.直積組合せ生成+W01出力(2000MAJSOR内でインライン実装)
取得した従業員レコードに対し、WRK-INS-RATESの全エントリを
PERFORM VARYINGで走査し、以下の組合せレコードを生成する。
【健康保険(INSURANCE-TYPE='1')】
HEALTH-PREMIUM = MONTHLY-AMOUNT × HEALTH-RATEROUNDED
PENSION-PREMIUM = 0
【厚生年金(INSURANCE-TYPE='2')】
PENSION-PREMIUM = MONTHLY-AMOUNT × PENSION-RATEROUNDED
HEALTH-PREMIUM = 0
2-2.W01出力
各組合せのSHA03RECをWRITE2-1と同一ループ内)
2-3.エラー発生時は2100ERROUTSORでW02(ERROR-LOG)出力
2-3.R01を読み込む。(1300R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'SHA03R01'
PARM2CUN-R01INN
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA03W01'
PARM2CUN-W01OUT
PARM1'SHA03W02'
PARM2CUN-W02OUT
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/INS-DETAIL
SHA03REC.cpyに従う。300B固定長。
| No | 項目名 | 属性 | 設定元 | 備考 |
|----|--------|------|--------|------|
| 1 | EMP-ID | 9(8) | R01.EMP-ID | |
| 2 | EMP-NAME | X(40) | R01.EMP-NAME | |
| 3 | INSURANCE-TYPE | X(1) | 固定 | '1'=健康保険 / '2'=厚生年金 |
| 4 | GRADE-CODE | 9(2) | WRK-INS-RATES.GRADE-CODE | 料率該当等級 |
| 5 | MONTHLY-AMOUNT | 9(9) | R01.MONTHLY-AMOUNT | 標準報酬月額(従業員の該当額) |
| 6 | HEALTH-RATE | 9(7) | WRK-INS-RATES.HEALTH-RATE | 健康保険料率 |
| 7 | PENSION-RATE | 9(7) | WRK-INS-RATES.PENSION-RATE | 厚生年金料率 |
| 8 | HEALTH-PREMIUM | 9(9) | MONTHLY-AMOUNT × HEALTH-RATE | 健康保険料(従業員負担分) |
| 9 | PENSION-PREMIUM | 9(9) | MONTHLY-AMOUNT × PENSION-RATE | 厚生年金保険料(従業員負担分) |
| 10 | FILLER | X(208) | LOW-VALUES固定 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
+159
View File
@@ -0,0 +1,159 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 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 |
+147
View File
@@ -0,0 +1,147 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA05TWN |
| 3 | プログラム名 | 標準報酬月額等級判定処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(N:1→N:1 2段階) |
| 6 | 機能概要 | 月額給与データ(SALARY-MONTHLY)を社員番号(EMP-ID)でN:1集約し、平均標準報酬月額を算出する。 |
| 7 | | 第1段階(N:1):社員番号キーブレイクで月額給与を平均化 |
| 8 | | 第2段階(N:1):平均標準報酬月額と等級テーブル(GRADE-TBL)をマッチングし、等級改定判定を実施 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01SALARY-MONTHLY | 社員番号(EMP-ID)+対象年月(YEAR-MONTH)の昇順ソート済 |
| 2 | ファイルR02GRADE-TBL | 等級コード(GRADE-CODE)の昇順ソート済、重複なし |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | SALARY-MONTHLY | R01 | SHA05R01 | I | 自前(200B) | FB | | 200 | PS | 月額給与データ(Cサブシステム由来) |
| 2 | GRADE-TBL | R02 | SHA05R02 | I | 自前(80B) | FB | | 80 | PS | 等級定義テーブル |
| 3 | REVISED-GRADE | W01 | SHA05W01 | O | SHA05REC | FB | | 200 | PS | 等級改定結果 |
| 4 | ERROR-LOG | W02 | SHA05W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | EMP-ID + YEAR-MONTH | EMP-ID(第1段階キーブレイク, N:1) |
| 2 | ファイルR02 | GRADE-CODE | 平均標準報酬月額(第2段階, N: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.ワークエリアの初期化
PARM(対象年月 YYYYMM)をACCEPT COMMAND-LINEから取得
未設定時はデフォルト'202607'を使用
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R02GRADE-TBL)を全件読み込み、内部テーブル(GRADE-TBL)に格納する。(1110R02LDASOR
1-7.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.第1段階:キーブレイクN:1集約(2010KEYBRSOR
2-1-1.同一EMP-IDのレコードを集約
2-1-2.MONTHLY-AMOUNTをADD TOで累積加算
2-1-3.COUNTをADD 1でカウント
2-1-4.グループ内の月数をカウント(WRK-MONTH-COUNT
2-1-5.キー変更時(新EMP-ID検出)、以下の処理を実行
2-1-5-1.WRK-TOTAL ÷ WRK-COUNT = 平均標準報酬月額
DIVIDE WRK-TOTAL BY WRK-COUNT GIVING WRK-AVG
REMAINDER WRK-REM
2-1-5-2.定時決定(4-6ヶ月平均)or 月変(3ヶ月平均)の判定
IF WRK-MONTH-COUNT >= 4 → 定時決定(TYPE='A'
IF WRK-MONTH-COUNT = 3 → 月変(TYPE='B'
ELSE → ERROR-LOGに出力
2-2.第2段階:等級テーブルN:1マッチング(2020GRADSOR
2-2-1.GRADE-TBLを平均標準報酬月額で線形探索
IF WRK-AVG >= MONTHLY-FROM AND WRK-AVG <= MONTHLY-TO
→ 該当等級コードを取得
2-2-2.該当等級なし→ ERROR-LOGに出力
2-2-3.該当等級あり→ 現在の等級と比較
2-2-3-1.現在等級はGRADE-HISTORYから取得(直近有効レコード)
2-2-3-2.OLD-GRADE ≠ NEW-GRADEの場合:REVISED-GRADEに出力
REVISED-TYPE='A'(定時決定:4-6ヶ月平均)/'B'(月変:3ヶ月平均)
2-2-3-3.OLD-GRADE = NEW-GRADEの場合:出力なし(変更不要)
2-2-4.WRK-ACCUMをINITIALIZEし、次のキーブレイクに備える
2-3.次のR01読み込み→次のキーグループへ(1100R01INNSOR
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.最終キーグループの処理(最終レコードの集約結果出力)
3-3.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-4.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/REVISED-GRADE
SHA05REC.cpyに従う。200B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01.EMP-ID | キーブレイク元の社員番号 |
| 2 | EMP-NAME | R01.EMP-NAME | キーブレイク元の氏名 |
| 3 | REVISED-YM | PARM(対象年月) | |
| 4 | OLD-GRADE | GRADE-HISTORYより取得 | 変更前等級 |
| 5 | NEW-GRADE | GRADE-TBLより取得 | 変更後等級 |
| 6 | AVG-STD-MONTHLY | 第1段階算出値 | DIVIDE結果(整数) |
| 7 | REVISED-TYPE | 'A'=定時決定/'B'=月変 | |
| 8 | FILLER | 初期値 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | エラー種別 |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容(EMP-ID + エラー理由) |
+153
View File
@@ -0,0 +1,153 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA06TWM |
| 3 | プログラム名 | 保険料率適用・控除計算処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(M:N→M:N 2段階) |
| 6 | 機能概要 | 従業員保険情報データ(EMP-INSURANCE)をもとに、DB2 INSURANCE-RATESとAPPLICABLE-RULESの2段階M:Nマッチングで保険料を算出する。 |
| 7 | | 第1段階(M×N):各従業員の給与等級に対応する保険料率をDB2より取得し、保険料を計算 |
| 8 | | 第2段階(M:N):年齢・扶養人数・地域コードの条件に合致する適用ルールを探索し、料率を調整後、控除結果を出力 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01EMP-INSURANCE | 社員番号(EMP-ID)の昇順ソート済 |
| 2 | ファイルR02APPLICABLE-RULES | ルールコード(RULE-CODE)の昇順ソート済 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EMP-INSURANCE | R01 | SHA06R01 | I | SHA02REC | FB | | 200 | PS | 従業員保険情報 |
| 2 | APPLICABLE-RULES | R02 | SHA06R02 | I | 自前(80B) | FB | | 80 | PS | 適用ルール定義テーブル |
| 3 | DEDUCTED-RESULT | W01 | SHA06W01 | O | SHA06REC | FB | | 300 | PS | 保険料確定結果 |
| 4 | ERROR-LOG | W02 | SHA06W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
| 5 | INSURANCEDB | DB | — | I | — | DB2 | — | — | DASD | DB2: INSURANCE-RATES |
| 6 | SALARYDB | DB | — | I | — | DB2 | — | — | DASD | DB2: EMP-MASTER(誕生日・扶養人数・地域コード取得) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | EMP-ID | EMP-ID(第1段階) |
| 2 | ファイルR02 | RULE-CODE | 年齢・扶養人数・地域コード(第2段階, M:N) |
### 使用モジュール一覧
| 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.DB接続
EXEC SQL CONNECT TO 'data/INSURANCEDB.db'
1-7.R02APPLICABLE-RULES)を全件読み込み、内部テーブル(RULE-TBL)に格納する。(1110R02LDASOR
1-8.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.第1段階:保険料率M×Nマッチング(DB2 INSURANCE-RATES)(2010RATESOR
2-1-1.EMP-INSURANCEのGRADE-CODE(等級コード)をもとに
DB2 INSURANCE-RATESテーブルをSELECT
2-1-2.SQLCODE=0の場合→健康保険料率・厚生年金保険料率を取得
2-1-3.SQLCODE=100の場合(該当なし)→ERROR-LOGに出力
2-1-4.SQLCODE<0の場合→ERROR-LOGに出力、処理継続
2-1-5.保険料計算
HEALTH-PREMIUM = MONTHLY-AMOUNT × HEALTH-RATE / 1000000
PENSION-PREMIUM = MONTHLY-AMOUNT × PENSION-RATE / 1000000
2-1-6.COMPUTE文を使用し、ON SIZE ERROR処理を実装
2-2.第2段階:適用ルールM:Nマッチング(APPLICABLE-RULES)(2020RULESCOL
2-2-1.年齢算出(運用日付 - BIRTH-DATEで満年齢)
2-2-2.SALARYDB.EMP-MASTERをSELECTし、BIRTH-DATE・DEPENDENT-COUNT・
REGION-CODEを取得。SQLCODE異常→ERROR-LOG出力。
2-2-3.RULE-TBLを線形探索し、以下の条件すべて合致するルールを検索
AGE >= AGE-FROM AND AGE <= AGE-TO
DEPENDENTS >= DEPENDENTS-FROM AND DEPENDENTS <= DEPENDENTS-TO
REGION-CODE = DBV-REGION-CODE
2-2-4.合致ルールあり→HEALTH-RATE-ADJ / PENSION-RATE-ADJで料率調整
IF 合致 AND HEALTH-RATE-ADJ > 0
HEALTH-RATE = DB2取得率 + HEALTH-RATE-ADJ
IF 合致 AND PENSION-RATE-ADJ > 0
PENSION-RATE = DB2取得率 + PENSION-RATE-ADJ
2-2-5.保険料再計算(調整後)
2-2-6.DEDUCTED-RESULTに出力(W01
TOTAL-PREMIUM = HEALTH-PREMIUM + PENSION-PREMIUM
2-3.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/DEDUCTED-RESULT
SHA06REC.cpyに従う。300B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01.EMP-ID | |
| 2 | EMP-NAME | R01.EMP-NAME | |
| 3 | INSURANCE-TYPE | R01.HEALTH-INS-TYPE | 健康保険種別 |
| 4 | GRADE-CODE | R01.GRADE-CODE | |
| 5 | MONTHLY-AMOUNT | R01.MONTHLY-AMOUNT | |
| 6 | HEALTH-RATE | DB2取得率(調整後) | 9(7) 小数点位置はプログラム内で規定 |
| 7 | PENSION-RATE | DB2取得率(調整後) | 9(7) 小数点位置はプログラム内で規定 |
| 8 | HEALTH-PREMIUM | 計算値 | MONTHLY-AMOUNT × HEALTH-RATE / 1000000 |
| 9 | PENSION-PREMIUM | 計算値 | MONTHLY-AMOUNT × PENSION-RATE / 1000000 |
| 10 | TOTAL-PREMIUM | 計算値 | HEALTH-PREMIUM + PENSION-PREMIUM |
| 11 | FILLER | 初期値 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | エラー種別(DBエラー/等級該当なし) |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容(EMP-ID + SQLCODE or 理由) |
+172
View File
@@ -0,0 +1,172 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA07KBR |
| 3 | プログラム名 | 資格異動キーブレイク処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 33(1:N+異キーキーブレイク) |
| 6 | 機能概要 | DB2 QUALIFICATION-CHANGESから資格異動データをFETCHし、従業員ごと(1:N)かつ保険者コード変更時(異キー)にキーブレイクしてサマリ・明細を出力する。 |
| 7 | | 同一従業員内で保険者コードが変更された時点でサマリレコード(REC-TYPE=S)を出力、全レコードを明細レコード(REC-TYPE=D)として出力する。 |
| 8 | | 各出力はSHA07REC書式(200B固定長)に従う。エラーはERROR-LOG(VB)に出力する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | QUALIFICATION-CHANGES(DB2) | EMP-ID, CHG-DATE昇順にSELECTする。ソートはSQLのORDER BYで担保する。 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | QUALIFICATION-CHANGES(DB2) | — | — | I | なし | — | — | — | DB2 | DECLARE CURSOR / FETCH |
| 2 | CHG-SUMMARY | W01 | SHA07W01 | O | SHA07REC | FB | | 200 | PS | REC-TYPE='S' |
| 3 | CHG-DETAIL | W02 | SHA07W02 | O | SHA07REC | FB | | 200 | PS | REC-TYPE='D' |
| 4 | ERROR-LOG | W03 | SHA07W03 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | QUALIFICATION-CHANGES | EMP-ID昇順, CHG-DATE昇順 | 1:Nマッチング(従業員1件に対しN件の異動) |
| 2 | 同上 | INSURER-CODE(異キー) | 従業員内で保険者コード変更時にキーブレイク |
### 使用モジュール一覧
| 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.DB接続(EXEC SQL CONNECT
1-7.DECLARE CURSOR文でQUALIFICATION-CHANGESをSELECT
SELECT対象:CHG-ID, EMP-ID, EMP-NAMESALARYDB.EMP-MASTERとJOIN, CHG-DATE, CHG-TYPE, INSURER-CODE, PREV-INSURER, REASON
ORDER BYEMP-ID, CHG-DATE
1-8.FETCHで1件目を取得し、WS-PREV-EMP-ID・WS-PREV-INSURERを初期設定(1100FETCSOR
2.主処理(2000MAJSOR)(FETCH終了まで繰り返す)
2-1.EMP-IDキーブレイク判定(2100KEYBRSOR
2-1-1.WS-PREV-EMP-ID(前回従業員ID)とDBV-EMP-ID(今回従業員ID)が異なる場合、主キーブレイク発生
2-1-2.初回(WS-PREV-EMP-IDHIGH-VALUES)はスキップ
2-1-3.主キーブレイク時はサマリレコード出力(REC-TYPE='S'
設定内容:前回従業員の最終保険者状態をサマリとして出力
PREV-INSURER=前回レコードのINSURER-CODE、INSURER-CODESPACE
EMP-ID=前回従業員ID
2-2.INSURER-CODE異キーブレイク判定(2200DIFKBSOR
2-2-1.WS-PREV-INSURER(前回保険者コード)とDBV-INSURER-CODE(今回保険者コード)が異なる場合、異キーブレイク発生
2-2-2.異キーブレイク時はサマリレコード出力(REC-TYPE='S'
設定内容:前回保険者→今回保険者の変遷をサマリ
PREV-INSURERWS-PREV-INSURER
INSURER-CODEDBV-INSURER-CODE
EMP-IDDBV-EMP-ID
CHG-DATEDBV-CHG-DATE
REASON'INSURER CHANGED'
2-3.明細レコード出力(2300DETAILSOR
全FETCHレコードを明細出力(REC-TYPE='D'
SHA07RECの全項目をDBV-から転記
2-4.WS-PREV-EMP-ID、WS-PREV-INSURERに今回値を設定
2-5.FETCHで次件取得(1100FETCSOR
3.最終グループ処理(2500LSTKBRSOR
3-1.最終従業員グループのサマリレコードを出力
3-2.最終詳細レコードを出力
4.終了処理(3000STPSOR
4-1.CLOSE CURSOR
4-2.DISCONNECT DB
4-3.出力ファイルのクローズ
4-4.出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'DB2-QUALIFICATION-CHANGES'
PARM2FETCH件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA07W01(CHG-SUMMARY)'
PARM2:サマリ件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA07W02(CHG-DETAIL)'
PARM2:明細件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA07W03(ERROR-LOG)'
PARM2:エラー件数
4-5.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/CHG-SUMMARY
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | CHG-ID | DBV-CHG-ID | 最終レコードのCHG-ID |
| 2 | EMP-ID | DBV-EMP-ID | 従業員ID |
| 3 | EMP-NAME | DBV-EMP-NAME | 従業員名 |
| 4 | CHG-DATE | DBV-CHG-DATE | 異動日 |
| 5 | CHG-TYPE | '99'固定 | サマリ識別 |
| 6 | INSURER-CODE | 異キー:DBV-INSURER-CODE / 主キー:SPACE | 主KB時はSPACE |
| 7 | PREV-INSURER | WS-PREV-INSURER | 変更前保険者コード |
| 8 | REASON | 'INSURER CHANGED' / SPACE | 異キー時のみ設定 |
| 9 | REC-TYPE | 'S'固定 | サマリ識別子 |
| 10 | FILLER | SPACE | |
### 出力ファイル2W02/CHG-DETAIL
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | CHG-ID | DBV-CHG-ID | |
| 2 | EMP-ID | DBV-EMP-ID | |
| 3 | EMP-NAME | DBV-EMP-NAME | |
| 4 | CHG-DATE | DBV-CHG-DATE | |
| 5 | CHG-TYPE | DBV-CHG-TYPE | |
| 6 | INSURER-CODE | DBV-INSURER-CODE | |
| 7 | PREV-INSURER | DBV-PREV-INSURER | |
| 8 | REASON | DBV-REASON | |
| 9 | REC-TYPE | 'D'固定 | |
| 10 | FILLER | SPACE | |
### 出力ファイル3W03/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
+178
View File
@@ -0,0 +1,178 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA08SRT |
| 3 | プログラム名 | 届出書データSORT編集処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 34SORT INPUT/OUTPUT PROCEDURE |
| 6 | 機能概要 | GRADED-LISTSHA04REC 200B)をすべてSORT文のINPUT PROCEDUREでRELEASEし、都道府県・事業所・従業員昇順にSORT後、OUTPUT PROCEDUREでRETURNしてレイアウト編集したRPT-DATASHA08REC 300B)を出力する。GRADED-LISTはSHA04TWOでマッチング成功した全件が有効レコードのため、STATUSフィルタは不要。 |
| 7 | | SORT作業用ファイルはSD-SORTWORKで定義し、I-O-CONTROLでSAME SORT AREAを指定する。 |
| 8 | | RETURN-CODEでSORT結果を判定し、異常時はABEND処理を行う。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | GRADED-LIST(R01) | 事前に事業所マッチング・保険者マッチング済みのSHA04TWO出力。ソート不要(SORT文で並替え)。 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | GRADED-LIST | R01 | SHA08R01 | I | SHA04REC | FB | | 200 | PS | |
| 2 | SD-SORTWORK | — | — | I/O | 自前 | — | — | 200 | 内部 | SORT作業用 |
| 3 | RPT-DATA | W01 | SHA08W01 | O | SHA08REC | FB | | 300 | PS | |
| 4 | ERROR-LOG | W02 | SHA08W02 | O | ZAN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | SD-SORTWORK | PREF-CODE昇順, OFFICE-NO昇順, EMP-ID昇順 | なし(SORTのみ) |
### 使用モジュール一覧
| 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.出力ファイルのオープン(W01 / W02)
1-6.入力ファイルR01のオープン
2.主処理(2000MAJSOR
2-1.SORT文の実行(2100SORTSOR
SORT SD-SORTWORK
ON ASCENDING KEY SR-PREF-CODE
SR-OFFICE-NO
SR-EMP-ID
INPUT PROCEDURE IS 2110INPPSOR
OUTPUT PROCEDURE IS 2120OUTPSOR.
2-2.SORT結果判定(RETURN-CODE
RETURN-CODE ≠ 0 の場合:
メッセージ出力
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SORT FAILED'
PARM2RETURN-CODE
【ABEND処理SUB】
ABENDコード:100
2-1.入力手続き(2110INPPSOR
2-1-1.INPUT PROCEDURE内でR01GRADED-LIST)を全件読み込み
2-1-2.全件をRELEASEでSD-SORTWORKに出力(GRADED-LISTはSHA04TWOの有効マッチング結果のためフィルタ不要)
2-1-3.SR-STATUSにはCNS-STATUS-0'0')を設定
2-1-4.READ AT ENDで入力手続き終了
2-1-5.EXITでINPUT PROCEDUREを抜ける
2-2.出力手続き(2120OUTPSOR
2-2-1.RETURNでSD-SORTWORKから1件取得
2-2-2.AT ENDまで以下の処理を繰り返す
2-2-3.ソート済みSDレコード→W01出力レコードに編集転記
編集内容:
RPT-BODYにSHA08RECの全項目を設定
REPORT-TYPE='01'(届出書種別:算定基礎届)
REPORT-DATEWRK-U06(運用日)
MONTHLY-AMOUNTはSR-MONTHLY-AMOUNTから転記(SHA04REC由来)
GRADE-CODEはSR-GRADE-CODEから転記(SHA04REC由来)
2-2-4.WRITE W01OUTRECでRPT-DATAに出力
2-2-5.RETURNで次のレコード取得
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.SORT入出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'SHA08R01(GRADED-LIST)'
PARM2:入力件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA08W01(RPT-DATA)'
PARM2:出力件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA08W02(ERROR-LOG)'
PARM2:エラー件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/RPT-DATA
SHA08REC.cpyに従う。300B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | SR-EMP-ID | |
| 2 | EMP-NAME | SR-EMP-NAME | |
| 3 | OFFICE-NO | SR-OFFICE-NO | |
| 4 | OFFICE-NAME | SR-OFFICE-NAME | |
| 5 | INSURER-CODE | SR-INSURER-CODE | |
| 6 | INSURER-NAME | SR-INSURER-NAME | |
| 7 | PREF-CODE | SR-PREF-CODE | |
| 8 | MONTHLY-AMOUNT | SR-MONTHLY-AMOUNT | SHA04RECから保持(SHA04TWO時点では0 |
| 9 | GRADE-CODE | SR-GRADE-CODE | SHA04RECから保持(SHA04TWO時点では0 |
| 10 | REPORT-TYPE | '01'固定 | |
| 11 | REPORT-DATE | WRK-U06 | 運用日 |
| 12 | FILLER | SPACE | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
### SD-SORTWORKSORT内部ファイル)
自前定義。200B。SHA04REC相当+SORT管理領域。
| No | 項目名 | 属性 | 備考 |
|----|--------|------|------|
| 1 | SR-EMP-ID | 9(008) | SORTキー3 |
| 2 | SR-EMP-NAME | X(040) | |
| 3 | SR-OFFICE-NO | X(004) | SORTキー2 |
| 4 | SR-OFFICE-NAME | X(040) | |
| 5 | SR-PREF-CODE | 9(002) | SORTキー1 |
| 6 | SR-INSURER-CODE | X(004) | |
| 7 | SR-INSURER-NAME | X(060) | |
| 8 | SR-MONTHLY-AMOUNT | 9(009) | SHA04RECから転記 |
| 9 | SR-GRADE-CODE | 9(002) | SHA04RECから転記 |
| 10 | SR-STATUS | X(001) | CNS-STATUS-0で固定(全件有効扱い) |
| 11 | SR-FILLER | X(030) | |
+149
View File
@@ -0,0 +1,149 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA09S25 |
| 3 | プログラム名 | 都道府県支部別分割出力処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 1125分割) |
| 6 | 機能概要 | RPT-DATASHA08REC 300B)からPREF-CODE(都道府県コード01〜25)を判定し、25個の出力ファイル(PREF-OUT-01〜25)に振り分けて出力する。 |
| 7 | | SELECT文にはORGANIZATION IS SEQUENTIALを明示指定する。 |
| 8 | | 各出力ファイルはCLOSE WITH LOCKで確定する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | RPT-DATA(R01) | SHA08SRTの出力。PREF-CODE 01〜25のいずれかが設定されている。 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | RPT-DATA | R01 | SHA09R01 | I | SHA08REC | FB | | 300 | PS | |
| 2 | PREF-OUT-01 | W01 | SHA09W01 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=01 |
| 3 | PREF-OUT-02 | W02 | SHA09W02 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=02 |
| 4 | PREF-OUT-03 | W03 | SHA09W03 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=03 |
| 5 | PREF-OUT-04 | W04 | SHA09W04 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=04 |
| 6 | PREF-OUT-05 | W05 | SHA09W05 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=05 |
| 7 | PREF-OUT-06 | W06 | SHA09W06 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=06 |
| 8 | PREF-OUT-07 | W07 | SHA09W07 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=07 |
| 9 | PREF-OUT-08 | W08 | SHA09W08 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=08 |
| 10 | PREF-OUT-09 | W09 | SHA09W09 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=09 |
| 11 | PREF-OUT-10 | W10 | SHA09W10 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=10 |
| 12 | PREF-OUT-11 | W11 | SHA09W11 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=11 |
| 13 | PREF-OUT-12 | W12 | SHA09W12 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=12 |
| 14 | PREF-OUT-13 | W13 | SHA09W13 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=13 |
| 15 | PREF-OUT-14 | W14 | SHA09W14 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=14 |
| 16 | PREF-OUT-15 | W15 | SHA09W15 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=15 |
| 17 | PREF-OUT-16 | W16 | SHA09W16 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=16 |
| 18 | PREF-OUT-17 | W17 | SHA09W17 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=17 |
| 19 | PREF-OUT-18 | W18 | SHA09W18 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=18 |
| 20 | PREF-OUT-19 | W19 | SHA09W19 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=19 |
| 21 | PREF-OUT-20 | W20 | SHA09W20 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=20 |
| 22 | PREF-OUT-21 | W21 | SHA09W21 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=21 |
| 23 | PREF-OUT-22 | W22 | SHA09W22 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=22 |
| 24 | PREF-OUT-23 | W23 | SHA09W23 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=23 |
| 25 | PREF-OUT-24 | W24 | SHA09W24 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=24 |
| 26 | PREF-OUT-25 | W25 | SHA09W25 | O | SHA09REC | FB | | 300 | PS | PREF-CODE=25 |
| 27 | ERROR-LOG | W98 | SHA09W98 | O | ZAN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | RPT-DATA | なし | PREF-CODEで振分け(01〜25 |
### 使用モジュール一覧
| 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.入出力ファイルのオープン
入力R01、出力W01〜W25、エラーW98
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで繰り返す)
2-1.PREF-CODE判定(2100SPLITSOR
EVALUATE PREF-CODE01〜25)で該当する出力ファイルにWRITE
【出力レコード編集】
SHA09RECのPREF-CODEにR01のPREF-CODEを設定
SHA09RECのINSURER-CODEにR01のINSURER-CODEを設定
SHA09RECのRPT-BODYにR01のFILLER(実質レコード本体の先頭294B)を設定
またはSHA08RECの全項目を編集してSHA09RECに転記
2-2.W01〜W25のいずれかにWRITE
2-3.R01を読み込む(1100R01INNSOR)(2件目以降)
2-4.PREF-CODEが01〜25の範囲外の場合、ERROR-LOGに出力
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ(CLOSE WITH LOCKで出力ファイルを確定)
3-2.入出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'SHA09R01'
PARM2:入力件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:各出力ファイルDD名
PARM2:各出力件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA09W98(ERROR-LOG)'
PARM2:エラー件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1〜25W01〜W25/PREF-OUT-01〜25
SHA09REC.cpyに従う。300B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | PREF-CODE | R01のPREF-CODE | 01〜25 |
| 2 | INSURER-CODE | R01のINSURER-CODE | |
| 3 | RPT-BODY | R01のFILLER領域相当 | ファイル本体データ(294B) |
### エラー出力ファイル(W98/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
+132
View File
@@ -0,0 +1,132 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA10S10 |
| 3 | プログラム名 | 保険者別分割出力処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 12100分割) |
| 6 | 機能概要 | RPT-DATASHA08REC 300B)からINSURER-CODE(保険者コード001〜099)を判定し、99個の出力ファイル(INSURER-OUT-01〜99)に振り分けて出力する。 |
| 7 | | SELECT文にはORGANIZATION IS SEQUENTIALを明示指定する。 |
| 8 | | 各出力ファイルはCLOSE WITH LOCKで確定する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | RPT-DATA(R01) | SHA08SRTの出力。INSURER-CODE 001〜099のいずれかが設定されている。 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | RPT-DATA | R01 | SHA10R01 | I | SHA08REC | FB | | 300 | PS | |
| 2 | INSURER-OUT-01 | W01 | SHA10W01 | O | SHA09REC | FB | | 300 | PS | INSURER-CODE=001 |
| 3 | INSURER-OUT-02 | W02 | SHA10W02 | O | SHA09REC | FB | | 300 | PS | INSURER-CODE=002 |
| 4 | INSURER-OUT-03 | W03 | SHA10W03 | O | SHA09REC | FB | | 300 | PS | INSURER-CODE=003 |
| .. | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 11 | INSURER-OUT-10 | W10 | SHA10W10 | O | SHA09REC | FB | | 300 | PS | INSURER-CODE=010 |
| 12 | ERROR-LOG | W99 | SHA10W98 | O | ZAN05REC | VB | | 200 | PS |
※本実装では代表10ファイル(001〜010)で定義。本番z/OSでは全99ファイルに拡張予定。
※エラーファイルの識別子はW99、DD名はSHA10W98。
INSURER-CODE=000または011〜099はエラーとする。
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | RPT-DATA | なし | INSURER-CODEで振分け(001〜099 |
### 使用モジュール一覧
| 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.入出力ファイルのオープン
入力R01、出力W01〜W10、エラーW99DD名SHA10W98
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで繰り返す)
2-1.INSURER-CODE判定(2100SPLITSOR
EVALUATE INSURER-CODE001〜099)で該当する出力ファイルにWRITE
【出力レコード編集】
SHA09RECのPREF-CODEにR01のPREF-CODEを設定
SHA09RECのINSURER-CODEにR01のINSURER-CODEを設定
SHA09RECのRPT-BODYにR01の本体部分(FILLER相当294B)を設定
2-2.W01〜W10のいずれかにWRITE
2-3.R01を読み込む(1100R01INNSOR)(2件目以降)
2-4.INSURER-CODEが001〜010の範囲外の場合、ERROR-LOGW99/DD:SHA10W98)に出力
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ(CLOSE WITH LOCKで出力ファイルを確定)
3-2.入出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'SHA10R01'
PARM2:入力件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:各出力ファイルDD名
PARM2:各出力件数
【メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA10W98(ERROR-LOG)'
PARM2:エラー件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1〜10W01〜W10/INSURER-OUT-01〜10
SHA09REC.cpyに従う。300B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | PREF-CODE | R01のPREF-CODE | |
| 2 | INSURER-CODE | R01のINSURER-CODE | 001〜099 |
| 3 | RPT-BODY | R01のFILLER領域相当 | ファイル本体データ(294B) |
### エラー出力ファイル(W99/ERROR-LOG、DD名:SHA10W98
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
+10 -1
View File
@@ -1,3 +1,12 @@
## 詳細設計書_ZAN01CHK.md (MARKDOWN, 5.8 KB)
- **Format**: Markdown
- **Word Count**: 512
- Words: 512 | Chars: 3,580
### Content
# 詳細設計書
## 基本情報
@@ -141,4 +150,4 @@
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |