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

239 lines
9.8 KiB
Markdown
Raw Permalink 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.
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 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 | エラー詳細メッセージ |