KIN03EXP: SELECT INTO → CURSOR(DECLARE/OPEN/FETCH/CLOSE) pattern; SUB01DAT: COPY ZANDATAC; 基本設計書A: KIN08DBU/KIN09CSV specs updated; 品質管理: coverage stats, keyword docs, test criteria

This commit is contained in:
qiuqiuqiu
2026-06-30 21:22:15 +08:00
parent a110bccdaf
commit baa5be54d2
40 changed files with 3382 additions and 350 deletions
@@ -543,28 +543,75 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
|------|------|
| **PGMパターン** | DB更新 + **SYSIN読込(P28)** |
| **JCL前処理** | なし |
| **入力** | DAILY-RECORD200B)、**SYSIN集計対象社員指定** |
| **入力** | DAILY-RECORD200B)、**SYSIN制御カード** |
| **出力** | DAILY_RECORDS / MONTHLY_ABSENCEDB2)、ABSENCE_SUMMARY80B|
**SYSIN制御カード(3種):**
```
* コメント行(先頭*
T 社員番号,社員番号,... ← TARGET: 集計対象社員指定(省略時=全社員)
P YEARMONTH=YYYYMM ← PERIOD: 処理対象年月(必須)
M MODE=RESET|NORMAL ← MODE: RESET=再実行(既存削除後に再INSERT, NORMAL=通常(UPSERT
```
カード種別('T','P','M')を第1桁で識別。**GO TO DEPENDING ON** で処理分岐する。
**機能:**
1. **SYSIN読込(パターン28**集計対象の社員番号一覧をSYSINから読み込む(省略時は全社員が対象)。
1. **SYSIN読込(パターン28**制御カードをSYSINから順次読み込み、カード種別で**GO TO DEPENDING ON**分岐
- `T`カード → 対象社員一覧をWORKING-STORAGEの内部テーブルに保持
- `P`カード → YEARMONTHを解析(`UNSTRING` + `INSPECT TALLYING`でカンマ区切り数検証)
- `M`カード → MODEを判定。未指定ならNORMAL
- `*`カード → コメント行としてスキップ(`CONTINUE`
- 不明カード → `DISPLAY`で警告表示
2. DAILY-RECORDを1レコードずつ読込み、DAILY_RECORDSに**EXEC SQL INSERT**
- 各INSERT前に`INSPECT TALLYING`で社員番号の有効性チェック → 空または無効値は`DISPLAY`で警告表示
3. 社員別・月別の集計値を**PERFORM VARYING**で積算(全社員ループ)
4. 全件処理後、MONTHLY_ABSENCEを**EXEC SQL UPDATE / INSERT**UPSERT
5. **INSPECT TALLYING**で社員番号の有効性チェック → 空または無効値は**DISPLAY**で警告表示
- **COMPUTE ROUNDED ON SIZE ERROR** で時間計算(桁あふれ時に警告表示
4. MODE=RESETの場合:**EXEC SQL DELETE**で該当月の既存レコードを削除
5. MONTHLY_ABSENCEに対して**EXEC SQL SELECT COUNT(*) → IF >0 → UPDATE ELSE INSERT**UPSERT
6. 病欠時間はSICK_LEAVE_RATEテーブルを参照し、控除前時間として保持
7. 集計後データをABSENCE_SUMMARYファイルに出力
**GO TO DEPENDING ON ロジック:**
```cobol
READ SYSINFILE INTO WS-SYSIN-REC
AT END SET SYSIN-EOF TO TRUE
END-READ.
IF NOT SYSIN-EOF
MOVE WS-SYSIN-REC(1:1) TO WS-CARD-TYPE
IF WS-CARD-TYPE = 'T' OR 'P' OR 'M'
IF WS-CARD-TYPE = 'T' MOVE 1 TO WS-DISP-IDX
IF WS-CARD-TYPE = 'P' MOVE 2 TO WS-DISP-IDX
IF WS-CARD-TYPE = 'M' MOVE 3 TO WS-DISP-IDX
GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
.
ELSE
IF WS-CARD-TYPE = '*'
DISPLAY 'COMMENT: ' WS-SYSIN-REC
ELSE
DISPLAY 'WARNING: Unknown SYSIN card type ['
WS-CARD-TYPE ']'
END-IF
END-IF
END-IF.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| **READ SYSIN**(パターン28 | 対象社員一覧の読込 ← 新規パターン |
| **READ SYSIN(パターン28** | 制御カード読込 ← 新規パターン |
| **GO TO DEPENDING ON** | カード種別による3分岐 ← 新規 |
| DISPLAY | 警告メッセージ表示 ← 新規 |
| INSPECT TALLYING | 社員番号の空チェック ← 新規 |
| INSPECT TALLYING | 社員番号の空チェック、カンマ区切り数検証 |
| **COMPUTE ON SIZE ERROR** | 時間計算の桁あふれ処理 ← 新規 |
| **EXEC SQL DELETE** | RESETモード時既存レコード削除 ← 新規(メインPGM) |
| PERFORM VARYING | 社員別月次集計ループ |
| EXEC SQL INSERT / UPDATE | DB更新(INSERT+UPDATEでUPSERT |
| EXEC SQL SELECT / INSERT / UPDATE | DB操作(UPSERTパターン |
---
@@ -572,24 +619,27 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
| 項目 | 内容 |
|------|------|
| **PGMパターン** | GETPUT |
| **PGMパターン** | GETPUT(編集出力) |
| **JCL前処理** | なし |
| **入力** | DAILY_RECORDS / MONTHLY_ABSENCEDB2)、**COMMAND-LINE PARM** |
| **出力** | CSVファイル(社員確認用)|
**PARM解析:**
- `YEARMONTH=202605` — 必須。対象年月。
- `MODE=FULL` — オプション。`FULL`=全項目出力, `SUMMARY`=集計のみ。
- `MODE=FULL` — オプション。`FULL`=全項目出力(日別+月次), `SHORT`=月次集計のみ。
**機能:**
1. **ACCEPT FROM COMMAND-LINE** でPARM解析(対象年月・出力モード
2. DAILY_RECORDSから当月の全レコードをCURSOR SELECT
3. **STRING** でCSV行を編集(DELIMITED BY SIZE
4. **WRITE AFTER ADVANCING PAGE** でページヘッダー制御 ← **新カバレッジ**
- 100行ごとにヘッダー行を出力
- WRITE header-record AFTER ADVANCING PAGE
5. CSVフォーマット:
1. **ACCEPT FROM COMMAND-LINE** でPARM解析(`INSPECT TALLYING`でカンマ区切り数チェック
2. DAILY_RECORDSから当月の全レコードをCURSOR SELECTORDER BY EMP_ID, TARGET_DATE
3. **INSPECT REPLACING** でCSV危険文字をサニタイズ(カンマ→セミコロン、改行→スペース
4. **STRING WITH POINTER** でCSV行を位置指定編集 ← **新カバレッジ**
5. **WRITE AFTER ADVANCING 3種** でページ制御 ← **新カバレッジ**
- 先頭ページ:`WRITE header-rec AFTER ADVANCING PAGE`
- セクション区切り:`WRITE section-rec AFTER ADVANCING 2 LINES`
- データ行:`WRITE data-rec AFTER ADVANCING 1 LINE`
6. MODE=FULL時:100行ごとにヘッダー行を再出力
7. CSVフォーマット:
```
社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間
@@ -599,14 +649,54 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
00000101,20260504,0000,0000,99,0.0,0.0,0.0,0.0,8.0
```
6. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99'
8. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99'
**INSPECT REPLACING によるCSVサニタイズ:**
```cobol
MOVE WS-FIELD TO WS-SAFE-FIELD.
INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';'
ALL X"0D" BY SPACE
ALL X"0A" BY SPACE.
```
**STRING WITH POINTER によるCSV行編集:**
```cobol
MOVE 1 TO WS-PTR.
STRING WS-EMP-ID DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-DATE DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-TIME-IN DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-TIME-OUT DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-LEAVE-TYPE DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-ANNUAL-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-PERSONAL-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-OFFICIAL-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-SICK-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-ABSENT-H DELIMITED BY SIZE
INTO WS-CSV-LINE WITH POINTER WS-PTR
END-STRING.
```
**新規カバレッジ構文:**
| 構文 | 用途 |
|------|------|
| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)← 新規 |
| **WRITE AFTER ADVANCING PAGE** | ページ制御出力 ← 新規 |
| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)|
| **INSPECT REPLACING** | CSV危険文字置換 ← 新規 |
| **STRING WITH POINTER** | 位置指定CSV行編集 ← 新規 |
| **WRITE AFTER ADVANCING PAGE** | ページヘッダー制御 ← 新規 |
| **WRITE AFTER ADVANCING 2 LINES** | セクション区切り ← 新規 |
| **WRITE AFTER ADVANCING 1 LINE** | データ行出力 ← 新規 |
| STRING | CSV行編集(DELIMITED BY SIZE |
| EXEC SQL SELECT(CURSOR) | DB読込 |
@@ -677,15 +767,26 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
|---------------|:----:|----------------|
| SEARCH(非ALL) | × | KIN01INP |
| DELETE FROM(DB2) | × | KIN02UPD |
| GO TO DEPENDING ON | × | — (KIN07DAIはフォールスルー問題のためEVALUATE+PERFORMに変更) |
| **GO TO DEPENDING ON** | **×** | **KIN08DBU(← 新規)** |
| PERFORM THRU | × | KIN03EXP |
| WRITE FROM | × | KIN04CHK, KIN06CLD |
| WRITE AFTER ADVANCING PAGE | × | KIN09CSV |
| **MULTIPLY** | **○(ZAN06UPDのみ)** | **KIN07DAI** |
| **SUBTRACT** | **○(ZAN06UPDのみ)** | **KIN07DAI** |
| **ACCEPT FROM COMMAND-LINE** | **(ZAN05CAL,KIN06CLD)** | **KIN09CSV** |
| **DISPLAY** | **△(SUB02MSG,SUB03ENDのみ)** | **KIN08DBU** |
| **INSPECT** | **◎** | **KIN08DBU** |
| **WRITE AFTER ADVANCINGPAGE/1/2** | **×** | **KIN09CSV(← 新規)** |
| **INSPECT REPLACING** | **×** | **KIN09CSV(← 新規)** |
| **STRING WITH POINTER** | **×** | **KIN09CSV(← 新規)** |
| **COMPUTE ON SIZE ERROR** | **(ZAN系のみ)** | **KIN08DBU(← 新規)** |
| MULTIPLY | ○(ZAN06UPDのみ) | KIN07DAI |
| SUBTRACT | ○(ZAN06UPDのみ) | KIN07DAI |
| ACCEPT FROM COMMAND-LINE | ◎(ZAN05CAL,KIN06CLD) | KIN09CSV |
| DISPLAY | △(SUB02MSG,SUB03ENDのみ) | KIN08DBU |
| INSPECT TALLYING | ◎ | KIN08DBU |
### 全体カバレッジ目標
| カテゴリ | 現状 | 追加後(目標) |
|---------|:---:|:-------------:|
| プログラムタイプ(35種) | 14使用(40.0% | 15使用(42.9% |
| ステートメント(45ユニーク) | 33使用(73.3% | 36使用(80.0% |
| カテゴリ(9種) | 8/9カバー(88.9% | 9/9カバー(100% |
---