Add Subsystem C (KYU01-09): all 9 programs, design docs, resource lists, DDL, COPY, coverage stats

KYU programs for payroll calculation:
  KYU01CVT - CSV conversion
  KYU02REG - attendance registration
  KYU03AGG - aggregation
  KYU04CAL - salary calculation
  KYU05DED - deduction calculation
  KYU06UPD - DB update
  KYU07DIV - division/pay-slip
  KYU08PRI - print output
  KYU09MRG - merge output

Includes:
  - Source programs (9 .cbl)
  - Compiled executables (9 .exe)
  - Detailed design docs (9 + sign-off)
  - Basic design doc (subsystem C overview)
  - Resource lists (9)
  - DDL schema (schema_kyu.sql)
  - COPY book (KYU99REC.cpy)
  - Coverage statistics update
  - DB definition update (STATUS values)
  - Overall system design document
This commit is contained in:
qiuqiuqiu
2026-07-09 08:09:59 +08:00
parent 02dd36e094
commit 75475b3fa1
43 changed files with 7212 additions and 41 deletions
@@ -0,0 +1,47 @@
# 勤怠システム 設計書
## システム概要
本システムは三つのサブシステムで構成される。
| サブシステム | 役割 | COBOLプログラム数 | 設計書 |
|---|---|---|---|---|
| **A: 勤怠休暇管理** | 休暇申請取込・打刻データ照合・日別勤怠計算・月次統計DB更新・CSV出力 | 7 | 01_勤怠休暇管理システム_設計書(サブシステムA).md |
| **B: 残業統計管理** | 加班申請データ取込・振り分け・重複チェック・打刻照合・マッチング・集約・DB更新 | 6 | 02_残業統計管理システム_設計書(サブシステムB).md |
| **C: 給与計算** | 欠勤統計取込・給与計算・給与明細出力 | 2 | 03_給与計算システム_設計書(サブシステムC).md |
## アーキテクチャ
- 全JCLステップは、前提条件(ソート)をJCLのSORTユーティリティ(`PGM=SORT`)で実行した後、COBOLプログラム(`EXEC PGM=SSSnnFFF`)を実行する。COBOLプログラム内でソートは行わない。
- DB: DB2 for LUW。COBOLからは埋め込みSQL`EXEC SQL`)で直接アクセスする。
- COBOL対象: GnuCOBOL 3.xIBM互換モード、`SOURCE-COMPUTER. IBM-ZSERIES.`)。
- 全パラメータは JCL PARM → `ACCEPT FROM COMMAND-LINE` + `UNSTRING` で解析。
## サブシステム間連携
| 連携データ | 出力元 | 入力先 | 方式 | 備考 |
|---|---|---|---|---|
| EDITED-PUNCH(打刻データ) | A-サブシステム KIN03PCK | B-サブシステム ZANJ013 | ファイル連携 | 打刻データ(出勤/退勤時刻) |
| OVT-APPLY(加班申請CSV) | 外部システム | B-サブシステム ZANJ010 | ファイル連携 | 加班申請入力CSV |
| ABSENCE-SUMMARY(欠勤統計) | A-サブシステム KIN06DBU | C-サブシステム KYUJ001 | ファイル連携 | 月次欠勤集計(A→C) |
| SALARY-DETAIL(給与明細) | C-サブシステム KYU01CAL | C-サブシステム KYU02PRI | ファイル連携 | 社内連携(C内) |
## 共通関数(サブプログラム)
| サブプログラム | I/Fコピー句 | 用途 |
|---|---|---|
| SUB01DAT | D01010AC | 運用日付取得 |
| SUB02MSG | MSG000AC | メッセージ編集出力 |
| SUB03END | MSG000AC | ABEND終了 |
| SUB04CHK | SUB04CHK | 項目チェック(日付/時刻/数値) |
| SUB05TIM | TIME010AC | 時刻丸め計算(分→時間) |
| SUB06DBU | SUB06DBU | DB更新処理(DB2埋め込みSQL |
### SUB05TIM I/FTIME010AC
| パラメータ | 入出力 | 説明 |
|-----------|--------|------|
| TI-MINUTES | I | 入力分数(PIC 9(6) |
| TI-ROUND-TYPE | I | 丸め種別('MIN30'=0.5h単位, 'MIN6'=0.1h単位) |
| TI-RESULT-HOURS | O | 丸め結果時間(PIC 9(4)V9(1) |
| TI-RETURN-CODE | O | 0=正常, 1=入力エラー |
@@ -0,0 +1,1181 @@
# 給与計算システム 設計書(サブシステムC)
## システム概要
本サブシステムは、社員マスタ・勤怠集計データ(サブシステムA・Bの出力)を基に給与計算を行い、
部門別分割出力・給与明細印刷・支給データ結合を実行する。
各COBOLプログラムは1プログラム=1パターンを原則とし、内部処理(Type 24/25/28)との併用のみ許容する。
### サブシステム情報
| 項目 | 内容 |
|------|------|
| サブシステムID | KYU(給与→KYUryo |
| COBOLプログラム数 | 9 |
| JCL数 | 6 |
### システム定数
| 定数 | 値 | 説明 |
|------|-----|------|
| BASE-HOURS | 160 | 月所定労働時間(20日×8h)(参考値、コード未使用) |
| INSURANCE-RATE | 0.12345 | 社会保険料率(12.345%)(参考値、コード未使用) |
| TAX-BASIC-DEDUCTION | 50000 | 基礎控除(月額50,000円) |
| OVERTIME-RATE | 1.25 | 時間外労働割増率(25%増) |
| HOLIDAY-RATE | 1.35 | 休日労働割増率(35%増) |
| MIDNIGHT-RATE | 1.50 | 深夜労働割増率(50%増) |
### サブシステム間連携
| 連携データ | 出力元 | 入力先 | 方式 | 備考 |
|-----------|--------|--------|------|------|
| ABSENCE-SUMMARY(欠勤統計) | A-サブシステム KIN08DBU | KYUJ020 | ファイル連携 | 月次欠勤集計(80B / 社員番号昇順) |
| OVT-MONTHLY(残業統計) | B-サブシステム ZAN06UPD | KYUJ020 | DB参照(同一DB2インスタンス) | 残業時間(DB2同一インスタンス内別スキーマ) |
| EMP-RECORD(社員固定長) | KYU01CVT | KYU02REG | ファイル連携 | CSV変換後(80B) |
| ABSENCE-AGGREGATE(欠勤集約) | KYU03AGG | KYU04CAL | ファイル連携 | 社員別集約後(80B) |
| SALARY-DETAIL(給与明細) | KYU04CAL | KYU05DED / KYU06UPD | ファイル連携 | 計算後給与(240B) |
| SALARY-NET(差引支給) | KYU05DED | KYU06UPD / KYU07DIV / KYU08PRI / KYU09MRG | ファイル連携 | 控除後支給額(200B) |
| PAYMENT-DATA(支給データ) | KYU09MRG | 外部銀行システム | ファイル連携 | 振込データ(200B) |
---
## ファイル一覧
| # | ファイル名 | 編成 | RECM | サイズ | 用途 | 区分 |
|---|-----------|------|------|-------|------|------|
| 1 | ABSENCE-SUMMARY | SEQUENTIAL | FB | 80 | 欠勤統計(Aシステム出力) | A連携 |
| 2 | PAY-PARAM | SEQUENTIAL | FB | 80 | 給与パラメータ(単価・控除率) | 新規 |
| 3 | EMP-RECORD | SEQUENTIAL | FB | 80 | 社員マスタ固定長(CSV変換後) | 新規 |
| 4 | ABSENCE-AGGREGATE | SEQUENTIAL | FB | 80 | 欠勤集約後(社員単位) | 新規 |
| 5 | SALARY-DETAIL | SEQUENTIAL | FB | 240 | 給与明細(計算後) | 新規 |
| 6 | SALARY-NET | SEQUENTIAL | FB | 200 | 差引支給額(控除後) | 新規 |
| 7 | PAYSLIP | SEQUENTIAL | FB | 200 | 給与明細印刷イメージ | 新規 |
| 8 | BONUS-DATA | SEQUENTIAL | FB | 200 | 賞与データ | 新規 |
| 9 | PAYMENT-DATA | SEQUENTIAL | FB | 200 | 支給データ(銀行振込用) | 新規 |
| 10 | DEPT-OUT-01〜50 | SEQUENTIAL | FB | 200 | 部門別分割出力(最大50ファイル) | 新規 |
| 11 | ERROR-LOG | SEQUENTIAL | VB | 最大200 | エラーレコード退避 | A・B共用 |
### DB二重対応
本サブシステムのDB操作はDB2の埋め込みSQL(`EXEC SQL`)で直接記述する。
社員マスタ(EMP-MASTER)と税率テーブル(TAX-TABLE)は同一DB2インスタンス内の別スキーマ(SALARYDB)で管理する。
BサブシステムのOVERTIME.DBも同一DB2インスタンスに存在するため、`スキーマ名.テーブル名` でクロススキーマ参照可能。
### 共通関数利用方針
既存のサブプログラム(SUB01DAT~SUB05TIM)は本サブシステムでも利用する。
新たな共通関数は追加せず、各プログラム内でロジックを完結させる。
---
## DB構成(SALARYDB
### DB名称:給与計算データベース(SALARYDB)
#### テーブル1EMP-MASTER(社員マスタテーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| EMP-NAME | VARCHAR(40) | 社員名 |
| DEPT-CODE | CHAR(2) | 部署コード(0150 |
| REGION-CODE | CHAR(2) | 地域コード(0125、FYI用) |
| CATEGORY-CODE | CHAR(3) | 社員区分コード(001100、FYI用) |
| BASE-SALARY | DECIMAL(9,0) | 基本給 |
| HOURLY-RATE | DECIMAL(7,0) | 時給 |
| DEPENDENT-COUNT | SMALLINT | 扶養人数 |
| STATUS | CHAR(1) | 0=在籍 / 9=退職 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル2TAX-TABLE(税率テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| TAX-FROM | DECIMAL(9,0) | 課税所得下限(PK |
| TAX-TO | DECIMAL(9,0) | 課税所得上限(PK |
| TAX-RATE | DECIMAL(5,4) | 税率(0.0500=5% |
| DEDUCTION | DECIMAL(9,0) | 控除額 |
#### テーブル3INSURANCE-TABLE(社会保険料率テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| INS-INCOME-FROM | DECIMAL(9,0) | 対象所得下限(PK |
| INS-INCOME-TO | DECIMAL(9,0) | 対象所得上限(PK |
| INS-HEALTH-RATE | DECIMAL(7,6) | 健康保険料率 |
| INS-PENSION-RATE | DECIMAL(7,6) | 厚生年金保険料率 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル4SALARY-RESULTS(給与計算結果テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMMPK |
| GROSS-PAYMENT | DECIMAL(9,0) | 支給総額 |
| INCOME-TAX | DECIMAL(9,0) | 源泉所得税 |
| INSURANCE | DECIMAL(9,0) | 社会保険料 |
| RESIDENT-TAX | DECIMAL(9,0) | 住民税 |
| NET-PAYMENT | DECIMAL(9,0) | 差引支給額 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
---
## 処理フロー
```
╞══ KYUJ010 ═══════════════════════════════════╡
│ KYU01CVTCSV→FB変換) PGMパターン: 21
│ INSPECT CONVERTING(引用符内改行→SPACE
│ UNSTRING COUNT IN(項目数カウント)
│ SUB04CHK で数値妥当性チェック(内部処理25)
│ コメント行(先頭#)は読み飛ばし
├── 正常 → EMP-RECORD80B 固定長)
└── 異常 → ERROR-LOG
│ KYU02REGDB2登録) PGMパターン: 09
│ EXEC SQL INSERT(新規)
│ SQLCODE=-803 → EXEC SQL UPDATE(重複更新)
├── → DB2 EMP-MASTER
└── 異常 → ERROR-LOG
╞══ KYUJ020 ═══════════════════════════════════╡
│ STEP020S: JCL SORTABSENCE-SUMMARY → 社員番号昇順)
│ KYU03AGG(欠勤集約) PGMパターン: 08
│ 同一社員内の複数欠勤レコードを読込 → 集約
│ INITIALIZE REPLACING NUMERIC DATA BY ZERO
├── → ABSENCE-AGGREGATE80B 社員単位1件)
└── 異常 → ERROR-LOG
│ KYU04CAL(給与計算) PGMパターン: 32
│ ABSENCE-AGGREGATE + EMP-MASTERDB2参照)
│ OVT-MONTHLYDB2 Bサブシステム参照)
│ EVALUATE ALSO(勤怠区分×手当種別の複合分岐)
│ COMPUTE ROUNDED ON SIZE ERROR
├── → SALARY-DETAIL240B
└── 異常 → ERROR-LOG
╞══ KYUJ030 ═══════════════════════════════════╡
│ KYU05DED(控除計算) PGMパターン: 23
│ TAX-TABLE → EXEC SQL SELECT ... BETWEEN
│ INSURANCE-TABLE → SEARCH ALL(内部表LOAD後)
│ 課税所得計算・源泉所得税・社会保険料・住民税を算出
├── → SALARY-NET200B
└── 異常 → ERROR-LOG
│ KYU06UPDDB2更新) PGMパターン: 09
│ EXEC SQL INSERT(新規)
│ SQLCODE=-803 → EXEC SQL UPDATE(再計算更新)
├── → DB2 SALARY-RESULTS
└── 異常 → ERROR-LOG
╞══ KYUJ040 ═══════════════════════════════════╡
│ STEP040S: JCL SORTSALARY-NET → 部署コード昇順)
│ KYU07DIV(部門分割出力) PGMパターン: 10
│ SYSIN制御カードで出力対象部署の絞込可能
│ EVALUATE DEPT-CODE で該当ファイルへSELECT WRITE
│ 部署別ファイルを順次OPEN/CLOSE(常時1 OPEN
│ CLOSE WITH LOCK で出力ファイル確定
├── 部署別 → DEPT-OUT-01〜50
└── 異常 → ERROR-LOG
╞══ KYUJ050 ═══════════════════════════════════╡
│ STEP050S: JCL SORTSALARY-NET → 社員番号昇順)
│ KYU08PRI(給与明細印刷) PGMパターン: 04
│ FD LINAGE IS 66 LINES / TOP 6 / BOTTOM 6 / FOOTING 60
│ WRITE BEFORE ADVANCING PAGE1社員1ページ)
│ BLANK WHEN ZERO / JUSTIFIED RIGHT
│ AT END-OF-PAGE / PAGE-COUNTER / SET UP BY
├── → PAYSLIPSYSOUT
└── 異常 → ERROR-LOG
╞══ KYUJ060 ═══════════════════════════════════╡
│ KYU09MRG(支給データ結合) PGMパターン: 35
│ COBOL MERGE文(SALARY-NET + BONUS-DATA
│ ON ASCENDING KEY MERGE-EMP-ID
│ OUTPUT PROCEDURE で社員単位に統合
│ RETURN ... AT END でMERGE結果受取
├── → PAYMENT-DATA200B
└── 異常 → ERROR-LOG
```
---
## JCL
### KYUJ010 — 社員マスタ取込(2ステップ)
```jcl
//KYUJ010 JOB (ACCT),'社員マスタ取込',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//* ※PARM値は本番z/OSでJCLから指定。ローカルGnuCOBOLでは環境変数で代替。
//*=====================================================================
//* STEP010: CSV→FB変換(Type 21
//*=====================================================================
//STEP010 EXEC PGM=KYU01CVT,PARM='YEARMONTH=&YEARMONTH'
//KYU01R01 DD DSN=EMP-MASTER.CSV,DISP=SHR
//KYU01W01 DD DSN=EMP-RECORD.DAT,DISP=(NEW,PASS)
//KYU01W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//*
//*=====================================================================
//* STEP020: DB2登録(Type 09
//*=====================================================================
//STEP020 EXEC PGM=KYU02REG,PARM='YEARMONTH=&YEARMONTH'
//KYU02R02 DD DSN=EMP-RECORD.DAT,DISP=(OLD,DELETE)
//KYU02W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### KYUJ020 — 給与計算(3ステップ)
```jcl
//KYUJ020 JOB (ACCT),'給与計算',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP020S: 欠勤統計 SORT(社員番号昇順)
//*=====================================================================
//STEP020S EXEC PGM=SORT
//SORTIN DD DSN=ABSENCE-SUMMARY.DAT,DISP=SHR
//SORTOUT DD DSN=KYU02S01.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(1,8,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP021: 欠勤集約(Type 08
//*=====================================================================
//STEP021 EXEC PGM=KYU03AGG,PARM='YEARMONTH=&YEARMONTH'
//KYU03R01 DD DSN=KYU02S01.DAT,DISP=(OLD,DELETE)
//KYU03W01 DD DSN=ABSENCE-AGGREGATE.DAT,DISP=(NEW,PASS)
//KYU03W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//*
//*=====================================================================
//* STEP022: 給与計算(Type 32
//* EMP-MASTER / OVT-MONTHLY はDB2EXEC SQL)参照のためDD不要
//*=====================================================================
//STEP022 EXEC PGM=KYU04CAL,PARM='YEARMONTH=&YEARMONTH'
//KYU04R02 DD DSN=ABSENCE-AGGREGATE.DAT,DISP=(OLD,DELETE)
//KYU04R03 DD DSN=PAY-PARAM.DAT,DISP=SHR
//KYU04W03 DD DSN=SALARY-DETAIL.DAT,DISP=(NEW,CATLG,DELETE)
//KYU04W04 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### KYUJ030 — 控除計算(2ステップ)
```jcl
//KYUJ030 JOB (ACCT),'控除計算',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP030: 控除計算(Type 23
//* TAX-TABLE / INSURANCE-TABLE はDB2EXEC SQL)参照のためDD不要
//*=====================================================================
//STEP030 EXEC PGM=KYU05DED,PARM='YEARMONTH=&YEARMONTH'
//KYU05R01 DD DSN=SALARY-DETAIL.DAT,DISP=(OLD,DELETE)
//KYU05W01 DD DSN=SALARY-NET.DAT,DISP=(NEW,PASS)
//KYU05W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
//*
//*=====================================================================
//* STEP031: DB2 SALARY-RESULTS 更新(Type 09
//*=====================================================================
//STEP031 EXEC PGM=KYU06UPD,PARM='YEARMONTH=&YEARMONTH'
//KYU06R02 DD DSN=SALARY-NET.DAT,DISP=(OLD,DELETE)
//KYU06W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### KYUJ040 — 部門別分割出力
```jcl
//KYUJ040 JOB (ACCT),'部門別分割出力',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP040S: SALARY-NET SORT(部署コード昇順)
//*=====================================================================
//STEP040S EXEC PGM=SORT
//SORTIN DD DSN=SALARY-NET.DAT,DISP=SHR
//SORTOUT DD DSN=KYU04S01.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(50,2,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP040: 50分割出力(Type 10
//* SYSINで出力対象部署絞込可
//*=====================================================================
//STEP040 EXEC PGM=KYU07DIV,PARM='YEARMONTH=&YEARMONTH'
//KYU07R01 DD DSN=KYU04S01.DAT,DISP=(OLD,DELETE)
//KYU07D01 DD DSN=DEPT-OUT-01.DAT,DISP=(NEW,CATLG,DELETE)
// ...(全50部署)
//KYU07D50 DD DSN=DEPT-OUT-50.DAT,DISP=(NEW,CATLG,DELETE)
//KYU07SYS DD *
DEPT=01,02,05,10
/*
//KYU07W99 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### KYUJ050 — 給与明細印刷
```jcl
//KYUJ050 JOB (ACCT),'給与明細印刷',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP050S: 給与データ SORT(社員番号昇順)
//*=====================================================================
//STEP050S EXEC PGM=SORT
//SORTIN DD DSN=SALARY-NET.DAT,DISP=SHR
//SORTOUT DD DSN=KYU05S01.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(1,8,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP050: 給与明細印刷(Type 04 LINAGEページ制御)
//*=====================================================================
//STEP050 EXEC PGM=KYU08PRI,PARM='YEARMONTH=&YEARMONTH'
//KYU08R01 DD DSN=KYU05S01.DAT,DISP=(OLD,DELETE)
//KYU08W01 DD SYSOUT=A
//KYU08W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### KYUJ060 — 支給データ結合
```jcl
//KYUJ060 JOB (ACCT),'支給データ結合',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP060: MERGEType 35 給与 + 賞与)
//*=====================================================================
//STEP060 EXEC PGM=KYU09MRG,PARM='YEARMONTH=&YEARMONTH'
//KYU09M99 DD UNIT=SYSDA,SPACE=(CYL,(10,5))
//KYU09M01 DD DSN=SALARY-NET.DAT,DISP=SHR
//KYU09M02 DD DSN=BONUS-DATA.DAT,DISP=SHR
//KYU09W01 DD DSN=PAYMENT-DATA.DAT,DISP=(NEW,CATLG,DELETE)
//KYU09W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### 実行順序
本サブシステムのJOBは、A・Bサブシステムの出力を入力とする。
JCL起動時は以下の順序を保証すること。
1. Aサブシステム KINJ080KIN08DBU)→ ABSENCE-SUMMARY生成
2. Bサブシステム ZANJ025ZAN06UPD)→ DB2 OVT-MONTHLY確定
3. **KYUJ010**(マスタ取込、任意タイミング。初回のみ必須)
4. **KYUJ020****KYUJ030****KYUJ040**(またはKYUJ050)→ **KYUJ060**(順次実行)
5. KYUJ040 と KYUJ050 は SALARY-NET.DAT を `DISP=SHR` で参照するため並行実行可能
---
## プログラム詳細
### KYU01CVT(社員マスタCSV→FB変換処理) — Type 21
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 社員マスタCSV→FB変換処理 |
| **PGMパターン** | CSV→FB変換(改行あり)+ 内部処理25(SUB04CHK数値チェック) |
| **SORT前処理** | 不要 |
| **入力** | EMP-MASTER.CSV(可変長/改行あり) |
| **出力** | EMP-RECORD80B 固定長)/ ERROR-LOGVB |
| **件数変化** | N件(CSV行)→ 正常M件 + 異常(N-M)件 |
| **使用共通関数** | SUB01DAT, SUB02MSG, SUB03END, SUB04CHK |
| **該当プログラム分類** | No.21 CSV→FB変換(改行あり) |
**入力CSV形式:**
```
EMP001,山田 太郎,01,01,001,300000,1800,2,0
EMP002,佐藤 花子,02,01,002,280000,1700,1,0
```
- 引用符(`"`)で囲まれた社員名フィールド内に改行を含む場合は複数行読込
- コメント行(先頭`#`)は読み飛ばし
**機能:**
1. `OPEN INPUT` CSVファイル(VB編成・可変長)
2. `READ` で1行取得。AT END まで繰り返し
3. 行内の引用符 `"` の出現状態を追跡し、引用符内改行とレコード境界改行を区別:
- `WS-IN-QUOTE` フラグが FALSE かつ行内に奇数個の `"` → 引用符内続行モード開始
- `WS-IN-QUOTE` が TRUE かつ行内に奇数個の `"` → 引用符内終了
- 引用符内継続行は連結用ワーク領域(WS-CSV-ACCUM)に蓄積
4. 完全な1レコード分のデータが揃った時点で、`INSPECT CONVERTING X"0D" X"0A" BY SPACE` で引用符内改行をスペース変換
5. `UNSTRING DELIMITED BY ',' INTO ... COUNT IN WS-FIELD-COUNT` でCSV分解+項目数カウント
6. SUB04CHK で社員番号(8桁)・時給(7桁)の数値妥当性チェック(内部処理25に該当)
7. 社員番号空チェック:`INSPECT TALLYING WS-TALLY FOR LEADING SPACES` → 全桁SPACEならエラー
8. 正常レコードは EMP-RECORD80B)に WRITE
9. エラー時は ERROR-LOG に書出し
#### DECLARATIVES(ファイルエラー処理)
`DECLARATIVES` 宣言部でファイル入出力エラーを捕捉し、共通エラー処理に制御を移す。
```
DECLARATIVES.
KYU01CVT-ERR SECTION.
USE AFTER ERROR PROCEDURE ON KYU01R01.
KYU01CVT-ERR-PROC.
PERFORM 9999-ABEND.
.
KYU01W01-ERR SECTION.
USE AFTER ERROR PROCEDURE ON KYU01W01.
KYU01W01-ERR-PROC.
PERFORM 9999-ABEND.
.
END DECLARATIVES.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| INSPECT CONVERTING | 引用符内改行コード→SPACE変換 |
| UNSTRING COUNT IN | CSV分解時の項目数検証 |
| IF ALPHABETIC | 社員名の英字判定 |
| DECLARATIVES | ファイル入出力エラー処理の宣言部 |
| USE AFTER ERROR | ファイルエラー時の共通エラー処理手続き |
---
### KYU02REG(社員マスタDB2登録処理) — Type 09
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 社員マスタDB2登録処理 |
| **PGMパターン** | DB更新 |
| **SORT前処理** | 不要(KYU01CVTの出力を入力) |
| **入力** | EMP-RECORD80B 固定長) |
| **出力** | DB2 EMP-MASTERINSERT/UPSERT/ ERROR-LOGVB |
| **件数変化** | N件 → DB2登録N件(全件) |
| **使用共通関数** | SUB02MSG, SUB03END |
| **該当プログラム分類** | No.09 DB更新 |
**機能:**
1. `OPEN INPUT` EMP-RECORD80B 固定長)
2. `READ` で1件取得。AT END まで繰り返し
3. `EXEC SQL INSERT INTO EMP-MASTER ...` でDB2登録
4. SQLCODE = -803(重複)の場合、`EXEC SQL UPDATE` で更新
5. エラー時は ERROR-LOG に書出し
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| EXEC SQL INSERT | 社員マスタ新規登録 |
| SQLCODE判定によるUPSERT | 重複時UPDATE |
| CLOSE WITH LOCK | 入力ファイルのロッククローズ |
---
### KYU03AGG(欠勤集約処理) — Type 08
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 欠勤集約処理 |
| **PGMパターン** | キーブレイク(集約) |
| **SORT前処理** | JCL SORT(社員番号昇順) |
| **入力** | KYU02S0180B JCL SORT済み欠勤データ) |
| **出力** | ABSENCE-AGGREGATE80B 社員単位)/ ERROR-LOGVB |
| **件数変化** | M件(欠勤レコード)→ N件(社員数、M≧N) |
| **使用共通関数** | SUB02MSG, SUB03END |
| **該当プログラム分類** | No.08 キーブレイク(集約) |
**機能:**
同一社員内の複数欠勤レコードを集約する。
```
PERFORM UNTIL WS-EOF = '1'
READ KYU08R01 INTO WS-ABSENCE-REC
AT END SET WS-EOF TO TRUE
END-READ
IF NOT WS-EOF
IF WS-PREV-EMP-ID = WS-EMP-ID
ADD 1 TO WS-ABSENT-COUNT
ADD WS-ABSENT-HOURS TO WS-TOTAL-ABSENT-HOURS
ELSE
PERFORM 2000-WRITE-AGGREGATE
MOVE WS-EMP-ID TO WS-PREV-EMP-ID
INITIALIZE WS-TOTAL-ABSENT-HOURS
WS-ABSENT-COUNT
REPLACING NUMERIC DATA BY ZERO
MOVE 1 TO WS-ABSENT-COUNT
MOVE WS-ABSENT-HOURS TO WS-TOTAL-ABSENT-HOURS
END-IF
END-IF
END-PERFORM.
PERFORM 2000-WRITE-AGGREGATE.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| INITIALIZE REPLACING NUMERIC DATA BY ZERO | 集約カウンタの型別初期化 |
| END-ADD | ADD文の明示的スコープターミネータ |
---
### KYU04CAL(給与計算処理) — Type 32
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 給与計算処理 |
| **PGMパターン** | 1:N+キーブレイク(同キー) |
| **SORT前処理** | 不要(KYU03AGGの出力を入力) |
| **入力** | ABSENCE-AGGREGATE80B/ PAY-PARAM80B/ EMP-MASTERDB2参照)/ OVT-MONTHLYDB2 Bサブシステム参照) |
| **出力** | SALARY-DETAIL240B/ ERROR-LOGVB |
| **件数変化** | N件(社員)→ N件(社員) |
| **使用共通関数** | SUB01DAT, SUB02MSG, SUB03END |
| **該当プログラム分類** | No.32 1:N+キーブレイク(同キー) |
**機能:**
#### Step1:社員単位の給与計算
ABSENCE-AGGREGATE(社員単位1件)を読込み、DB2 EMP-MASTER・OVT-MONTHLY を補完参照する。
```
PERFORM UNTIL WS-EOF = '1'
READ KYU04R02 INTO WS-ABSENCE-AGG
AT END SET WS-EOF TO TRUE
END-READ
IF NOT WS-EOF
PERFORM 2100-CALCULATE-SALARY
END-IF
END-PERFORM.
```
#### Step2:給与計算
1. **EMP-MASTERDB2 SELECT** で基本給・時給・扶養人数を取得
2. **OVT-MONTHLYDB2 SELECT WHERE EMP-ID / YEAR-MONTH** で残業時間を取得
3. 欠勤控除額 = HOURLY-RATE × 欠勤時間合計
4. 時間外手当 = HOURLY-RATE × 残業時間 × OVERTIME-RATE1.25
5. **支給総額 = 基本給 + 各種手当 - 欠勤控除**
```
EXEC SQL
SELECT BASE-SALARY, HOURLY-RATE, DEPENDENT-COUNT
INTO :WS-BASE-SALARY, :WS-HOURLY-RATE, :WS-DEPENDENT
FROM EMP-MASTER
WHERE EMP-ID = :WS-EMP-ID
END-EXEC.
IF SQLCODE = 0
COMPUTE WS-ABSENT-DEDUCT ROUNDED =
WS-HOURLY-RATE * WS-TOTAL-ABSENT-HOURS
ON SIZE ERROR
MOVE ZERO TO WS-ABSENT-DEDUCT
PERFORM 9999ABDSOR
END-COMPUTE
COMPUTE WS-OVT-AMOUNT ROUNDED =
WS-HOURLY-RATE * WS-OVT-HOURS * WS-OVERTIME-RATE
ON SIZE ERROR
MOVE ZERO TO WS-OVT-AMOUNT
PERFORM 9999ABDSOR
END-COMPUTE
COMPUTE WS-GROSS-PAYMENT =
WS-BASE-SALARY + WS-OVT-AMOUNT - WS-ABSENT-DEDUCT
END-COMPUTE
END-IF.
```
#### Step3:複合条件分岐(EVALUATE ALSO
勤怠区分と手当種別の組み合わせで支給額を判定する。
```
EVALUATE WS-ALLOWANCE-TYPE ALSO WS-ATTEND-TYPE
WHEN 'OVT' ALSO 'W'
COMPUTE WS-AMOUNT ROUNDED =
WS-HOURLY-RATE * WS-OVT-HOURS * 1.25
WHEN 'OVT' ALSO 'H'
COMPUTE WS-AMOUNT ROUNDED =
WS-HOURLY-RATE * WS-OVT-HOURS * 1.35
WHEN 'LATE' ALSO ANY
COMPUTE WS-AMOUNT ROUNDED =
WS-HOURLY-RATE * WS-LATE-HOURS * 0.50
WHEN OTHER
MOVE ZERO TO WS-AMOUNT
END-EVALUATE.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| EVALUATE ALSO | 勤怠区分×手当種別の複合分岐 |
| OCCURS DESCENDING KEY | 手当テーブルの高額順整列 |
| COMPUTE ROUNDED ON SIZE ERROR | 給与計算の桁あふれ処理 |
| END-ADD / END-DIVIDE / END-SUBTRACT | 明示的スコープターミネータ |
---
### KYU05DED(控除計算処理) — Type 23
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 控除計算処理 |
| **PGMパターン** | SELECT条件 |
| **SORT前処理** | 不要 |
| **入力** | SALARY-DETAIL240B/ TAX-TABLEDB2/ INSURANCE-TABLEDB2 |
| **出力** | SALARY-NET200B/ ERROR-LOGVB |
| **件数変化** | N件 → N件(1対1 |
| **使用共通関数** | SUB02MSG, SUB03END |
| **該当プログラム分類** | No.23 SELECT条件 |
**機能:**
#### Step1:課税所得計算
```
COMPUTE WS-TAXABLE-INCOME =
WS-GROSS-PAYMENT - WS-INSURANCE - WS-BASIC-DEDUCTION
END-COMPUTE.
```
#### Step2:税率取得(EXEC SQL SELECT ... BETWEEN
```
EXEC SQL
SELECT TAX-RATE, DEDUCTION
INTO :WS-TAX-RATE, :WS-DEDUCTION
FROM TAX-TABLE
WHERE :WS-TAXABLE-INCOME BETWEEN TAX-FROM AND TAX-TO
END-EXEC.
IF SQLCODE = 0
COMPUTE WS-INCOME-TAX ROUNDED =
WS-TAXABLE-INCOME * WS-TAX-RATE - WS-DEDUCTION
END-COMPUTE
ELSE
MOVE ZERO TO WS-INCOME-TAX
END-IF.
```
#### Step3:社会保険料計算(SEARCH ALL
保険料率テーブル(WORKING-STORAGE)を事前LOADし、SEARCH ALLで検索する。
```
01 INSURANCE-WORK.
05 IW-COUNT PIC 9(4).
05 IW-ENTRY OCCURS 1 TO 200 TIMES
DEPENDING ON IW-COUNT
ASCENDING KEY IS IW-INCOME-FROM
INDEXED BY IW-IDX.
10 IW-INCOME-FROM PIC 9(9).
10 IW-INCOME-TO PIC 9(9).
10 IW-HEALTH-RATE PIC V9(6).
10 IW-PENSION-RATE PIC V9(6).
05 IW-END.
```
- 初期処理で DB2 INSURANCE-TABLE を全件 SELECT → WORKING-STORAGE に LOAD
- `SEARCH ALL` で該当所得範囲の保険料率を検索
```
SEARCH ALL IW-ENTRY
AT END
PERFORM 9999ABDSOR
WHEN IW-INCOME-FROM(IW-IDX) <= WS-TAXABLE-INCOME
AND WS-TAXABLE-INCOME <= IW-INCOME-TO(IW-IDX)
COMPUTE WS-INSURANCE ROUNDED =
WS-TAXABLE-INCOME *
(IW-HEALTH-RATE(IW-IDX) + IW-PENSION-RATE(IW-IDX))
END-COMPUTE
END-SEARCH.
```
#### Step4:差引支給額計算
```
COMPUTE WS-NET-PAYMENT =
WS-GROSS-PAYMENT - WS-INCOME-TAX
- WS-INSURANCE
- WS-RESIDENT-TAX
END-COMPUTE.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| EXEC SQL SELECT ... BETWEEN | 課税所得範囲検索 |
| SEARCH ALL(複数WHEN複合条件) | IW-INCOME-FROMIW-INCOME-TO範囲判定 |
| 88-level VALUES複数値 | 保険料率テーブルの境界値判定 |
---
### KYU06UPD(給与計算結果DB2更新処理) — Type 09
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 給与計算結果DB2更新処理 |
| **PGMパターン** | DB更新 |
| **SORT前処理** | 不要(KYU05DEDの出力を入力) |
| **入力** | SALARY-NET200B |
| **出力** | DB2 SALARY-RESULTSINSERT/UPSERT/ ERROR-LOGVB |
| **件数変化** | N件 → DB2登録N件(全件) |
| **使用共通関数** | SUB02MSG, SUB03END |
| **該当プログラム分類** | No.09 DB更新 |
**機能:**
1. `OPEN INPUT` SALARY-NET200B
2. `READ` で1件取得。AT END まで繰り返し
3. `EXEC SQL INSERT INTO SALARY-RESULTS ...` で登録
```
EXEC SQL
INSERT INTO SALARY-RESULTS
(EMP-ID, YEAR-MONTH, GROSS-PAYMENT,
INCOME-TAX, INSURANCE, RESIDENT-TAX,
NET-PAYMENT, UPDATED-AT)
VALUES
(:WS-EMP-ID, :WS-YEAR-MONTH, :WS-GROSS-PAYMENT,
:WS-INCOME-TAX, :WS-INSURANCE, :WS-RESIDENT-TAX,
:WS-NET-PAYMENT, CURRENT TIMESTAMP)
END-EXEC.
```
4. SQLCODE = -803(重複)の場合、`EXEC SQL UPDATE` で更新
```
IF SQLCODE = -803
EXEC SQL
UPDATE SALARY-RESULTS SET
GROSS-PAYMENT = :WS-GROSS-PAYMENT,
INCOME-TAX = :WS-INCOME-TAX,
INSURANCE = :WS-INSURANCE,
RESIDENT-TAX = :WS-RESIDENT-TAX,
NET-PAYMENT = :WS-NET-PAYMENT,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WS-EMP-ID
AND YEAR-MONTH = :WS-YEAR-MONTH
END-EXEC
END-IF.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| EXEC SQL INSERT | SALARY-RESULTS新規登録 |
| SQLCODE判定によるUPSERT | 再計算時の重複UPDATE |
---
### KYU07DIV(部門別分割出力処理) — Type 10
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 部門別分割出力処理 |
| **PGMパターン** | 50分割 |
| **SORT前処理** | JCL SORT(部署コード昇順) |
| **入力** | KYU04S01200B JCL SORT済み)/ SYSIN(制御カード) |
| **出力** | DEPT-OUT-01〜50(各200B |
| **件数変化** | N件 → 各部署合計N件(全社員) |
| **使用共通関数** | SUB02MSG, SUB03END |
| **該当プログラム分類** | No.10 50分割 |
**機能:**
1. `READ SYSIN` で出力対象部署コード一覧を取得(省略時は全50部署)
2. JCL SORT済みのため部署コード順に入力。部署コードが変わるたびにファイルを切替
3. 部署コード単位でファイルを開閉し、常に1ファイルのみ OPEN 状態を保つ
```
PERFORM UNTIL WS-EOF = '1'
READ KYU07R01 INTO WS-SALARY-REC
AT END SET WS-EOF TO TRUE
END-READ
IF NOT WS-EOF AND WS-DEPT-CODE IN 対象部署一覧
IF WS-PREV-DEPT > SPACES
AND WS-PREV-DEPT NOT = WS-DEPT-CODE
PERFORM 3000-CLOSE-FILE
END-IF
IF WS-DEPT-CODE NOT = WS-PREV-DEPT
PERFORM 3100-OPEN-FILE
END-IF
EVALUATE WS-DEPT-CODE
WHEN '01' WRITE DEPT01-REC FROM WS-SALARY-REC
WHEN '02' WRITE DEPT02-REC FROM WS-SALARY-REC
...
WHEN '50' WRITE DEPT50-REC FROM WS-SALARY-REC
WHEN OTHER CONTINUE
END-EVALUATE
MOVE WS-DEPT-CODE TO WS-PREV-DEPT
END-IF
END-PERFORM.
IF WS-PREV-DEPT > SPACES
PERFORM 3000-CLOSE-FILE
END-IF.
```
4. 全ファイル終了後、最終部署ファイルを `CLOSE WITH LOCK` で確定
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| 50分割(部署別1ファイルずつOPEN/CLOSE切替) | 部署別出力(常時1 OPEN でリソース節約) |
| CLOSE WITH LOCK | 出力ファイルのロッククローズ |
| READ SYSIN | 制御カードによる出力対象部署指定(内部処理28) |
---
### KYU08PRI(給与明細印刷処理) — Type 04
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 給与明細印刷処理 |
| **PGMパターン** | レイアウト編集のみ(GETPUT)+ LINAGEページ制御 |
| **SORT前処理** | JCL SORT(社員番号昇順) |
| **入力** | KYU05S01200B |
| **出力** | PAYSLIPSYSOUT A行 200B/ ERROR-LOGVB |
| **件数変化** | N件 → 1社員1ページ(Nページ) |
| **使用共通関数** | SUB01DAT, SUB02MSG, SUB03END |
| **該当プログラム分類** | No.04 レイアウト編集のみ(GETPUT) |
**機能:**
#### Step1LINAGEページ定義
```
FD KYU08W01
LABEL RECORDS STANDARD
LINAGE IS 66 LINES
FOOTING IS 60
TOP 6
BOTTOM 6.
```
- 1ページ66行、先頭6行(TOP)= ヘッダ領域、最終6行(BOTTOM)= フッタ領域
#### Step2:明細行編集
```
01 PAYSLIP-HEADER.
05 PH-TITLE PIC X(40) VALUE
'========== 給与明細書 =========='.
05 FILLER PIC X(10) VALUE SPACES.
05 PH-PAGE-NO PIC Z(4)9 VALUE ZERO.
05 FILLER PIC X(02) VALUE '頁'.
01 PAYSLIP-DETAIL.
05 PD-EMP-ID PIC X(08).
05 FILLER PIC X(02) VALUE SPACES.
05 PD-EMP-NAME PIC X(20) JUSTIFIED RIGHT.
05 FILLER PIC X(02) VALUE SPACES.
05 PD-BASIC-SALARY PIC Z(8)9 BLANK WHEN ZERO.
05 FILLER PIC X(02) VALUE SPACES.
05 PD-NET-PAYMENT PIC Z(8)9 BLANK WHEN ZERO.
```
#### Step3:ページ制御
```
WRITE PAYSLIP-REC FROM PAYSLIP-HEADER
BEFORE ADVANCING PAGE.
PERFORM VARYING WS-LINE FROM 1 BY 1
UNTIL WS-LINE > WS-DETAIL-LINES
WRITE PAYSLIP-REC FROM PAYSLIP-DETAIL
BEFORE ADVANCING 1 LINE
AT END-OF-PAGE
WRITE PAYSLIP-REC FROM PAYSLIP-FOOTER
BEFORE ADVANCING PAGE
SET WS-PAGE-END TO TRUE
END-WRITE
END-PERFORM.
```
- `PAGE-COUNTER` 特殊レジスタで自動ページ番号管理
- `SET UP BY` / `SET DOWN BY``PAGE-COUNTER` 操作
- 社員ごとに `WRITE BEFORE ADVANCING PAGE` で改ページ
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| FD LINAGE IS ... TOP/BOTTOM/FOOTING | 明細ページ制御 |
| WRITE BEFORE ADVANCING PAGE | 改ページ制御 |
| WRITE BEFORE ADVANCING 1 LINE | 行送り制御 |
| WRITE AT END-OF-PAGE | ページ終端検出 |
| PAGE-COUNTER | ページ番号自動計数 |
| BLANK WHEN ZERO | ゼロ金額非表示 |
| JUSTIFIED RIGHT | 右詰め編集 |
| SET UP BY / SET DOWN BY | カウンタ増減操作 |
---
### KYU09MRG(支給データ結合処理) — Type 35
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 支給データ結合処理 |
| **PGMパターン** | MERGE(複数ファイル結合) |
| **SORT前処理** | 不要(MERGE文が自ら結合) |
| **入力** | SALARY-NET200B/ BONUS-DATA200B |
| **出力** | PAYMENT-DATA200B/ ERROR-LOGVB |
| **件数変化** | N件 + M件 → (N+M)件(社員単位に統合後N件) |
| **使用共通関数** | SUB01DAT, SUB02MSG, SUB03END |
| **該当プログラム分類** | No.35 MERGE(複数ファイル結合) |
**機能:**
#### MERGE文によるファイル結合
SALARY-NET と BONUS-DATA は共に200B固定長で、社員番号(EMP-ID)が1桁目から8桁で共通。
MERGE文で社員番号昇順に結合し、同一社員の給与レコードと賞与レコードを連続取得する。
```
PROCEDURE DIVISION USING KYU-PARM.
MAIN-MERGE SECTION.
MERGE WORK-FILE
ON ASCENDING KEY MERGE-EMP-ID
USING SALARY-FILE BONUS-FILE
OUTPUT PROCEDURE 3000-MERGE-OUTPUT
.
GOBACK.
```
#### OUTPUT PROCEDURE:社員単位の支給データ生成
MERGE結果を受け取り、同一社員内で給与(TYPE='S')と賞与(TYPE='B')のレコードを統合する。
```
3000-MERGE-OUTPUT SECTION.
PERFORM WITH TEST AFTER
UNTIL WS-MERGE-EOF
RETURN WORK-FILE INTO WS-MERGE-REC
AT END SET WS-MERGE-EOF TO TRUE
END-RETURN
IF NOT WS-MERGE-EOF
MOVE MERGE-EMP-ID OF WS-MERGE-REC
TO WS-CURRENT-EMP
MOVE ZEROS TO WS-SALARY-AMOUNT
WS-BONUS-AMOUNT
PERFORM UNTIL WS-CURRENT-EMP
NOT = MERGE-EMP-ID OF WS-MERGE-REC
IF WS-RECORD-TYPE = 'S'
MOVE WS-PAY-AMOUNT TO WS-SALARY-AMOUNT
ELSE
MOVE WS-PAY-AMOUNT TO WS-BONUS-AMOUNT
END-IF
RETURN WORK-FILE INTO WS-MERGE-REC
AT END
MOVE HIGH-VALUES TO MERGE-EMP-ID
EXIT PERFORM
END-RETURN
END-PERFORM
ADD WS-SALARY-AMOUNT TO WS-BONUS-AMOUNT
GIVING WS-TOTAL-PAYMENT
WRITE PAYMENT-REC FROM WS-PAYMENT-DATA
END-IF
END-PERFORM.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| MERGE文(USING複数ファイル) | 給与+賞与の社員番号昇順結合 |
| MERGE ... OUTPUT PROCEDURE | MERGE結果の後処理 |
| RETURN ... AT END | MERGE結果レコード取得 |
| ENTRY | 代替エントリポイント |
---
## レコード構成
### EMP-RECORD80B — KYU01CVT出力
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 社員番号 | ER-EMP-ID | 1 | 8 | X(8) | |
| 2 | 社員名 | ER-EMP-NAME | 9 | 40 | X(40) | |
| 3 | 部署コード | ER-DEPT-CODE | 49 | 2 | X(2) | |
| 4 | 地域コード | ER-REGION-CODE | 51 | 2 | X(2) | |
| 5 | 社員区分コード | ER-CATEGORY-CODE | 53 | 3 | X(3) | |
| 6 | 基本給 | ER-BASE-SALARY | 56 | 9 | 9(9) | |
| 7 | 時給 | ER-HOURLY-RATE | 65 | 7 | 9(7) | |
| 8 | 扶養人数 | ER-DEPENDENT-COUNT | 72 | 2 | 9(2) | |
| 9 | ステータス | ER-STATUS | 74 | 1 | X(1) | |
| 10 | 予備 | ER-FILLER | 75 | 6 | X(6) | |
### ABSENCE-AGGREGATE80B — KYU03AGG出力
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 社員番号 | AA-EMP-ID | 1 | 8 | X(8) | |
| 2 | 対象年月 | AA-YEAR-MONTH | 9 | 6 | X(6) | YYYYMM |
| 3 | 欠勤時間合計 | AA-TOTAL-ABSENT-HOURS | 15 | 5 | 9(4)V9(1) | |
| 4 | 欠勤回数 | AA-ABSENT-COUNT | 20 | 2 | 9(2) | |
| 5 | 予備 | AA-FILLER | 22 | 58 | X(58) | |
### SALARY-DETAIL240B — KYU04CAL出力
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 社員番号 | SD-EMP-ID | 1 | 8 | X(8) | |
| 2 | 社員名 | SD-EMP-NAME | 9 | 40 | X(40) | |
| 3 | 部署コード | SD-DEPT-CODE | 49 | 2 | X(2) | |
| 4 | 基本給 | SD-BASIC-SALARY | 51 | 9 | 9(9) | |
| 5 | 時間外手当 | SD-OVT-AMOUNT | 60 | 9 | 9(9) | |
| 6 | 休日手当 | SD-HOLIDAY-AMOUNT | 69 | 9 | 9(9) | |
| 7 | 欠勤控除 | SD-ABSENT-DEDUCT | 78 | 9 | 9(9) | |
| 8 | 支給総額 | SD-GROSS-PAYMENT | 87 | 9 | 9(9) | |
| 9 | 残業時間 | SD-OVT-HOURS | 96 | 5 | 9(4)V9(1) | |
| 10 | 欠勤時間 | SD-ABSENT-HOURS | 101 | 5 | 9(4)V9(1) | |
| 11 | 勤怠区分 | SD-ATTEND-TYPE | 106 | 1 | X(1) | W=平日残業 / H=休日残業 |
| 12 | 手当種別 | SD-ALLOWANCE-TYPE | 107 | 3 | X(3) | OVT=残業 / LATE=遅刻 |
| 13 | 予備 | SD-FILLER | 110 | 131 | X(131) | |
### SALARY-NET200B — KYU05DED出力
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 社員番号 | SN-EMP-ID | 1 | 8 | X(8) | MERGEキー |
| 2 | レコード種別 | SN-REC-TYPE | 9 | 1 | X(1) | S=給与 / B=賞与 |
| 3 | 社員名 | SN-EMP-NAME | 10 | 40 | X(40) | |
| 4 | 部署コード | SN-DEPT-CODE | 50 | 2 | X(2) | |
| 5 | 地域コード | SN-REGION-CODE | 52 | 2 | X(2) | |
| 6 | 社員区分コード | SN-CATEGORY-CODE | 54 | 3 | X(3) | |
| 7 | 支給総額 | SN-GROSS-PAYMENT | 57 | 9 | 9(9) | |
| 8 | 源泉所得税 | SN-INCOME-TAX | 66 | 9 | 9(9) | |
| 9 | 社会保険料 | SN-INSURANCE | 75 | 9 | 9(9) | |
| 10 | 住民税 | SN-RESIDENT-TAX | 84 | 9 | 9(9) | |
| 11 | 差引支給額 | SN-NET-PAYMENT | 93 | 9 | 9(9) | |
| 12 | 課税所得 | SN-TAXABLE-INCOME | 102 | 9 | 9(9) | |
| 13 | 支給額 | SN-PAY-AMOUNT | 111 | 9 | 9(9) | 汎用(給与/賞与) |
| 14 | 予備 | SN-FILLER | 120 | 81 | X(81) | |
> BONUS-DATA も同一レイアウト(200B)。レコード種別 `SN-REC-TYPE` = 'B'、支給額 `SN-PAY-AMOUNT` に賞与額を格納。
### DEPT-OUT-01〜50(各200B — KYU07DIV出力
SALARY-NET と同一レイアウト(200B)。部署コードに応じて振り分け出力。
### PAYSLIP200B — KYU08PRI出力(印刷イメージ)
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 社員番号 | PS-EMP-ID | 1 | 8 | X(8) | |
| 2 | FILLER | PS-SP1 | 9 | 2 | X(2) | 空白 |
| 3 | 社員名 | PS-EMP-NAME | 11 | 20 | X(20) | JUSTIFIED RIGHT |
| 4 | FILLER | PS-SP2 | 31 | 2 | X(2) | 空白 |
| 5 | 基本給 | PS-BASIC-SALARY | 33 | 9 | Z(8)9 | BLANK WHEN ZERO |
| 6 | FILLER | PS-SP3 | 42 | 2 | X(2) | 空白 |
| 7 | 差引支給額 | PS-NET-PAYMENT | 44 | 9 | Z(8)9 | BLANK WHEN ZERO |
| 8 | FILLER | PS-SP4 | 53 | 2 | X(2) | 空白 |
| 9 | ページヘッダ | PS-PAGE-TITLE | 55 | 40 | X(40) | LINAGE制御用 |
| 10 | 予備 | PS-FILLER | 95 | 106 | X(106) | |
### PAYMENT-DATA200B — KYU09MRG出力
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 社員番号 | PD-EMP-ID | 1 | 8 | X(8) | |
| 2 | 支給区分 | PD-PAY-TYPE | 9 | 1 | X(1) | S=給与 / B=賞与 / T=合計 |
| 3 | 支給額 | PD-AMOUNT | 10 | 9 | 9(9) | |
| 4 | 振込銀行コード | PD-BANK-CODE | 19 | 4 | X(4) | |
| 5 | 振込口座番号 | PD-ACCOUNT-NO | 23 | 8 | 9(8) | |
| 6 | 予備 | PD-FILLER | 31 | 170 | X(170) | |
---
## 新規プログラムタイプカバレッジ一覧(10種)
| No. | 名称 | 分類 | 対応プログラム | カバレッジ(現状→目標) |
|:---:|------|:----:|:--------------:|:---------------------:|
| 04 | レイアウト編集のみ(GETPUT | 编辑 | KYU08PRI | ◎(既存) |
| 08 | キーブレイク(集約) | key切 | KYU03AGG | × → ◎ |
| 09 | DB更新 | 数据库 | KYU02REG, KYU06UPD | ◎(既存、本サブシステムで+2本) |
| 10 | 50分割 | 分割 | KYU07DIV | × → ◎ |
| 21 | CSV→FB変換(改行あり) | 文件转换 | KYU01CVT | × → ◎ |
| 23 | SELECT条件 | 数据库 | KYU05DED | × → ◎ |
| 32 | 1:N+キーブレイク(同キー) | 混合 | KYU04CAL | × → ◎ |
| 35 | MERGE(複数ファイル結合) | 排序 | KYU09MRG | × → ◎ |
**プログラムタイプカバレッジ率:** 16/3545.7%)→ **24/3568.6%**
> 本サブシステムで新規追加するプログラムタイプは **7種**08, 09x2, 10, 21, 23, 32, 35)。
> 09DB更新)は既にKIN02UPD・ZAN06UPDで◎であるが、本サブシステムでさらに2本追加し実績を拡充。
> No.27(項目チェック半角20桁/4桁)はKYU01CVT内でSUB04CHK(内部処理25)により実装され、プログラムタイプとしては単一(21)を維持。
---
## 新規予約語カバレッジ一覧
| No. | 予約語 | 現状 | 目標 | プログラム | 使用コンテキスト |
|:---:|--------|:---:|:----:|-----------|----------------|
| 6 | ALPHABETIC | × | ◎ | KYU01CVT | クラス条件(社員名英字判定) |
| 8 | ALSO | △ | ◎ | KYU04CAL | EVALUATE ALSO(勤怠区分×手当種別) |
| 31 | CONVERTING | × | ◎ | KYU01CVT | INSPECT CONVERTING(引用符内改行→SPACE |
| 34 | COUNT | × | ◎ | KYU01CVT | UNSTRING COUNT IN(項目数カウント) |
| 40 | DECLARATIVES | × | ◎ | KYU01CVT | ファイルエラー処理の宣言部 |
| 45 | DESCENDING | × | ◎ | KYU04CAL | OCCURS DESCENDING KEY(高額手当優先) |
| 50 | DOWN | × | ◎ | KYU08PRI | SET DOWN BY(ページカウンタ減少) |
| 55 | END-ADD | × | ◎ | KYU03AGG | ADD文の明示的END-ADD |
| 58 | END-DIVIDE | × | ◎ | KYU04CAL | DIVIDE文の明示的END-DIVIDE |
| 66 | END-SUBTRACT | × | ◎ | KYU05DED | SUBTRACT文の明示的END-SUBTRACT |
| 112 | NEXT | × | △ | KYU09MRG | READ NEXTの代替(MERGE RETURN使用) |
| 128 | PAGE | △ | ◎ | KYU08PRI | LINAGE PAGE句 / FD PAGE-COUNTER |
| 129 | PAGE-COUNTER | × | ◎ | KYU08PRI | 特殊レジスタ(自動ページ番号) |
| 142 | REMOVAL | × | — | — | CLOSE FOR REMOVALは今回不要 |
| 177 | UP | × | ◎ | KYU08PRI | SET UP BYPAGE-COUNTER増加) |
| 180 | USE | × | ◎ | KYU01CVT | USE AFTER ERROR(ファイルエラー処理) |
| 183 | VALUES | × | ◎ | KYU05DED | 88-level VALUES複数値指定 |
| 193 | ENTRY | × | ◎ | KYU09MRG | 代替エントリポイント定義 |
| 194 | MERGE | × | ◎ | KYU09MRG | MERGE文(複数ファイル結合) |
| 196 | RETURN | × | ◎ | KYU09MRG | MERGE OUTPUT PROCEDUREのRETURN文 |
| 204 | BEFORE | × | ◎ | KYU08PRI | WRITE BEFORE ADVANCING |
**予約語カバレッジ率(◎+△):** 125/20561.0%)→ **145/20570.7%**
**内 ◎:** 101/20549.3%)→ **121/20559.0%**
> 前回変更で追加した DECLARATIVES / USE / SORT / RELEASE / および ADDRESS 除外の修正は、
> 今回のパターン純化方針に伴い再編。SORT / RELEASE は KYU07DIV に COBOL SORT を使わないため削除。
---
## PICTURE記号カバレッジ拡張
| 記号 | 現状 | 目標 | プログラム | 使用例 |
|:----:|:----:|:----:|-----------|--------|
| ZZZ9 | × | ◎ | KYU08PRI | PIC Z(8)9 BLANK WHEN ZERO |
---
## 全体サマリ
| 指標 | 現状 | 目標(追加後) | 増分 |
|------|:----:|:--------------:|:----:|
| プログラムタイプ(35種) | 16使用 | **24使用** | **+8**68.6% |
| 予約語 ◎+△(205 | 125 | **145** | **+20**70.7% |
| 予約語 ◎(205 | 101 | **121** | **+20**59.0% |
| PICTURE記号(11種) | 7 | **8** | **+1** |
| COBOLプログラム数 | 20 | **29** | **+9** |