diff --git a/.gitignore b/.gitignore index 13e9c5a..f51d212 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,11 @@ -# 编译产物 -*.exe -*.dll +# バックアップディレクトリ(push対象外) +old/ + +# コンパイル中間ファイル *.o *.obj -# 临时文件 -data/ -inpute/ -test/ - -# 备份文件 -*_2026*.bak.* - -# 日志文件 +# データ・ログファイル *.log *.DAT *.dat \ No newline at end of file diff --git a/README.md b/README.md index 859fe3a..80f836b 100644 --- a/README.md +++ b/README.md @@ -1,99 +1,54 @@ # 勤怠管理システム - 生产环境资源 -本リポジトリは勤怠管理システム(サブシステムA:勤怠休暇管理、サブシステムB:残業統計管理、サブシステムC:給与計算)の生产环境最終版リソースを管理する。 +本リポジトリは勤怠管理システム(サブシステムA:勤怠休暇管理、サブシステムB:残業統計管理、サブシステムC:給与計算)の生产环境リソースを管理する。 ## 目录结构 ``` production/ -├── src/ # 主程序源代码(COBOL) -├── sub/ # 共通サブプログラム(SUB01DAT~SUB05TIM) -├── cpy/ # COPY書式ファイル(レコード定義・連絡領域) -├── jcl/ # 実行スクリプト(Windows batch) -└── 詳細設計書/ # 詳細設計ドキュメント +├── src/ # 主プログラムソース(COBOL) +├── sub/ # 共通サブプログラム +├── cpy/ # COPY書式ファイル(レコード定義・連絡領域) +├── bin/ # 実行ファイル(.exe)+サブプログラムDLL(.dll) +├── design/ # サブシステム全体設計書 +└── 詳細設計書/ # 詳細設計ドキュメント +``` + +## サブシステム構成 + +| サブシステム | 役割 | COBOLプログラム | +|-------------|------|----------------| +| A: 勤怠休暇管理 | 休暇申請取込・打刻照合・日別計算・DB更新 | KIN01INP~KIN09CSV(9本) | +| B: 残業統計管理 | 加班申請取込・重複チェック・照合・集計・DB更新 | ZAN01CHK~ZAN06UPD(6本) | +| C: 給与計算 | 欠勤統計取込・給与計算・明細出力 | 後続追加予定 | ## 构建与运行 -### 编译命令 +### 编译 + +ソースコードはCOBOL + DB2向けに実装されている。 +開発環境(Windows + GnuCOBOL 3.2.0)にはDB2がないため、プリプロセッサ`convert-sql.mjs`が`EXEC SQL`をSQLite3用の`CALL 'br_exec'`に変換し、SQLite3で動作させる。 ```batch -rem 单个程序编译 -tools\build.bat \.cbl - -rem 例如: -tools\build.bat cobol\ZAN01CHK.cbl -tools\build.bat cobol\ZAN02CHK.cbl -tools\build.bat cobol\ZAN03CHK.cbl +rem プロジェクトルートで実行 +tools\build.bat src\.cbl ``` -### 运行环境设置 +### 実行 ```batch set COB_CONFIG_DIR=C:\mingw64\share\gnucobol\config -set COB_LIBRARY_PATH= +set COB_LIBRARY_PATH=bin +cd +bin\.exe ``` -### 输入输出 DD 名称对应关系 +### サブシステムB テスト実行順序 -| 程序 | DD 名称 | 说明 | -|----------|---------|----------------| -| 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 | +```batch +ZAN01CHK → ZAN02CHK → ZAN03CHK → ZAN04MAT → ZAN05CAL → ZAN06UPD +``` -## 测试结果概要 +## 编码 -三个主程序均已通过疏通测试,覆盖正常和异常分支: - -**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(如需要动态加载) \ No newline at end of file +源文件使用 ASCII/JIS 编码保存。COPYファイルは元の命名を維持する。 \ No newline at end of file diff --git a/bin/SUB01DAT.dll b/bin/SUB01DAT.dll new file mode 100644 index 0000000..b1a6de7 Binary files /dev/null and b/bin/SUB01DAT.dll differ diff --git a/bin/SUB02MSG.dll b/bin/SUB02MSG.dll new file mode 100644 index 0000000..ebb8af9 Binary files /dev/null and b/bin/SUB02MSG.dll differ diff --git a/bin/SUB03END.dll b/bin/SUB03END.dll new file mode 100644 index 0000000..8db2143 Binary files /dev/null and b/bin/SUB03END.dll differ diff --git a/bin/SUB04CHK.dll b/bin/SUB04CHK.dll new file mode 100644 index 0000000..d72a42e Binary files /dev/null and b/bin/SUB04CHK.dll differ diff --git a/bin/SUB05TIM.dll b/bin/SUB05TIM.dll new file mode 100644 index 0000000..0bde1dc Binary files /dev/null and b/bin/SUB05TIM.dll differ diff --git a/bin/ZAN01CHK.exe b/bin/ZAN01CHK.exe new file mode 100644 index 0000000..51388bc Binary files /dev/null and b/bin/ZAN01CHK.exe differ diff --git a/bin/ZAN02CHK.exe b/bin/ZAN02CHK.exe new file mode 100644 index 0000000..9e37c47 Binary files /dev/null and b/bin/ZAN02CHK.exe differ diff --git a/bin/ZAN03CHK.exe b/bin/ZAN03CHK.exe new file mode 100644 index 0000000..27a7537 Binary files /dev/null and b/bin/ZAN03CHK.exe differ diff --git a/bin/ZAN04MAT.exe b/bin/ZAN04MAT.exe new file mode 100644 index 0000000..a1da98d Binary files /dev/null and b/bin/ZAN04MAT.exe differ diff --git a/bin/ZAN05CAL.exe b/bin/ZAN05CAL.exe new file mode 100644 index 0000000..ab70b5f Binary files /dev/null and b/bin/ZAN05CAL.exe differ diff --git a/bin/ZAN06UPD.exe b/bin/ZAN06UPD.exe new file mode 100644 index 0000000..7b74ea0 Binary files /dev/null and b/bin/ZAN06UPD.exe differ diff --git a/cpy/ZANTIMAC.cpy b/cpy/ZANTIMAC.cpy index b5341a4..105c65c 100644 --- a/cpy/ZANTIMAC.cpy +++ b/cpy/ZANTIMAC.cpy @@ -1,5 +1,5 @@  * SUB05TIM 時刻丸め用連絡領域 - 01 T01TIMPAR. + 01 T01TIMPAR. 03 T01TIMHRS PIC 9(004)V9(001). 03 T01TIMOUT PIC 9(004)V9(001). 03 T01TIMRRC PIC 9(004). diff --git a/design/02_残業統計管理システム_設計書(サブシステムB).md b/design/02_残業統計管理システム_設計書(サブシステムB).md new file mode 100644 index 0000000..caf332e --- /dev/null +++ b/design/02_残業統計管理システム_設計書(サブシステムB).md @@ -0,0 +1,822 @@ +# 残業統計管理システム 設計書(サブシステムB) + +## システム概要 + +本サブシステムは、社員からの加班申請データを元に、振り分け・重複チェック・打刻照合・取消マッチング・キーブレイク集約を行い、月次の加班統計データをDBに保存する。 + +### サブシステム情報 + +| 項目 | 内容 | +|------|------| +| サブシステムID | ZAN(残業→ZANgyo) | +| COBOLプログラム数 | 6 | +| JCL数 | 6 | +| DB | 1(OVERTIME-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サブシステムの共通関数のうち、安定した汎用API(SUB01DAT, SUB02MSG, SUB03END, SUB04CHK, SUB05TIM)はBでも利用する。 +SUB06DBUはサブシステムAで使用するDB更新用サブプログラムであり、Bでは使用しない(EXEC SQLを直接記述)。 + +--- + +## DB構成 + +### DB名称:残業統計データベース(OVERTIME-DB) + +#### テーブル1: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 | 更新日時 | + +#### テーブル2:OVT-MONTHLY(月次集計テーブル) + +| カラム | 型 | 内容 | +|--------|---|------| +| EMP-ID | CHAR(8) | 社員番号(PK) | +| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMM(PK) | +| OVT-TYPE | CHAR(1) | W=平日 / H=休日(PK) | +| OVT-HOURS | DECIMAL(6,1) | 加班時間合計 | +| OVT-COUNT | INTEGER | 加班回数 | +| UPDATED-AT | TIMESTAMP | 更新日時 | + +--- + +## 処理フロー + +``` +OVT-APPLY(CSV、任意順) + レコード: 申請番号,社員番号,日付,開始時刻,終了時刻,ステータス(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サブシステム KINJ020(KIN03PCK)→ EDITED-PUNCH生成 +2. Bサブシステム ZANJ010〜ZANJ025(必要時順次実行) + +KINJ030(日別計算)は各打刻確定後であればいつでも実行可能で、ZANJ系列との依存関係はない。 + +--- + +## プログラム詳細 + +### STEP010: ZAN01CHK(残業申請振分処理) — 振り分け + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 残業申請振分処理 | +| **PGMパターン** | 振り分け | +| **SORT前処理** | 不要 | +| **入力ファイル** | OVT-APPLY(80B / CSV形式) | +| **出力ファイル** | OVT-VALID(80B)/ OVT-CANCEL(80B)/ ERROR-LOG(VB) | +| **件数変化** | N件 → 有効M件 + 取消K件 + 異常L件(M+K+L=N) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND), 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-START(1830) → エラー(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-VSORT(80B) | +| **出力ファイル** | OVT-NODUP(80B)/ ERROR-LOG(VB) | +| **件数変化** | M件 → 通過K件 + 重複エラー(M-K)件 | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +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-NODUP(80B)/ PUNCH-SORTED(80B) | +| **出力ファイル** | OVT-CHECKED(80B)/ ERROR-LOG(VB) | +| **件数変化** | K件 → 通過P件 + エラー(K-P)件 | +| **使用共通関数** | SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +#### 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-SORTED(80B)/ OVT-CSORT(80B) | +| **出力ファイル** | OVT-MATCHED(80B)/ OVT-DBCLEAN(80B)/ ERROR-LOG(VB) | +| **件数変化** | 有効P件 + 取消R件 → 通過Q件 + 消滅S件 + DB削除T件(P=Q+S, R=S+T) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +キー=**申請番号(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-SORTED2(80B) | +| **出力ファイル** | OVT-SUMMARY(80B) | +| **件数変化** | Q件 → 申請番号ユニーク数(L件、L≦Q) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND), 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 剰余 +``` + +**SUB05TIM(mode 2:0.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-SUMMARY(80B)/ OVT-DBCLEAN(80B) | +| **出力ファイル** | OVERTIME-DB(DB2)/ ERROR-LOG(VB) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +全DB操作は埋め込みSQL(`EXEC SQL`)で直接記述する。 + +#### 処理1:OVT-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. +``` + +#### 処理2:OVT-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-CHECKED(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 | +|---|------|------|------|------|------|------| +| 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/H(OVT-CHECKED以降のみ有効) | +| 8 | 予備 | OA-FILLER | 35 | 46 | X(46) | | + +### OVT-MATCHED(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 | +|---|------|------|------|------|------|------| +| 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) | | + +社員名・部署コードは DB2(OVT-APPLICATIONSテーブル)側で保持する。 + +### OVT-SUMMARY(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 | +|---|------|------|------|------|------|------| +| 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-DBCLEAN(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | +|---|------|------|------|------|------| +| 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 SQL(INSERT/UPDATE/SELECT/COMMIT/ROLLBACK) | | | | | | ● | +|10 | IF(SQLCODE分岐) | | | | | | ● | +|11 | PERFORM VARYING | | | | | | ● | +|12 | PERFORM TEST AFTER | | | | | | ● | +|13 | MULTIPLY | | | | | | ● | +|14 | SUBTRACT | | | | | | ● | + +--- + +## 丸めルール + +| 条件 | ルール | +|------|--------| +| 加班開始時刻 < DINNER-START(1830) | エラー(申請不可、食事時間のため) | +| 加班時間 < 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) diff --git a/src/ZAN03CHK.cbl b/src/ZAN03CHK.cbl index 98eaf84..0982e1d 100644 --- a/src/ZAN03CHK.cbl +++ b/src/ZAN03CHK.cbl @@ -56,7 +56,7 @@ 03 R02DATE PIC 9(008). 03 R02TIME-IN PIC 9(004). 03 R02TIME-OUT PIC 9(004). - 03 R02FILLER PIC X(060). + 03 R02FILLER PIC X(056). * ***************************************************************** * ##R03## * @@ -249,14 +249,15 @@ ***************************************************************** 1200R02INNSOR SECTION. * - READ R02INNFIL - AT END - MOVE '1' TO WRK-R02EOF - NOT AT END - ADD 1 TO CUN-R02INN - MOVE R02EMP-ID TO WRK-R02KEY001 - MOVE R02DATE TO WRK-R02KEY002 - END-READ. + READ R02INNFIL + AT END + MOVE '1' TO WRK-R02EOF + MOVE HIGH-VALUES TO WRK-R02KEY + NOT AT END + ADD 1 TO CUN-R02INN + MOVE R02EMP-ID TO WRK-R02KEY001 + MOVE R02DATE TO WRK-R02KEY002 + END-READ. * 1200R02INNSOR-EXT. EXIT. diff --git a/src/ZAN04MAT.cbl b/src/ZAN04MAT.cbl new file mode 100644 index 0000000..3914358 --- /dev/null +++ b/src/ZAN04MAT.cbl @@ -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. diff --git a/src/ZAN05CAL.cbl b/src/ZAN05CAL.cbl new file mode 100644 index 0000000..5d4aa1a --- /dev/null +++ b/src/ZAN05CAL.cbl @@ -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 2:0.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. \ No newline at end of file diff --git a/src/ZAN06UPD.cbl b/src/ZAN06UPD.cbl new file mode 100644 index 0000000..928e6d7 --- /dev/null +++ b/src/ZAN06UPD.cbl @@ -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) * + * サブモジュール名:主処理 * + * 処理概要 : R01(OVT-SUMMARY)→R02(OVT-DBCLEAN)処理 * + ***************************************************************** + 2000MAJSOR SECTION. + * + EVALUATE TRUE + *** フェーズ1:OVT-SUMMARY処理 + WHEN NOT WRK-R01-EOF + PERFORM 2100SUMMARYSOR + PERFORM 1100R01INNSOR + *** フェーズ2:OVT-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出力+ROLLBACK+ABEND * + ***************************************************************** + 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. diff --git a/詳細設計書/COPY句定義書.md b/詳細設計書/COPY句定義書.md new file mode 100644 index 0000000..f88d557 --- /dev/null +++ b/詳細設計書/COPY句定義書.md @@ -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-SEQ(9(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.h(0.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-HOURS(9(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で使用予定(未実装) | diff --git a/詳細設計書/詳細設計書_SUB01DAT.md b/詳細設計書/詳細設計書_SUB01DAT.md index 74a20ee..8f32bee 100644 --- a/詳細設計書/詳細設計書_SUB01DAT.md +++ b/詳細設計書/詳細設計書_SUB01DAT.md @@ -11,6 +11,9 @@ | 5 | PGMパターン | - | | 6 | 機能概要 | 現在日付を取得し、運用日付(YYYYMMDD)として返す | +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + ### 使用方法 ``` diff --git a/詳細設計書/詳細設計書_SUB02MSG.md b/詳細設計書/詳細設計書_SUB02MSG.md index 3d9846c..2407a62 100644 --- a/詳細設計書/詳細設計書_SUB02MSG.md +++ b/詳細設計書/詳細設計書_SUB02MSG.md @@ -11,6 +11,9 @@ | 5 | PGMパターン | - | | 6 | 機能概要 | メッセージ番号とパラメータを編集し、標準出力へ出力する。 | +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + ### 使用方法 ``` diff --git a/詳細設計書/詳細設計書_SUB03END.md b/詳細設計書/詳細設計書_SUB03END.md index f68dc7b..d9d3297 100644 --- a/詳細設計書/詳細設計書_SUB03END.md +++ b/詳細設計書/詳細設計書_SUB03END.md @@ -11,6 +11,9 @@ | 5 | PGMパターン | - | | 6 | 機能概要 | ABENDコードを表示し、異常終了する。 | +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + ### 使用方法 ``` diff --git a/詳細設計書/詳細設計書_SUB04CHK.md b/詳細設計書/詳細設計書_SUB04CHK.md index 03f3e00..a7d5333 100644 --- a/詳細設計書/詳細設計書_SUB04CHK.md +++ b/詳細設計書/詳細設計書_SUB04CHK.md @@ -11,6 +11,9 @@ | 5 | PGMパターン | 項目チェック | | 6 | 機能概要 | チェックタイプに応じてデータ妥当性を検証する。 | +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + ### 使用方法 ``` diff --git a/詳細設計書/詳細設計書_SUB05TIM.md b/詳細設計書/詳細設計書_SUB05TIM.md index ab7046d..4afbb16 100644 --- a/詳細設計書/詳細設計書_SUB05TIM.md +++ b/詳細設計書/詳細設計書_SUB05TIM.md @@ -11,6 +11,9 @@ | 5 | PGMパターン | - | | 6 | 機能概要 | 時間値を指定単位で丸め計算する。 | +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + ### 使用方法 ``` diff --git a/詳細設計書/詳細設計書_ZAN01CHK.md b/詳細設計書/詳細設計書_ZAN01CHK.md index 50faf83..9f737a4 100644 --- a/詳細設計書/詳細設計書_ZAN01CHK.md +++ b/詳細設計書/詳細設計書_ZAN01CHK.md @@ -14,7 +14,8 @@ | 8 | | ステータス9:取消申請としてOVT-CANCELに出力 | | 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更新 ### 前提条件 diff --git a/詳細設計書/詳細設計書_ZAN02CHK.md b/詳細設計書/詳細設計書_ZAN02CHK.md index 275ba02..9e9da40 100644 --- a/詳細設計書/詳細設計書_ZAN02CHK.md +++ b/詳細設計書/詳細設計書_ZAN02CHK.md @@ -13,7 +13,8 @@ | 7 | | 重複なしのレコードはOVT-NODUPに出力 | | 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更新 ### 前提条件 diff --git a/詳細設計書/詳細設計書_ZAN03CHK.md b/詳細設計書/詳細設計書_ZAN03CHK.md index b23a577..a86d1a2 100644 --- a/詳細設計書/詳細設計書_ZAN03CHK.md +++ b/詳細設計書/詳細設計書_ZAN03CHK.md @@ -8,12 +8,13 @@ | 2 | プログラムID | ZAN03CHK | | 3 | プログラム名 | 打刻時間照合処理 | | 4 | PGMタイプ | メイン | -| 5 | PGMパターン | 項目チェック | +| 5 | PGMパターン | マッチング(N:1) | | 6 | 機能概要 | OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の照合を行う。 | | 7 | | 申請時間帯が出勤〜退勤の範囲内かを確認する。 | | 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更新 ### 前提条件 diff --git a/詳細設計書/詳細設計書_ZAN04MAT.md b/詳細設計書/詳細設計書_ZAN04MAT.md new file mode 100644 index 0000000..4d7a21d --- /dev/null +++ b/詳細設計書/詳細設計書_ZAN04MAT.md @@ -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 | ファイルR01(OVT-SORTED) | 申請番号(APPL-ID)で昇順ソート済、重複なし | +| 2 | ファイルR02(OVT-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(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/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 | 初期値 | | + +### 出力ファイル2(W02/OVT-DBCLEAN) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | R02.APPL-ID | DB削除対象申請番号 | +| 2 | FILLER | 初期値 | | + +### 出力ファイル3(W03/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | 03で固定 | 取消マッチ監査証跡 | +| 2 | ERR-DETAIL | STRINGで編集 | CANCEL-MATCH: + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 | diff --git a/詳細設計書/詳細設計書_ZAN05CAL.md b/詳細設計書/詳細設計書_ZAN05CAL.md new file mode 100644 index 0000000..20b7efe --- /dev/null +++ b/詳細設計書/詳細設計書_ZAN05CAL.md @@ -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 | ファイルR01(OVT-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 2:0.1h単位切捨) + COMPUTE WRK-TEMP-HOURS = WRK-ACCUM-MIN / 60(切捨用にそのまま) + MOVE WRK-TEMP-HOURS TO T01TIMHRS + MOVE 2 TO T01TIMRRC(mode 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(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/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 | 初期値 | | diff --git a/詳細設計書/詳細設計書_ZAN06UPD.md b/詳細設計書/詳細設計書_ZAN06UPD.md new file mode 100644 index 0000000..133755f --- /dev/null +++ b/詳細設計書/詳細設計書_ZAN06UPD.md @@ -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 | ファイルR01(OVT-SUMMARY) | ZAN05CALの出力、APPL-ID順ソート済 | +| 2 | ファイルR02(OVT-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) | 対象年月 YYYYMM(PK) | +| 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.処理フェーズ1:OVT-SUMMARY(R01)を全件処理 + 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のUPSERT(2110MONTHLYUPSOR) + 2-1-5.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX) + + 2-2.処理フェーズ2:OVT-DBCLEAN(R02)を全件処理 + 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 INTO(DB-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.最終COMMIT(2300COMMITDBX) + 5-2.入出力ファイルのクローズ + 5-3.DB操作件数メッセージ出力 + メッセージ番号:6(入力件数メッセージ) + PARM1:'ZAN06R01' / PARM2:CUN-R01INN + PARM1:'ZAN06R02' / PARM2:CUN-R02INN + PARM1:'INS' / PARM2:CUN-DBXINS + PARM1:'UPD' / PARM2:CUN-DBXUPD + PARM1:'W01' / PARM2:CUN-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 | 残加班容量検証 | + +## 出力レコード定義 + +### 出力ファイル1(W01/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | WRK-ERR-CATEGORY | 20=孤立取消 / 30=DBエラー | +| 2 | ERR-DETAIL | WRK-ERR-DETAIL | エラー詳細メッセージ |