# JIN02SKL 詳細設計書 ## プログラム概要 | 項目 | 内容 | |------|------| | プログラムID | JIN02SKL(人事→JINji, 02, スキルSukiru別評価集計→SKL) | | プログラムタイプ | 19(M:N→N件マッチング+集計) | | 機能 | スキル評価明細(M件)× 評価基準マスタ(N件)→ スキル別評価集計(N件出力) | | CALL方式 | メインプログラム(JCLからCALL) | | DBアクセス | なし | | 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) | ## ファイル一覧 | DD名 | ファイル名 | 編成 | RECM | サイズ | I/O | 用途 | |:----:|:---------:|:----:|:----:|:-----:|:---:|------| | JIN02R01 | SKILL-EVAL | SEQUENTIAL | FB | 200 | INPUT | スキル評価明細データ(M件) | | JIN02R02 | SKILL-MST | SEQUENTIAL | FB | 80 | INPUT | スキル評価基準マスタ(N件→内部表LOAD) | | JIN02W01 | SKILL-AGG | SEQUENTIAL | FB | 200 | OUTPUT | スキル別評価集計結果(N件出力) | | JIN02W02 | VALID-ERROR | SEQUENTIAL | FB | 80 | OUTPUT | エラーレコード | ## レコード定義 ### SKILL-EVAL-REC(JIN02R01, 200B) | 項目 | PIC | 内容 | 備考 | |:----|:---:|------|:----:| | SKILL-CODE | X(4) | スキルコード | | | EMP-ID | X(8) | 社員番号 | | | EMP-NAME | X(40) | 社員氏名 | | | EVAL-DATE | X(8) | 評価日 YYYYMMDD | | | SCORE | 9(3) | 評価点数 | 1-999 | | PADDING | X(137) | FILLER | | ### SKILL-MST-REC(JIN02R02, 80B) | 項目 | PIC | USAGE | 内容 | 備考 | |:----|:---:|:-----:|------|:----:| | MST-SKILL-CODE | X(4) | — | スキルコード | SEARCH ALL キー | | MST-LEVEL | 9(2) | BINARY | レベル | BINARY 予約語使用 | | MST-SCORE-FROM | 9(3) | — | 下限点数 | | | MST-SCORE-TO | 9(3) | — | 上限点数 | | | MST-LEVEL-NAME | X(20) | — | レベル名称 | | | FILLER | X(048) | — | — | | ### SKILL-AGG-REC(JIN02W01, 200B) | 項目 | PIC | USAGE | 内容 | 備考 | |:----|:---:|:-----:|------|:----:| | AGG-SKILL-CODE | X(4) | — | スキルコード | | | AGG-LEVEL | 9(2) | PACKED-DECIMAL | レベル | PACKED-DECIMAL 予約語使用 | | AGG-LEVEL-NAME | X(20) | — | レベル名称 | | | AGG-EMP-COUNT | 9(5) | BINARY | 人数 | BINARY 予約語使用 | | AGG-COUNT-EDIT | ZZZZ9 | — | 人数編集表示 | ZZZZ9 PICTURE記号 | | AGG-AVG-SCORE | 9(3)V9(2) | PACKED-DECIMAL | 平均点数 | | | FILLER | X(162) | — | — | | ### VALID-ERROR-REC(JIN02W02, 80B) JIN01KNS と共用。VALID-ERROR-REC.cpy(独立したCOPY書式)を参照。 ## 内部表 ### WS-SKILL-TABLE(OCCURS DEPENDING ON) | 項目 | PIC | USAGE | 内容 | |:----|:---:|:-----:|------| | TBL-SKILL-CODE | X(4) | — | スキルコード | | TBL-LEVEL | 9(2) | BINARY | レベル | | TBL-LEVEL-NAME | X(20) | — | レベル名称 | | TBL-EMP-COUNT | 9(5) | BINARY | 件数 | | TBL-SCORE-SUM | 9(8) | BINARY | 合計点 | | TBL-MAX-ENTRY | 99 | BINARY | 最大エントリ数(100) | SEARCH ALL のキー項目:TBL-SKILL-CODE ## 処理詳細 ### 段落一覧 | 段落名 | 機能 | |:-------|:-----| | 0000MAJCOLSOR | メインコントロール(初期→マスタLOAD→主処理→出力→終了) | | 1000ITTSOR | 初期処理(開始メッセージ・初期化・運用日付・OPEN) | | 1100R02INNSOR | 評価基準マスタ(R02)読込・EOF判定 | | 1200MSTLDASOR | 評価基準マスタ全件LOAD → 内部表構築 | | 1300R01INNSOR | 評価明細(R01)読込・EOF判定 | | 2000MAJSOR | 集計主処理(SEARCH判定 → 更新 or エラー) | | 2100WRTERRSOR | エラーレコードWRITE | | 2200UPDTTLSOR | 内部表の件数・合計点UPDATE | | 3000OUTPUSOR | 集計結果出力(降順走査 → 平均点算出 → WRITE) | | 3100WRITEAGSOR | 1エントリWRITE | | 4000STPSOR | 終了処理(統計表示・CLOSE・終了メッセージ) | | 6000MSGOUTSOR | メッセージ編集出力SUB呼出 | | 9999ABDSOR | エラー処理(ABEND) | > 設計書の機能記述(SEARCH-LVL / GET-AVG / DESCEND 等)は、実装では個々の SECTION ではなく親段落(2000MAJSOR / 3000OUTPUSOR)内にインラインで実装されている。 ### 処理ロジック #### 初期処理(1000ITTSOR) 1. 開始メッセージを OUTPUT(6000MSGOUTSOR 経由) 2. JIN02R01 / JIN02R02 / JIN02W01 / JIN02W02 を OPEN 3. WS-TBL-MAX-IDX を ZERO で初期化(内部表初期化) #### マスタLOAD(1100R02INNSOR / 1200MSTLDASOR) 1. JIN02R02 から SKILL-MST を 1 件読込(1100R02INNSOR) 2. 1200MSTLDASOR で内部表 WS-SKILL-TABLE に設定 (MST-SKILL-CODE, MST-LEVEL, MST-LEVEL-NAME, TBL-EMP-COUNT=0, TBL-SCORE-SUM=0) 3. AT END(1100R02INNSOR で WRK-R02EOF='1')→ マスタLOADループ終了 4. JIN02R02 の CLOSE は 3000OUTPUSOR で実施 #### 主処理ループ(1300R01INNSOR → 2000MAJSOR → ループ) 1. JIN02R01 から SKILL-EVAL を 1 件 READ(1300R01INNSOR) 2. AT END → 3000OUTPUSOR へ 3. 2000MAJSOR を PERFORM #### 集計処理(2000MAJSOR) 1. SEARCH ALL で該当レベルを特定 2. WHEN 該当 → 2200UPDTTLSOR を PERFORM 3. WHEN NOT 該当 → 2100WRTERRSOR を PERFORM #### SEARCH ALL(2000MAJSOR 内) 1. SEARCH ALL WS-SKILL-TABLE 2. AT END → PERFORM 2100WRTERRSOR(該当するレベルがない) 3. WHEN TBL-SKILL-CODE(WS-IDX) = SKILL-CODE → PERFORM 2200UPDTTLSOR #### 内部表UPDATE(2200UPDTTLSOR) 1. ADD 1 TO TBL-EMP-COUNT(WS-IDX) END-ADD 2. ADD SCORE TO TBL-SCORE-SUM(WS-IDX) END-ADD #### 集計結果出力(3000OUTPUSOR) 1. 内部表をスキルコード降順(逆走査)で走査(内部表は SKILL-CODE 昇順。WS-TBL-MAX-IDX から -1 ずつ逆走査) 2. 各エントリについて: a. WS-AVG を ZERO で初期化 b. DIVIDE TBL-SCORE-SUM BY TBL-EMP-COUNT GIVING WS-AVG END-DIVIDE c. SKILL-AGG-REC に編集設定(ZZZZ9 編集文字) d. 3100WRITEAGSOR を PERFORM(JIN02W01 へ WRITE) #### 降順走査(3000OUTPUSOR 内) ``` PERFORM VARYING WS-IDX FROM WS-MAX-ENTRY BY -1 UNTIL WS-IDX = 0 PERFORM 3100WRITEAGSOR END-PERFORM ``` SUBTRACT 1 FROM WS-IDX END-SUBTRACT(END-SUBTRACT 予約語使用) #### 平均点算出(3000OUTPUSOR 内) ``` DIVIDE TBL-SCORE-SUM(WS-IDX) BY TBL-EMP-COUNT(WS-IDX) GIVING WS-AVG-TEMP REMAINDER WS-REM END-DIVIDE ``` (DIVIDE 予約語カバレッジ + END-DIVIDE) #### エラー出力(2100WRTERRSOR) 1. VALID-ERROR-REC にエラー情報設定 2. JIN02W02 へ WRITE #### 終了処理(4000STPSOR) 1. 統計表示 2. JIN02W01 / JIN02W02 を CLOSE(JIN02R01 / JIN02R02 は 3000OUTPUSOR で CLOSE 済み) 3. 終了メッセージ OUTPUT(6000MSGOUTSOR) 4. GOBACK ## カバレッジ対象キーワード | 予約語/記号 | 区分 | 使用箇所 | |:-----------|:----:|:---------| | USAGE BINARY | 予約語(16) | TBL-LEVEL, TBL-EMP-COUNT, TBL-SCORE-SUM(内部表) | | USAGE PACKED-DECIMAL | 予約語(127) | AGG-LEVEL, AGG-AVG-SCORE | | BY(降順走査) | 予約語(18) | PERFORM VARYING BY -1(3000OUTPUSOR) | | END-DIVIDE | 予約語(58) | 3000OUTPUSOR | | END-SUBTRACT | 予約語(66) | 3000OUTPUSOR | | GREATER | 予約語(87) | IF WS-COUNT IS GREATER THAN ZERO | | IF GREATER THAN | 予約語(87) | 件数判定 | | PIC ZZZZ9 | PICTURE記号 | AGG-COUNT-EDIT | | PIC N | PICTURE記号 | (JIN02SKL では PIC N 未使用。PIC N は JIN01KNS が JIN01REC の KANJI-NAME でカバー) |