feat: サブシステムB 残業統計管理 初回production反映

- 全6プログラム(ZAN01CHK~ZAN06UPD)ソース・実行ファイル
- 5サブプログラム(SUB01DAT~SUB05TIM)ソース・DLL
- 10 COPY書式ファイル
- 詳細設計書12ファイル
- サブシステムB全体設計書
- bin/配下の実行ファイル资産
This commit is contained in:
qiuqiuqiu
2026-06-17 23:20:53 +08:00
parent c13e2407d7
commit b3e800e601
31 changed files with 3273 additions and 103 deletions
+5 -12
View File
@@ -1,18 +1,11 @@
# 编译产物 # バックアップディレクトリ(push対象外)
*.exe old/
*.dll
# コンパイル中間ファイル
*.o *.o
*.obj *.obj
# 临时文件 # データ・ログファイル
data/
inpute/
test/
# 备份文件
*_2026*.bak.*
# 日志文件
*.log *.log
*.DAT *.DAT
*.dat *.dat
+32 -77
View File
@@ -1,99 +1,54 @@
# 勤怠管理システム - 生产环境资源 # 勤怠管理システム - 生产环境资源
本リポジトリは勤怠管理システム(サブシステムA:勤怠休暇管理、サブシステムB:残業統計管理、サブシステムC:給与計算)の生产环境最終版リソースを管理する。 本リポジトリは勤怠管理システム(サブシステムA:勤怠休暇管理、サブシステムB:残業統計管理、サブシステムC:給与計算)の生产环境リソースを管理する。
## 目录结构 ## 目录结构
``` ```
production/ production/
├── src/ # 主程序源代码COBOL ├── src/ # 主プログラムソースCOBOL
├── sub/ # 共通サブプログラムSUB01DATSUB05TIM ├── sub/ # 共通サブプログラム
├── cpy/ # COPY書式ファイル(レコード定義・連絡領域) ├── cpy/ # COPY書式ファイル(レコード定義・連絡領域)
├── jcl/ # 実行スクリプト(Windows batch ├── bin/ # 実行ファイル(.exe)+サブプログラムDLL(.dll
── 詳細設計書/ # 詳細設計ドキュメント ── design/ # サブシステム全体設計書
└── 詳細設計書/ # 詳細設計ドキュメント
```
## サブシステム構成
| サブシステム | 役割 | COBOLプログラム |
|-------------|------|----------------|
| A: 勤怠休暇管理 | 休暇申請取込・打刻照合・日別計算・DB更新 | KIN01INPKIN09CSV9本) |
| B: 残業統計管理 | 加班申請取込・重複チェック・照合・集計・DB更新 | ZAN01CHKZAN06UPD6本) |
| C: 給与計算 | 欠勤統計取込・給与計算・明細出力 | 後続追加予定 |
## 构建与运行 ## 构建与运行
### 编译命令 ### 编译
ソースコードはCOBOL + DB2向けに実装されている。
開発環境(Windows + GnuCOBOL 3.2.0)にはDB2がないため、プリプロセッサ`convert-sql.mjs``EXEC SQL`をSQLite3用の`CALL 'br_exec'`に変換し、SQLite3で動作させる。
```batch ```batch
rem 单个程序编译 rem プロジェクトルートで実行
tools\build.bat <cobol>\<program>.cbl tools\build.bat src\<program>.cbl
rem 例如:
tools\build.bat cobol\ZAN01CHK.cbl
tools\build.bat cobol\ZAN02CHK.cbl
tools\build.bat cobol\ZAN03CHK.cbl
``` ```
### 运行环境设置 ### 実行
```batch ```batch
set COB_CONFIG_DIR=C:\mingw64\share\gnucobol\config set COB_CONFIG_DIR=C:\mingw64\share\gnucobol\config
set COB_LIBRARY_PATH=<path_to_cobol_directory> set COB_LIBRARY_PATH=bin
cd <project_root>
bin\<program>.exe
``` ```
### 输入输出 DD 名称对应关系 ### サブシステムB テスト実行順序
| 程序 | DD 名称 | 说明 | ```batch
|----------|---------|----------------| ZAN01CHK → ZAN02CHK → ZAN03CHK → ZAN04MAT → ZAN05CAL → ZAN06UPD
| ZAN01CHK | ZAN01R01 | OVT-APPLY.DAT | ```
| | ZAN01W01 | OVT-VALID.DAT |
| | ZAN01W02 | OVT-CANCEL.DAT |
| | ZAN01W03 | ERROR-LOG.DAT |
| ZAN02CHK | ZAN02R01 | OVT-VSORT.DAT |
| | ZAN02W01 | OVT-CHECKED.DAT|
| | ZAN02W02 | ERROR-LOG.DAT |
| ZAN03CHK | ZAN03R01 | OVT-NODUP.DAT |
| | ZAN03R02 | PUNCH-SORTED.DAT|
| | ZAN03R03 | HOLIDAY.DAT |
| | ZAN03W01 | OVT-MATCHED.DAT|
| | ZAN03W02 | ERROR-LOG.DAT |
## 测试结果概要 ## 编码
三个主程序均已通过疏通测试,覆盖正常和异常分支: 源文件使用 ASCII/JIS 编码保存。COPYファイルは元の命名を維持する。
**ZAN01CHK - 残業申請振分処理**
- ✓ CSV 格式解析正确
- ✓ status=0/1 → W01 有效申请
- ✓ status=9 → W02 取消申请
- ✓ 无效状态/DATETIME CHECK→ W03错误日志
- ✓ START TIME >= 1830验证
- ✓ START < END验证
- ✓ 时间差 >= 30min验证
- **已修复**: W01/W02/W03 FILLER 未初始化 Bug
**ZAN02CHK - 時間帯重複チェック処理**
- ✓ 同一天同一员工的时段重复检查
- ✓ 初回记录直出到 W01
- ✓ キーブレイク正确处理
- ✓ OVERLAP 判断逻辑正确(前終了 > 現開始)
- **已修复**: 主循环中首条记录与自身比较误判的 Bug
- **已修复**: NORMALOUTSOR不更新 PREV 导致后续比较基准失准
**ZAN03CHK - 打刻時間照合処理**
- ✓ R01(申请) vs R02(打刻) 匹配检查
- ✓ 时间范围包含验证(申请⊆打刻)
- ✓ NOMATCH 处理(无对应打刻)→ W02错误
- ✓ MISMATCH 处理(时间不符)→ W02错误
- ✓ HOLIDAY判定正确(OVT-TYPE="H"
- ✓ R03休日计数问题已修复
- ✓ W02 FILLER 初始化问题已修复
- **已知限制**: GnuCOBOL 读无 CRLF 的二进制文件可能多产生一条伪空记录
## 重要 Notes
1. **GnuCOBOL 文件读取特性**: 在纯二进制定长文件(无行分隔符)模式下,GnuCOBOL READ 操作可能在真正 EOF 前多产生一条记录,这是运行时环境的已知行为,非代码 Bug。
2. **COPY 文件命名**: 所有 COPY 文件均保留原始命名,无额外字符后缀。
3. **备份文件**: 生产环境只包含最新确定的版本,不包含 *.bak.**_fixed* 等中间版本。
4. **编码**: 源文件使用 ASCII/JIS 编码保存。
## 维护建议
- 每次修改后请再次进行完整疏通测试
- JCL/batch 脚本的 DD 变量名需与实际 DD 分配一致
- 确保 `COB_LIBRARY_PATH` 包含 SUB*.dll(如需要动态加载)
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
* SUB05TIM 時刻丸め用連絡領域 * SUB05TIM 時刻丸め用連絡領域
01 T01TIMPAR. 01 T01TIMPAR.
03 T01TIMHRS PIC 9(004)V9(001). 03 T01TIMHRS PIC 9(004)V9(001).
03 T01TIMOUT PIC 9(004)V9(001). 03 T01TIMOUT PIC 9(004)V9(001).
03 T01TIMRRC PIC 9(004). 03 T01TIMRRC PIC 9(004).
@@ -0,0 +1,822 @@
# 残業統計管理システム 設計書(サブシステムB)
## システム概要
本サブシステムは、社員からの加班申請データを元に、振り分け・重複チェック・打刻照合・取消マッチング・キーブレイク集約を行い、月次の加班統計データをDBに保存する。
### サブシステム情報
| 項目 | 内容 |
|------|------|
| サブシステムID | ZAN(残業→ZANgyo |
| COBOLプログラム数 | 6 |
| JCL数 | 6 |
| DB | 1OVERTIME-DB / DB2、2テーブル) |
### システム定数
| 定数 | 値 | 説明 |
|------|-----|------|
| WORK-START | 0900 | 所定労働開始時刻 |
| WORK-END | 1800 | 所定労働終了時刻 |
| DINNER-START | 1830 | 食事時間開始(1830以前は加班不可) |
| MIN-OVT-HOURS | 0.5 | 加班最小単位 |
### 入力CSV形式(OVT-APPLY
各レコードはCSV形式。
| 項目 | 内容 |
|------|------|
| フォーマット | `申請番号,社員番号,日付(YYYYMMDD),開始時刻(HHMM),終了時刻(HHMM),ステータス` |
| ステータス 0 | 申請(新規) |
| ステータス 1 | 承認済(後続処理で状態更新) |
| ステータス 9 | 取消 |
---
## ファイル一覧
| # | ファイル名 | 編成 | RECM | サイズ | 用途 | 区分 |
|---|-----------|------|------|-------|------|------|
| 1 | OVT-APPLY | SEQUENTIAL | FB | 80 | 加班申請CSV(入力) | 新規 |
| 2 | OVT-VALID | SEQUENTIAL | FB | 80 | 振り分け通過(有効申請) | 新規 |
| 3 | OVT-CANCEL | SEQUENTIAL | FB | 80 | 振り分け通過(取消) | 新規 |
| 4 | OVT-NODUP | SEQUENTIAL | FB | 80 | 重複チェック通過データ | 新規 |
| 5 | OVT-CHECKED | SEQUENTIAL | FB | 80 | 打刻照合通過(OVT-TYPE付加) | 新規 |
| 6 | OVT-MATCHED | SEQUENTIAL | FB | 80 | マッチング通過(処理番号付加) | 新規 |
| 7 | OVT-DBCLEAN | SEQUENTIAL | FB | 80 | 孤立取消(DB削除対象) | 新規 |
| 8 | OVT-SUMMARY | SEQUENTIAL | FB | 80 | 集約結果 | 新規 |
| 9 | ERROR-LOG | SEQUENTIAL | VB | 200 | エラーレコード退避 | Aと共用 |
| 10 | EDITED-PUNCH | SEQUENTIAL | FB | 80 | 打刻データ(Aシステム出力) | Aから連携 |
| 11 | HOLIDAY-FILE | SEQUENTIAL | FB | 80 | 休日マスタファイル(Aシステム提供) | Aから連携 |
### DBテーブル管理方針
DB2インスタンスは全サブシステムで共有するが、テーブルはサブシステム別に機能分割する。
BサブシステムのテーブルはOVT-APPLICATIONS, OVT-MONTHLYの2つであり、これらの管理・更新はBのみが行う。
Aサブシステムのテーブル(DAILY_RECORDS, LEAVE_RECORDS等)は参照せず、A→Bの連携はEDITED-PUNCHファイル経由に限定する。
HOLIDAY_CALENDARテーブルについては、Aサブシステムによって提供されるHOLIDAY-FILEを使用することで参照を代替する。
### DB二重対応
本サブシステムのDB操作はDB2の埋め込みSQL(`EXEC SQL`)で直接記述する。
ただし、休日マスタに関するDBアクセスはファイルベースで処理するため、
ZAN06UPD以外の全プログラムはDBアクセスを伴わない。
各プログラム内でEXEC SQL INSERT/UPDATE/SELECTを発行する。
### 共通関数利用方針
Aサブシステムの共通関数のうち、安定した汎用APISUB01DAT, SUB02MSG, SUB03END, SUB04CHK, SUB05TIM)はBでも利用する。
SUB06DBUはサブシステムAで使用するDB更新用サブプログラムであり、Bでは使用しない(EXEC SQLを直接記述)。
---
## DB構成
### DB名称:残業統計データベース(OVERTIME-DB
#### テーブル1OVT-APPLICATIONS(個別加班申請テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| APPL-ID | CHAR(8) | 申請番号(PK |
| EMP-ID | CHAR(8) | 社員番号 |
| APPL-DATE | CHAR(8) | 申請日 YYYYMMDD |
| OVT-TYPE | CHAR(1) | W=平日 / H=休日 |
| START-TIME | CHAR(4) | 開始時刻 HHMM |
| END-TIME | CHAR(4) | 終了時刻 HHMM |
| OVT-HOURS | DECIMAL(4,1) | 加班時間 |
| STATUS | CHAR(1) | 0=有効 / 9=取消 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### テーブル2OVT-MONTHLY(月次集計テーブル)
| カラム | 型 | 内容 |
|--------|---|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMMPK |
| OVT-TYPE | CHAR(1) | W=平日 / H=休日(PK |
| OVT-HOURS | DECIMAL(6,1) | 加班時間合計 |
| OVT-COUNT | INTEGER | 加班回数 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
---
## 処理フロー
```
OVT-APPLYCSV、任意順)
レコード: 申請番号,社員番号,日付,開始時刻,終了時刻,ステータス(0/1/9)
╞══ ZANJ010 ═══════════════════════════════════╡
│ ZAN01CHK(残業申請振分処理)— 振り分け
│ UNSTRINGでCSV分解 / EVALUATEでステータス判定
│ SUB04CHKで日付/時刻/数値チェック / 0.5h未満チェック
├── ステータス=0,1 → OVT-VALID
├── ステータス=9 → OVT-CANCEL
└── 異常 → ERROR-LOG
╞══ ZANJ012 ═══════════════════════════════════╡
│ SORT(OVT-VALID → 社員番号+日付+開始時刻昇順)
│ ZAN02CHK(時間帯重複チェック処理)— 項目チェック
│ 同社員+同日の前レコード終了時刻 > 現レコード開始時刻
│ → 重複(境界接続は重複としない)
├── 通過 → OVT-NODUP
└── 重複 → ERROR-LOG
╞══ ZANJ013 ═══════════════════════════════════╡
│ SORT(EDITED-PUNCH → 社員番号+日付昇順)
│ ZAN03CHK(打刻時間照合処理)— マッチング(N:1)
│ OVT-NODUP + PUNCH-SORTED を社員番号+日付で突合
│ 申請時間帯が出勤〜退勤の範囲内か確認
│ HOLIDAY_CALENDAR検索+曜日関数で休日判定→OVT-TYPE(W/H)設定
├── 通過 → OVT-CHECKED
└── 異常 → ERROR-LOG
╞══ ZANJ015 ═══════════════════════════════════╡
│ SORT(OVT-CHECKED → 申請番号昇順)
│ SORT(OVT-CANCEL → 申請番号昇順)
│ ZAN04MAT(取消マッチング処理)— マッチング1:1
│ キー=申請番号で VALID vs CANCEL を突合
├── VALID有 + CANCEL無 → OVT-MATCHED
├── VALID有 + CANCEL有 → 消滅
└── VALID無 + CANCEL有 → OVT-DBCLEAN
╞══ ZANJ020 ═══════════════════════════════════╡
│ SORT(OVT-MATCHED → 申請番号+処理番号昇順)
│ ZAN05CAL(残業時間集計処理)— キーブレイク集計
│ 同一申請番号内の最終レコードを集計
│ DIVIDE 分→時間変換 / SUB05TIMで丸め
│ COMPUTE ROUNDED ON SIZE ERROR
│ → OVT-SUMMARY
╞══ ZANJ025 ═══════════════════════════════════╡
│ ZAN06UPD(残業統計DB更新処理)— DB更新
├── OVT-SUMMARY → OVT-APPLICATIONS INSERT/UPDATE
│ → OVT-MONTHLY UPSERT(平日/休日別)
└── OVT-DBCLEAN → OVT-APPLICATIONS STATUS='9' UPDATE
→ OVT-MONTHLY 減算UPDATE
→ 該当なし → ERROR-LOG
```
---
## JCL
### ZANJ010 — 残業申請振分
```jcl
//ZANJ010 JOB (ACCT),'残業申請振分',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP010: 振り分け(SORT不要)
//* 注:YEARMONTH PARMは他プログラムとの一貫性のため渡すが、ZAN01CHK内では未使用
//*=====================================================================
//STEP010 EXEC PGM=ZAN01CHK
//ZAN01R01 DD DSN=OVT-APPLY.DAT,DISP=SHR
//ZAN01W01 DD DSN=OVT-VALID.DAT,DISP=(NEW,PASS)
//ZAN01W02 DD DSN=OVT-CANCEL.DAT,DISP=(NEW,PASS)
//ZAN01W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### ZANJ012 — 時間帯重複チェック
```jcl
//ZANJ012 JOB (ACCT),'時間帯重複チェック',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP012S: 有効申請 SORT
//*=====================================================================
//STEP012S EXEC PGM=SORT
//SORTIN DD DSN=OVT-VALID.DAT,DISP=(OLD,DELETE)
//SORTOUT DD DSN=OVT-VSORT.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(9,8,CH,A,17,8,CH,A,25,4,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP012: 重複チェック
//*=====================================================================
//STEP012 EXEC PGM=ZAN02CHK,PARM='YEARMONTH=&YEARMONTH'
//ZAN02R01 DD DSN=OVT-VSORT.DAT,DISP=(OLD,DELETE)
//ZAN02W01 DD DSN=OVT-NODUP.DAT,DISP=(NEW,PASS)
//ZAN02W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### ZANJ013 — 打刻時間照合
```jcl
//ZANJ013 JOB (ACCT),'打刻時間照合',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP013S: 打刻データ SORT
//*=====================================================================
//STEP013S EXEC PGM=SORT
//SORTIN DD DSN=EDITED-PUNCH.DAT,DISP=SHR
//SORTOUT DD DSN=PUNCH-SORTED.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(1,8,CH,A,9,8,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP013: 打刻照合 + 曜日判定
//*=====================================================================
//STEP013 EXEC PGM=ZAN03CHK,PARM='YEARMONTH=&YEARMONTH'
//ZAN03R01 DD DSN=OVT-NODUP.DAT,DISP=(OLD,DELETE)
//ZAN03R02 DD DSN=PUNCH-SORTED.DAT,DISP=(OLD,DELETE)
//ZAN03R03 DD DSN=HOLIDAY-FILE.DAT,DISP=SHR
//ZAN03W01 DD DSN=OVT-CHECKED.DAT,DISP=(NEW,PASS)
//ZAN03W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### ZANJ015 — 取消マッチング
```jcl
//ZANJ015 JOB (ACCT),'取消マッチング',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP015S1: チェック済データ SORT
//*=====================================================================
//STEP015SA EXEC PGM=SORT
//SORTIN DD DSN=OVT-CHECKED.DAT,DISP=(OLD,DELETE)
//SORTOUT DD DSN=OVT-SORTED.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(1,8,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP015S2: 取消データ SORT
//*=====================================================================
//STEP015SB EXEC PGM=SORT
//SORTIN DD DSN=OVT-CANCEL.DAT,DISP=(OLD,DELETE)
//SORTOUT DD DSN=OVT-CSORT.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(1,8,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP015: マッチング
//*=====================================================================
//STEP015 EXEC PGM=ZAN04MAT,PARM='YEARMONTH=&YEARMONTH'
//ZAN04R01 DD DSN=OVT-SORTED.DAT,DISP=(OLD,DELETE)
//ZAN04R02 DD DSN=OVT-CSORT.DAT,DISP=(OLD,DELETE)
//ZAN04W01 DD DSN=OVT-MATCHED.DAT,DISP=(NEW,PASS)
//ZAN04W02 DD DSN=OVT-DBCLEAN.DAT,DISP=(NEW,PASS)
//ZAN04W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### ZANJ020 — 残業時間集計
```jcl
//ZANJ020 JOB (ACCT),'残業時間集計',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP020S: マッチング済データ SORT
//*=====================================================================
//STEP020S EXEC PGM=SORT
//SORTIN DD DSN=OVT-MATCHED.DAT,DISP=(OLD,DELETE)
//SORTOUT DD DSN=OVT-SORTED2.DAT,DISP=(NEW,PASS)
//SYSIN DD *
SORT FIELDS=(1,8,CH,A,35,2,CH,A),EQUALS
/*
//*
//*=====================================================================
//* STEP020: キーブレイク集計
//*=====================================================================
//STEP020 EXEC PGM=ZAN05CAL,PARM='YEARMONTH=&YEARMONTH'
//ZAN05R01 DD DSN=OVT-SORTED2.DAT,DISP=(OLD,DELETE)
//ZAN05W01 DD DSN=OVT-SUMMARY.DAT,DISP=(NEW,PASS)
```
### ZANJ025 — 残業統計DB更新
```jcl
//ZANJ025 JOB (ACCT),'残業統計DB更新',CLASS=A
//*
//*--- パラメータ定義 ---
//SETPARM SET YEARMONTH=202605
//*
//*=====================================================================
//* STEP025: DB更新(SORT不要)
//*=====================================================================
//STEP025 EXEC PGM=ZAN06UPD,PARM='YEARMONTH=&YEARMONTH'
//ZAN06R01 DD DSN=OVT-SUMMARY.DAT,DISP=(OLD,DELETE)
//ZAN06R02 DD DSN=OVT-DBCLEAN.DAT,DISP=(OLD,DELETE)
//ZAN06W01 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS)
```
### 実行順序
BサブシステムのJOBは、AサブシステムのKINJ020(打刻チェック)出力を入力とする。
そのためJCL起動時は以下の順序を保証すること。
1. Aサブシステム KINJ020KIN03PCK)→ EDITED-PUNCH生成
2. Bサブシステム ZANJ010〜ZANJ025(必要時順次実行)
KINJ030(日別計算)は各打刻確定後であればいつでも実行可能で、ZANJ系列との依存関係はない。
---
## プログラム詳細
### STEP010: ZAN01CHK(残業申請振分処理) — 振り分け
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 残業申請振分処理 |
| **PGMパターン** | 振り分け |
| **SORT前処理** | 不要 |
| **入力ファイル** | OVT-APPLY80B / CSV形式) |
| **出力ファイル** | OVT-VALID80B/ OVT-CANCEL80B/ ERROR-LOGVB |
| **件数変化** | N件 → 有効M件 + 取消K件 + 異常L件(M+K+L=N |
| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03ENDABEND, SUB04CHK(項目チェック) |
**入力CSVレコード例:** `A001,EMP001,20260610,1800,2000,0`
**機能:**
1. READ OVT-APPLY
2. **UNSTRING** でCSVレコードを各項目に分解
3. **UNSTRING TALLYING** でカンマ区切り数をカウント(項目数妥当性確認)
4. **EVALUATE** でステータスを判定
- 0 or 1 → 有効申請として次へ
- 9 → OVT-CANCEL に書出し
- その他 → エラーとして処理
5. SUB04CHK で日付(DATE8)・時刻(TIME4)・社員番号(NUMERIC)を検証
6. 加班時間計算(時刻はHHMM形式のため分単位に変換してから減算)
```
開始分 = (開始時刻 / 100) * 60 + (開始時刻 - (開始時刻 / 100) * 100)
終了分 = (終了時刻 / 100) * 60 + (終了時刻 - (終了時刻 / 100) * 100)
加班時間(分) = 終了分 - 開始分
```
- 開始時刻 < DINNER-START1830 → エラー(18:30以前は食事時間のため加班不可)
- 加班時間 < 30分 → エラー(0.5h未満)
- 開始時刻 ≧ 終了時刻 → エラー
7. 通過 → OVT-VALID に書出し
8. エラー → 該当レコードをERROR-LOG用01レコードにMOVEしてWRITE出力
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| UNSTRING | CSVレコードの項目分解(TALLYING句で区切り数カウント) |
| STRING | エラーレコード編集 |
---
### STEP012: ZAN02CHK(時間帯重複チェック処理) — 項目チェック
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 時間帯重複チェック処理 |
| **PGMパターン** | 項目チェック |
| **SORT前処理** | OVT-VALID → 社員番号+日付+開始時刻昇順 |
| **入力ファイル** | OVT-VSORT80B |
| **出力ファイル** | OVT-NODUP80B/ ERROR-LOGVB |
| **件数変化** | M件 → 通過K件 + 重複エラー(M-K)件 |
| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03ENDABEND |
**機能:**
OVT-VSORT は既に社員番号+日付+開始時刻でソート済。順次READしながら直前レコードと比較する。
1. READ OVT-VSORT → 現レコード取得成功
2. 直前レコードと同一社員番号+日付 かつ 前終了時刻 > 現開始時刻 の場合 → **時間帯重複**
- 境界接続(前終了時刻 = 現開始時刻)は重複としない
3. 重複 → ERROR-LOG へ
4. 重複なし → OVT-NODUP へ書出し
5. 社員番号 or 日付が変わったら直前レコードをリセット
6. **SET** で重複有無フラグを設定
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| SET | 重複有無フラグ設定 |
| CONTINUE | リセット時の空処理 |
---
### STEP013: ZAN03CHK(打刻時間照合処理) — マッチング(N:1)
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 打刻時間照合処理 |
| **PGMパターン** | マッチング(N:1) |
| **SORT前処理** | EDITED-PUNCH → 社員番号+日付昇順 |
| **入力ファイル** | OVT-NODUP80B/ PUNCH-SORTED80B |
| **出力ファイル** | OVT-CHECKED80B/ ERROR-LOGVB |
| **件数変化** | K件 → 通過P件 + エラー(K-P)件 |
| **使用共通関数** | SUB02MSG(メッセージ), SUB03ENDABEND |
**機能:**
#### Step1:打刻時間内チェック
OVT-NODUP と PUNCH-SORTED を社員番号+日付で突合(共にソート済のため順次READで処理可)。
1. READ OVT-NODUP → 現レコード
2. 該当社員番号+日付の打刻レコードを PUNCH-SORTED から READ
3. 打刻データあり かつ 以下を両方満たすことを確認:
- 申請開始時刻 ≧ 出勤時刻
- 申請終了時刻 ≦ 退勤時刻
4. 範囲外 または 打刻データなし → ERROR-LOG
#### Step2:曜日判定
**SEARCH ALL** で休日マスタファイル(WORKING-STORAGE)を検索し、申請日の種別を判定。
Aサブシステムと同一の休日定義に従う(HOLIDAY-FILEファイル相当のデータを保持)。
##### 休日ファイル初期化手順
初期処理(1000ITTSOR相当)で以下の手順によりHOLIDAY-TABLEを構築する。
1. FUNCTION CURRENT-DATE で処理日を取得
2. 処理日の年月から該当月の初日〜末日を算出
3. 各日について曜日判定(土日またはHOLIDAY-FILE該当)を行い、
休日=該当月内の全祝日レコードをWORKING-STORAGEのHOLIDAY-TABLEに格納
```
* 休日データ取得(ファイル読込み)
OPEN INPUT HOLIDAY-FILE
READ HOLIDAY-FILE
... 逐次処理
CLOSE HOLIDAY-FILE
```
```
01 HOLIDAY-TABLE.
05 HOLIDAY-CNT PIC 9(004).
05 HOLIDAY-DATA OCCURS 1 TO 366 TIMES
DEPENDING ON HOLIDAY-CNT
INDEXED BY HD-IDX.
10 HD-DATE PIC 9(008).
10 HD-TYPE PIC X(001).
88 HD-HOLIDAY VALUE 'H'.
```
```
SET HD-IDX TO 1
SEARCH ALL HOLIDAY-DATA
AT END
SET OVT-TYPE TO 'W'
WHEN HD-DATE(HD-IDX) = APPL-DATE
IF HD-HOLIDAY(HD-IDX)
SET OVT-TYPE TO 'H'
ELSE
SET OVT-TYPE TO 'W'
END-IF
END-SEARCH
```
- HOLIDAY-FILE該当 → OVT-TYPE='H'
- 該当なし → OVT-TYPE='W'
**MOVE** で OVT-TYPE を設定。**FUNCTION CURRENT-DATE** で処理日を取得し、曜日計算の補助に使用。
全通過レコードは OVT-TYPE を付加して OVT-CHECKED に書出し。
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| SEARCH ALL | 休日マスタテーブル二分探索 |
| SET | テーブル添字操作 |
---
### STEP015: ZAN04MAT(取消マッチング処理) — マッチング1:1
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 取消マッチング処理 |
| **PGMパターン** | マッチング(1:1) |
| **SORT前処理** | OVT-CHECKED → 申請番号昇順 |
| | OVT-CANCEL → 申請番号昇順 |
| **入力ファイル** | OVT-SORTED80B/ OVT-CSORT80B |
| **出力ファイル** | OVT-MATCHED80B/ OVT-DBCLEAN80B/ ERROR-LOGVB |
| **件数変化** | 有効P件 + 取消R件 → 通過Q件 + 消滅S件 + DB削除T件(P=Q+S, R=S+T |
| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03ENDABEND |
**機能:**
キー=**申請番号(APPL-ID** で OVT-SORTED(有効申請)と OVT-CSORT(取消)をマッチング1:1。
マッチング制御の分岐:
| 条件 | 結果 | 処理 |
|------|------|------|
| SORTED.APPL-ID < CSORT.APPL-ID | 申請のみ(取消なし) | OVT-MATCHEDへ |
| SORTED.APPL-ID = CSORT.APPL-ID | 両方あり(取消済) | 消滅(出力なし)。ただし監査のため取消情報をERROR-LOGに記録(エラー区分=03、取消申請番号+原本データ) |
| SORTED.APPL-ID > CSORT.APPL-ID | 取消のみ(既DB登録済) | OVT-DBCLEANへ |
同一申請番号グループ内の出力順に **処理番号(OA-PROC-SEQ** を1から付与する。
**STRING** で申請情報を編集して OVT-MATCHED に書出す。
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| STRING | 申請情報編集出力 |
---
### STEP020: ZAN05CAL(残業時間集計処理) — キーブレイク集計
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 残業時間集計処理 |
| **PGMパターン** | キーブレイク(集計) |
| **SORT前処理** | OVT-MATCHED → 申請番号+処理番号昇順 |
| **入力ファイル** | OVT-SORTED280B |
| **出力ファイル** | OVT-SUMMARY80B |
| **件数変化** | Q件 → 申請番号ユニーク数(L件、L≦Q) |
| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03ENDABEND, SUB05TIM(時刻丸め) |
**機能:**
#### Step1:キーブレイク制御
同一申請番号内に複数レコード(例:申請(0) + 承認済(1))がある場合、グループ内の**最終レコード**を集約結果として採用する。
```
入力(申請番号+処理番号昇順):
A001,EMP01,6/10,1800,2000,0 ← 申請(処理番号1
A001,EMP01,6/10,1800,2000,1 ← 承認済(処理番号2 → 最新)
集約結果: 承認済(1) を採用、申請(0) は捨てる
```
- READ → 申請番号が変わるまで読み進める
- ブレイク(申請番号切替)時に、**直前に保持していたレコード**を出力
- グループ内の途中レコードは **CONTINUE** で読み飛ばす
- **SET** で集約結果の有無フラグを設定
#### Step2:加班時間計算
終了時刻 - 開始時刻 を分数で計算 → **DIVIDE** で時間に変換。
```
DIVIDE 分 BY 60 GIVING 時間 REMAINDER 剰余
```
**SUB05TIMmode 20.1h単位切捨)** を呼び出して丸め処理。加班の丸めは0.1h単位切捨が正となる。
**COMPUTE ROUNDED ON SIZE ERROR** で内部計算のエラー処理。
```
COMPUTE WRK-OVT-HOURS ROUNDED = WRK-MINUTES / 60
ON SIZE ERROR
CONTINUE
MOVE ZERO TO WRK-OVT-HOURS
END-COMPUTE
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| COMPUTE ROUNDED ON SIZE ERROR | 丸め計算+エラー処理 |
| DIVIDE | 分→時間変換 |
| CONTINUE | キーブレイク制御の空分岐 |
| SET | 集計結果フラグ設定 |
| ACCEPT FROM DATE | 処理日付取得 |
---
### STEP025: ZAN06UPD(残業統計DB更新処理) — DB更新
| 項目 | 内容 |
|------|------|
| **プログラム名称** | 残業統計DB更新処理 |
| **PGMパターン** | DB更新 |
| **SORT前処理** | 不要 |
| **入力ファイル** | OVT-SUMMARY80B/ OVT-DBCLEAN80B |
| **出力ファイル** | OVERTIME-DBDB2/ ERROR-LOGVB |
| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03ENDABEND |
**機能:**
全DB操作は埋め込みSQL`EXEC SQL`)で直接記述する。
#### 処理1OVT-SUMMARY → DB登録
**EXEC SQL** でDB2にINSERT/UPDATEを発行する。
```
EXEC SQL
INSERT INTO OVT-APPLICATIONS
(APPL-ID, EMP-ID, APPL-DATE, OVT-TYPE,
START-TIME, END-TIME, OVT-HOURS, STATUS)
VALUES
(:WRK-APPL-ID, :WRK-EMP-ID, :WRK-APPL-DATE,
:WRK-OVT-TYPE, :WRK-START-TIME, :WRK-END-TIME,
:WRK-OVT-HOURS, :WRK-STATUS)
END-EXEC.
IF SQLCODE NOT = 0
* 同一APPL-ID存在 → UPDATEに変更
EXEC SQL
UPDATE OVT-APPLICATIONS SET
STATUS = :WRK-STATUS,
UPDATED-AT = CURRENT TIMESTAMP
WHERE APPL-ID = :WRK-APPL-ID
END-EXEC
END-IF.
```
OVT-MONTHLY のUPSERTも同様。
```
EXEC SQL
SELECT OVT-HOURS, OVT-COUNT
INTO :DB-OVT-HOURS, :DB-OVT-COUNT
FROM OVT-MONTHLY
WHERE EMP-ID = :WRK-EMP-ID
AND YEAR-MONTH = :WRK-YEAR-MONTH
AND OVT-TYPE = :WRK-OVT-TYPE
END-EXEC.
IF SQLCODE = 0
* UPDATE(加算)
EXEC SQL
UPDATE OVT-MONTHLY SET
OVT-HOURS = OVT-HOURS + :WRK-OVT-HOURS,
OVT-COUNT = OVT-COUNT + 1,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WRK-EMP-ID
AND YEAR-MONTH = :WRK-YEAR-MONTH
AND OVT-TYPE = :WRK-OVT-TYPE
END-EXEC
ELSE
* INSERT(新規)
EXEC SQL
INSERT INTO OVT-MONTHLY
(EMP-ID, YEAR-MONTH, OVT-TYPE,
OVT-HOURS, OVT-COUNT, UPDATED-AT)
VALUES
(:WRK-EMP-ID, :WRK-YEAR-MONTH, :WRK-OVT-TYPE,
:WRK-OVT-HOURS, 1, CURRENT TIMESTAMP)
END-EXEC
END-IF.
```
#### 処理2OVT-DBCLEAN → DB取消
```
EXEC SQL
UPDATE OVT-APPLICATIONS SET
STATUS = '9',
UPDATED-AT = CURRENT TIMESTAMP
WHERE APPL-ID = :WRK-APPL-ID
END-EXEC.
IF SQLCODE NOT = 0
該当なし → ERROR-LOG に書出し
PERFORM 9999ABDSOR
END-IF.
```
OVT-MONTHLY の減算UPDATE
```
EXEC SQL
UPDATE OVT-MONTHLY SET
OVT-HOURS = OVT-HOURS - :WRK-OVT-HOURS,
OVT-COUNT = OVT-COUNT - 1,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WRK-EMP-ID
AND YEAR-MONTH = :WRK-YEAR-MONTH
AND OVT-TYPE = :WRK-OVT-TYPE
END-EXEC.
IF SQLCODE NOT = 0
* OVT-MONTHLYレコード不存在 → データ不整合の可能性
該当エラー → ERROR-LOG に書出し
PERFORM 9999ABDSOR
END-IF.
```
**注意**: OVT-MONTHLY減算UPDATEの失敗時は、OVT-MONTHLYに対応レコードが存在しないことを意味する。
ファイルとDBの不整合としてエラーログに記録した上でABENDさせる。
**SQLCODE** でDB操作の成否を確認し、異常時は ERROR-LOG に出力。
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| EXEC SQL | DB2埋め込みSQLによるDB操作 |
| IF | SQLCODE判定による分岐 |
| PERFORM VARYING | 月バリデーションループ(1〜12月) |
| PERFORM TEST AFTER | OVT-MONTHLY減算リトライ制御 |
| MULTIPLY | 時間→分変換(MULTIPLY BY 60 GIVING |
| SUBTRACT | 残容量検証(SUBTRACT FROM GIVING |
---
## レコード構成
### OVT-VALID / OVT-CANCEL / OVT-NODUP / OVT-CHECKED80B
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 申請番号 | OA-APPL-ID | 1 | 8 | X(8) | |
| 2 | 社員番号 | OA-EMP-ID | 9 | 8 | 9(8) | |
| 3 | 申請日 | OA-APPL-DATE | 17 | 8 | 9(8) | YYYYMMDD |
| 4 | 開始時刻 | OA-START-TIME | 25 | 4 | 9(4) | HHMM |
| 5 | 終了時刻 | OA-END-TIME | 29 | 4 | 9(4) | HHMM |
| 6 | ステータス | OA-STATUS | 33 | 1 | X(1) | 0/1/9 |
| 7 | OVT-TYPE | OA-OVT-TYPE | 34 | 1 | X(1) | W/HOVT-CHECKED以降のみ有効) |
| 8 | 予備 | OA-FILLER | 35 | 46 | X(46) | |
### OVT-MATCHED80B
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 申請番号 | OA-APPL-ID | 1 | 8 | X(8) | |
| 2 | 社員番号 | OA-EMP-ID | 9 | 8 | 9(8) | |
| 3 | 申請日 | OA-APPL-DATE | 17 | 8 | 9(8) | YYYYMMDD |
| 4 | 開始時刻 | OA-START-TIME | 25 | 4 | 9(4) | HHMM |
| 5 | 終了時刻 | OA-END-TIME | 29 | 4 | 9(4) | HHMM |
| 6 | ステータス | OA-STATUS | 33 | 1 | X(1) | 0/1 |
| 7 | OVT-TYPE | OA-OVT-TYPE | 34 | 1 | X(1) | W/H |
| 8 | 処理番号 | OA-PROC-SEQ | 35 | 2 | 9(2) | 同申請内連番 |
| 9 | 予備 | OA-FILLER | 37 | 44 | X(44) | |
社員名・部署コードは DB2OVT-APPLICATIONSテーブル)側で保持する。
### OVT-SUMMARY80B
| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 |
|---|------|------|------|------|------|------|
| 1 | 申請番号 | OS-APPL-ID | 1 | 8 | X(8) | |
| 2 | 社員番号 | OS-EMP-ID | 9 | 8 | 9(8) | |
| 3 | 申請日 | OS-APPL-DATE | 17 | 8 | 9(8) | YYYYMMDD |
| 4 | 開始時刻 | OS-START-TIME | 25 | 4 | 9(4) | HHMM |
| 5 | 終了時刻 | OS-END-TIME | 29 | 4 | 9(4) | HHMM |
| 6 | 加班時間 | OS-OVT-HOURS | 33 | 5 | 9(4)V9(1) | SUB05TIM丸め後 |
| 7 | OVT-TYPE | OS-OVT-TYPE | 38 | 1 | X(1) | W/H |
| 8 | 予備 | OS-FILLER | 39 | 42 | X(42) | |
### OVT-DBCLEAN80B
| # | 項目 | 名称 | 開始 | 長さ | 属性 |
|---|------|------|------|------|------|
| 1 | 申請番号 | OD-APPL-ID | 1 | 8 | X(8) |
| 2 | 予備 | OD-FILLER | 9 | 72 | X(72) |
---
## 新規COBOL構文カバレッジ一覧(14種)
| # | 構文 | ZAN01CHK | ZAN02CHK | ZAN03CHK | ZAN04MAT | ZAN05CAL | ZAN06UPD |
|---|------|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|
| 1 | UNSTRING | ● | | | | | |
| 2 | STRING | ● | | | ● | | |
| 3 | SEARCH ALL | | | ● | | | |
| 4 | SET | | ● | ● | | ● | |
| 5 | COMPUTE ROUNDED ON SIZE ERROR | | | | | ● | |
| 6 | DIVIDE | ● | | | | ● | |
| 7 | CONTINUE | | ● | | | ● | |
| 8 | ACCEPT FROM DATE | | | | | ● | |
| 9 | EXEC SQLINSERT/UPDATE/SELECT/COMMIT/ROLLBACK | | | | | | ● |
|10 | IFSQLCODE分岐) | | | | | | ● |
|11 | PERFORM VARYING | | | | | | ● |
|12 | PERFORM TEST AFTER | | | | | | ● |
|13 | MULTIPLY | | | | | | ● |
|14 | SUBTRACT | | | | | | ● |
---
## 丸めルール
| 条件 | ルール |
|------|--------|
| 加班開始時刻 < DINNER-START1830 | エラー(申請不可、食事時間のため) |
| 加班時間 < 30分 | エラー(申請不可) |
| 加班時間 ≧ 30分 かつ < 0.5h換算 | 0.5hに切上 |
| 加班時間 ≧ 0.5h | 0.1h単位切捨(SUB05TIM mode 2 |
例:0.5h→0.5, 0.7h→0.7, 1.55h→1.5(切捨のため1.5、切上なら1.6)
+10 -9
View File
@@ -56,7 +56,7 @@
03 R02DATE PIC 9(008). 03 R02DATE PIC 9(008).
03 R02TIME-IN PIC 9(004). 03 R02TIME-IN PIC 9(004).
03 R02TIME-OUT PIC 9(004). 03 R02TIME-OUT PIC 9(004).
03 R02FILLER PIC X(060). 03 R02FILLER PIC X(056).
* *
***************************************************************** *****************************************************************
* ##R03## * * ##R03## *
@@ -249,14 +249,15 @@
***************************************************************** *****************************************************************
1200R02INNSOR SECTION. 1200R02INNSOR SECTION.
* *
READ R02INNFIL READ R02INNFIL
AT END AT END
MOVE '1' TO WRK-R02EOF MOVE '1' TO WRK-R02EOF
NOT AT END MOVE HIGH-VALUES TO WRK-R02KEY
ADD 1 TO CUN-R02INN NOT AT END
MOVE R02EMP-ID TO WRK-R02KEY001 ADD 1 TO CUN-R02INN
MOVE R02DATE TO WRK-R02KEY002 MOVE R02EMP-ID TO WRK-R02KEY001
END-READ. MOVE R02DATE TO WRK-R02KEY002
END-READ.
* *
1200R02INNSOR-EXT. 1200R02INNSOR-EXT.
EXIT. EXIT.
+407
View File
@@ -0,0 +1,407 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. ZAN04MAT.
*****************************************************************
* システム名 : 残業統計管理システム *
* プログラムID : ZAN04MAT *
* プログラム名 : 取消マッチング処理 *
* 作成日 : 2026-06-15 *
* 処理概要 : OVT-SORTED(有効申請)とOVT-CSORT *
* (取消申請)を申請番号で1:1マッチングし、 *
* 結果を振り分ける。 *
* *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-15 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO ZAN04R01.
SELECT R02INNFIL ASSIGN TO ZAN04R02.
SELECT W01OUTFIL ASSIGN TO ZAN04W01.
SELECT W02OUTFIL ASSIGN TO ZAN04W02.
SELECT W03OUTFIL ASSIGN TO ZAN04W03.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01 (OVT-SORTED) *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY ZAN01REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* R02 (OVT-CSORT) *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
COPY ZAN01REC REPLACING ==(A)== BY ==R02==.
*
*****************************************************************
* W01 (OVT-MATCHED) *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY ZAN02REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* W02 (OVT-DBCLEAN) *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W02OUTREC.
COPY ZAN04REC REPLACING ==(A)== BY ==W02==.
*
*****************************************************************
* W03 (ERROR-LOG) *
*****************************************************************
FD W03OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W03OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W03==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'ZAN04MAT'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
01 CNS-ERR-CAT03 PIC 9(002) VALUE 03.
01 CNS-PROC-SEQ01 PIC 9(002) VALUE 01.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-R02INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W03OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** 運用日付
03 WRK-U06 PIC 9(008).
*** マッチングキー
03 WRK-R01KEY PIC X(008).
03 WRK-R02KEY PIC X(008).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理
PERFORM 2000MAJSOR
UNTIL WRK-R01KEY = HIGH-VALUE
AND WRK-R02KEY = HIGH-VALUE.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
R02INNFIL
OUTPUT W01OUTFIL
W02OUTFIL
W03OUTFIL.
*
*** R01を読み込み
PERFORM 1100R01INNSOR.
*** R02を読み込み
PERFORM 1200R02INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : レコード読込・キー設定 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE HIGH-VALUE TO WRK-R01KEY
NOT AT END
ADD 1 TO CUN-R01INN
MOVE R01APPL-ID TO WRK-R01KEY
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.2) *
* サブモジュール名:R02読込処理 *
* 処理概要 : レコード読込・キー設定 *
*****************************************************************
1200R02INNSOR SECTION.
*
READ R02INNFIL
AT END
MOVE HIGH-VALUE TO WRK-R02KEY
NOT AT END
ADD 1 TO CUN-R02INN
MOVE R02APPL-ID TO WRK-R02KEY
END-READ.
*
1200R02INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : マッチング(1:1)を行う *
*****************************************************************
2000MAJSOR SECTION.
*
EVALUATE TRUE
*** マッチ
WHEN WRK-R01KEY = WRK-R02KEY
PERFORM 2100MATCHSOR
PERFORM 1100R01INNSOR
PERFORM 1200R02INNSOR
*** R01のみ
WHEN WRK-R01KEY < WRK-R02KEY
PERFORM 2200R01OUTSOR
PERFORM 1100R01INNSOR
*** R02のみ
WHEN WRK-R01KEY > WRK-R02KEY
PERFORM 2300R02OUTSOR
PERFORM 1200R02INNSOR
END-EVALUATE.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名:マッチ時処理 *
* 処理概要 : 取消済み申請をERROR-LOGに出力 *
*****************************************************************
2100MATCHSOR SECTION.
*
*** ERROR-LOG出力(監査証跡)
INITIALIZE W03OUTREC.
MOVE CNS-ERR-CAT03 TO W03ERR-CATEGORY.
STRING 'CANCEL-MATCH: '
R01APPL-ID ' '
R01EMP-ID ' '
R01APPL-DATE ' '
R01START-TIME ' '
R01END-TIME
DELIMITED BY SIZE
INTO W03ERR-DETAIL.
WRITE W03OUTREC.
ADD 1 TO CUN-W03OUT.
*
2100MATCHSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名:R01のみ処理 *
* 処理概要 : 有効申請をOVT-MATCHEDに出力 *
*****************************************************************
2200R01OUTSOR SECTION.
*
*** OVT-MATCHED出力(STRING編集)
INITIALIZE W01OUTREC.
STRING R01APPL-ID DELIMITED BY SIZE
R01EMP-ID DELIMITED BY SIZE
R01APPL-DATE DELIMITED BY SIZE
R01START-TIME DELIMITED BY SIZE
R01END-TIME DELIMITED BY SIZE
R01STATUS DELIMITED BY SIZE
R01OVT-TYPE DELIMITED BY SIZE
CNS-PROC-SEQ01 DELIMITED BY SIZE
INTO W01OUTREC.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2200R01OUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.3) *
* サブモジュール名:R02のみ処理 *
* 処理概要 : 取消申請をOVT-DBCLEANに出力 *
*****************************************************************
2300R02OUTSOR SECTION.
*
*** OVT-DBCLEAN出力
INITIALIZE W02OUTREC.
MOVE R02APPL-ID TO W02APPL-ID.
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2300R02OUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
R02INNFIL
W01OUTFIL
W02OUTFIL
W03OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'ZAN04R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'ZAN04R02' TO M00UMKDATS22-01.
MOVE CUN-R02INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'ZAN04W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'ZAN04W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'ZAN04W03' TO M00UMKDATS22-01.
MOVE CUN-W03OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(4.0) *
* サブモジュール名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.9) *
* サブモジュール名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+400
View File
@@ -0,0 +1,400 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. ZAN05CAL.
*****************************************************************
* システム名 : 残業統計管理システム *
* プログラムID : ZAN05CAL *
* プログラム名 : 残業時間集計処理 *
* 作成日 : 2026-06-15 *
* 処理概要 : OVT-SORTED2(申請番号+処理番号昇順)を *
* キーブレイク集計し、同一APPL-ID内の全明細の *
* 加班時間を積算してOVT-SUMMARYに1レコード出力。*
* *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-15 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO ZAN05R01.
SELECT W01OUTFIL ASSIGN TO ZAN05W01.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01 (OVT-SORTED2) *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY ZAN02REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* W01 (OVT-SUMMARY) *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY ZAN03REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'ZAN05CAL'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-TIMMODE02 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** 処理日付(ACCEPT FROM DATE用)
03 WRK-DATE-8 PIC 9(008).
*** 運用日付
03 WRK-U06 PIC 9(008).
*** キーブレイク制御
03 WRK-R01KEY PIC X(008).
03 WRK-PREV-APPL-ID PIC X(008).
03 WRK-GROUP-ACTIVE PIC X(001).
88 WRK-GROUP-IS-ACTIVE VALUE '1'.
88 WRK-GROUP-NOT-ACTIVE VALUE '0'.
*** 集約用最終レコード保持
03 WRK-LAST-REC PIC X(080).
03 WRK-LAST-REC-REDEF REDEFINES WRK-LAST-REC.
05 WRK-LAST-APPL-ID PIC X(008).
05 WRK-LAST-EMP-ID PIC 9(008).
05 WRK-LAST-APPL-DATE PIC 9(008).
05 WRK-LAST-START PIC 9(004).
05 WRK-LAST-END PIC 9(004).
05 WRK-LAST-STATUS PIC X(001).
05 WRK-LAST-OVT-TYPE PIC X(001).
05 WRK-LAST-PROC-SEQ PIC 9(002).
05 WRK-LAST-FILLER PIC X(044).
*** 集計用グループ先頭START保持
03 WRK-GROUP-START PIC 9(004).
*** 集計用積算分領域
03 WRK-ACCUM-MIN PIC S9(009) COMP-3.
*** 時刻計算領域
03 WRK-START-HOUR PIC 9(004).
03 WRK-START-MIN PIC 9(004).
03 WRK-END-HOUR PIC 9(004).
03 WRK-END-MIN PIC 9(004).
03 WRK-START-TOTAL PIC 9(005).
03 WRK-END-TOTAL PIC 9(005).
03 WRK-DIFF-MIN PIC 9(005).
03 WRK-INT-HOURS PIC 9(004).
03 WRK-REMAIN-MIN PIC 9(004).
03 WRK-OVT-HOURS PIC 9(004)V9(001).
03 WRK-TEMP-HOURS PIC 9(004)V9(001).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*** 時刻丸め計算SR用
COPY ZANTIMAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理
PERFORM 2000MAJSOR
UNTIL WRK-R01KEY = HIGH-VALUE
AND WRK-GROUP-NOT-ACTIVE.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 処理日付取得(ACCEPT FROM DATE
ACCEPT WRK-DATE-8 FROM DATE YYYYMMDD.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
MOVE '0' TO WRK-GROUP-ACTIVE.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
OUTPUT W01OUTFIL.
*
*** R01を読み込み
PERFORM 1100R01INNSOR.
*
*** 初回レコード設定
IF WRK-R01KEY NOT = HIGH-VALUE
MOVE R01APPL-ID TO WRK-PREV-APPL-ID
MOVE R01INNREC TO WRK-LAST-REC
MOVE R01START-TIME TO WRK-GROUP-START
SET WRK-GROUP-IS-ACTIVE TO TRUE
END-IF.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : レコード読込・キー設定 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE HIGH-VALUE TO WRK-R01KEY
NOT AT END
ADD 1 TO CUN-R01INN
MOVE R01APPL-ID TO WRK-R01KEY
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : キーブレイク集計制御を行う *
*****************************************************************
2000MAJSOR SECTION.
*
EVALUATE TRUE
*** EOF時:最終グループを出力
WHEN WRK-R01KEY = HIGH-VALUE
IF WRK-GROUP-IS-ACTIVE
PERFORM 2100OUTSOR
SET WRK-GROUP-NOT-ACTIVE TO TRUE
END-IF
*** キーブレイク:前グループ出力→新グループ開始
WHEN WRK-R01KEY NOT = WRK-PREV-APPL-ID
IF WRK-GROUP-IS-ACTIVE
PERFORM 2100OUTSOR
END-IF
MOVE R01APPL-ID TO WRK-PREV-APPL-ID
MOVE R01INNREC TO WRK-LAST-REC
MOVE R01START-TIME TO WRK-GROUP-START
SET WRK-GROUP-IS-ACTIVE TO TRUE
PERFORM 2200ACCUMSOR
PERFORM 1100R01INNSOR
*** 同一グループ:現レコード積算→最新レコードで上書き保持
WHEN OTHER
PERFORM 2200ACCUMSOR
MOVE R01INNREC TO WRK-LAST-REC
CONTINUE
PERFORM 1100R01INNSOR
END-EVALUATE.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名:集計計算出力処理 *
* 処理概要 : WRK-ACCUM-MIN→SUB05TIM丸め・OVT-SUMMARY出力*
*****************************************************************
2100OUTSOR SECTION.
*
*** 累積分→時間変換(DIVIDE REMAINDER
DIVIDE WRK-ACCUM-MIN BY 60
GIVING WRK-INT-HOURS
REMAINDER WRK-REMAIN-MIN.
*
*** COMPUTE ROUNDED ON SIZE ERROR(カバレッジ用)
COMPUTE WRK-OVT-HOURS ROUNDED =
WRK-ACCUM-MIN / 60
ON SIZE ERROR
CONTINUE
MOVE ZERO TO WRK-OVT-HOURS
END-COMPUTE.
*
*** SUB05TIM呼出(mode 20.1h単位切捨)
COMPUTE WRK-TEMP-HOURS =
WRK-ACCUM-MIN / 60
END-COMPUTE.
MOVE WRK-TEMP-HOURS TO T01TIMHRS.
MOVE CNS-TIMMODE02 TO T01TIMRRC.
CALL 'SUB05TIM' USING T01TIMPAR.
*
*** OVT-SUMMARY出力
INITIALIZE W01OUTREC.
MOVE WRK-LAST-APPL-ID TO W01APPL-ID.
MOVE WRK-LAST-EMP-ID TO W01EMP-ID.
MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE.
MOVE WRK-GROUP-START TO W01START-TIME.
MOVE WRK-LAST-END TO W01END-TIME.
MOVE T01TIMOUT TO W01OVT-HOURS.
MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
*** 累積分リセット(次グループ用)
MOVE ZERO TO WRK-ACCUM-MIN.
*
2100OUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名:積算処理 *
* 処理概要 : 現レコードの時間差分をWRK-ACCUM-MINに加算 *
*****************************************************************
2200ACCUMSOR SECTION.
*
*** 開始時刻→分変換
DIVIDE R01START-TIME BY 100
GIVING WRK-START-HOUR
REMAINDER WRK-START-MIN.
COMPUTE WRK-START-TOTAL =
WRK-START-HOUR * 60 + WRK-START-MIN
END-COMPUTE.
*
*** 終了時刻→分変換
DIVIDE R01END-TIME BY 100
GIVING WRK-END-HOUR
REMAINDER WRK-END-MIN.
COMPUTE WRK-END-TOTAL =
WRK-END-HOUR * 60 + WRK-END-MIN
END-COMPUTE.
*
*** 差分計算
COMPUTE WRK-DIFF-MIN =
WRK-END-TOTAL - WRK-START-TOTAL
END-COMPUTE.
*
*** 積算
COMPUTE WRK-ACCUM-MIN =
WRK-ACCUM-MIN + WRK-DIFF-MIN
END-COMPUTE.
*
2200ACCUMSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
W01OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'ZAN05R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'ZAN05W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(4.0) *
* サブモジュール名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.9) *
* サブモジュール名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+696
View File
@@ -0,0 +1,696 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. ZAN06UPD.
*****************************************************************
* システム名 : 残業統計管理システム *
* プログラムID : ZAN06UPD *
* プログラム名 : 残業統計DB更新処理 *
* 作成日 : 2026-06-16 *
* 処理概要 : OVT-SUMMARYの各レコードをDB2テーブル *
* OVT-APPLICATIONSにINSERT/UPSERTし、 *
* OVT-MONTHLYに月次集計を反映する。 *
* またOVT-DBCLEANの各レコードについて、 *
* 該当申請を取消状態に更新し、 *
* OVT-MONTHLYから該当加班時間を減算する。 *
* *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-16 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO ZAN06R01.
SELECT R02INNFIL ASSIGN TO ZAN06R02.
SELECT W01OUTFIL ASSIGN TO ZAN06W01.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01 (OVT-SUMMARY) 80B FB *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY ZAN03REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* R02 (OVT-DBCLEAN) 80B FB *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
COPY ZAN04REC REPLACING ==(A)== BY ==R02==.
*
*****************************************************************
* W01 (ERROR-LOG) VB 200B *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
RECORDING MODE IS V.
01 W01OUTREC.
COPY ZAN05REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'ZAN06UPD'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-ABD999 PIC 9(003) VALUE 999.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-COMMIT-CNT PIC 9(003) VALUE 050.
03 CNS-STATUS-ACTIVE PIC X(001) VALUE '0'.
03 CNS-STATUS-CANCEL PIC X(001) VALUE '9'.
03 CNS-MAX-HOURS PIC 9(004)V9(001)
VALUE 9999.9.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-R02INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXINS PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXUPD PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-COMMIT PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-ETHUS PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** EOF判定
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
03 WRK-R02EOF PIC X(001).
88 WRK-R02-EOF VALUE '1'.
*** 日付分解領域
03 WRK-APPL-DATE-N PIC 9(008).
03 WRK-YEAR-MONTH PIC 9(006).
03 WRK-MONTH PIC 9(002).
03 WRK-MONTH-VALID PIC 9(001).
88 WRK-MONTH-OK VALUE 1.
*** ループ制御
03 WRK-IDX PIC 9(004).
03 WRK-RETRY-CNT PIC 9(001).
*** 加班時間変換領域
03 WRK-OVT-HOURS-EDITED PIC 9(004).9(001).
03 WRK-OVT-HOURS-NUM PIC 9(004)V9(001).
03 WRK-OVT-MINUTES PIC 9(006).
03 WRK-REMAIN-HOURS PIC 9(004)V9(001).
*** SQL用ホスト変数(全DISPLAY
03 WRK-SQL-APPL-ID PIC X(008).
03 WRK-SQL-EMP-ID PIC X(008).
03 WRK-SQL-APPL-DATE PIC X(008).
03 WRK-SQL-YEAR-MONTH PIC X(006).
03 WRK-SQL-START-TIME PIC X(004).
03 WRK-SQL-END-TIME PIC X(004).
03 WRK-SQL-OVT-HOURS PIC X(006).
03 WRK-SQL-OVT-TYPE PIC X(001).
03 WRK-SQL-STATUS PIC X(001).
*** SQLCODE表示用(COMP-5から編集変換)
03 WRK-SQLCODE-DISP PIC +9(009).
*** エラーログ編集領域
03 WRK-ERR-CATEGORY PIC 9(002).
03 WRK-ERR-DETAIL PIC X(198).
*
*****************************************************************
* DBホスト変数(COMP-3、bridge compVarsマップ対応) *
*****************************************************************
01 DB-OVT-HOURS PIC S9(007)V9(001) COMP-3.
01 DB-OVT-COUNT PIC S9(009) COMP-3.
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理(R01→R02順に処理)
PERFORM 2000MAJSOR
UNTIL WRK-R01-EOF
AND WRK-R02-EOF.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-APPL-DATE-N
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
R02INNFIL
OUTPUT W01OUTFIL.
*
*** DB接続
EXEC SQL
CONNECT TO 'data\OVERTIME.DB'
END-EXEC.
*
*** R01を初回読込
PERFORM 1100R01INNSOR.
*
*** R02を初回読込
PERFORM 1200R02INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : OVT-SUMMARY読込 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.2) *
* サブモジュール名:R02読込処理 *
* 処理概要 : OVT-DBCLEAN読込 *
*****************************************************************
1200R02INNSOR SECTION.
*
READ R02INNFIL
AT END
MOVE '1' TO WRK-R02EOF
NOT AT END
ADD 1 TO CUN-R02INN
END-READ.
*
1200R02INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : R01OVT-SUMMARY)→R02OVT-DBCLEAN)処理 *
*****************************************************************
2000MAJSOR SECTION.
*
EVALUATE TRUE
*** フェーズ1OVT-SUMMARY処理
WHEN NOT WRK-R01-EOF
PERFORM 2100SUMMARYSOR
PERFORM 1100R01INNSOR
*** フェーズ2OVT-DBCLEAN処理
WHEN NOT WRK-R02-EOF
PERFORM 2200DBCLEANSOR
PERFORM 1200R02INNSOR
WHEN OTHER
CONTINUE
END-EVALUATE.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名:OVT-SUMMARY→DB登録処理 *
* 処理概要 : OVT-APPLICATIONS INSERT/UPSERT *
*****************************************************************
2100SUMMARYSOR SECTION.
*
*** SQLホスト変数設定
MOVE R01APPL-ID TO WRK-SQL-APPL-ID.
MOVE R01EMP-ID TO WRK-SQL-EMP-ID.
MOVE R01APPL-DATE TO WRK-SQL-APPL-DATE.
MOVE R01APPL-DATE TO WRK-APPL-DATE-N.
MOVE WRK-APPL-DATE-N(5:2) TO WRK-MONTH.
*
*** 月バリデーション(PERFORM VARYING カバレッジ用)
MOVE ZERO TO WRK-MONTH-VALID.
PERFORM VARYING WRK-IDX
FROM 1 BY 1
UNTIL WRK-IDX > 12
OR WRK-MONTH-VALID = 1
IF WRK-MONTH = WRK-IDX
MOVE 1 TO WRK-MONTH-VALID
END-IF
END-PERFORM.
*
*** 月異常時はエラー
IF WRK-MONTH-VALID = ZERO
MOVE 10 TO WRK-ERR-CATEGORY
STRING 'INVALID MONTH APPL-ID='
WRK-SQL-APPL-ID DELIMITED BY SIZE
INTO WRK-ERR-DETAIL
END-STRING
MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY
MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
PERFORM 9999ABDSOR
END-IF.
*
*** 年月抽出
MOVE WRK-APPL-DATE-N(1:6) TO WRK-YEAR-MONTH.
MOVE WRK-YEAR-MONTH TO WRK-SQL-YEAR-MONTH.
*
*** 開始/終了時刻設定
MOVE R01START-TIME TO WRK-SQL-START-TIME.
MOVE R01END-TIME TO WRK-SQL-END-TIME.
*
*** 加班時間 → SQL形式変換(小数点付加)
MOVE R01OVT-HOURS TO WRK-OVT-HOURS-NUM.
MOVE R01OVT-HOURS TO WRK-OVT-HOURS-EDITED.
MOVE WRK-OVT-HOURS-EDITED TO WRK-SQL-OVT-HOURS.
*
*** MULTIPLY カバレッジ:時間→分変換
MULTIPLY WRK-OVT-HOURS-NUM
BY 60 GIVING WRK-OVT-MINUTES.
*
*** 種別・ステータス設定
MOVE R01OVT-TYPE TO WRK-SQL-OVT-TYPE.
MOVE CNS-STATUS-ACTIVE TO WRK-SQL-STATUS.
*
*** OVT-APPLICATIONSにINSERT
EXEC SQL
INSERT INTO OVT_APPLICATIONS
(APPL_ID, EMP_ID, APPL_DATE, OVT_TYPE,
START_TIME, END_TIME, OVT_HOURS, STATUS,
UPDATED_AT)
VALUES
(:WRK-SQL-APPL-ID, :WRK-SQL-EMP-ID,
:WRK-SQL-APPL-DATE, :WRK-SQL-OVT-TYPE,
:WRK-SQL-START-TIME, :WRK-SQL-END-TIME,
:WRK-SQL-OVT-HOURS, :WRK-SQL-STATUS,
CURRENT_TIMESTAMP)
END-EXEC.
*
IF SQLCODE NOT = 0
*** 重複 → UPDATE
EXEC SQL
UPDATE OVT_APPLICATIONS SET
STATUS = :WRK-SQL-STATUS,
UPDATED_AT = CURRENT_TIMESTAMP
WHERE APPL_ID = :WRK-SQL-APPL-ID
END-EXEC
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF
ADD 1 TO CUN-DBXUPD
ELSE
ADD 1 TO CUN-DBXINS
END-IF.
*
ADD 1 TO CUN-COMMIT.
*
*** OVT-MONTHLY UPSERT
PERFORM 2110MONTHLYUPSOR.
*
*** COMMIT判定
IF CUN-COMMIT >= CNS-COMMIT-CNT
PERFORM 2300COMMITDBX
END-IF.
*
2100SUMMARYSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.1) *
* サブモジュール名:OVT-MONTHLY UPSERT処理 *
* 処理概要 : 月次集計テーブルへの追加/更新 *
*****************************************************************
2110MONTHLYUPSOR SECTION.
*
*** OVT-MONTHLY存在確認
EXEC SQL
SELECT OVT_HOURS, OVT_COUNT
INTO :DB-OVT-HOURS, :DB-OVT-COUNT
FROM OVT_MONTHLY
WHERE EMP_ID = :WRK-SQL-EMP-ID
AND YEAR_MONTH = :WRK-SQL-YEAR-MONTH
AND OVT_TYPE = :WRK-SQL-OVT-TYPE
END-EXEC.
*
IF SQLCODE = 0
*** 既存レコードあり → 加算UPDATE
EXEC SQL
UPDATE OVT_MONTHLY SET
OVT_HOURS = OVT_HOURS + :WRK-SQL-OVT-HOURS,
OVT_COUNT = OVT_COUNT + 1,
UPDATED_AT = CURRENT_TIMESTAMP
WHERE EMP_ID = :WRK-SQL-EMP-ID
AND YEAR_MONTH = :WRK-SQL-YEAR-MONTH
AND OVT_TYPE = :WRK-SQL-OVT-TYPE
END-EXEC
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF
ELSE
*** 新規 → INSERT
EXEC SQL
INSERT INTO OVT_MONTHLY
(EMP_ID, YEAR_MONTH, OVT_TYPE,
OVT_HOURS, OVT_COUNT, UPDATED_AT)
VALUES
(:WRK-SQL-EMP-ID, :WRK-SQL-YEAR-MONTH,
:WRK-SQL-OVT-TYPE, :WRK-SQL-OVT-HOURS,
1, CURRENT_TIMESTAMP)
END-EXEC
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF
END-IF.
*
2110MONTHLYUPSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名:OVT-DBCLEAN→取消処理 *
* 処理概要 : OVT-APPLICATIONS取消+OVT-MONTHLY減算 *
*****************************************************************
2200DBCLEANSOR SECTION.
*
*** SQLホスト変数設定
MOVE R02APPL-ID TO WRK-SQL-APPL-ID.
*
*** OVT-APPLICATIONSから既存データ取得
EXEC SQL
SELECT EMP_ID, APPL_DATE, OVT_TYPE, OVT_HOURS
INTO :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE,
:WRK-SQL-OVT-TYPE, :WRK-SQL-OVT-HOURS
FROM OVT_APPLICATIONS
WHERE APPL_ID = :WRK-SQL-APPL-ID
END-EXEC.
*
IF SQLCODE NOT = 0
*** 該当なし(孤立取消)→ ERROR-LOG + ABEND
MOVE 20 TO WRK-ERR-CATEGORY
STRING 'ORPHAN CANCEL APPL-ID='
WRK-SQL-APPL-ID DELIMITED BY SIZE
INTO WRK-ERR-DETAIL
END-STRING
MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY
MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
PERFORM 9999ABDSOR
END-IF.
*
*** 年月抽出
MOVE WRK-SQL-APPL-DATE TO WRK-APPL-DATE-N.
MOVE WRK-APPL-DATE-N(1:6) TO WRK-YEAR-MONTH.
MOVE WRK-YEAR-MONTH TO WRK-SQL-YEAR-MONTH.
*
*** SUBTRACT カバレッジ:残容量検証
MOVE WRK-SQL-OVT-HOURS TO WRK-OVT-HOURS-NUM.
SUBTRACT WRK-OVT-HOURS-NUM
FROM CNS-MAX-HOURS
GIVING WRK-REMAIN-HOURS.
*
*** OVT-APPLICATIONSステータス更新(取消)
EXEC SQL
UPDATE OVT_APPLICATIONS SET
STATUS = :CNS-STATUS-CANCEL,
UPDATED_AT = CURRENT_TIMESTAMP
WHERE APPL_ID = :WRK-SQL-APPL-ID
END-EXEC.
*
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO CUN-DBXUPD.
ADD 1 TO CUN-COMMIT.
*
*** OVT-MONTHLY減算
PERFORM 2210MONTHLYSUBSOR.
*
2200DBCLEANSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2.1) *
* サブモジュール名:OVT-MONTHLY減算処理 *
* 処理概要 : 月次集計テーブルからの減算 *
*****************************************************************
2210MONTHLYSUBSOR SECTION.
*
*** リトライカウンタ設定
MOVE 3 TO WRK-RETRY-CNT.
*
*** PERFORM TEST AFTER カバレッジ
PERFORM TEST AFTER
VARYING WRK-IDX
FROM 1 BY 1
UNTIL WRK-IDX > WRK-RETRY-CNT
OR SQLCODE = 0
EXEC SQL
UPDATE OVT_MONTHLY SET
OVT_HOURS = OVT_HOURS
- :WRK-SQL-OVT-HOURS,
OVT_COUNT = OVT_COUNT - 1,
UPDATED_AT = CURRENT_TIMESTAMP
WHERE EMP_ID = :WRK-SQL-EMP-ID
AND YEAR_MONTH = :WRK-SQL-YEAR-MONTH
AND OVT_TYPE = :WRK-SQL-OVT-TYPE
END-EXEC
IF SQLCODE NOT = 0
EXEC SQL
ROLLBACK WORK
END-EXEC
END-IF
END-PERFORM.
*
IF SQLCODE NOT = 0
*** 減算失敗 → データ不整合
MOVE 21 TO WRK-ERR-CATEGORY
STRING 'MONTHLY SUBTRACT FAIL APPL-ID='
WRK-SQL-APPL-ID DELIMITED BY SIZE
INTO WRK-ERR-DETAIL
END-STRING
MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY
MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
PERFORM 9999ABDSOR
END-IF.
*
ADD 1 TO CUN-DBXUPD.
ADD 1 TO CUN-COMMIT.
*
*** COMMIT判定
IF CUN-COMMIT >= CNS-COMMIT-CNT
PERFORM 2300COMMITDBX
END-IF.
*
2210MONTHLYSUBSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.3) *
* サブモジュール名:COMMIT処理 *
* 処理概要 : DB COMMIT発行 *
*****************************************************************
2300COMMITDBX SECTION.
*
*** COMMIT
EXEC SQL
COMMIT WORK
END-EXEC.
*
MOVE ZERO TO CUN-COMMIT.
ADD 1 TO CUN-ETHUS.
*
2300COMMITDBX-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : 最終COMMIT・ファイルクローズ・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 最終COMMIT
IF CUN-COMMIT > ZERO
PERFORM 2300COMMITDBX
END-IF.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
R02INNFIL
W01OUTFIL.
*
*** 件数メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'ZAN06R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'ZAN06R02' TO M00UMKDATS22-01.
MOVE CUN-R02INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'INS' TO M00UMKDATS22-01.
MOVE CUN-DBXINS TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'UPD' TO M00UMKDATS22-01.
MOVE CUN-DBXUPD TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'ZAN06W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(4.0) *
* サブモジュール名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.1) *
* サブモジュール名:DBエラー処理 *
* 処理概要 : DBエラー→ERROR-LOG出力+ROLLBACKABEND *
*****************************************************************
9100DBERRSOR SECTION.
*
*** ERROR-LOG出力
MOVE 30 TO WRK-ERR-CATEGORY.
MOVE SQLCODE TO WRK-SQLCODE-DISP.
STRING 'DB ERROR SQLCODE='
WRK-SQLCODE-DISP DELIMITED BY SIZE
' APPL-ID='
WRK-SQL-APPL-ID DELIMITED BY SIZE
INTO WRK-ERR-DETAIL
END-STRING.
MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY.
MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
*** ROLLBACK
EXEC SQL
ROLLBACK WORK
END-EXEC.
*
MOVE ZERO TO CUN-COMMIT.
*
PERFORM 9999ABDSOR.
*
9100DBERRSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.9) *
* サブモジュール名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+326
View File
@@ -0,0 +1,326 @@
# ファイル定義書
## 変更履歴
| No | 変更内容 | 担当者 | 変更日 | 承認者 | 備考 |
|----|---------|--------|--------|--------|------|
| 1 | 新規作成 | AI | 2026/06/15 | | COPY10部品を一括定義 |
---
# ZAN01REC — 加班申請レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-VALID / OVT-CANCEL / OVT-SORTED / OVT-CSORT / OVT-VSORT / OVT-NODUP / OVT-CHECKED | ZAN01REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | YYYYMMDD+SEQ |
| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | |
| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD |
| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM |
| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM |
| 6 | 03 | ステータス | (A)STATUS | X(1) | 1 | | 33 | | | 0:有効/1:確定/9:取消 |
| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 34 | | | W:平日/H:休日 |
| 8 | 03 | 予約 | (A)FILLER | X(46) | 46 | | 35 | | | |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O |
|-----------|--------------|------|-----|
| ZAN01CHK | W01 | OVT-VALID出力(STATUS=0/1 | O |
| ZAN01CHK | W02 | OVT-CANCEL出力(STATUS=9 | O |
| ZAN02CHK | R01 | OVT-VSORT入力 | I |
| ZAN02CHK | W01 | OVT-NODUP出力 | O |
| ZAN03CHK | R01 | OVT-NODUP入力 | I |
| ZAN03CHK | W01 | OVT-CHECKED出力 | O |
| ZAN04MAT | R01 | OVT-SORTED入力(有効申請) | I |
| ZAN04MAT | R02 | OVT-CSORT入力(取消申請) | I |
---
# ZAN02REC — マッチング結果レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-MATCHED | ZAN02REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | |
| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | |
| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD |
| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM |
| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM |
| 6 | 03 | ステータス | (A)STATUS | X(1) | 1 | | 33 | | | |
| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 34 | | | W:平日/H:休日 |
| 8 | 03 | 処理番号 | (A)PROC-SEQ | 9(2) | 2 | | 35 | | | 01固定 |
| 9 | 03 | 予約 | (A)FILLER | X(44) | 44 | | 37 | | | |
### ZAN01RECとの差分
| 項目 | ZAN01REC | ZAN02REC |
|------|----------|----------|
| 追加 | — | PROC-SEQ9(2) |
| FILLER | X(46) | X(44) |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O |
|-----------|--------------|------|-----|
| ZAN04MAT | W01 | OVT-MATCHED出力 | O |
---
# ZAN03REC — 集約結果レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-AGGREGATED | ZAN03REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | |
| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | |
| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD |
| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM |
| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM |
| 6 | 03 | 残業時間 | (A)OVT-HOURS | 9(4)V9(1) | 5 | | 33 | | | HH.h0.1h単位) |
| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 38 | | | W:平日/H:休日 |
| 8 | 03 | 予約 | (A)FILLER | X(42) | 42 | | 39 | | | |
### ZAN01RECとの差分
| 項目 | ZAN01REC | ZAN03REC |
|------|----------|----------|
| 削除 | STATUS | — |
| 追加 | — | OVT-HOURS9(4)V9(1) |
| FILLER | X(46) | X(42) |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O | 備考 |
|-----------|--------------|------|-----|------|
| ZAN05CAL | (未定) | 集約結果出力 | O | 未実装 |
---
# ZAN04REC — DBCLEAN対象レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-DBCLEAN | ZAN04REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | DB削除対象申請番号 |
| 2 | 03 | 予約 | (A)FILLER | X(72) | 72 | | 9 | | | |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O |
|-----------|--------------|------|-----|
| ZAN04MAT | W02 | OVT-DBCLEAN出力(APPL-IDのみ設定) | O |
---
# ZAN05REC — エラーログレコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| ERROR-LOG | ZAN05REC | PS | VB | 200 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | エラーカテゴリ | (A)ERR-CATEGORY | 9(2) | 2 | | 1 | | | 01:項目CHK/02:重複/03:打刻不突合/03:取消監査 |
| 2 | 03 | エラー詳細 | (A)ERR-DETAIL | X(198) | 198 | | 3 | | | STRING編集値 |
### 使用プログラム
| プログラム | プレフィックス | エラーカテゴリ | I/O |
|-----------|--------------|---------------|-----|
| ZAN01CHK | W03 | 01(項目チェックエラー) | O |
| ZAN02CHK | W02 | 02(時間重複エラー) | O |
| ZAN03CHK | W02 | 03(打刻不突合エラー) | O |
| ZAN04MAT | W03 | 03(取消マッチ監査証跡) | O |
---
# ZANDATAC — SUB01DAT 運用日付取得用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB01DAT連絡領域 | ZANDATAC | — | — | 10 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | 運用日付パラメタ | D01UBSPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | 復帰コード | D01FKICOD | S9(4) COMP | 2 | | 1 | | D01UBSPAR | 0000:正常 |
| 3 | 03 | 運用日付 | D01UBSUDATE | 9(8) | 8 | | 3 | | D01UBSPAR | YYYYMMDD |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| ZAN01CHK | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 |
| ZAN02CHK | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 |
| ZAN04MAT | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 |
※ ZAN03CHKはFUNCTION CURRENT-DATEを使用し本COPY未使用
---
# ZANMSGAC — SUB02MSG メッセージ出力用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB02MSG連絡領域 | ZANMSGAC | — | — | 303 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | メッセージパラメタ | M00MHOPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | メッセージ番号 | M00MSGCOD | 9(3) | 3 | | 1 | | M00MHOPAR | |
| 3 | 03 | パラメータ1 | M00UMKDATS22-01 | X(30) | 30 | | 4 | | M00MHOPAR | |
| 4 | 03 | パラメータ2 | M00UMKDATS22-02 | X(30) | 30 | | 34 | | M00MHOPAR | |
| 5 | 03 | パラメータ3 | M00UMKDATS22-03 | X(30) | 30 | | 64 | | M00MHOPAR | |
| 6 | 03 | パラメータ4 | M00UMKDATS22-04 | X(30) | 30 | | 94 | | M00MHOPAR | |
| 7 | 03 | パラメータ5 | M00UMKDATS22-05 | X(30) | 30 | | 124 | | M00MHOPAR | |
| 8 | 03 | パラメータ6 | M00UMKDATS22-06 | X(30) | 30 | | 154 | | M00MHOPAR | |
| 9 | 03 | パラメータ7 | M00UMKDATS22-07 | X(30) | 30 | | 184 | | M00MHOPAR | |
| 10 | 03 | パラメータ8 | M00UMKDATS22-08 | X(30) | 30 | | 214 | | M00MHOPAR | |
| 11 | 03 | パラメータ9 | M00UMKDATS22-09 | X(30) | 30 | | 244 | | M00MHOPAR | |
| 12 | 03 | パラメータ10 | M00UMKDATS22-10 | X(30) | 30 | | 274 | | M00MHOPAR | |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| ZAN01CHK | CALL 'SUB02MSG' USING M00MHOPAR | |
| ZAN02CHK | CALL 'SUB02MSG' USING M00MHOPAR | |
| ZAN03CHK | CALL 'SUB02MSG' USING M00MHOPAR | |
| ZAN04MAT | CALL 'SUB02MSG' USING M00MHOPAR | |
---
# ZANENDAC — SUB03END ABEND処理用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB03END連絡領域 | ZANENDAC | — | — | 3 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | ABENDパラメタ | E01ABDPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | ABENDコード | E01ABDCOD | 9(3) | 3 | | 1 | | E01ABDPAR | 999:汎用 |
### 使用プログラム
| プログラム | 呼出方法 |
|-----------|---------|
| ZAN01CHK | CALL 'SUB03END' USING E01ABDPAR |
| ZAN02CHK | CALL 'SUB03END' USING E01ABDPAR |
| ZAN03CHK | CALL 'SUB03END' USING E01ABDPAR |
| ZAN04MAT | CALL 'SUB03END' USING E01ABDPAR |
---
# ZANCHKAC — SUB04CHK 項目チェック用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB04CHK連絡領域 | ZANCHKAC | — | — | 92 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | 項目チェックパラメタ | C01CHKPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | チェックタイプ | C01CHKTYP | X(8) | 8 | | 1 | | C01CHKPAR | DATE/TIME/NUM/EMPID |
| 3 | 03 | チェック対象データ | C01CHKDAT | X(80) | 80 | | 9 | | C01CHKPAR | |
| 4 | 03 | 復帰コード | C01CHKRRC | 9(4) | 4 | | 89 | | C01CHKPAR | 0000:正常/0001:日付/0002:時刻/0003:数字/0004:社員番号/9999:不明 |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| ZAN01CHK | CALL 'SUB04CHK' USING C01CHKPAR | 日付/時刻チェック |
---
# ZANTIMAC — SUB05TIM 時刻丸め用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB05TIM連絡領域 | ZANTIMAC | — | — | 14 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | 時刻丸めパラメタ | T01TIMPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | 入力時間 | T01TIMHRS | 9(4)V9(1) | 5 | | 1 | | T01TIMPAR | HH.h |
| 3 | 03 | 出力時間 | T01TIMOUT | 9(4)V9(1) | 5 | | 6 | | T01TIMPAR | 丸め後 |
| 4 | 03 | 丸めモード | T01TIMRRC | 9(4) | 4 | | 11 | | T01TIMPAR | 0:0.5h切上/1:0.1h切上/2:0.1h切捨/3:四捨五入 |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| — | — | ZAN05CALで使用予定(未実装) |
@@ -11,6 +11,9 @@
| 5 | PGMパターン | - | | 5 | PGMパターン | - |
| 6 | 機能概要 | 現在日付を取得し、運用日付(YYYYMMDD)として返す | | 6 | 機能概要 | 現在日付を取得し、運用日付(YYYYMMDD)として返す |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法 ### 使用方法
``` ```
@@ -11,6 +11,9 @@
| 5 | PGMパターン | - | | 5 | PGMパターン | - |
| 6 | 機能概要 | メッセージ番号とパラメータを編集し、標準出力へ出力する。 | | 6 | 機能概要 | メッセージ番号とパラメータを編集し、標準出力へ出力する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法 ### 使用方法
``` ```
@@ -11,6 +11,9 @@
| 5 | PGMパターン | - | | 5 | PGMパターン | - |
| 6 | 機能概要 | ABENDコードを表示し、異常終了する。 | | 6 | 機能概要 | ABENDコードを表示し、異常終了する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法 ### 使用方法
``` ```
@@ -11,6 +11,9 @@
| 5 | PGMパターン | 項目チェック | | 5 | PGMパターン | 項目チェック |
| 6 | 機能概要 | チェックタイプに応じてデータ妥当性を検証する。 | | 6 | 機能概要 | チェックタイプに応じてデータ妥当性を検証する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法 ### 使用方法
``` ```
@@ -11,6 +11,9 @@
| 5 | PGMパターン | - | | 5 | PGMパターン | - |
| 6 | 機能概要 | 時間値を指定単位で丸め計算する。 | | 6 | 機能概要 | 時間値を指定単位で丸め計算する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法 ### 使用方法
``` ```
+2 -1
View File
@@ -14,7 +14,8 @@
| 8 | | ステータス9:取消申請としてOVT-CANCELに出力 | | 8 | | ステータス9:取消申請としてOVT-CANCELに出力 |
| 9 | | その他:エラーとしてERROR-LOGに出力 | | 9 | | その他:エラーとしてERROR-LOGに出力 |
※PGMパターン:マッチング(1:1、1:N、M:N)、レイアウト編集のみ(GETPUT)、項目チェック、振り分け、キーブレイク、キーブレイク(集計、集約)、DB更新 ※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件 ### 前提条件
+2 -1
View File
@@ -13,7 +13,8 @@
| 7 | | 重複なしのレコードはOVT-NODUPに出力 | | 7 | | 重複なしのレコードはOVT-NODUPに出力 |
| 8 | | 重複ありのレコードはERROR-LOGに出力 | | 8 | | 重複ありのレコードはERROR-LOGに出力 |
※PGMパターン:マッチング(1:1、1:N、M:N)、レイアウト編集のみ(GETPUT)、項目チェック、振り分け、キーブレイク、キーブレイク(集計、集約)、DB更新 ※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件 ### 前提条件
+3 -2
View File
@@ -8,12 +8,13 @@
| 2 | プログラムID | ZAN03CHK | | 2 | プログラムID | ZAN03CHK |
| 3 | プログラム名 | 打刻時間照合処理 | | 3 | プログラム名 | 打刻時間照合処理 |
| 4 | PGMタイプ | メイン | | 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 項目チェック | | 5 | PGMパターン | マッチング(N:1) |
| 6 | 機能概要 | OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の照合を行う。 | | 6 | 機能概要 | OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の照合を行う。 |
| 7 | | 申請時間帯が出勤〜退勤の範囲内かを確認する。 | | 7 | | 申請時間帯が出勤〜退勤の範囲内かを確認する。 |
| 8 | | 申請日が休日かを判定しOVT-TYPEを付加する。 | | 8 | | 申請日が休日かを判定しOVT-TYPEを付加する。 |
※PGMパターン:マッチング(1:1、1:N、M:N)、レイアウト編集のみ(GETPUT)、項目チェック、振り分け、キーブレイク、キーブレイク(集計、集約)、DB更新 ※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件 ### 前提条件
+144
View File
@@ -0,0 +1,144 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN04MAT |
| 3 | プログラム名 | 取消マッチング処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:1) |
| 6 | 機能概要 | OVT-SORTED(有効申請)とOVT-CSORT(取消申請)を申請番号(APPL-ID)で1:1マッチングし、結果を振り分ける。 |
| 7 | | 申請番号一致(取消済):監査証跡としてERROR-LOGに記録 |
| 8 | | 申請のみ(取消なし):OVT-MATCHEDに出力(処理番号=1 |
| 9 | | 取消のみ(既DB登録済):OVT-DBCLEANに出力(DB削除用) |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SORTED | 申請番号(APPL-ID)で昇順ソート済、重複なし |
| 2 | ファイルR02OVT-CSORT | 申請番号(APPL-ID)で昇順ソート済、重複なし |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SORTED | R01 | ZAN04R01 | I | ZAN01REC | FB | | 80 | PS | 有効申請(APPL-ID昇順) |
| 2 | OVT-CSORT | R02 | ZAN04R02 | I | ZAN01REC | FB | | 80 | PS | 取消申請(APPL-ID昇順) |
| 3 | OVT-MATCHED | W01 | ZAN04W01 | O | ZAN02REC | FB | | 80 | PS | マッチング結果(処理番号付) |
| 4 | OVT-DBCLEAN | W02 | ZAN04W02 | O | ZAN04REC | FB | | 80 | PS | DB削除用(APPL-IDのみ) |
| 5 | ERROR-LOG | W03 | ZAN04W03 | O | ZAN05REC | VB | | 200 | PS | 監査証跡(取消マッチ記録) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | APPL-ID(重複NG | APPL-ID |
| 2 | ファイルR02 | APPL-ID(重複NG | APPL-ID |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
1-7.R02を読み込む。(1200R02INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01、R02を全て読み終えるまで下記を繰り返す)
2-1.マッチの場合(R01.APPL-ID = R02.APPL-ID
取消済みの申請のため、OVT-MATCHEDには出力しない。
監査証跡としてERROR-LOGにマッチ情報を出力する。(2100MATCHSOR)
【STRING編集】
ERR-CATEGORY = 03
ERR-DETAIL = 'CANCEL-MATCH: ' + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻
R01を読み込む。(1100R01INNSOR)(2件目以降)
R02を読み込む。(1200R02INNSOR)(2件目以降)
2-2.R01のみの場合(R01.APPL-ID < R02.APPL-ID
R01をOVT-MATCHEDにSTRING編集して出力する。(2200R01OUTSOR)
【STRING編集】
W01 = 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 + ステータス + OVT-TYPE + 処理番号(01)
R01を読み込む。(1100R01INNSOR)(2件目以降)
2-3.R02のみの場合(R01.APPL-ID > R02.APPL-ID
R02をOVT-DBCLEANに出力する。(2300R02OUTSOR)
W02.APPL-ID = R02.APPL-ID
R02を読み込む。(1200R02INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-MATCHED
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | R01.APPL-ID | |
| 2 | EMP-ID | R01.EMP-ID | |
| 3 | APPL-DATE | R01.APPL-DATE | |
| 4 | START-TIME | R01.START-TIME | |
| 5 | END-TIME | R01.END-TIME | |
| 6 | STATUS | R01.STATUS | |
| 7 | OVT-TYPE | R01.OVT-TYPE | |
| 8 | PROC-SEQ | 01固定 | 同一申請番号グループ内連番 |
| 9 | FILLER | 初期値 | |
### 出力ファイル2W02/OVT-DBCLEAN
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | R02.APPL-ID | DB削除対象申請番号 |
| 2 | FILLER | 初期値 | |
### 出力ファイル3W03/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 03で固定 | 取消マッチ監査証跡 |
| 2 | ERR-DETAIL | STRINGで編集 | CANCEL-MATCH: + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 |
+173
View File
@@ -0,0 +1,173 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN05CAL |
| 3 | プログラム名 | 残業時間集約処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | キーブレイク(集計) |
| 6 | 機能概要 | OVT-SORTED2(申請番号+処理番号昇順)をキーブレイク集約し、 |
| 7 | | 同一APPL-IDの全レコードの加班時間を積算し、 |
| 8 | | OVT-SUMMARYに1レコードに集計して出力する。 |
| 9 | | キーブレイク制御にCONTINUE/SET、時間計算にCOMPUTE ROUNDED/DIVIDE、 |
| 10 | | 処理日付取得にACCEPT FROM DATEをそれぞれ使用する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SORTED2 | 申請番号(APPL-ID)>処理番号(PROC-SEQ)で昇順ソート済 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SORTED2 | R01 | ZAN05R01 | I | ZAN02REC | FB | | 80 | PS | マッチング結果(APPL-ID+PROC-SEQ昇順) |
| 2 | OVT-SUMMARY | W01 | ZAN05W01 | O | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | APPL-ID>PROC-SEQ(同一APPL-ID内複数明細あり) | APPL-ID(キーブレイク) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 時刻丸め計算SUB | SUB05TIM | ZANTIMAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ACCEPT FROM DATEで処理日付を取得(WRK-DATE-8
【新規カバレッジ】
ACCEPT FROM DATE YYYYMMDD
1-4.ワークエリアの初期化(WRK-ACCUM-MIN含む)
1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-6.使用ファイルのオープン(R01入力、W01出力)
1-7.R01の初回読込(1100R01INNSOR
1-8.初回読込成功時、WRK-PREV-APPL-IDに設定
WRK-GROUP-STARTに現レコードのSTARTを保持
WRK-LAST-RECに現レコードを保持
SET WRK-GROUP-IS-ACTIVE TO TRUE
(積算は主処理2000MAJSOR内の各分岐で行う)
2.主処理(2000MAJSOR)(R01を全て読み終え、最終グループ出力完了まで下記を繰り返す)
2-1.EOFの場合(WRK-R01KEY = HIGH-VALUE
2-1-1.WRK-GROUP-IS-ACTIVEなら最終グループを出力(2100OUTSOR)
2-1-2.SET WRK-GROUP-NOT-ACTIVE TO TRUE(ループ終了条件)
2-2.初回設定済みの場合(WRK-PREV-APPL-ID = 初回値あり)
2-2-1.同一APPL-IDの場合
現レコードの時間差分を積算(2200ACCUMSOR
現レコードをWRK-LAST-RECに上書き保持(ENDは最終明細で上書きされる)
グループ内最初の明細のSTARTはWRK-GROUP-STARTに保持済のため不変
R01次回読込(1100R01INNSOR
2-2-2.異なるAPPL-IDの場合(キーブレイク)
WRK-GROUP-IS-ACTIVEなら直前に保持していたグループを出力(2100OUTSOR)
WRK-PREV-APPL-IDを現レコードのAPPL-IDで更新
WRK-GROUP-STARTに現レコードのSTARTを保持
現レコードをWRK-LAST-RECに設定
2200ACCUMSORを呼出(新グループ初回レコードの時間差分を積算)
SET WRK-GROUP-IS-ACTIVE TO TRUE
R01次回読込(1100R01INNSOR
3.積算処理(2200ACCUMSOR
3-1.現レコードの時刻→分変換
DIVIDE WRK-KEY-START BY 100 GIVING WRK-START-HOUR REMAINDER WRK-START-MIN
DIVIDE WRK-KEY-END BY 100 GIVING WRK-END-HOUR REMAINDER WRK-END-MIN
COMPUTE WRK-START-TOTAL = WRK-START-HOUR * 60 + WRK-START-MIN
COMPUTE WRK-END-TOTAL = WRK-END-HOUR * 60 + WRK-END-MIN
3-2.差分計算
COMPUTE WRK-DIFF-MIN = WRK-END-TOTAL - WRK-START-TOTAL
3-3.WRK-ACCUM-MINに積算
COMPUTE WRK-ACCUM-MIN = WRK-ACCUM-MIN + WRK-DIFF-MIN
4.計算出力処理(2100OUTSOR
4-1.分→時間変換(DIVIDE for coverage
DIVIDE WRK-ACCUM-MIN BY 60 GIVING WRK-INT-HOURS REMAINDER WRK-REMAIN-MIN
4-2.COMPUTE ROUNDED for coverage(結果はSUB05TIMには渡さない)
COMPUTE WRK-OVT-HOURS ROUNDED = WRK-ACCUM-MIN / 60
ON SIZE ERROR
CONTINUE
MOVE ZERO TO WRK-OVT-HOURS
END-COMPUTE
4-3.SUB05TIM呼出(mode 20.1h単位切捨)
COMPUTE WRK-TEMP-HOURS = WRK-ACCUM-MIN / 60(切捨用にそのまま)
MOVE WRK-TEMP-HOURS TO T01TIMHRS
MOVE 2 TO T01TIMRRCmode 2
CALL 'SUB05TIM' USING T01TIMPAR
MOVE T01TIMOUT TO WRK-OVT-HOURS
4-4.OVT-SUMMARY出力
【STRING編集相当(MOVE)】
INITIALIZE W01OUTREC
MOVE WRK-LAST-APPL-ID TO W01APPL-ID
MOVE WRK-LAST-EMP-ID TO W01EMP-ID
MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE
MOVE WRK-GROUP-START TO W01START-TIME
MOVE WRK-LAST-END TO W01END-TIME
MOVE WRK-OVT-HOURS TO W01OVT-HOURS
MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE
WRITE W01OUTREC
W01出力カウンタ加算
4-5.WRK-ACCUM-MINをZEROに初期化(次グループ用)
5.終了処理(3000STPSOR
5-1.入出力ファイルのクローズ
5-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'ZAN05R01'
PARM2:入力件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'ZAN05W01'
PARM2:出力件数
5-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-SUMMARY
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | WRK-LAST-APPL-ID | 申請番号 |
| 2 | EMP-ID | WRK-LAST-EMP-ID | 社員番号 |
| 3 | APPL-DATE | WRK-LAST-APPL-DATE | 申請日 YYYYMMDD |
| 4 | START-TIME | WRK-GROUP-START | 開始時刻 HHMM(グループ最初の明細のSTART) |
| 5 | END-TIME | WRK-LAST-END | 終了時刻 HHMM |
| 6 | OVT-HOURS | SUB05TIM出力(T01TIMOUT | 加班時間(0.1h単位切捨) |
| 7 | OVT-TYPE | WRK-LAST-OVT-TYPE | W=平日 / H=休日 |
| 8 | FILLER | 初期値 | |
+235
View File
@@ -0,0 +1,235 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN06UPD |
| 3 | プログラム名 | 残業統計DB更新処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | DB更新 |
| 6 | 機能概要 | OVT-SUMMARYの各レコードをOVT-APPLICATIONSテーブルにINSERT/UPSERTし、 |
| 7 | | OVT-MONTHLYテーブルに月次集計を反映する。 |
| 8 | | またOVT-DBCLEANの各レコードについて、該当申請を取消状態に更新し、 |
| 9 | | OVT-MONTHLYから該当加班時間を減算する。 |
| 10 | | 新規カバレッジ:EXEC SQL(INSERT/UPDATE/SELECT)、COMMIT/ROLLBACK、 |
| 11 | | PERFORM VARYING/TEST AFTER、COBOL SUBTRACT/MULTIPLY |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SUMMARY | ZAN05CALの出力、APPL-ID順ソート済 |
| 2 | ファイルR02OVT-DBCLEAN | ZAN04MATの出力、DB上に該当APPL-IDが存在すること(孤立取消はエラー) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SUMMARY | R01 | ZAN06R01 | I | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) |
| 2 | OVT-DBCLEAN | R02 | ZAN06R02 | I | ZAN04REC | FB | | 80 | PS | 孤立取消(DB削除対象) |
| 3 | ERROR-LOG | W01 | ZAN06W01 | O | ZAN05REC | VB | | 200 | PS | DBエラー・データ不整合記録 |
| 4 | OVERTIME-DB | DB | - | - | - | DB2 | - | - | DASD | EXEC SQLで直接操作 |
### キー項目一覧
| NO | ファイル名 | キー項目 | 用途 |
|----|-----------|---------|------|
| 1 | ファイルR01 | APPL-ID | OVT-APPLICATIONS INSERT/UPDATEのキー |
| 2 | ファイルR02 | APPL-ID | OVT-APPLICATIONS SELECT/UPDATEのキー |
| 3 | DB OVT-MONTHLY | EMP-ID + YEAR-MONTH + OVT-TYPE | 月次集計UPSERTのキー |
### テーブル定義
#### OVT-APPLICATIONS(個別加班申請テーブル)
| カラム | 型 | 内容 |
|--------|-----|------|
| APPL-ID | CHAR(8) | 申請番号(PK |
| EMP-ID | CHAR(8) | 社員番号 |
| APPL-DATE | CHAR(8) | 申請日 YYYYMMDD |
| OVT-TYPE | CHAR(1) | W=平日 / H=休日 |
| START-TIME | CHAR(4) | 開始時刻 HHMM |
| END-TIME | CHAR(4) | 終了時刻 HHMM |
| OVT-HOURS | DECIMAL(4,1) | 加班時間 |
| STATUS | CHAR(1) | 0=有効 / 9=取消 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### OVT-MONTHLY(月次集計テーブル)
| カラム | 型 | 内容 |
|--------|-----|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMMPK |
| OVT-TYPE | CHAR(1) | W=平日 / H=休日(PK |
| OVT-HOURS | DECIMAL(6,1) | 加班時間合計 |
| OVT-COUNT | INTEGER | 加班回数 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン(R01/R02入力、W01出力)
1-6.R01、R02の初回読込(1100R01INNSOR、1200R02INNSOR
2.主処理(2000MAJSOR
2-1.処理フェーズ1OVT-SUMMARYR01)を全件処理
R01 EOFまで以下の処理を繰り返す
2-1-1.OVT-APPLICATIONSへのINSERTを試行
【EXEC SQL INSERT】
INSERT INTO OVT-APPLICATIONS (APPL-ID, EMP-ID, APPL-DATE, OVT-TYPE,
START-TIME, END-TIME, OVT-HOURS, STATUS, UPDATED-AT)
VALUES (:WRK-SQL-APPL-ID, :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE,
:WRK-SQL-OVT-TYPE, :WRK-SQL-START-TIME, :WRK-SQL-END-TIME,
:WRK-SQL-OVT-HOURS, :WRK-SQL-STATUS, CURRENT TIMESTAMP)
2-1-2.SQLCODE NOT = 0の場合(APPL-ID重複):
【EXEC SQL UPDATE】
UPDATE OVT-APPLICATIONS SET STATUS = :WRK-SQL-STATUS,
UPDATED-AT = CURRENT TIMESTAMP
WHERE APPL-ID = :WRK-SQL-APPL-ID
SQLCODE異常時は9100DBERRSORへ
2-1-3.SQLCODE = 0の場合:CUN-DBXINS加算、それ以外:CUN-DBXUPD加算
2-1-4.OVT-MONTHLYのUPSERT2110MONTHLYUPSOR
2-1-5.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX
2-2.処理フェーズ2OVT-DBCLEANR02)を全件処理
R02 EOFまで以下の処理を繰り返す
2-2-1.SELECTでOVT-APPLICATIONSから該当レコード取得
【EXEC SQL SELECT INTO】
SELECT EMP-ID, APPL-DATE, OVT-TYPE, OVT-HOURS
INTO :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE, :WRK-SQL-OVT-TYPE,
:WRK-SQL-OVT-HOURS
FROM OVT-APPLICATIONS
WHERE APPL-ID = :WRK-SQL-APPL-ID
2-2-2.SQLCODE NOT = 0(該当なし=孤立取消):
ERROR-LOGに出力(カテゴリ=20)、9999ABDSORで異常終了
2-2-3.OVT-APPLICATIONSのSTATUSを'9'に更新
【EXEC SQL UPDATE】
UPDATE OVT-APPLICATIONS SET STATUS = '9',
UPDATED-AT = CURRENT TIMESTAMP
WHERE APPL-ID = :WRK-SQL-APPL-ID
2-2-4.YEAR-MONTH抽出:APPL-DATE(1:6)
2-2-5.OVT-MONTHLYから減算(2210MONTHLYSUBSOR
【EXEC SQL UPDATE(減算)+COBOL SUBTRACT検証】
UPDATE OVT-MONTHLY SET
OVT-HOURS = OVT-HOURS - :WRK-SQL-OVT-HOURS,
OVT-COUNT = OVT-COUNT - 1,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WRK-SQL-EMP-ID
AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH
AND OVT-TYPE = :WRK-SQL-OVT-TYPE
SQLCODE異常時は9100DBERRSORへ
2-2-6.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX
3.OVT-MONTHLY UPSERT処理(2110MONTHLYUPSOR
3-1.OVT-MONTHLYの存在確認SELECT
【EXEC SQL SELECT INTODB-OVT-HOURS, DB-OVT-COUNT)】
SELECT OVT-HOURS, OVT-COUNT
INTO :DB-OVT-HOURS, :DB-OVT-COUNT
FROM OVT-MONTHLY
WHERE EMP-ID = :WRK-SQL-EMP-ID
AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH
AND OVT-TYPE = :WRK-SQL-OVT-TYPE
3-2.SQLCODE = 0(既存レコードあり):
【EXEC SQL UPDATE(加算)】
UPDATE OVT-MONTHLY SET
OVT-HOURS = OVT-HOURS + :WRK-SQL-OVT-HOURS,
OVT-COUNT = OVT-COUNT + 1,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WRK-SQL-EMP-ID
AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH
AND OVT-TYPE = :WRK-SQL-OVT-TYPE
3-3.SQLCODE NOT = 0(新規):
【EXEC SQL INSERT】
INSERT INTO OVT-MONTHLY
(EMP-ID, YEAR-MONTH, OVT-TYPE, OVT-HOURS, OVT-COUNT, UPDATED-AT)
VALUES
(:WRK-SQL-EMP-ID, :WRK-SQL-YEAR-MONTH, :WRK-SQL-OVT-TYPE,
:WRK-SQL-OVT-HOURS, 1, CURRENT TIMESTAMP)
3-4.SQLCODE異常時は9100DBERRSORへ
4.COMMIT処理(2300COMMITDBX
4-1.【EXEC SQL COMMIT】
COMMIT WORK
4-2.CUN-COMMITをZEROにリセット
4-3.CUN-ETHUSに1加算
5.終了処理(3000STPSOR
5-1.最終COMMIT2300COMMITDBX
5-2.入出力ファイルのクローズ
5-3.DB操作件数メッセージ出力
メッセージ番号:6(入力件数メッセージ)
PARM1'ZAN06R01' / PARM2CUN-R01INN
PARM1'ZAN06R02' / PARM2CUN-R02INN
PARM1'INS' / PARM2CUN-DBXINS
PARM1'UPD' / PARM2CUN-DBXUPD
PARM1'W01' / PARM2CUN-W01OUT
5-4.終了メッセージ出力
メッセージ番号:2(終了メッセージ)
6.DBエラー処理(9100DBERRSOR
6-1.ERROR-LOGにDBエラー情報出力(カテゴリ=30)
【COBOL STRING】
STRING 'DB ERROR SQLCODE=' SQLCODE ' APPL-ID='
WRK-SQL-APPL-ID INTO WRK-ERR-DETAIL
6-2.【EXEC SQL ROLLBACK】
ROLLBACK WORK
6-3.9999ABDSORで異常終了
```
---
## 新規カバレッジ構文
| # | 構文 | 用途 |
|---|------|------|
| 1 | EXEC SQL INSERT | OVT-APPLICATIONSへの新規登録 |
| 2 | EXEC SQL UPDATE | OVT-APPLICATIONSステータス更新・OVT-MONTHLY加減算 |
| 3 | EXEC SQL SELECT INTO | OVT-MONTHLY存在確認・OVT-APPLICATIONS検索 |
| 4 | EXEC SQL COMMIT | 定期的なCOMMIT発行 |
| 5 | EXEC SQL ROLLBACK | DBエラー時のROLLBACK |
| 6 | PERFORM VARYING | 月(1-12)のバリデーションループ |
| 7 | PERFORM TEST AFTER VARYING | 月次減算のリトライ制御 |
| 8 | COBOL MULTIPLY | 加班時間→分変換 |
| 9 | COBOL SUBTRACT | 残加班容量検証 |
## 出力レコード定義
### 出力ファイル1W01/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | WRK-ERR-CATEGORY | 20=孤立取消 / 30=DBエラー |
| 2 | ERR-DETAIL | WRK-ERR-DETAIL | エラー詳細メッセージ |