JIN09RPT 社員別スキル集計レポート処理を新規追加(SAME句削除版)。未カバー予約語6語(CANCEL/I-O-CONTROL/NEXT SENTENCE/EJECT/SKIP2/FALSE)をカバーし、カバレッジ×41→34に改善。全26テストPASS

This commit is contained in:
qiuqiuqiu
2026-08-01 23:22:10 +08:00
parent 4804c20ccc
commit 415427a4fe
6 changed files with 1221 additions and 18 deletions
+221
View File
@@ -0,0 +1,221 @@
# JIN09RPT 詳細設計書
## プログラム概要
| 項目 | 内容 |
|------|------|
| プログラムID | JIN09RPT(人事→JINji, 09, 社員別スキル集計レポート→RPT) |
| プログラムタイプ | 32(1:N+同キーキーブレイク) |
| 機能 | SKILL-EVALM件, EMP-ID昇順)を社員キーブレイクで集計し、社員別スキル集計結果を出力する |
| CALL方式 | メインプログラム(JCLからCALL) |
| DBアクセス | なし |
| 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | SKILL-EVAL | JCL の SORTSTEP010)で EMP-ID 昇順に並替済であること |
| 2 | SKILL-MST | SKILL-CODE 昇順に整列済であること |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 |
|----|--------------|--------|------|-----|--------|------|-----------|------|------|
| 1 | SKILL-EVAL | R01 | JIN09R01 | I | SKILL-EVAL-REC | FB | 200 | PS | EMP-ID昇順 |
| 2 | SKILL-MST | R02 | JIN09R02 | I | SKILL-MST-REC | FB | 80 | PS | SKILL-CODE昇順 |
| 3 | SKILL-SUM | W01 | JIN09W01 | O | JIN09REC | FB | 120 | PS | 社員別集計結果 |
| 4 | VALID-ERROR | W02 | JIN09W02 | O | VALID-ERROR-REC | FB | 80 | PS | エラー退避 |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------|
| 1 | SKILL-EVAL | EMP-ID昇順 | 同キーキーブレイク(社員ごと) |
| 2 | SKILL-MST | SKILL-CODE昇順 | 評価基準マッチング(1:N) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | JINDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | JINMSGAC |
| 3 | ABEND処理SUB | SUB03END | JINENDAC |
---
## 処理詳細
### 段落一覧
| 段落名 | 機能 |
|:-------|:-----|
| JIN09RPT-OPEN | ファイルOPEN + ワーク初期化 |
| JIN09RPT-LOAD-MST | 評価基準マスタ(R02)全件LOAD → 内部表構築 |
| JIN09RPT-READ-EVAL | 評価明細(R011件READ |
| JIN09RPT-KEY-BREAK | 社員キーブレイク判定(同キー) |
| JIN09RPT-OUTPUT-GRP | 1社員分の集計結果出力 |
| JIN09RPT-AGGREGATE | 1明細の集計主処理(NESTED IF |
| JIN09RPT-JUDGE-LEVEL | スコア→S/A/B/Cレベル判定(NESTED IF 3段) |
| JIN09RPT-SEARCH-MST | SEARCH ALL で評価基準を特定 |
| JIN09RPT-UPDATE-TBL | 内部表の件数・合計点をUPDATE |
| JIN09RPT-CALC-AVG | DIVIDEで平均点算出 |
| JIN09RPT-WRITE-SUM | 1行の集計レコードWRITE |
| JIN09RPT-WRITE-ERR | エラーレコードWRITE |
| JIN09RPT-CLOSE | ファイルCLOSE + メッセージ出力 |
| JIN09RPT-MAIN | 主処理ループ制御(PERFORM VARYING 多重ループ) |
### 処理フロー
```
1. 初期処理(JIN09RPT-OPEN
1-1. JIN09R01 / JIN09R02 / JIN09W01 / JIN09W02 を OPEN
1-2. SUB01DAT で運用日取得(復帰コード≠0なら SUB03END で異常終了)
1-3. 内部表 WS-SKILL-TABLE を INITIALIZE
1-4. SUB02MSG で開始メッセージ出力
2. マスタLOADJIN09RPT-LOAD-MST
2-1. JIN09R02 から SKILL-MST を全件 READ
2-2. WS-TBL-ENTRY を 1 加算
2-3. 内部表 WS-SKILL-TABLE(WS-TBL-ENTRY) に設定
2-4. AT END → JIN09R02 を CLOSE → 主処理へ
3. 主処理(JIN09RPT-MAIN
3-1. JIN09RPT-READ-EVAL で SKILL-EVAL を1件 READ
3-2. AT END → JIN09RPT-OUTPUT-GRP(最終社員分)→ 終了処理へ
3-3. JIN09RPT-KEY-BREAK を PERFORM
(初回 or EMP-ID が WS-PREV-EMP-ID と不一致 → キーブレイク)
→ JIN09RPT-OUTPUT-GRP で前社員分を出力、内部表を INITIALIZE
3-4. JIN09RPT-AGGREGATE を PERFORM
3-5. WS-PREV-EMP-ID に今回 EMP-ID を設定
3-6. 3-1 へ戻る
4. 集計処理(JIN09RPT-AGGREGATE
4-1. JIN09RPT-JUDGE-LEVEL でレベル判定
4-2. JIN09RPT-SEARCH-MST で評価基準を SEARCH ALL
4-3. WHEN 該当 → JIN09RPT-UPDATE-TBL を PERFORM
4-4. WHEN 未該当 → JIN09RPT-WRITE-ERR を PERFORM
5. レベル判定(JIN09RPT-JUDGE-LEVEL)— NESTED IF 3段 + 複合条件
IF SCORE >= 80 AND SCORE <= 999
IF SCORE >= 90 OR SCORE = 100
MOVE 'S' TO WS-LEVEL
ELSE
MOVE 'A' TO WS-LEVEL
END-IF
ELSE
IF SCORE >= 50 AND SCORE <= 79
MOVE 'B' TO WS-LEVEL
ELSE
IF SCORE >= 1 AND SCORE <= 49
MOVE 'C' TO WS-LEVEL
ELSE
MOVE 'X' TO WS-LEVEL
NEXT SENTENCE
END-IF
END-IF
END-IF
6. 社員グループ出力(JIN09RPT-OUTPUT-GRP
6-1. 内部表を 1 から WS-TBL-ENTRY まで PERFORM VARYING で走査
6-2. 件数 > 0 のエントリのみ JIN09RPT-WRITE-SUM で出力
6-3. JIN09RPT-CALC-AVG で平均点算出(DIVIDE
6-4. 出力行数カウンタを加算
7. 終了処理(JIN09RPT-CLOSE
7-1. JIN09R01 / JIN09W01 / JIN09W02 を CLOSE
7-2. CANCEL 'SUB02MSG' でサブPGM解放
7-3. SUB02MSG で件数メッセージ出力
7-4. GOBACK
```
### I-O-CONTROL
```
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL JIN09R01.
SELECT R02INNFIL ASSIGN TO EXTERNAL JIN09R02.
SELECT W01OUTFIL ASSIGN TO EXTERNAL JIN09W01.
SELECT W02OUTFIL ASSIGN TO EXTERNAL JIN09W02.
I-O-CONTROL.
```
> 補足:I-O-CONTROL 段落は予約語カバー目的で記載する。当初 SAME RECORD AREA FOR
> R01INNFIL R02INNFIL を指定したが、GnuCOBOL 3.2 はレコード長の異なるファイル
> R01=200B / R02=79B)間で共有領域が最小レコード長に固定され、R01 の READ が
> 破綻することが判明したため、SAME 句は使用しない(IBM COBOL では正しく動作する
> が、ローカル検証の再現性を優先して SAME 予約語カバーは断念)。
### SET 条件名 / NEXT SENTENCE / CANCEL / EJECT / SKIP2
| 予約語 | 使用箇所 |
|:-------|:---------|
| SET 条件名 TO FALSE | 内部表初期化後に SET WRK-FIRST-FLG TO FALSE で初回フラグ解除 |
| NEXT SENTENCE | レベル判定の ELSE 内で未判定時、後続文へ制御 |
| CANCEL | 終了処理で CANCEL 'SUB02MSG' |
| EJECT | PROCEDURE DIVISION 先頭直後にソース行 EJECT |
| SKIP2 | 段落境界にソース行 SKIP2 |
### 内部表
#### WS-SKILL-TABLEOCCURS 20
| 項目 | PIC | USAGE | 内容 |
|:----|:---:|:-----:|------|
| TBL-SKILL-CODE | X(4) | — | スキルコード |
| TBL-LEVEL | 9(2) | BINARY | レベル |
| TBL-LEVEL-NAME | X(20) | — | レベル名称 |
| TBL-EVAL-CNT | 9(3) | BINARY | 明細件数 |
| TBL-SCORE-SUM | 9(5) | BINARY | 合計点 |
| TBL-EMP-ID | X(8) | — | 社員番号(出力用) |
| TBL-EMP-NAME | X(40) | — | 社員氏名(出力用) |
SEARCH ALL のキー項目:TBL-SKILL-CODESKILL-MST LOAD後に確定)
---
## 出力レコード定義
### 出力ファイル1W01/SKILL-SUM)— JIN09REC 120B
| No | 項目名 | 設定元 | PIC | 備考 |
|----|--------|--------|:---:|------|
| 1 | SUM-EMP-ID | TBL-EMP-ID | X(8) | |
| 2 | SUM-EMP-NAME | TBL-EMP-NAME | X(40) | |
| 3 | SUM-SKILL-CODE | TBL-SKILL-CODE | X(4) | |
| 4 | SUM-SKILL-NAME | MST-LEVEL-NAME | X(20) | スキル名称 |
| 5 | SUM-LEVEL-NAME | WS-LEVEL | X(2) | S/A/B/C |
| 6 | SUM-EVAL-CNT | TBL-EVAL-CNT | 9(3) | 明細件数 |
| 7 | SUM-SCORE-TOTAL | TBL-SCORE-SUM | 9(5) | 合計点 |
| 8 | SUM-SCORE-AVG | WS-AVG | 9(3)V9(2) | 平均点 |
| 9 | SUM-EVAL-CNT-TOTAL | WS-EMP-EVAL-CNT | 9(3) | 社員別明細総数 |
| 10 | SUM-FILLER | SPACE | X(30) | |
### 出力ファイル2W02/VALID-ERROR)— VALID-ERROR-REC 80B
| No | 項目名 | 設定元 | PIC | 備考 |
|----|--------|--------|:---:|------|
| 1 | ERR-PROGRAMID | 'JIN09RPT' | X(8) | |
| 2 | ERR-EMP-ID | EMP-ID | X(8) | |
| 3 | ERR-CODE | 'LVL1' | X(4) | レベル未特定 |
| 4 | ERR-DETAIL | STRING 編集 | X(60) | SKILL-CODE / SCORE |
---
## カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| CANCEL | 予約語 | 終了処理 CANCEL 'SUB02MSG' |
| I-O-CONTROL | 予約語 | ENVIRONMENT DIVISION の I-O-CONTROL 段落 |
| NEXT SENTENCE | 予約語 | レベル判定 ELSE 内 NEXT SENTENCE |
| EJECT | 予約語 | PROCEDURE DIVISION のソース行 EJECT |
| SKIP2 | 予約語 | 段落境界のソース行 SKIP2 |
| SET 条件名 TO FALSE | 予約語 | 初回フラグ解除に SET ... TO FALSE |
| PERFORM VARYING | 予約語(昇格) | 内部表走査の多重ループ |
| NESTED IF(複合条件 AND/OR | 予約語(昇格) | レベル判定 IF ネスト 3 段 |
| SEARCH ALL | 予約語 | 評価基準マッチング |
| DIVIDE ... GIVING | 予約語 | 平均点算出 |
| BINARY | 予約語 | 内部表カウンタ USAGE BINARY |