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

9.7 KiB
Raw Permalink Blame History

JIN09RPT 詳細設計書

プログラム概要

項目 内容
プログラムID JIN09RPT(人事→JINji, 09, 社員別スキル集計レポート→RPT)
プログラムタイプ 321: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

処理詳細

段落一覧

段落名 機能
0000MAJCOLSOR メインコントロール(初期→マスタLOAD→主処理→終了)
1000ITTSOR 初期処理(開始メッセージ・初期化・OPEN・運用日付)
1100R02INNSOR 評価基準マスタ(R02)読込・EOF判定
1200MSTLDASOR 評価基準マスタ全件LOAD → 内部表構築
1250R02CLOSOR 評価基準マスタ(R02CLOSE
1300R01INNSOR 評価明細(R01)読込・EOF判定
1500TBLINITSOR 内部表初期化(INITIALIZE TBL
1600TBLRSTSOR 内部表リセット(キーブレイク時に再初期化)
2000MAJSOR 主処理(キーブレイク判定 → 集計 → 前社員分出力 → リセット)
2100AGGRGASOR 1明細の集計主処理(レベル判定→SEARCH→UPDATE/ERR
2200JUDGESOR スコア→S/A/B/Cレベル判定(NESTED IF 3段)
2300UPDTTLSOR 内部表の件数・合計点UPDATE
2400WRTERRSOR エラーレコードWRITE
3000OUTPUSOR 1社員分の集計結果出力(昇順走査→平均点→WRITE)
3100WRITEAGSOR 1行の集計レコードWRITE(DIVIDE平均点含む)
4000STPSOR 終了処理(統計表示・CLOSE・CANCEL・終了メッセージ)
6000MSGOUTSOR メッセージ編集出力SUB呼出
9999ABDSOR エラー処理(ABEND

処理フロー

1. 初期処理(1000ITTSOR
   1-1. SUB02MSG で開始メッセージ出力(6000MSGOUTSOR
   1-2. 内部表 WS-SKILL-TABLE を INITIALIZE1500TBLINITSOR
   1-3. SUB01DAT で運用日取得(復帰コード≠0なら 9999ABDSOR+SUB03END で異常終了)
   1-4. JIN09R01 / JIN09R02 / JIN09W01 / JIN09W02 を OPEN
   1-5. 初回フラグ(WRK-FIRST-FLG)を 'Y' に設定
   1-6. R02 初回読込(1100R02INNSOR
   1-7. R01 初回読込(1300R01INNSOR

2. マスタLOAD1100R02INNSOR / 1200MSTLDASOR
   2-1. JIN09R02 から SKILL-MST を 1 件 READ1100R02INNSOR
   2-2. 1200MSTLDASOR で内部表 WS-SKILL-TABLE(WS-TBL-ENTRY) に設定
   2-3. AT END → 1250R02CLOSORJIN09R02 CLOSE)→ 主処理へ

3. 主処理(0000MAJCOLSOR
   3-1. 1300R01INNSOR で SKILL-EVAL を1件 READ
   3-2. AT END → 3000OUTPUSOR(最終社員分)→ 4000STPSOR へ
   3-3. 2000MAJSOR でキーブレイク判定:
       (初回 or EMP-ID が WS-PREV-EMP-ID と不一致 → キーブレイク)
       → 3000OUTPUSOR で前社員分を出力、1600TBLRSTSOR で内部表リセット
   3-4. 2100AGGRtASOR を PERFORM
   3-5. WS-PREV-EMP-ID に今回 EMP-ID を設定
   3-6. 3-1 へ戻る

4. 集計処理(2100AGGRGASOR
   4-1. 2200JUDGESOR でレベル判定
   4-2. SEARCH ALL で評価基準を特定
   4-3. WHEN 該当 → 2300UPDTTLSOR を PERFORM
   4-4. WHEN 未該当 → 2400WRTERRSOR を PERFORM

5. レベル判定(2200JUDGESOR)— 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. 社員グループ出力(3000OUTPUSOR
   6-1. 内部表を 1 から WS-TBL-ENTRY まで PERFORM VARYING で走査
   6-2. 件数 > 0 のエントリのみ 3100WRITEAGSOR で出力(DIVIDE平均点含む)
   6-3. 出力行数カウンタを加算

7. 終了処理(4000STPSOR
   7-1. 統計表示
   7-2. JIN09R01 / JIN09W01 / JIN09W02 を CLOSE
   7-3. CANCEL 'SUB02MSG' でサブPGM解放
   7-4. SUB02MSG で件数メッセージ出力
   7-5. 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=80B)間で共有領域が最小レコード長に固定され、R01 の READ が 破綻することが判明したため、SAME 句は使用しない(IBM COBOL では正しく動作する が、ローカル検証の再現性を優先して SAME 予約語カバーは断念)。

SET 条件名 / NEXT SENTENCE / CANCEL / EJECT / SKIP2

予約語 使用箇所
SET 条件名 TO FALSE 2000MAJSOR: キーブレイク検知時に SET WRK-FIRST-FLG TO FALSE で初回フラグ解除
NEXT SENTENCE レベル判定の ELSE 内で未判定時、後続文へ制御
CANCEL 終了処理で CANCEL 'SUB02MSG'
EJECT 段落境界の第7桁に * 付きコメント行 *EJECT(コメント化)
SKIP2 (実装せず。EJECT 同様に *SKIP2 コメント行のみ。W-1 にて統計から除外決定)

内部表

WS-SKILL-TABLEOCCURS 1 TO 20 DEPENDING ON WS-TBL-MAX-IDX

項目 PIC USAGE 内容
TBL-SKILL-CODE X(4) スキルコード
TBL-SKILL-NAME X(20) スキル名称
TBL-LEVEL-NAME X(2) S/A/B/C レベル
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 予約語 段落境界の *EJECT コメント行(コメント化)
SKIP2 予約語 (実装せず。W-1 にて統計対象から除外決定)
SET 条件名 TO FALSE 予約語 2000MAJSOR: 初回フラグ解除に SET ... TO FALSE
PERFORM VARYING 予約語(昇格) 内部表走査(単一ループ)
NESTED IF(複合条件 AND/OR 予約語(昇格) レベル判定 IF ネスト 3 段
SEARCH ALL 予約語 評価基準マッチング
DIVIDE ... GIVING 予約語 平均点算出
BINARY 予約語 内部表カウンタ USAGE BINARY