Files
cobol-tna-system/src/ZAN05CAL.cbl
T
qiuqiuqiu b3e800e601 feat: サブシステムB 残業統計管理 初回production反映
- 全6プログラム(ZAN01CHK~ZAN06UPD)ソース・実行ファイル
- 5サブプログラム(SUB01DAT~SUB05TIM)ソース・DLL
- 10 COPY書式ファイル
- 詳細設計書12ファイル
- サブシステムB全体設計書
- bin/配下の実行ファイル资産
2026-06-17 23:20:53 +08:00

400 lines
18 KiB
COBOL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
IDENTIFICATION DIVISION.
PROGRAM-ID. ZAN05CAL.
*****************************************************************
* システム名 : 残業統計管理システム *
* プログラムID : ZAN05CAL *
* プログラム名 : 残業時間集計処理 *
* 作成日 : 2026-06-15 *
* 処理概要 : OVT-SORTED2(申請番号+処理番号昇順)を *
* キーブレイク集計し、同一APPL-ID内の全明細の *
* 加班時間を積算してOVT-SUMMARYに1レコード出力。*
* *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-15 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO ZAN05R01.
SELECT W01OUTFIL ASSIGN TO ZAN05W01.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01 (OVT-SORTED2) *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY ZAN02REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* W01 (OVT-SUMMARY) *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY ZAN03REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'ZAN05CAL'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-TIMMODE02 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** 処理日付(ACCEPT FROM DATE用)
03 WRK-DATE-8 PIC 9(008).
*** 運用日付
03 WRK-U06 PIC 9(008).
*** キーブレイク制御
03 WRK-R01KEY PIC X(008).
03 WRK-PREV-APPL-ID PIC X(008).
03 WRK-GROUP-ACTIVE PIC X(001).
88 WRK-GROUP-IS-ACTIVE VALUE '1'.
88 WRK-GROUP-NOT-ACTIVE VALUE '0'.
*** 集約用最終レコード保持
03 WRK-LAST-REC PIC X(080).
03 WRK-LAST-REC-REDEF REDEFINES WRK-LAST-REC.
05 WRK-LAST-APPL-ID PIC X(008).
05 WRK-LAST-EMP-ID PIC 9(008).
05 WRK-LAST-APPL-DATE PIC 9(008).
05 WRK-LAST-START PIC 9(004).
05 WRK-LAST-END PIC 9(004).
05 WRK-LAST-STATUS PIC X(001).
05 WRK-LAST-OVT-TYPE PIC X(001).
05 WRK-LAST-PROC-SEQ PIC 9(002).
05 WRK-LAST-FILLER PIC X(044).
*** 集計用グループ先頭START保持
03 WRK-GROUP-START PIC 9(004).
*** 集計用積算分領域
03 WRK-ACCUM-MIN PIC S9(009) COMP-3.
*** 時刻計算領域
03 WRK-START-HOUR PIC 9(004).
03 WRK-START-MIN PIC 9(004).
03 WRK-END-HOUR PIC 9(004).
03 WRK-END-MIN PIC 9(004).
03 WRK-START-TOTAL PIC 9(005).
03 WRK-END-TOTAL PIC 9(005).
03 WRK-DIFF-MIN PIC 9(005).
03 WRK-INT-HOURS PIC 9(004).
03 WRK-REMAIN-MIN PIC 9(004).
03 WRK-OVT-HOURS PIC 9(004)V9(001).
03 WRK-TEMP-HOURS PIC 9(004)V9(001).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*** 時刻丸め計算SR用
COPY ZANTIMAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理
PERFORM 2000MAJSOR
UNTIL WRK-R01KEY = HIGH-VALUE
AND WRK-GROUP-NOT-ACTIVE.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
*** 開始メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSTR TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
*** コンパイル日時出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 処理日付取得(ACCEPT FROM DATE
ACCEPT WRK-DATE-8 FROM DATE YYYYMMDD.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
MOVE '0' TO WRK-GROUP-ACTIVE.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
OUTPUT W01OUTFIL.
*
*** R01を読み込み
PERFORM 1100R01INNSOR.
*
*** 初回レコード設定
IF WRK-R01KEY NOT = HIGH-VALUE
MOVE R01APPL-ID TO WRK-PREV-APPL-ID
MOVE R01INNREC TO WRK-LAST-REC
MOVE R01START-TIME TO WRK-GROUP-START
SET WRK-GROUP-IS-ACTIVE TO TRUE
END-IF.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : レコード読込・キー設定 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE HIGH-VALUE TO WRK-R01KEY
NOT AT END
ADD 1 TO CUN-R01INN
MOVE R01APPL-ID TO WRK-R01KEY
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : キーブレイク集計制御を行う *
*****************************************************************
2000MAJSOR SECTION.
*
EVALUATE TRUE
*** EOF時:最終グループを出力
WHEN WRK-R01KEY = HIGH-VALUE
IF WRK-GROUP-IS-ACTIVE
PERFORM 2100OUTSOR
SET WRK-GROUP-NOT-ACTIVE TO TRUE
END-IF
*** キーブレイク:前グループ出力→新グループ開始
WHEN WRK-R01KEY NOT = WRK-PREV-APPL-ID
IF WRK-GROUP-IS-ACTIVE
PERFORM 2100OUTSOR
END-IF
MOVE R01APPL-ID TO WRK-PREV-APPL-ID
MOVE R01INNREC TO WRK-LAST-REC
MOVE R01START-TIME TO WRK-GROUP-START
SET WRK-GROUP-IS-ACTIVE TO TRUE
PERFORM 2200ACCUMSOR
PERFORM 1100R01INNSOR
*** 同一グループ:現レコード積算→最新レコードで上書き保持
WHEN OTHER
PERFORM 2200ACCUMSOR
MOVE R01INNREC TO WRK-LAST-REC
CONTINUE
PERFORM 1100R01INNSOR
END-EVALUATE.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名:集計計算出力処理 *
* 処理概要 : WRK-ACCUM-MIN→SUB05TIM丸め・OVT-SUMMARY出力*
*****************************************************************
2100OUTSOR SECTION.
*
*** 累積分→時間変換(DIVIDE REMAINDER
DIVIDE WRK-ACCUM-MIN BY 60
GIVING WRK-INT-HOURS
REMAINDER WRK-REMAIN-MIN.
*
*** COMPUTE ROUNDED ON SIZE ERROR(カバレッジ用)
COMPUTE WRK-OVT-HOURS ROUNDED =
WRK-ACCUM-MIN / 60
ON SIZE ERROR
CONTINUE
MOVE ZERO TO WRK-OVT-HOURS
END-COMPUTE.
*
*** SUB05TIM呼出(mode 20.1h単位切捨)
COMPUTE WRK-TEMP-HOURS =
WRK-ACCUM-MIN / 60
END-COMPUTE.
MOVE WRK-TEMP-HOURS TO T01TIMHRS.
MOVE CNS-TIMMODE02 TO T01TIMRRC.
CALL 'SUB05TIM' USING T01TIMPAR.
*
*** OVT-SUMMARY出力
INITIALIZE W01OUTREC.
MOVE WRK-LAST-APPL-ID TO W01APPL-ID.
MOVE WRK-LAST-EMP-ID TO W01EMP-ID.
MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE.
MOVE WRK-GROUP-START TO W01START-TIME.
MOVE WRK-LAST-END TO W01END-TIME.
MOVE T01TIMOUT TO W01OVT-HOURS.
MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
*** 累積分リセット(次グループ用)
MOVE ZERO TO WRK-ACCUM-MIN.
*
2100OUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名:積算処理 *
* 処理概要 : 現レコードの時間差分をWRK-ACCUM-MINに加算 *
*****************************************************************
2200ACCUMSOR SECTION.
*
*** 開始時刻→分変換
DIVIDE R01START-TIME BY 100
GIVING WRK-START-HOUR
REMAINDER WRK-START-MIN.
COMPUTE WRK-START-TOTAL =
WRK-START-HOUR * 60 + WRK-START-MIN
END-COMPUTE.
*
*** 終了時刻→分変換
DIVIDE R01END-TIME BY 100
GIVING WRK-END-HOUR
REMAINDER WRK-END-MIN.
COMPUTE WRK-END-TOTAL =
WRK-END-HOUR * 60 + WRK-END-MIN
END-COMPUTE.
*
*** 差分計算
COMPUTE WRK-DIFF-MIN =
WRK-END-TOTAL - WRK-START-TOTAL
END-COMPUTE.
*
*** 積算
COMPUTE WRK-ACCUM-MIN =
WRK-ACCUM-MIN + WRK-DIFF-MIN
END-COMPUTE.
*
2200ACCUMSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
W01OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'ZAN05R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'ZAN05W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(4.0) *
* サブモジュール名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.9) *
* サブモジュール名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.