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

- 全6プログラム(ZAN01CHK~ZAN06UPD)ソース・実行ファイル
- 5サブプログラム(SUB01DAT~SUB05TIM)ソース・DLL
- 10 COPY書式ファイル
- 詳細設計書12ファイル
- サブシステムB全体設計書
- bin/配下の実行ファイル资産
This commit is contained in:
qiuqiuqiu
2026-06-17 23:20:53 +08:00
parent c13e2407d7
commit b3e800e601
31 changed files with 3273 additions and 103 deletions
+173
View File
@@ -0,0 +1,173 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN05CAL |
| 3 | プログラム名 | 残業時間集約処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | キーブレイク(集計) |
| 6 | 機能概要 | OVT-SORTED2(申請番号+処理番号昇順)をキーブレイク集約し、 |
| 7 | | 同一APPL-IDの全レコードの加班時間を積算し、 |
| 8 | | OVT-SUMMARYに1レコードに集計して出力する。 |
| 9 | | キーブレイク制御にCONTINUE/SET、時間計算にCOMPUTE ROUNDED/DIVIDE、 |
| 10 | | 処理日付取得にACCEPT FROM DATEをそれぞれ使用する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SORTED2 | 申請番号(APPL-ID)>処理番号(PROC-SEQ)で昇順ソート済 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SORTED2 | R01 | ZAN05R01 | I | ZAN02REC | FB | | 80 | PS | マッチング結果(APPL-ID+PROC-SEQ昇順) |
| 2 | OVT-SUMMARY | W01 | ZAN05W01 | O | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | APPL-ID>PROC-SEQ(同一APPL-ID内複数明細あり) | APPL-ID(キーブレイク) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 時刻丸め計算SUB | SUB05TIM | ZANTIMAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ACCEPT FROM DATEで処理日付を取得(WRK-DATE-8
【新規カバレッジ】
ACCEPT FROM DATE YYYYMMDD
1-4.ワークエリアの初期化(WRK-ACCUM-MIN含む)
1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-6.使用ファイルのオープン(R01入力、W01出力)
1-7.R01の初回読込(1100R01INNSOR
1-8.初回読込成功時、WRK-PREV-APPL-IDに設定
WRK-GROUP-STARTに現レコードのSTARTを保持
WRK-LAST-RECに現レコードを保持
SET WRK-GROUP-IS-ACTIVE TO TRUE
(積算は主処理2000MAJSOR内の各分岐で行う)
2.主処理(2000MAJSOR)(R01を全て読み終え、最終グループ出力完了まで下記を繰り返す)
2-1.EOFの場合(WRK-R01KEY = HIGH-VALUE
2-1-1.WRK-GROUP-IS-ACTIVEなら最終グループを出力(2100OUTSOR)
2-1-2.SET WRK-GROUP-NOT-ACTIVE TO TRUE(ループ終了条件)
2-2.初回設定済みの場合(WRK-PREV-APPL-ID = 初回値あり)
2-2-1.同一APPL-IDの場合
現レコードの時間差分を積算(2200ACCUMSOR
現レコードをWRK-LAST-RECに上書き保持(ENDは最終明細で上書きされる)
グループ内最初の明細のSTARTはWRK-GROUP-STARTに保持済のため不変
R01次回読込(1100R01INNSOR
2-2-2.異なるAPPL-IDの場合(キーブレイク)
WRK-GROUP-IS-ACTIVEなら直前に保持していたグループを出力(2100OUTSOR)
WRK-PREV-APPL-IDを現レコードのAPPL-IDで更新
WRK-GROUP-STARTに現レコードのSTARTを保持
現レコードをWRK-LAST-RECに設定
2200ACCUMSORを呼出(新グループ初回レコードの時間差分を積算)
SET WRK-GROUP-IS-ACTIVE TO TRUE
R01次回読込(1100R01INNSOR
3.積算処理(2200ACCUMSOR
3-1.現レコードの時刻→分変換
DIVIDE WRK-KEY-START BY 100 GIVING WRK-START-HOUR REMAINDER WRK-START-MIN
DIVIDE WRK-KEY-END BY 100 GIVING WRK-END-HOUR REMAINDER WRK-END-MIN
COMPUTE WRK-START-TOTAL = WRK-START-HOUR * 60 + WRK-START-MIN
COMPUTE WRK-END-TOTAL = WRK-END-HOUR * 60 + WRK-END-MIN
3-2.差分計算
COMPUTE WRK-DIFF-MIN = WRK-END-TOTAL - WRK-START-TOTAL
3-3.WRK-ACCUM-MINに積算
COMPUTE WRK-ACCUM-MIN = WRK-ACCUM-MIN + WRK-DIFF-MIN
4.計算出力処理(2100OUTSOR
4-1.分→時間変換(DIVIDE for coverage
DIVIDE WRK-ACCUM-MIN BY 60 GIVING WRK-INT-HOURS REMAINDER WRK-REMAIN-MIN
4-2.COMPUTE ROUNDED for coverage(結果はSUB05TIMには渡さない)
COMPUTE WRK-OVT-HOURS ROUNDED = WRK-ACCUM-MIN / 60
ON SIZE ERROR
CONTINUE
MOVE ZERO TO WRK-OVT-HOURS
END-COMPUTE
4-3.SUB05TIM呼出(mode 20.1h単位切捨)
COMPUTE WRK-TEMP-HOURS = WRK-ACCUM-MIN / 60(切捨用にそのまま)
MOVE WRK-TEMP-HOURS TO T01TIMHRS
MOVE 2 TO T01TIMRRCmode 2
CALL 'SUB05TIM' USING T01TIMPAR
MOVE T01TIMOUT TO WRK-OVT-HOURS
4-4.OVT-SUMMARY出力
【STRING編集相当(MOVE)】
INITIALIZE W01OUTREC
MOVE WRK-LAST-APPL-ID TO W01APPL-ID
MOVE WRK-LAST-EMP-ID TO W01EMP-ID
MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE
MOVE WRK-GROUP-START TO W01START-TIME
MOVE WRK-LAST-END TO W01END-TIME
MOVE WRK-OVT-HOURS TO W01OVT-HOURS
MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE
WRITE W01OUTREC
W01出力カウンタ加算
4-5.WRK-ACCUM-MINをZEROに初期化(次グループ用)
5.終了処理(3000STPSOR
5-1.入出力ファイルのクローズ
5-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'ZAN05R01'
PARM2:入力件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'ZAN05W01'
PARM2:出力件数
5-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-SUMMARY
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | WRK-LAST-APPL-ID | 申請番号 |
| 2 | EMP-ID | WRK-LAST-EMP-ID | 社員番号 |
| 3 | APPL-DATE | WRK-LAST-APPL-DATE | 申請日 YYYYMMDD |
| 4 | START-TIME | WRK-GROUP-START | 開始時刻 HHMM(グループ最初の明細のSTART) |
| 5 | END-TIME | WRK-LAST-END | 終了時刻 HHMM |
| 6 | OVT-HOURS | SUB05TIM出力(T01TIMOUT | 加班時間(0.1h単位切捨) |
| 7 | OVT-TYPE | WRK-LAST-OVT-TYPE | W=平日 / H=休日 |
| 8 | FILLER | 初期値 | |