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
45 KiB
給与計算システム 設計書(サブシステム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)
テーブル1:EMP-MASTER(社員マスタテーブル)
| カラム | 型 | 内容 |
|---|---|---|
| EMP-ID | CHAR(8) | 社員番号(PK) |
| EMP-NAME | VARCHAR(40) | 社員名 |
| DEPT-CODE | CHAR(2) | 部署コード(01~50) |
| REGION-CODE | CHAR(2) | 地域コード(01~25、FYI用) |
| CATEGORY-CODE | CHAR(3) | 社員区分コード(001~100、FYI用) |
| BASE-SALARY | DECIMAL(9,0) | 基本給 |
| HOURLY-RATE | DECIMAL(7,0) | 時給 |
| DEPENDENT-COUNT | SMALLINT | 扶養人数 |
| STATUS | CHAR(1) | 0=在籍 / 9=退職 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
テーブル2:TAX-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) | 控除額 |
テーブル3:INSURANCE-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 | 更新日時 |
テーブル4:SALARY-RESULTS(給与計算結果テーブル)
| カラム | 型 | 内容 |
|---|---|---|
| EMP-ID | CHAR(8) | 社員番号(PK) |
| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMM(PK) |
| 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 ═══════════════════════════════════╡
│ KYU01CVT(CSV→FB変換) PGMパターン: 21
│ INSPECT CONVERTING(引用符内改行→SPACE)
│ UNSTRING COUNT IN(項目数カウント)
│ SUB04CHK で数値妥当性チェック(内部処理25)
│ コメント行(先頭#)は読み飛ばし
├── 正常 → EMP-RECORD(80B 固定長)
└── 異常 → ERROR-LOG
│
│ KYU02REG(DB2登録) PGMパターン: 09
│ EXEC SQL INSERT(新規)
│ SQLCODE=-803 → EXEC SQL UPDATE(重複更新)
├── → DB2 EMP-MASTER
└── 異常 → ERROR-LOG
│
╞══ KYUJ020 ═══════════════════════════════════╡
│ STEP020S: JCL SORT(ABSENCE-SUMMARY → 社員番号昇順)
│
│ KYU03AGG(欠勤集約) PGMパターン: 08
│ 同一社員内の複数欠勤レコードを読込 → 集約
│ INITIALIZE REPLACING NUMERIC DATA BY ZERO
├── → ABSENCE-AGGREGATE(80B 社員単位1件)
└── 異常 → ERROR-LOG
│
│ KYU04CAL(給与計算) PGMパターン: 32
│ ABSENCE-AGGREGATE + EMP-MASTER(DB2参照)
│ OVT-MONTHLY(DB2 Bサブシステム参照)
│ EVALUATE ALSO(勤怠区分×手当種別の複合分岐)
│ COMPUTE ROUNDED ON SIZE ERROR
├── → SALARY-DETAIL(240B)
└── 異常 → ERROR-LOG
│
╞══ KYUJ030 ═══════════════════════════════════╡
│ KYU05DED(控除計算) PGMパターン: 23
│ TAX-TABLE → EXEC SQL SELECT ... BETWEEN
│ INSURANCE-TABLE → SEARCH ALL(内部表LOAD後)
│ 課税所得計算・源泉所得税・社会保険料・住民税を算出
├── → SALARY-NET(200B)
└── 異常 → ERROR-LOG
│
│ KYU06UPD(DB2更新) PGMパターン: 09
│ EXEC SQL INSERT(新規)
│ SQLCODE=-803 → EXEC SQL UPDATE(再計算更新)
├── → DB2 SALARY-RESULTS
└── 異常 → ERROR-LOG
│
╞══ KYUJ040 ═══════════════════════════════════╡
│ STEP040S: JCL SORT(SALARY-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 SORT(SALARY-NET → 社員番号昇順)
│
│ KYU08PRI(給与明細印刷) PGMパターン: 04
│ FD LINAGE IS 66 LINES / TOP 6 / BOTTOM 6 / FOOTING 60
│ WRITE BEFORE ADVANCING PAGE(1社員1ページ)
│ BLANK WHEN ZERO / JUSTIFIED RIGHT
│ AT END-OF-PAGE / PAGE-COUNTER / SET UP BY
├── → PAYSLIP(SYSOUT)
└── 異常 → 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-DATA(200B)
└── 異常 → ERROR-LOG
JCL
KYUJ010 — 社員マスタ取込(2ステップ)
//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ステップ)
//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 はDB2(EXEC 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ステップ)
//KYUJ030 JOB (ACCT),'控除計算',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP030: 控除計算(Type 23)
//* TAX-TABLE / INSURANCE-TABLE はDB2(EXEC 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 — 部門別分割出力
//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 — 給与明細印刷
//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 — 支給データ結合
//KYUJ060 JOB (ACCT),'支給データ結合',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP060: MERGE(Type 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起動時は以下の順序を保証すること。
- Aサブシステム KINJ080(KIN08DBU)→ ABSENCE-SUMMARY生成
- Bサブシステム ZANJ025(ZAN06UPD)→ DB2 OVT-MONTHLY確定
- KYUJ010(マスタ取込、任意タイミング。初回のみ必須)
- KYUJ020 → KYUJ030 → KYUJ040(またはKYUJ050)→ KYUJ060(順次実行)
- KYUJ040 と KYUJ050 は SALARY-NET.DAT を
DISP=SHRで参照するため並行実行可能
プログラム詳細
KYU01CVT(社員マスタCSV→FB変換処理) — Type 21
| 項目 | 内容 |
|---|---|
| プログラム名称 | 社員マスタCSV→FB変換処理 |
| PGMパターン | CSV→FB変換(改行あり)+ 内部処理25(SUB04CHK数値チェック) |
| SORT前処理 | 不要 |
| 入力 | EMP-MASTER.CSV(可変長/改行あり) |
| 出力 | EMP-RECORD(80B 固定長)/ ERROR-LOG(VB) |
| 件数変化 | 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
- 引用符(
")で囲まれた社員名フィールド内に改行を含む場合は複数行読込 - コメント行(先頭
#)は読み飛ばし
機能:
OPEN INPUTCSVファイル(VB編成・可変長)READで1行取得。AT END まで繰り返し- 行内の引用符
"の出現状態を追跡し、引用符内改行とレコード境界改行を区別:WS-IN-QUOTEフラグが FALSE かつ行内に奇数個の"→ 引用符内続行モード開始WS-IN-QUOTEが TRUE かつ行内に奇数個の"→ 引用符内終了- 引用符内継続行は連結用ワーク領域(WS-CSV-ACCUM)に蓄積
- 完全な1レコード分のデータが揃った時点で、
INSPECT CONVERTING X"0D" X"0A" BY SPACEで引用符内改行をスペース変換 UNSTRING DELIMITED BY ',' INTO ... COUNT IN WS-FIELD-COUNTでCSV分解+項目数カウント- SUB04CHK で社員番号(8桁)・時給(7桁)の数値妥当性チェック(内部処理25に該当)
- 社員番号空チェック:
INSPECT TALLYING WS-TALLY FOR LEADING SPACES→ 全桁SPACEならエラー - 正常レコードは EMP-RECORD(80B)に WRITE
- エラー時は 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-RECORD(80B 固定長) |
| 出力 | DB2 EMP-MASTER(INSERT/UPSERT)/ ERROR-LOG(VB) |
| 件数変化 | N件 → DB2登録N件(全件) |
| 使用共通関数 | SUB02MSG, SUB03END |
| 該当プログラム分類 | No.09 DB更新 |
機能:
OPEN INPUTEMP-RECORD(80B 固定長)READで1件取得。AT END まで繰り返しEXEC SQL INSERT INTO EMP-MASTER ...でDB2登録- SQLCODE = -803(重複)の場合、
EXEC SQL UPDATEで更新 - エラー時は ERROR-LOG に書出し
新規カバレッジ構文:
| 構文 | 用途 |
|---|---|
| EXEC SQL INSERT | 社員マスタ新規登録 |
| SQLCODE判定によるUPSERT | 重複時UPDATE |
| CLOSE WITH LOCK | 入力ファイルのロッククローズ |
KYU03AGG(欠勤集約処理) — Type 08
| 項目 | 内容 |
|---|---|
| プログラム名称 | 欠勤集約処理 |
| PGMパターン | キーブレイク(集約) |
| SORT前処理 | JCL SORT(社員番号昇順) |
| 入力 | KYU02S01(80B JCL SORT済み欠勤データ) |
| 出力 | ABSENCE-AGGREGATE(80B 社員単位)/ ERROR-LOG(VB) |
| 件数変化 | 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-AGGREGATE(80B)/ PAY-PARAM(80B)/ EMP-MASTER(DB2参照)/ OVT-MONTHLY(DB2 Bサブシステム参照) |
| 出力 | SALARY-DETAIL(240B)/ ERROR-LOG(VB) |
| 件数変化 | 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:給与計算
- EMP-MASTER(DB2 SELECT) で基本給・時給・扶養人数を取得
- OVT-MONTHLY(DB2 SELECT WHERE EMP-ID / YEAR-MONTH) で残業時間を取得
- 欠勤控除額 = HOURLY-RATE × 欠勤時間合計
- 時間外手当 = HOURLY-RATE × 残業時間 × OVERTIME-RATE(1.25)
- 支給総額 = 基本給 + 各種手当 - 欠勤控除
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-DETAIL(240B)/ TAX-TABLE(DB2)/ INSURANCE-TABLE(DB2) |
| 出力 | SALARY-NET(200B)/ ERROR-LOG(VB) |
| 件数変化 | 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-FROM~IW-INCOME-TO範囲判定 |
| 88-level VALUES複数値 | 保険料率テーブルの境界値判定 |
KYU06UPD(給与計算結果DB2更新処理) — Type 09
| 項目 | 内容 |
|---|---|
| プログラム名称 | 給与計算結果DB2更新処理 |
| PGMパターン | DB更新 |
| SORT前処理 | 不要(KYU05DEDの出力を入力) |
| 入力 | SALARY-NET(200B) |
| 出力 | DB2 SALARY-RESULTS(INSERT/UPSERT)/ ERROR-LOG(VB) |
| 件数変化 | N件 → DB2登録N件(全件) |
| 使用共通関数 | SUB02MSG, SUB03END |
| 該当プログラム分類 | No.09 DB更新 |
機能:
OPEN INPUTSALARY-NET(200B)READで1件取得。AT END まで繰り返し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.
- 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(部署コード昇順) |
| 入力 | KYU04S01(200B JCL SORT済み)/ SYSIN(制御カード) |
| 出力 | DEPT-OUT-01〜50(各200B) |
| 件数変化 | N件 → 各部署合計N件(全社員) |
| 使用共通関数 | SUB02MSG, SUB03END |
| 該当プログラム分類 | No.10 50分割 |
機能:
READ SYSINで出力対象部署コード一覧を取得(省略時は全50部署)- JCL SORT済みのため部署コード順に入力。部署コードが変わるたびにファイルを切替
- 部署コード単位でファイルを開閉し、常に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.
- 全ファイル終了後、最終部署ファイルを
CLOSE WITH LOCKで確定
新規カバレッジ構文:
| 構文 | 用途 |
|---|---|
| 50分割(部署別1ファイルずつOPEN/CLOSE切替) | 部署別出力(常時1 OPEN でリソース節約) |
| CLOSE WITH LOCK | 出力ファイルのロッククローズ |
| READ SYSIN | 制御カードによる出力対象部署指定(内部処理28) |
KYU08PRI(給与明細印刷処理) — Type 04
| 項目 | 内容 |
|---|---|
| プログラム名称 | 給与明細印刷処理 |
| PGMパターン | レイアウト編集のみ(GETPUT)+ LINAGEページ制御 |
| SORT前処理 | JCL SORT(社員番号昇順) |
| 入力 | KYU05S01(200B) |
| 出力 | PAYSLIP(SYSOUT A行 200B)/ ERROR-LOG(VB) |
| 件数変化 | N件 → 1社員1ページ(Nページ) |
| 使用共通関数 | SUB01DAT, SUB02MSG, SUB03END |
| 該当プログラム分類 | No.04 レイアウト編集のみ(GETPUT) |
機能:
Step1:LINAGEページ定義
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-NET(200B)/ BONUS-DATA(200B) |
| 出力 | PAYMENT-DATA(200B)/ ERROR-LOG(VB) |
| 件数変化 | 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-RECORD(80B) — 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-AGGREGATE(80B) — 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-DETAIL(240B) — 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-NET(200B) — 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)。部署コードに応じて振り分け出力。
PAYSLIP(200B) — 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-DATA(200B) — 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/35(45.7%)→ 24/35(68.6%)
本サブシステムで新規追加するプログラムタイプは 7種(08, 09x2, 10, 21, 23, 32, 35)。 09(DB更新)は既に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 BY(PAGE-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/205(61.0%)→ 145/205(70.7%) 内 ◎: 101/205(49.3%)→ 121/205(59.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 |