Files
cobol-tna-system/詳細設計書/詳細設計書_ZAN06UPD.md

9.8 KiB
Raw Permalink Blame History

詳細設計書

基本情報

# 項目 内容
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 ファイルR01OVT-SUMMARY ZAN05CALの出力、APPL-ID順ソート済
2 ファイルR02OVT-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) 対象年月 YYYYMMPK
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.処理フェーズ1OVT-SUMMARYR01)を全件処理
     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のUPSERT2110MONTHLYUPSOR
     2-1-5.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX

   2-2.処理フェーズ2OVT-DBCLEANR02)を全件処理
     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 INTODB-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.最終COMMIT2300COMMITDBX
   5-2.入出力ファイルのクローズ
   5-3.DB操作件数メッセージ出力
     メッセージ番号:6(入力件数メッセージ)
     PARM1'ZAN06R01' / PARM2CUN-R01INN
     PARM1'ZAN06R02' / PARM2CUN-R02INN
     PARM1'INS' / PARM2CUN-DBXINS
     PARM1'UPD' / PARM2CUN-DBXUPD
     PARM1'W01' / PARM2CUN-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 加班時間→分変換

出力レコード定義

出力ファイル1W01/ERROR-LOG

No 項目名 設定元 備考
1 ERR-CATEGORY WRK-ERR-CATEGORY 20=孤立取消 / 30=DBエラー
2 ERR-DETAIL WRK-ERR-DETAIL エラー詳細メッセージ