IDENTIFICATION DIVISION. PROGRAM-ID. SUB05TIM. ***************************************************************** * システム名 : 残業統計管理システム * * プログラムID : SUB05TIM * * プログラム名 : 時刻丸め計算サブ * * 作成日 : 2026-06-14 * * 処理概要 : 時間値を指定単位で丸め計算する * * * ***************************************************************** * 更新履歴 * *---------------------------------------------------------------* * 更新日付 担当者 更新内容 * *---------------------------------------------------------------* * 26-06-14 @@@ 新規作成 * * * ***************************************************************** ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-ZSERIES. OBJECT-COMPUTER. IBM-ZSERIES. * DATA DIVISION. ***************************************************************** WORKING-STORAGE SECTION. ***************************************************************** 01 WRKARA. 03 WRK-MINUTES PIC S9(005). 03 WRK-HOURS PIC S9(005)V9(001). 03 WRK-REMAINDER PIC S9(005). * ***************************************************************** * リンケージエリア * ***************************************************************** LINKAGE SECTION. * COPY ZANTIMAC. * PROCEDURE DIVISION USING T01TIMPAR. ***************************************************************** * サブモジュールNO: (0.0) * * サブモジュール名: 制御処理 * * 処理概要 : メインコントロール処理 * ***************************************************************** 0000MAINSOR SECTION. * *** 丸めモードにより分岐する EVALUATE T01TIMRRC *** モード0: 0.5時間単位・切上 WHEN 0 PERFORM 1000RNDHALF *** モード1: 0.1時間単位・切上 WHEN 1 PERFORM 2000RNDUP *** モード2: 0.1時間単位・切捨 WHEN 2 PERFORM 3000RNDDOWN *** モード3: 単純四捨五入(0.1h単位) WHEN 3 PERFORM 4000RNDNORMAL WHEN OTHER *** モード指定なし→そのまま出力 MOVE T01TIMHRS TO T01TIMOUT END-EVALUATE. * 0000MAINSOR-EXT. GOBACK. ***************************************************************** * サブモジュールNO: (1.0) * * サブモジュール名: 0.5時間単位・切上 * * 処理概要 : 30分単位で切り上げる * ***************************************************************** 1000RNDHALF SECTION. * *** 時間→分変換 COMPUTE WRK-MINUTES = T01TIMHRS * 60. *** 30分単位で切り上げ DIVIDE WRK-MINUTES BY 30 GIVING WRK-HOURS REMAINDER WRK-REMAINDER. IF WRK-REMAINDER > 0 THEN COMPUTE WRK-HOURS = WRK-HOURS + 1 END-IF. *** 分→時間変換 COMPUTE T01TIMOUT = WRK-HOURS * 0.5. * 1000RNDHALF-EXT. EXIT. ***************************************************************** * サブモジュールNO: (2.0) * * サブモジュール名: 0.1時間単位・切上 * * 処理概要 : 6分単位で切り上げる * ***************************************************************** 2000RNDUP SECTION. * *** 時間→分変換 COMPUTE WRK-MINUTES = T01TIMHRS * 60. *** 6分単位で切り上げ DIVIDE WRK-MINUTES BY 6 GIVING WRK-HOURS REMAINDER WRK-REMAINDER. IF WRK-REMAINDER > 0 THEN COMPUTE WRK-HOURS = WRK-HOURS + 1 END-IF. *** 分→時間変換 COMPUTE T01TIMOUT = WRK-HOURS * 0.1. * 2000RNDUP-EXT. EXIT. ***************************************************************** * サブモジュールNO: (3.0) * * サブモジュール名: 0.1時間単位・切捨 * * 処理概要 : 6分単位で切り捨てる * ***************************************************************** 3000RNDDOWN SECTION. * *** 時間→分変換 COMPUTE WRK-MINUTES = T01TIMHRS * 60. *** 6分単位で切り捨て DIVIDE WRK-MINUTES BY 6 GIVING WRK-HOURS REMAINDER WRK-REMAINDER. *** 分→時間変換 COMPUTE T01TIMOUT = WRK-HOURS * 0.1. * 3000RNDDOWN-EXT. EXIT. ***************************************************************** * サブモジュールNO: (4.0) * * サブモジュール名: 単純四捨五入(0.1h単位) * * 処理概要 : 0.05を加算して切捨 * ***************************************************************** 4000RNDNORMAL SECTION. * *** 0.05を加算してV9(1)に収める COMPUTE WRK-HOURS = T01TIMHRS + 0.05. *** V9(1)への代入で小数点第2位以下切捨 MOVE WRK-HOURS TO T01TIMOUT. * 4000RNDNORMAL-EXT. EXIT.