Files
cobol-tna-system/基本設計書/03_給与計算システム_設計書(サブシステムC).md
qiuqiuqiu 75475b3fa1 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
2026-07-09 08:09:59 +08:00

1182 lines
45 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 給与計算システム 設計書(サブシステム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** |