# 給与計算システム 設計書(サブシステム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ステップ) ```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 は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ステップ) ```jcl //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 — 部門別分割出力 ```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: 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起動時は以下の順序を保証すること。 1. Aサブシステム KINJ080(KIN08DBU)→ ABSENCE-SUMMARY生成 2. Bサブシステム ZANJ025(ZAN06UPD)→ 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-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 ``` - 引用符(`"`)で囲まれた社員名フィールド内に改行を含む場合は複数行読込 - コメント行(先頭`#`)は読み飛ばし **機能:** 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-RECORD(80B)に 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-RECORD(80B 固定長) | | **出力** | DB2 EMP-MASTER(INSERT/UPSERT)/ ERROR-LOG(VB) | | **件数変化** | N件 → DB2登録N件(全件) | | **使用共通関数** | SUB02MSG, SUB03END | | **該当プログラム分類** | No.09 DB更新 | **機能:** 1. `OPEN INPUT` EMP-RECORD(80B 固定長) 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(社員番号昇順) | | **入力** | 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:給与計算 1. **EMP-MASTER(DB2 SELECT)** で基本給・時給・扶養人数を取得 2. **OVT-MONTHLY(DB2 SELECT WHERE EMP-ID / YEAR-MONTH)** で残業時間を取得 3. 欠勤控除額 = HOURLY-RATE × 欠勤時間合計 4. 時間外手当 = HOURLY-RATE × 残業時間 × OVERTIME-RATE(1.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-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更新 | **機能:** 1. `OPEN INPUT` SALARY-NET(200B) 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(部署コード昇順) | | **入力** | KYU04S01(200B 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(社員番号昇順) | | **入力** | 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** |