# 詳細設計書 ## 基本情報 | # | 項目 | 内容 | |---|------|------| | 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をそれぞれ使用する。 | ※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.ワークエリアの初期化(WRK-ACCUM-MIN含む) 1-4.運用日付取得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 R01START-TIME BY 100 GIVING WRK-START-HOUR REMAINDER WRK-START-MIN DIVIDE R01END-TIME 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 | 初期値 | |