# 詳細設計書 ## 基本情報 | # | 項目 | 内容 | |---|------|------| | 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 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(減算)】 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 リトライ制御:PERFORM TEST AFTER VARYING(最大3回) SQLCODE≠0時はROLLBACKしてリトライ 全リトライ消費後もSQLCODE≠0の場合、 ERROR-LOG(カテゴリ=21)に出力し9999ABDSORで異常終了する (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にリセット 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 | 加班時間→分変換 | ## 出力レコード定義 ### 出力ファイル1(W01/ERROR-LOG) | No | 項目名 | 設定元 | 備考 | |----|--------|--------|------| | 1 | ERR-CATEGORY | WRK-ERR-CATEGORY | 20=孤立取消 / 30=DBエラー | | 2 | ERR-DETAIL | WRK-ERR-DETAIL | エラー詳細メッセージ |