詳細設計書
基本情報
| # |
項目 |
内容 |
| 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 |
エラー詳細メッセージ |