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

212 lines
8.0 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 | KIN08DBU |
| 3 | プログラム名 | 勤怠DB更新処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | DB更新 + SYSIN読込(P28) |
| 6 | 機能概要 | DAILY-RECORDを読込み、DAILY_RECORDSにINSERT。社員別月次集計後、MONTHLY_ABSENCEにUPSERT。集計結果をABSENCE_SUMMARYファイルに出力する。SYSIN制御カード(T/P/Mの3種)をGO TO DEPENDING ONで分岐処理する。 |
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|----------------|------|
| 1 | DAILY-RECORD | KIN07DAIが出力した日別勤怠計算結果が存在すること |
| 2 | DAILY_RECORDS | 同一日付のレコードが既に存在してもMODE=NORMALではUPSERT動作 |
| 3 | MONTHLY_ABSENCE | 集計対象月の統計レコードが未作成でもINSERTできること |
| 4 | SYSIN | 省略時は全社員対象、NORMALモードで動作 |
### SYSIN制御カード仕様
| カード種別 | 第1桁 | フォーマット | 説明 |
|-----------|:-----:|-------------|------|
| TARGET | T | `T 社員番号,社員番号,...` | 集計対象社員指定。省略時=全社員 |
| PERIOD | P | `P YEARMONTH=YYYYMM` | 処理対象年月。必須 |
| MODE | M | `M MODE=RESET\|NORMAL` | RESET=既存削除後再INSERT、NORMAL=UPSERT |
| コメント | * | `* 任意コメント` | 読み飛ばし |
| 不明 | 他 | — | DISPLAYで警告表示 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|
| 1 | DAILY-RECORD | INREC | KIN08R01 | I | KIN07REC | FB | | 200 | PS |
| 2 | ABSENCE-SUMMARY | OUTREC | KIN08W01 | O | KIN08REC | FB | | 80 | PS |
| 3 | SYSIN | SYSIN | KIN08S01 | I | — | FB | | 80 | PS |
### 使用DBテーブル
| NO | テーブル名 | 処理内容 |
|----|-----------|---------|
| 1 | DAILY_RECORDS | INSERTMODE=NORMAL時) / DELETE+INSERTMODE=RESET時) |
| 2 | MONTHLY_ABSENCE | SELECT COUNT(*) → IF >0 UPDATE ELSE INSERTUPSERT |
| 3 | SICK_LEAVE_RATE | SELECT DEDUCTION_RATE WHERE LEAVE_TYPE='04' |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |
| 3 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリア初期化
1-4.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
1-5.SYSINファイルOPEN
1-6.SYSIN読込ループ(EOFまで)
READ SYSINFILE INTO WS-SYSIN-REC
AT END SET SYSIN-EOF TO TRUE
END-READ.
カード種別判定(WS-SYSIN-REC(1:1)):
'T' → MOVE 1 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
'P' → MOVE 2 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
'M' → MOVE 3 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
'*' → コメント行としてDISPLAY表示後スキップ(CONTINUE
他 → DISPLAY 'WARNING: Unknown card type [x]'
1-7.必須パラメータ未設定チェック
Pカード未読込 → ABEND(CALL SUB03END)
1-8.集計対象社員テーブル設定(Tカード省略時は全社員フラグON)
1-9.入力ファイルOPENDAILY-RECORD
1-10.出力ファイルOPENABSENCE-SUMMARY
2.主処理(2000MAJSOR)(R01 EOFまで下記を繰り返す)
2-1.DAILY-RECORD読込(READ INTO
【ガード】社員番号の有効性チェック
INSPECT WS-EMP-ID TALLYING WS-ZERO-CNT FOR LEADING '0'
空文字判定 → DISPLAY警告
2-2.DAILY_RECORDS INSERT
EXEC SQL INSERT INTO DAILY_RECORDS (...) VALUES (:WS-...)
IF SQLCODE NOT = 0 → DISPLAY警告 + 9100DBERRSOR
2-3.社員別月次集計(PERFORM VARYING 内部テーブル)
該当社員の集計行を線形探索
集計計算(COMPUTE ROUNDED ON SIZE ERROR
COMPUTE WS-TOTAL-HOURS ROUNDED =
WS-ANNUAL-H + WS-PERSONAL-H + WS-OFFICIAL-H
+ WS-SICK-H + WS-ABSENT-H
ON SIZE ERROR
DISPLAY 'WARNING: Total hours overflow '
WS-EMP-ID ' date ' WS-DATE
MOVE ZERO TO WS-TOTAL-HOURS
END-COMPUTE
3.終了処理(3000STPSOR
3-1.MODE判定
MODE=RESETの場合:
EXEC SQL DELETE FROM MONTHLY_ABSENCE
WHERE YEAR_MONTH = :WS-YEAR-MONTH
3-2.集計結果のMONTHLY_ABSENCE書出(PERFORM VARYING 集計テーブル)
各社員・月ごとに:
EXEC SQL SELECT COUNT(*) INTO WS-CNT
FROM MONTHLY_ABSENCE
WHERE EMP_ID = :WS-EMP-ID
AND YEAR_MONTH = :WS-YEAR-MONTH
IF WS-CNT > 0
EXEC SQL UPDATE MONTHLY_ABSENCE SET ...
ELSE
EXEC SQL INSERT INTO MONTHLY_ABSENCE (...)
END-IF
IF SQLCODE NOT = 0 → 9100DBERRSOR
3-3.ABSENCE_SUMMARYファイル出力
STRINGで編集後 WRITE
3-4.EXEC SQL COMMIT
3-5.全CURSOR/ファイルCLOSE
3-6.出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(出力件数)
PARM1'DAILY_RECORDS'
PARM2CUN-DBXINSINSERT件数)
3-7.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
### SYSINカード処理詳細
```
2100-TARGETSOR SECTION.
UNSTRING WS-SYSIN-REC(3:) DELIMITED BY ','
INTO WS-TARGET-EMP(1) WS-TARGET-EMP(2) ...
TALLYING IN WS-EMP-COUNT
END-UNSTRING.
DISPLAY 'TARGET EMPLOYEES: ' WS-EMP-COUNT ' persons'.
EXIT.
GO TO 2000-EXIT.
2200-PERIODSOR SECTION.
UNSTRING WS-SYSIN-REC(3:) DELIMITED BY '='
INTO WS-PARM-NAME WS-PARM-VALUE
END-UNSTRING.
MOVE WS-PARM-VALUE TO WS-YEAR-MONTH.
DISPLAY 'PERIOD: ' WS-YEAR-MONTH.
EXIT.
GO TO 2000-EXIT.
2300-MODESOR SECTION.
INSPECT WS-SYSIN-REC
REPLACING ALL 'MODE=' BY SPACES.
MOVE WS-SYSIN-REC(3:) TO WS-MODE-VALUE.
IF WS-MODE-VALUE = 'RESET'
SET RESET-MODE TO TRUE
ELSE
SET NORMAL-MODE TO TRUE
END-IF.
DISPLAY 'MODE: ' WS-MODE-VALUE.
EXIT.
GO TO 2000-EXIT.
```
---
## 出力レコード定義
### ABSENCE-SUMMARYOUTREC/KIN08REC80B FB
| No | 項目名 | 設定元 | 属性 | 備考 |
|----|--------|--------|------|------|
| 1 | EMP-ID | MONTHLY_ABSENCE.EMP_ID | X(8) | 社員番号 |
| 2 | YEAR-MONTH | MONTHLY_ABSENCE.YEAR_MONTH | X(6) | YYYYMM |
| 3 | ANNUAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 年休使用合計 |
| 4 | PERSONAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 事假合計 |
| 5 | OFFICIAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 因公特批假合計 |
| 6 | SICK-LEAVE-H | 集計結果 | 9(4)V9(1) | 病欠合計 |
| 7 | UNAPPROVED-ABSENT-H | 集計結果 | 9(4)V9(1) | 未申請欠勤合計 |
| 8 | FILLER | SPACE | X(24) | |
---
## カバレッジ構文一覧
| 構文 | 用途 |
|------|------|
| READ SYSIN(パターン28) | 制御カード読込 ← 新規パターン |
| GO TO DEPENDING ON | カード種別による3分岐 ← 新規 |
| DISPLAY | 警告メッセージ表示 ← 新規 |
| INSPECT TALLYING | 社員番号空チェック、カンマ区切り数検証 |
| COMPUTE ROUNDED ON SIZE ERROR | 時間計算桁あふれ処理 ← 新規 |
| EXEC SQL DELETE | RESETモード既存削除 ← 新規 |
| EXEC SQL INSERT / UPDATE / SELECT | DB操作 |
| PERFORM VARYING | 社員別集計ループ |
| UNSTRING | SYSINカード値解析 |
| STRING | メッセージ編集 |