# JIN09RPT 詳細設計書 ## プログラム概要 | 項目 | 内容 | |------|------| | プログラムID | JIN09RPT(人事→JINji, 09, 社員別スキル集計レポート→RPT) | | プログラムタイプ | 32(1:N+同キーキーブレイク) | | 機能 | SKILL-EVAL(M件, EMP-ID昇順)を社員キーブレイクで集計し、社員別スキル集計結果を出力する | | CALL方式 | メインプログラム(JCLからCALL) | | DBアクセス | なし | | 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) | ### 前提条件 | NO | 対象ファイル | 条件 | |----|-------------|------| | 1 | SKILL-EVAL | JCL の SORT(STEP010)で 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 | 評価基準マスタ(R02)CLOSE | | 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 を INITIALIZE(1500TBLINITSOR) 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. マスタLOAD(1100R02INNSOR / 1200MSTLDASOR) 2-1. JIN09R02 から SKILL-MST を 1 件 READ(1100R02INNSOR) 2-2. 1200MSTLDASOR で内部表 WS-SKILL-TABLE(WS-TBL-ENTRY) に設定 2-3. AT END → 1250R02CLOSOR(JIN09R02 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-TABLE(OCCURS 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-CODE(SKILL-MST LOAD後に確定) --- ## 出力レコード定義 ### 出力ファイル1(W01/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) | | ### 出力ファイル2(W02/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 |