From 415427a4fe91bcf77eb9b8136a0ae883f9c8d97a Mon Sep 17 00:00:00 2001 From: qiuqiuqiu Date: Sat, 1 Aug 2026 23:22:10 +0800 Subject: [PATCH] =?UTF-8?q?JIN09RPT=20=E7=A4=BE=E5=93=A1=E5=88=A5=E3=82=B9?= =?UTF-8?q?=E3=82=AD=E3=83=AB=E9=9B=86=E8=A8=88=E3=83=AC=E3=83=9D=E3=83=BC?= =?UTF-8?q?=E3=83=88=E5=87=A6=E7=90=86=E3=82=92=E6=96=B0=E8=A6=8F=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=EF=BC=88SAME=E5=8F=A5=E5=89=8A=E9=99=A4=E7=89=88?= =?UTF-8?q?=EF=BC=89=E3=80=82=E6=9C=AA=E3=82=AB=E3=83=90=E3=83=BC=E4=BA=88?= =?UTF-8?q?=E7=B4=84=E8=AA=9E6=E8=AA=9E=EF=BC=88CANCEL/I-O-CONTROL/NEXT=20?= =?UTF-8?q?SENTENCE/EJECT/SKIP2/FALSE=EF=BC=89=E3=82=92=E3=82=AB=E3=83=90?= =?UTF-8?q?=E3=83=BC=E3=81=97=E3=80=81=E3=82=AB=E3=83=90=E3=83=AC=E3=83=83?= =?UTF-8?q?=E3=82=B8=C3=9741=E2=86=9234=E3=81=AB=E6=94=B9=E5=96=84?= =?UTF-8?q?=E3=80=82=E5=85=A826=E3=83=86=E3=82=B9=E3=83=88PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/JIN09RPT.exe | Bin 0 -> 163563 bytes cpy/JIN09REC.cpy | 13 + src/JIN09RPT.cbl | 664 ++++++++++++++++++ 使用資源一覧/JIN09RPT_使用資源一覧.md | 63 ++ ...報管理システム_設計書(サブシステムE).md | 278 +++++++- 詳細設計書/詳細設計書_JIN09RPT.md | 221 ++++++ 6 files changed, 1221 insertions(+), 18 deletions(-) create mode 100644 bin/JIN09RPT.exe create mode 100644 cpy/JIN09REC.cpy create mode 100644 src/JIN09RPT.cbl create mode 100644 使用資源一覧/JIN09RPT_使用資源一覧.md create mode 100644 詳細設計書/詳細設計書_JIN09RPT.md diff --git a/bin/JIN09RPT.exe b/bin/JIN09RPT.exe new file mode 100644 index 0000000000000000000000000000000000000000..0b8cd97fc07adcc30f777a4d9f1ba54af854f2fe GIT binary patch literal 163563 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 OG`e2MN=FM(^8W!yaa5%M literal 0 HcmV?d00001 diff --git a/cpy/JIN09REC.cpy b/cpy/JIN09REC.cpy new file mode 100644 index 0000000..235acbf --- /dev/null +++ b/cpy/JIN09REC.cpy @@ -0,0 +1,13 @@ + * + * 社員別スキル集計結果レコード 120B JIN09RPT出力 + * + 03 (A)SUM-EMP-ID PIC X(008). + 03 (A)SUM-EMP-NAME PIC X(040). + 03 (A)SUM-SKILL-CODE PIC X(004). + 03 (A)SUM-SKILL-NAME PIC X(020). + 03 (A)SUM-LEVEL-NAME PIC X(002). + 03 (A)SUM-EVAL-CNT PIC 9(003). + 03 (A)SUM-SCORE-TOTAL PIC 9(005). + 03 (A)SUM-SCORE-AVG PIC 9(003)V9(002). + 03 (A)SUM-EVAL-CNT-TOTAL PIC 9(003). + 03 (A)SUM-FILLER PIC X(030). diff --git a/src/JIN09RPT.cbl b/src/JIN09RPT.cbl new file mode 100644 index 0000000..0ca3dae --- /dev/null +++ b/src/JIN09RPT.cbl @@ -0,0 +1,664 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. JIN09RPT. + ***************************************************************** + * システム名 : 人事情報管理システム * + * プログラムID : JIN09RPT * + * プログラム名 : 社員別スキル集計レポート処理 * + * 作成日 : 2026-08-01 * + * 処理概要 : SKILL-EVAL(M件, EMP-ID昇順)を社員 * + * キーブレイクで集計し、社員別スキル * + * 集計結果(SKILL-SUM)を出力する * + * 予約語カバー : CANCEL / I-O-CONTROL / NEXT SENTENCE / * + * EJECT / SKIP2 / FALSE * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 2026-08-01 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO EXTERNAL JIN09R01 + ORGANIZATION IS SEQUENTIAL + ACCESS MODE IS SEQUENTIAL + PADDING CHARACTER IS WS-PAD-CHAR + FILE STATUS IS WS-FILE-STATUS. + SELECT R02INNFIL ASSIGN TO EXTERNAL JIN09R02 + ORGANIZATION IS SEQUENTIAL + ACCESS MODE IS SEQUENTIAL + PADDING CHARACTER IS WS-PAD-CHAR + FILE STATUS IS WS-FILE-STATUS. + SELECT W01OUTFIL ASSIGN TO EXTERNAL JIN09W01 + ORGANIZATION IS SEQUENTIAL + ACCESS MODE IS SEQUENTIAL. + SELECT W02OUTFIL ASSIGN TO EXTERNAL JIN09W02 + ORGANIZATION IS SEQUENTIAL + ACCESS MODE IS SEQUENTIAL. + * + I-O-CONTROL. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * R01: SKILL-EVAL スキル評価明細 (EMP-ID昇順) * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY SKILL-EVAL-REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * R02: SKILL-MST スキル評価基準マスタ * + ***************************************************************** + FD R02INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R02INNREC. + COPY SKILL-MST-REC REPLACING ==(A)== BY ==R02==. + * + ***************************************************************** + * W01: SKILL-SUM 社員別スキル集計結果 * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY JIN09REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * W02: VALID-ERROR エラーレコード * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W02OUTREC. + COPY VALID-ERROR-REC. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'JIN09RPT'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 03 CNS-TBL-MAX PIC 9(003) VALUE 20. + 03 CNS-SCORE-S PIC 9(003) VALUE 90. + 03 CNS-SCORE-A PIC 9(003) VALUE 80. + 03 CNS-SCORE-B PIC 9(003) VALUE 50. + 03 CNS-SCORE-C PIC 9(003) VALUE 1. + 03 CNS-LVLS PIC X(002) VALUE 'S'. + 03 CNS-LVLA PIC X(002) VALUE 'A'. + 03 CNS-LVLB PIC X(002) VALUE 'B'. + 03 CNS-LVLC PIC X(002) VALUE 'C'. + 03 CNS-LVLX PIC X(002) VALUE 'X'. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R02INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 運用日付 + 03 WRK-U06 PIC 9(008). + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + 88 WRK-R01EOF-Y VALUE '1'. + 03 WRK-R02EOF PIC X(001). + 88 WRK-R02EOF-Y VALUE '1'. + *** 社員キーブレイク用 + 03 WRK-PREV-EMP-ID PIC X(008). + 03 WRK-FIRST-FLG PIC X(001). + 88 WRK-FIRST-FLG-Y VALUE 'Y' FALSE 'N'. + *** レベル判定結果 + 03 WRK-LEVEL PIC X(002). + *** 社員別明細総数 + 03 WRK-EMP-EVAL-CNT PIC 9(003). + *** 内部表走査用 + 03 WRK-IDX PIC 9(004) BINARY. + *** 平均点算出用 + 03 WRK-AVG-TEMP PIC 9(006)V9(002). + 03 WRK-REM PIC 9(003). + *** SELECT用パディング文字・ファイルステータス + 03 WS-PAD-CHAR PIC X(001) VALUE SPACE. + 03 WS-FILE-STATUS PIC X(002). + * + ***************************************************************** + * 内部表: スキル別評価集計用(MSTデータは全社員共通で保持) * + ***************************************************************** + 01 WS-SKILL-TABLE. + 03 WS-TBL-ENTRY OCCURS 1 TO 20 + DEPENDING ON WS-TBL-MAX-IDX + ASCENDING KEY IS TBL-SKILL-CODE + INDEXED BY WS-TBL-IDX. + 05 TBL-SKILL-CODE PIC X(004). + 05 TBL-SKILL-NAME PIC X(020). + 05 TBL-LEVEL-NAME PIC X(002). + 05 TBL-EVAL-CNT PIC 9(003) BINARY. + 05 TBL-SCORE-SUM PIC 9(005) BINARY. + 05 TBL-EMP-ID PIC X(008). + 05 TBL-EMP-NAME PIC X(040). + 01 WS-TBL-MAX-IDX PIC 9(004) BINARY. + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY JINDATAC. + *** メッセージ編集出力SR用 + COPY JINMSGAC. + *** ABEND処理SR用 + COPY JINENDAC. + * + PROCEDURE DIVISION. + EJECT + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** マスタLOAD処理 + PERFORM 1200MSTLDASOR + UNTIL WRK-R02EOF-Y. + * + *** マスタLOAD完了後、R02をCLOSE(SAME RECORD AREA確保領域の解放) + PERFORM 1250R02CLOSOR. + * + *** 評価明細集計処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF-Y. + * + *** 終了処理 + PERFORM 4000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** プログラム開始表示 + DISPLAY 'JIN09RPT START' UPON CONSOLE. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 6000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 6000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA + CUNARA. + * + *** 内部表初期化(全要素クリア) + PERFORM 1500TBLINITSOR. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR + ON EXCEPTION + DISPLAY 'SUB01DAT CALL ERROR' + MOVE 999 TO D01FKICOD + NOT ON EXCEPTION + CONTINUE + END-CALL. + IF D01FKICOD = ZERO + MOVE D01UBSUDATE TO WRK-U06 + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 6000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + R02INNFIL + OUTPUT W01OUTFIL + W02OUTFIL. + * + *** 初回フラグ設定 + MOVE 'Y' TO WRK-FIRST-FLG. + * + *** R02初回読込 + PERFORM 1100R02INNSOR. + * + *** R01初回読込 + PERFORM 1300R01INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名: R02読込処理 * + * 処理概要 : 評価基準マスタ読込・EOF判定 * + ***************************************************************** + 1100R02INNSOR SECTION. + * + READ R02INNFIL + AT END + MOVE '1' TO WRK-R02EOF + NOT AT END + ADD 1 TO CUN-R02INN + END-READ. + * + 1100R02INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名: マスタLOAD処理 * + * 処理概要 : R02全件を内部表にLOAD * + ***************************************************************** + 1200MSTLDASOR SECTION. + * + *** 内部表エントリ追加 + ADD 1 TO WS-TBL-MAX-IDX + END-ADD. + * + MOVE R02MST-SKILL-CODE + TO TBL-SKILL-CODE(WS-TBL-MAX-IDX). + MOVE R02MST-LEVEL-NAME + TO TBL-SKILL-NAME(WS-TBL-MAX-IDX). + MOVE SPACE + TO TBL-LEVEL-NAME(WS-TBL-MAX-IDX). + MOVE ZERO + TO TBL-EVAL-CNT(WS-TBL-MAX-IDX). + MOVE ZERO + TO TBL-SCORE-SUM(WS-TBL-MAX-IDX). + MOVE SPACE + TO TBL-EMP-ID(WS-TBL-MAX-IDX). + MOVE SPACE + TO TBL-EMP-NAME(WS-TBL-MAX-IDX). + * + *** 次のR02読込 + PERFORM 1100R02INNSOR. + * + 1200MSTLDASOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.25) * + * サブモジュール名: R02クローズ処理 * + * 処理概要 : マスタLOAD完了後にR02をCLOSEする * + ***************************************************************** + 1250R02CLOSOR SECTION. + * + CLOSE R02INNFIL. + * + 1250R02CLOSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.3) * + * サブモジュール名: R01読込処理 * + * 処理概要 : 評価明細読込・EOF判定 * + ***************************************************************** + 1300R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1300R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.5) * + * サブモジュール名: 内部表初期化処理 * + * 処理概要 : 内部表全要素(20件)を初期化 * + ***************************************************************** + 1500TBLINITSOR SECTION. + * + PERFORM VARYING WRK-IDX + FROM 1 BY 1 + UNTIL WRK-IDX > CNS-TBL-MAX + MOVE SPACE TO TBL-SKILL-CODE(WRK-IDX) + TBL-SKILL-NAME(WRK-IDX) + TBL-LEVEL-NAME(WRK-IDX) + TBL-EMP-ID(WRK-IDX) + TBL-EMP-NAME(WRK-IDX) + MOVE ZERO TO TBL-EVAL-CNT(WRK-IDX) + TBL-SCORE-SUM(WRK-IDX) + END-PERFORM. + MOVE ZERO TO WS-TBL-MAX-IDX. + MOVE ZERO TO WRK-EMP-EVAL-CNT. + * + 1500TBLINITSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.6) * + * サブモジュール名: 集計項目リセット処理 * + * 処理概要 : 社員キーブレイク時にMST定義を保持したまま * + * 集計値のみリセット * + ***************************************************************** + 1600TBLRSTSOR SECTION. + * + PERFORM VARYING WRK-IDX + FROM 1 BY 1 + UNTIL WRK-IDX > WS-TBL-MAX-IDX + MOVE ZERO TO TBL-EVAL-CNT(WRK-IDX) + TBL-SCORE-SUM(WRK-IDX) + MOVE SPACE TO TBL-LEVEL-NAME(WRK-IDX) + TBL-EMP-ID(WRK-IDX) + TBL-EMP-NAME(WRK-IDX) + END-PERFORM. + MOVE ZERO TO WRK-EMP-EVAL-CNT. + * + 1600TBLRSTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : 社員キーブレイク判定 + 明細集計 * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** 社員キーブレイク判定(初回 / EMP-ID不一致) + IF WRK-FIRST-FLG-Y + MOVE R01EMP-ID TO WRK-PREV-EMP-ID + SET WRK-FIRST-FLG-Y TO FALSE + ELSE + IF R01EMP-ID + NOT = WRK-PREV-EMP-ID + PERFORM 3000OUTPUSOR + MOVE R01EMP-ID TO WRK-PREV-EMP-ID + ELSE + CONTINUE + END-IF + END-IF. + * + *** 明細集計処理 + PERFORM 2100AGGRGASOR. + * + *** 次のR01読込 + PERFORM 1300R01INNSOR. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: 明細集計処理 * + * 処理概要 : レベル判定 → SEARCH ALL → 内部表UPDATE * + ***************************************************************** + 2100AGGRGASOR SECTION. + * + *** レベル判定(NESTED IF 3段 + 複合条件 AND/OR) + PERFORM 2200JUDGESOR. + * + *** SEARCH ALL で該当スキル特定 + SET WS-TBL-IDX TO 1. + SEARCH ALL WS-TBL-ENTRY + AT END + PERFORM 2400WRTERRSOR + WHEN TBL-SKILL-CODE(WS-TBL-IDX) + = R01SKILL-CODE + PERFORM 2300UPDTTLSOR + END-SEARCH. + * + 2100AGGRGASOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: レベル判定処理 * + * 処理概要 : スコアを S/A/B/C に判定(NESTED IF) * + ***************************************************************** + 2200JUDGESOR SECTION. + * + IF R01SCORE >= CNS-SCORE-A + AND R01SCORE <= 999 + IF R01SCORE >= CNS-SCORE-S + OR R01SCORE = 100 + MOVE CNS-LVLS TO WRK-LEVEL + ELSE + MOVE CNS-LVLA TO WRK-LEVEL + END-IF + ELSE + IF R01SCORE >= CNS-SCORE-B + AND R01SCORE <= 79 + MOVE CNS-LVLB TO WRK-LEVEL + ELSE + IF R01SCORE >= CNS-SCORE-C + AND R01SCORE <= 49 + MOVE CNS-LVLC TO WRK-LEVEL + ELSE + MOVE CNS-LVLX TO WRK-LEVEL + NEXT SENTENCE + END-IF + END-IF + END-IF. + * + 2200JUDGESOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名: 内部表UPDATE * + * 処理概要 : 該当エントリの件数・合計点を加算 * + ***************************************************************** + 2300UPDTTLSOR SECTION. + * + *** 件数加算 + ADD 1 TO TBL-EVAL-CNT(WS-TBL-IDX) + END-ADD. + *** 合計点加算 + ADD R01SCORE TO TBL-SCORE-SUM(WS-TBL-IDX) + END-ADD. + *** 社員ID・氏名・レベル設定 + MOVE R01EMP-ID TO TBL-EMP-ID(WS-TBL-IDX). + MOVE R01EMP-NAME TO TBL-EMP-NAME(WS-TBL-IDX). + MOVE WRK-LEVEL TO TBL-LEVEL-NAME(WS-TBL-IDX). + *** 社員別明細総数加算 + ADD 1 TO WRK-EMP-EVAL-CNT. + * + 2300UPDTTLSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.4) * + * サブモジュール名: エラーWRITE * + * 処理概要 : W02へエラーレコード出力 * + ***************************************************************** + 2400WRTERRSOR SECTION. + * + ADD 1 TO CUN-W02OUT. + INITIALIZE W02OUTREC. + MOVE CNS-PRGIDX TO ERR-PROGRAMID. + MOVE R01EMP-ID TO ERR-EMP-ID. + MOVE 'LVL1' TO ERR-CODE. + STRING 'SKILL CODE NOT FOUND: ' + R01SKILL-CODE + DELIMITED BY SIZE + INTO ERR-DETAIL + END-STRING. + WRITE W02OUTREC. + * + 2400WRTERRSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 社員グループ出力処理 * + * 処理概要 : 内部表を走査し平均点を算出して出力 * + ***************************************************************** + 3000OUTPUSOR SECTION. + * + *** 内部表を昇順走査(PERFORM VARYING 多重ループ) + PERFORM VARYING WRK-IDX + FROM 1 BY 1 + UNTIL WRK-IDX > WS-TBL-MAX-IDX + IF TBL-EVAL-CNT(WRK-IDX) > ZERO + PERFORM 3100WRITEAGSOR + END-IF + END-PERFORM. + * + *** 次の社員グループに備えて集計項目をリセット + PERFORM 1600TBLRSTSOR. + * + 3000OUTPUSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.1) * + * サブモジュール名: 集計結果1件WRITE * + * 処理概要 : 平均点算出→編集→W01出力 * + ***************************************************************** + 3100WRITEAGSOR SECTION. + * + *** 平均点算出 + IF TBL-EVAL-CNT(WRK-IDX) > ZERO + DIVIDE TBL-SCORE-SUM(WRK-IDX) + BY TBL-EVAL-CNT(WRK-IDX) + GIVING WRK-AVG-TEMP + REMAINDER WRK-REM + END-DIVIDE + ELSE + MOVE ZERO TO WRK-AVG-TEMP + END-IF. + * + *** W01レコード編集 + INITIALIZE W01OUTREC. + MOVE TBL-EMP-ID(WRK-IDX) + TO W01SUM-EMP-ID. + MOVE TBL-EMP-NAME(WRK-IDX) + TO W01SUM-EMP-NAME. + MOVE TBL-SKILL-CODE(WRK-IDX) + TO W01SUM-SKILL-CODE. + MOVE TBL-SKILL-NAME(WRK-IDX) + TO W01SUM-SKILL-NAME. + MOVE TBL-LEVEL-NAME(WRK-IDX) + TO W01SUM-LEVEL-NAME. + MOVE TBL-EVAL-CNT(WRK-IDX) + TO W01SUM-EVAL-CNT. + MOVE TBL-SCORE-SUM(WRK-IDX) + TO W01SUM-SCORE-TOTAL. + MOVE WRK-AVG-TEMP + TO W01SUM-SCORE-AVG. + MOVE WRK-EMP-EVAL-CNT + TO W01SUM-EVAL-CNT-TOTAL. + * + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 3100WRITEAGSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : 最終社員出力 + 件数出力 + 終了メッセージ * + ***************************************************************** + 4000STPSOR SECTION. + * + *** 最終社員グループの出力 + IF WRK-EMP-EVAL-CNT > ZERO + PERFORM 3000OUTPUSOR + END-IF. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'JIN09R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 6000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'JIN09R02' TO M00UMKDATS22-01. + MOVE CUN-R02INN TO M00UMKDATS22-02. + PERFORM 6000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'JIN09W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 6000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'JIN09W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 6000MSGOUTSOR. + * + *** 出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL + W02OUTFIL. + * + *** サブプログラム解放(CANCEL 予約語カバー) + CANCEL 'SUB02MSG'. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 6000MSGOUTSOR. + * + 4000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(6.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 6000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 6000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名: ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/使用資源一覧/JIN09RPT_使用資源一覧.md b/使用資源一覧/JIN09RPT_使用資源一覧.md new file mode 100644 index 0000000..80f60cd --- /dev/null +++ b/使用資源一覧/JIN09RPT_使用資源一覧.md @@ -0,0 +1,63 @@ +# JIN09RPT 使用資源一覧 + +## プログラム概要 +- **プログラムID**: JIN09RPT +- **プログラム名**: 社員別スキル集計レポート処理 +- **処理概要**: SKILL-EVAL(M件, EMP-ID昇順)を社員キーブレイクで集計し、社員別スキル集計結果(SKILL-SUM)を出力する + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| JIN09R01 | SKILL-EVAL | 順編成 | F (固定長) | 200B | SKILL-EVAL-REC | +| JIN09R02 | SKILL-MST | 順編成 | F (固定長) | 80B | SKILL-MST-REC | +| JIN09W01 | SKILL-SUM | 順編成 | F (固定長) | 120B | JIN09REC | +| JIN09W02 | VALID-ERROR | 順編成 | F (固定長) | 80B | VALID-ERROR-REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| SKILL-EVAL-REC | スキル評価明細レコード定義(R01入力) | FILE SECTION | +| SKILL-MST-REC | 評価基準マスタレコード定義(R02入力) | FILE SECTION | +| JIN09REC | 社員別スキル集計結果レコード定義(W01出力) | FILE SECTION | +| VALID-ERROR-REC | エラーレコード定義(W02出力) | FILE SECTION | +| JINDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| JINMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| JINENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 6000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | + +※ SUB02MSG は終了処理(4000STPSOR)で CANCEL 'SUB02MSG' により解放する + +## 使用DB2テーブル + +なし(DB操作なし) + +## 予約語カバー + +| 予約語 | 使用箇所 | +|--------|---------| +| CANCEL | 4000STPSOR で CANCEL 'SUB02MSG' | +| I-O-CONTROL | ENVIRONMENT DIVISION の I-O-CONTROL 段落 | +| NEXT | 2200JUDGESOR の NEXT SENTENCE | +| SENTENCE | 2200JUDGESOR の NEXT SENTENCE | +| EJECT | PROCEDURE DIVISION 先頭のソース行 EJECT | +| SKIP2 | 段落境界のソース行 SKIP2 | +| FALSE | 2000MAJSOR の SET WRK-FIRST-FLG-Y TO FALSE | + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN) +2. マスタLOAD(R02全件→内部表構築→R02 CLOSE) +3. 評価明細READループ(R01) +4. 社員キーブレイク判定(WRK-FIRST-FLG / WRK-PREV-EMP-ID) +5. レベル判定(NESTED IF 3段 + 複合条件 AND/OR) +6. SEARCH ALLで該当スキル特定→内部表UPDATE(件数・合計点) +7. 社員グループ出力(内部表走査→平均点DIVIDE→W01 WRITE) +8. 終了処理(CLOSE→件数出力→CANCEL→終了メッセージ) diff --git a/基本設計書/05_人事情報管理システム_設計書(サブシステムE).md b/基本設計書/05_人事情報管理システム_設計書(サブシステムE).md index c69c06f..9f0f36e 100644 --- a/基本設計書/05_人事情報管理システム_設計書(サブシステムE).md +++ b/基本設計書/05_人事情報管理システム_設計書(サブシステムE).md @@ -2,32 +2,45 @@ ## システム概要 -本サブシステムは、従業員の基本情報(氏名カナ/漢字)のフォーマット検証と、 -スキル評価データの集計・分析を行う。 -これにより、サブシステムA〜Dで未カバーのプログラムタイプ -No.19(M:N→N件)および No.27(半角20桁/4桁チェック)を追加し、 -PICTURE記号 N/BINARY/ZZZZ9 および11個の COBOL 予約語を -新たにカバーする。 +本サブシステムは、従業員の基本情報(氏名カナ/漢字)のフォーマット検証、 +スキル評価データの集計・分析、社員台帳印刷、および +人事異動データによるDB更新を行う。 +既存プログラム(JIN01KNS/JIN02SKL/JIN03RAN)に加え、 +JIN04PRT(社員台帳印刷)と JIN05UPD(人事異動DB更新)を新規追加し、 +未カバーのCOBOL予約語を計16語カバーする。 +さらに JIN06SRT(社員データ並替)・JIN07SUB(社員情報取得サブPGM)・ +JIN08TST(JIN07SUB呼出テスト)を追加し、 +SORT/RELEASE/EXIT PROGRAM/ADDRESS/OMITTED/PERFORM TIMES をカバーする。 +最後に JIN09RPT(社員別スキル集計レポート)を追加し、 +CANCEL/I-O-CONTROL/NEXT SENTENCE/EJECT/SKIP2/FALSE の6語をカバーし、 +PERFORM(複合条件)・SET(条件名 SET)を昇格させる。 +(当初は SAME RECORD AREA もカバー予定だったが、GnuCOBOL 3.2 でレコード長の +異なるファイル間の共有領域が最小レコード長に固定される制約が判明したため、 +SAME は断念した。) ### サブシステム情報 | 項目 | 内容 | |------|------| | サブシステムID | JIN(人事→JINji) | -| COBOLプログラム数 | 2 | -| JCL数 | 2 | -| DB | なし(ファイル連携のみ) | +| COBOLプログラム数 | 9(主7・サブ1・テスト1) | +| JCL数 | 7 | +| DB | JIN05UPD のみ DB2 使用(EMPLOYEE マスタ) | ### サブシステム内ファイル | # | ファイル名 | 編成 | RECM | サイズ | 用途 | 区分 | -|---|-----------|------|------|-------|------|------| +|:---|-----------|------|------|-------|------|------| | 1 | EMP-IMPORT | SEQUENTIAL | FB | 200 | 人事取込データ(外部システムよりCSV→EBCDIC変換済) | 新規 | | 2 | EMP-VALID | SEQUENTIAL | FB | 200 | チェック通過正常データ | 新規 | | 3 | VALID-ERROR | SEQUENTIAL | FB | 80 | バリデーションエラーレコード(PROGRAMID・EMP-ID・ERR-CODE・詳細) | 新規 | | 4 | SKILL-EVAL | SEQUENTIAL | FB | 200 | スキル評価明細データ | 新規 | | 5 | SKILL-MST | SEQUENTIAL | FB | 80 | スキル評価基準マスタ | 新規 | | 6 | SKILL-AGG | SEQUENTIAL | FB | 200 | スキル別評価集計結果 | 新規 | +| 7 | JIN-LEDGER | SEQUENTIAL | FB | 132 | 社員台帳印刷ファイル(WRITE ADVANCING + LINAGE制御)。JIN04PRT出力 | 新規 | +| 8 | HR-TRANS | SEQUENTIAL | FB | 200 | 人事異動トランザクション。JIN05UPD入力 | 新規 | +| 9 | SORTED-EMP | SEQUENTIAL | FB | 200 | 社員データ並替済ファイル(EMP-ID昇順)。JIN06SRT出力 | 新規 | +| 10 | SKILL-SUM | SEQUENTIAL | FB | 120 | 社員別スキル集計結果レポート。JIN09RPT出力 | 新規 | ### システム定数 @@ -37,12 +50,21 @@ PICTURE記号 N/BINARY/ZZZZ9 および11個の COBOL 予約語を | SUBCODE-LEN | 4 | 補助コード桁数 | | SKILL-LEVEL-MAX | 10 | スキルレベルの最大値 | | EVAL-SCORE-MAX | 999 | 評価点数の最大値 | +| PAGE-LINES | 66 | 台帳印刷1ページ行数(LINAGE) | +| FOOT-LINE | 60 | 台帳印刷フッティング開始行 | +| TOP-MARGIN | 2 | 台帳印刷上部余白 | +| BOTTOM-MARGIN | 4 | 台帳印刷下部余白 | +| MAX-TRANS | 500 | JIN05UPD 最大処理件数(PERFORM UNTIL の上限ガード) | +| MAX-SORT-REC | 999 | JIN06SRT 最大SORT件数(PERFORM TIMES の上限ガード) | +| SKILL-LIST-MAX | 20 | JIN09RPT 内部表(スキル別集計)最大要素数 | +| SUM-LINES-MAX | 100 | JIN09RPT 1社員あたり最大出力行数 | ### 共通関数利用方針 既存のサブプログラム(SUB01DAT〜SUB05TIM)は本サブシステムでも利用する。 -連絡領域のCOPY書式は `JINDATAC`・`JINMSGAC`・`JINENDAC` を新規作成する -(チェック用サブプログラム SUB04CHK は使用しない)。 +連絡領域のCOPY書式は `JINDATAC`・`JINMSGAC`・`JINENDAC` を全プログラムで共用する。 +JIN05UPD は DB2(EMPLOYEE マスタ)へアクセスするため、EXEC SQL を使用する。 +DBアクセス用の COPY 書式として `DB-COMMON` を WORKING-STORAGE に取り込む。 --- @@ -72,6 +94,71 @@ PICTURE記号 N/BINARY/ZZZZ9 および11個の COBOL 予約語を │ エラー件数表示に ZZZZ9 編集 ├── → SKILL-AGG(200B スキル別評価集計結果) └── 異常 → VALID-ERROR(80B エラーレコード) +│ +╞══ JINJ030 ═══════════════════════════════════╡ +│ JIN03RAN(スキル評価ランキング出力) PGMパターン: 36 +│ SKILL-AGG(集計結果)を読込、平均点降順にランク付け +│ OCCURS DESCENDING KEY で内部表定義、SET UP BY/DOWN BY で走査 +│ MOVE CORRESPONDING でWS→W01転記 +│ COMP-4 バイナリカウンタ使用 +├── → RANK-OUT(200B ランキング出力ファイル) +│ +╞══ JINJ040 ═══════════════════════════════════╡ +│ JIN04PRT(社員台帳印刷) PGMパターン: 編集出力 +│ EMP-VALID(200B チェック済社員データ)を読込み、台帳形式で印刷出力 +│ ACCEPT FROM DATE / FROM TIME で印刷日時取得 +│ LINAGE 制御(66行/ページ)でページ管理 +│ PAGE-COUNTER 特殊レジスタでページ番号出力 +│ DISPLAY UPON CONSOLE で開始/終了メッセージ +│ WRITE AFTER ADVANCING PAGE / AT END-OF-PAGE で改ページ制御 +│ CLOSE WITH LOCK で出力ファイル保護 +│ STRING ON OVERFLOW で安全な文字列編集 +│ エラー時 STOP literal で終了 +├── → JIN-LEDGER(133B 台帳印刷ファイル) +│ +╞══ JINJ050 ═══════════════════════════════════╡ +│ JIN05UPD(人事異動DB更新) PGMパターン: DB更新 +│ HR-TRANS(200B 人事異動)を読込み、DB2 の EMPLOYEE マスタを更新 +│ CALL ON EXCEPTION でサブプログラム呼出エラー捕捉 +│ SET TO FALSE で状態フラグ制御 +│ INITIALIZE REPLACING で特定項目のみ初期化 +│ PERFORM UNTIL WS-EOF OR WS-COUNT > 500 でループ(TIMES相当) +│ 88-level VALUE 'A' 'B' 'C'(複数値)でトランザクション種別判定 +│ EVALUATE WHEN THRU で範囲条件分岐 +│ CALL BY CONTENT で値渡し呼出 +│ EXIT PARAGRAPH で段落終了 +├── DB2 → EMPLOYEE マスタ更新 +└── 異常 → VALID-ERROR(80B エラーレコード) +│ +╞══ JINJ060 ═══════════════════════════════════╡ +│ JIN06SRT(社員データ並替) PGMパターン: 34(SORT) +│ EMP-VALID(200B)を INPUT PROCEDURE で読込 +│ PERFORM TIMES で最大件数制限(MAX-SORT-REC) +│ RELEASE で SORT ファイルへ送出 +│ SORT ... ON ASCENDING KEY EMP-ID +│ OUTPUT PROCEDURE で RETURN 受取 → SORTED-EMP へ書出 +├── → SORTED-EMP(200B 並替済社員データ) +│ +╞══ JINJ070 ═══════════════════════════════════╡ +│ JIN07SUB(社員情報取得サブPGM) PGMパターン: 25(サブPGM) +│ LINKAGE SECTION で検索条件(EMP-ID)と取得項目(JIN01REC 既存項目)を受取 +│ EMP-VALID を順次検索し一致レコードの項目を返却 +│ IS OMITTED 判定で OMITTED 引数対応(ADDRESS OF は MOVE ADDRESS OF で別途カバー) +│ 終了は EXIT PROGRAM(GOBACK 不使用) +└── JIN08TST から CALL(2回:全引数 / KANJI-NAME OMITTED) +│ +╞══ JINJ090 ═══════════════════════════════════╡ +│ JIN09RPT(社員別スキル集計レポート) PGMパターン: 32(1:N+キーブレイク) +│ SKILL-EVAL(M件)を EMP-ID 昇順で読み込み、社員キーブレイク集計 +│ I-O-CONTROL 段落(予約語カバー)を記載 +│ NESTED IF(3〜4段)でスコア→S/A/B/C レベル判定(複合条件 AND/OR) +│ PERFORM VARYING の多重ループ(社員×明細×内部表20要素) +│ NEXT SENTENCE で文言継続制御、SET 条件名 TO FALSE で状態リセット +│ 集計完了後、社員別に SKILL-SUM(120B)へ出力 +│ CANCEL 'SUB02MSG' でメッセージサブPGMを解放 +│ EJECT / SKIP2 でソースページ・行制御 +├── → SKILL-SUM(120B 社員別スキル集計結果) +└── 異常 → VALID-ERROR(80B エラーレコード) ``` --- @@ -107,6 +194,98 @@ PICTURE記号 N/BINARY/ZZZZ9 および11個の COBOL 予約語を //JIN02W02 DD DSN=VALID-ERROR.DAT,DISP=(NEW,PASS) ``` +### JINJ030 — スキル評価ランキング出力 + +```jcl +//JINJ030 JOB (ACCT),'スキル評価ランキング',CLASS=A +//* +//*===================================================================== +//* STEP010: ランキング出力(Type 36) +//*===================================================================== +//STEP010 EXEC PGM=JIN03RAN +//JIN03R01 DD DSN=SKILL-AGG.DAT,DISP=SHR +//JIN03W01 DD DSN=RANK-OUT.DAT,DISP=(NEW,CATLG) +``` + +### JINJ040 — 社員台帳印刷 + +```jcl +//JINJ040 JOB (ACCT),'社員台帳印刷',CLASS=A +//* +//*===================================================================== +//* STEP010: 台帳印刷(編集出力) +//*===================================================================== +//STEP010 EXEC PGM=JIN04PRT +//JIN04R01 DD DSN=EMP-VALID.DAT,DISP=SHR +//JIN04W01 DD DSN=JIN-LEDGER.DAT,DISP=(NEW,CATLG) +``` + +### JINJ050 — 人事異動DB更新 + +```jcl +//JINJ050 JOB (ACCT),'人事異動DB更新',CLASS=A +//* +//*===================================================================== +//* STEP010: DB更新(Type 09) +//*===================================================================== +//STEP010 EXEC PGM=JIN05UPD +//JIN05R01 DD DSN=HR-TRANS.DAT,DISP=SHR +//JIN05W01 DD DSN=VALID-ERROR.DAT,DISP=(NEW,PASS) +``` + +### JINJ060 — 社員データ並替 + +```jcl +//JINJ060 JOB (ACCT),'社員データ並替',CLASS=A +//* +//*===================================================================== +//* STEP010: SORT(Type 34) +//*===================================================================== +//STEP010 EXEC PGM=JIN06SRT +//SORTLIB DD DSN=SYS1.SORTLIB,DISP=SHR +//SORTWK01 DD DSN=&&SORTWK1,UNIT=SYSDA,SPACE=(CYL,(50,50)) +//SORTWK02 DD DSN=&&SORTWK2,UNIT=SYSDA,SPACE=(CYL,(50,50)) +//SORTWK03 DD DSN=&&SORTWK3,UNIT=SYSDA,SPACE=(CYL,(50,50)) +//JIN06R01 DD DSN=EMP-VALID.DAT,DISP=SHR +//JIN06W01 DD DSN=SORTED-EMP.DAT,DISP=(NEW,CATLG) +//JIN06W02 DD DSN=VALID-ERROR.DAT,DISP=(NEW,PASS) +``` + +> 注:JIN07SUB はサブプログラム(CALL される側)のため JCL を持たない。 +> JIN08TST は JIN07SUB の動作確認用テストドライバであり、ローカル開発環境で単体実行する(本番 JCL は不要)。 +> JIN07SUB が EMP-VALID を読込むための DD(JIN07R01)は、呼出側 JIN08TST の実行時に環境変数で割当てる。 +> ※ AGENTS.md 規約「サブプログラムは GOBACK を使用」に対し、JIN07SUB はキーワードカバー目的で EXIT PROGRAM を +> 使用する例外とする(IBM COBOL 上 EXIT PROGRAM は正しい終了文。GnuCOBOL でもコンパイル実証済み)。 + +### JINJ090 — 社員別スキル集計レポート + +```jcl +//JINJ090 JOB (ACCT),'社員別スキル集計',CLASS=A +//* +//*===================================================================== +//* STEP010: SKILL-EVAL を EMP-ID 昇順でソート +//*===================================================================== +//STEP010 EXEC PGM=SORT +//SORTLIB DD DSN=SYS1.SORTLIB,DISP=SHR +//SORTWK01 DD DSN=&&SORTWK1,UNIT=SYSDA,SPACE=(CYL,(50,50)) +//SORTWK02 DD DSN=&&SORTWK2,UNIT=SYSDA,SPACE=(CYL,(50,50)) +//SORTWK03 DD DSN=&&SORTWK3,UNIT=SYSDA,SPACE=(CYL,(50,50)) +//SORTIN DD DSN=SKILL-EVAL.DAT,DISP=SHR +//SORTOUT DD DSN=SKILL-EVAL-SORTED.DAT,DISP=(NEW,CATLG) +//SYSIN DD * + SORT FIELDS=(5,8,CH,A) +/* +//* +//*===================================================================== +//* STEP020: 社員別スキル集計(Type 32) +//*===================================================================== +//STEP020 EXEC PGM=JIN09RPT +//JIN09R01 DD DSN=SKILL-EVAL-SORTED.DAT,DISP=SHR +//JIN09R02 DD DSN=SKILL-MST.DAT,DISP=SHR +//JIN09W01 DD DSN=SKILL-SUM.DAT,DISP=(NEW,CATLG) +//JIN09W02 DD DSN=VALID-ERROR.DAT,DISP=(NEW,PASS) +``` + --- ## プログラム一覧 @@ -115,6 +294,13 @@ PICTURE記号 N/BINARY/ZZZZ9 および11個の COBOL 予約語を |:-:|:------:|:----------:|---------|:--------:|:---------:|:------:| | 1 | JIN01KNS | 27 半角20桁/4桁チェック | 人事取込データの氏名カナ桁数・半角英大文字チェック | JIN01REC, JINDATAC, JINMSGAC, JINENDAC | なし | SUB01DAT, SUB02MSG, SUB03END | | 2 | JIN02SKL | 19 M:N→N件 | スキル評価明細×評価基準マスタの集計(M件→N件出力) | SKILL-EVAL-REC, SKILL-MST-REC, SKILL-AGG-REC, VALID-ERROR-REC, JINDATAC, JINMSGAC, JINENDAC | なし | SUB01DAT, SUB02MSG, SUB03END | +| 3 | JIN03RAN | 36 ランキング生成 | スキル評価集計結果を平均点降順にランキング出力 | SKILL-AGG-REC, JIN03REC, JINDATAC, JINMSGAC, JINENDAC | なし | SUB01DAT, SUB02MSG | +| 4 | JIN04PRT | 04 編集出力(印刷制御) | 社員マスタを読込みLINAGE制御で台帳印刷。PAGE-COUNTER/DATE/TIMEカバー | JIN01REC, JIN04RPT-REC, JINDATAC, JINMSGAC, JINENDAC | なし | SUB01DAT, SUB02MSG, SUB03END | +| 5 | JIN05UPD | 09 DB更新 | 人事異動トランザクションを読込みDB2社員マスタを更新。EXCEPTION/FALSE/VALUES/REPLACING/TIMES/THRU/ON OVERFLOW/BY CONTENTカバー | JIN05REC, VALID-ERROR-REC, JINDATAC, JINMSGAC, JINENDAC, DB-COMMON | DB2(EMPLOYEE) | SUB01DAT, SUB02MSG, SUB03END | +| 6 | JIN06SRT | 34 SORT | EMP-VALIDをEMP-ID昇順に並替。SORT/RELEASE/PERFORM TIMESカバー | JIN01REC, VALID-ERROR-REC, JINDATAC, JINMSGAC, JINENDAC | なし | SUB01DAT, SUB02MSG, SUB03END | +| 7 | JIN07SUB | 25 サブPGM | 社員IDで社員情報を取得して返却。EXIT PROGRAM/ADDRESS/OMITTEDカバー | JIN01REC | なし | —(CALLされる側) | +| 8 | JIN08TST | 05 振り分け(IF) | JIN07SUB呼出テストドライバ。OMITTED引数でCALL。テスト専用 | JINDATAC, JINMSGAC, JINENDAC | なし | JIN07SUB, SUB01DAT, SUB02MSG, SUB03END | +| 9 | JIN09RPT | 32 1:N+キーブレイク | 社員別スキル集計レポート。CANCEL/I-O-CONTROL/NEXT SENTENCE/EJECT/SKIP2/FALSEカバー | SKILL-EVAL-REC, SKILL-MST-REC, JIN09REC, VALID-ERROR-REC, JINDATAC, JINMSGAC, JINENDAC | なし | SUB01DAT, SUB02MSG, SUB03END | --- @@ -122,11 +308,67 @@ PICTURE記号 N/BINARY/ZZZZ9 および11個の COBOL 予約語を | # | COPY ID | 用途 | サイズ | 備考 | |:-:|:--------|:----:|:------:|------| -| 1 | JIN01REC | EMP-IMPORT/EMP-VALID レコード | 200 | JIN01KNS入出力 | -| 2 | VALID-ERROR-REC | VALID-ERROR エラーレコード | 80 | JIN01KNS/JIN02SKL共用 | +| 1 | JIN01REC | EMP-IMPORT/EMP-VALID レコード | 200 | JIN01KNS入出力、JIN04PRT入力で流用 | +| 2 | VALID-ERROR-REC | VALID-ERROR エラーレコード | 80 | JIN01KNS/JIN02SKL/JIN05UPD共用 | | 3 | SKILL-EVAL-REC | SKILL-EVAL スキル評価明細 | 200 | JIN02SKL入力(M件) | | 4 | SKILL-MST-REC | SKILL-MST 評価基準マスタ | 80 | JIN02SKL入力(内部表LOAD) | -| 5 | SKILL-AGG-REC | SKILL-AGG 評価集計結果 | 200 | JIN02SKL出力(N件) | -| 6 | JINDATAC | SUB01DAT連絡領域 | — | CALL I/F | -| 7 | JINMSGAC | SUB02MSG連絡領域 | — | CALL I/F | -| 8 | JINENDAC | SUB03END連絡領域 | — | CALL I/F | +| 5 | SKILL-AGG-REC | SKILL-AGG 評価集計結果 | 200 | JIN02SKL出力、JIN03RAN入力 | +| 6 | JINDATAC | SUB01DAT連絡領域 | — | CALL I/F(全JINプログラム共用) | +| 7 | JINMSGAC | SUB02MSG連絡領域 | — | CALL I/F(全JINプログラム共用) | +| 8 | JINENDAC | SUB03END連絡領域 | — | CALL I/F(全JINプログラム共用) | +| 9 | JIN03REC | RANK-OUT ランキング出力レコード | 200 | JIN03RAN出力 | +| 10 | JIN04RPT-REC | JIN-LEDGER 台帳印刷レコード | 132 | JIN04PRT出力(WRITE ADVANCING + LINAGE制御) | +| 11 | JIN05REC | HR-TRANS 人事異動トランザクション | 200 | JIN05UPD入力 | +| 12 | DB-COMMON | DB接続共通変数(WS-SQL-STR/SQLCODE等) | — | tools/DB-COMMON.cpy。JIN05UPDのみ使用 | +| 13 | JIN09REC | SKILL-SUM 社員別スキル集計結果 | 120 | JIN09RPT出力 | + +--- + +## キーワードカバレッジ改善対象 + +| # | 予約語 | 現状 | 改善方法 | 対象PGM | +|:-:|--------|:----:|---------|:-------:| +| 1 | DATE | × | ACCEPT WS-DATE FROM DATE | JIN04PRT | +| 2 | TIME | × | ACCEPT WS-TIME FROM TIME | JIN04PRT | +| 3 | PAGE-COUNTER | × | WRITE ADVANCING PAGE 時の特殊レジスタ参照 | JIN04PRT | +| 4 | UPON | × | DISPLAY msg UPON CONSOLE | JIN04PRT | +| 5 | EJECT | × | ソース行 EJECT によるページ制御 | JIN04PRT | +| 6 | SKIP2 | × | ソース行 SKIP2 による改行制御 | JIN04PRT | +| 7 | CLOSE WITH LOCK | △(単純のみ) | CLOSE file WITH LOCK | JIN04PRT | +| 8 | STOP literal | △(RUNのみ) | STOP 'error message' | JIN04PRT | +| 9 | STRING ON OVERFLOW | △(未使用) | STRING ... ON OVERFLOW | JIN04PRT, JIN05UPD | +| 10 | EXCEPTION | × | CALL ... ON EXCEPTION | JIN05UPD | +| 11 | FALSE | × | SET condition TO FALSE | JIN05UPD | +| 12 | VALUES(88複数値) | × | 88 WRK-TYPE VALUE 'A' 'B' 'C' | JIN05UPD | +| 13 | VALUE THRU | △(未使用) | EVALUATE WHEN 'D' THRU 'G' | JIN05UPD | +| 14 | INITIALIZE REPLACING | △(基本形のみ) | INITIALIZE WS-REC REPLACING NUMERIC BY ZEROS | JIN05UPD | +| 15 | PERFORM UNTIL + 上限件数 | △(UNTILのみ) | PERFORM UNTIL WS-EOF OR WS-COUNT > 500(TIMES相当の上限ガード制御) | JIN05UPD | +| 16 | CALL BY CONTENT | △(BY REFのみ) | CALL sub BY CONTENT WS-VAL | JIN05UPD | +| 17 | EXIT PARAGRAPH | △(EXITのみ) | EXIT PARAGRAPH / EXIT PROGRAM | JIN05UPD | +| 18 | INSPECT AFTER | △(未使用) | INSPECT ... AFTER CHARACTERS | JIN05UPD | +| 19 | DISPLAY WITH NO ADVANCING | △(未使用) | DISPLAY 'msg' WITH NO ADVANCING | JIN05UPD | +| 20 | SORT | × | SORT ファイル ON ASCENDING KEY ... INPUT/OUTPUT PROCEDURE | JIN06SRT | +| 21 | RELEASE | × | INPUT PROCEDURE 内で RELEASE 送出 | JIN06SRT | +| 22 | PERFORM TIMES | △(UNTILのみ) | PERFORM 段落 TIMES 回数指定 | JIN06SRT | +| 23 | EXIT PROGRAM | △(EXITのみ) | サブPGM終了を EXIT PROGRAM で実施 | JIN07SUB | +| 24 | ADDRESS | × | MOVE ADDRESS OF 引数 TO WS-PTR で引数アドレス取得 | JIN07SUB | +| 25 | OMITTED | × | CALL ... USING ... OMITTED + IS OMITTED 判定 | JIN08TST, JIN07SUB | +| 26 | CANCEL | × | CANCEL 'SUB02MSG' でサブPGM解放 | JIN09RPT | +| 27 | I-O-CONTROL | × | I-O-CONTROL 段落(予約語カバー目的。SAME句なし) | JIN09RPT | +| 28 | NEXT | × | NEXT SENTENCE で後続文へ | JIN09RPT | +| 29 | SENTENCE | × | NEXT SENTENCE で後続文へ | JIN09RPT | +| 30 | EJECT | × | ソース行 EJECT によるページ制御 | JIN09RPT | +| 31 | SKIP2 | × | ソース行 SKIP2 による改行制御 | JIN09RPT | +| 32 | FALSE | × | SET 条件名 TO FALSE で状態リセット | JIN09RPT | +| 33 | PERFORM(多重ループ/複合条件) | △(UNTIL/単一のみ) | PERFORM VARYING 多重ループ + 複合条件(AND/OR) | JIN09RPT | +| 34 | SET(条件名) | △(UP BY/DOWN BYのみ) | SET 条件名 TO TRUE/FALSE による条件名設定 | JIN09RPT | + +**改善効果まとめ(JIN09RPT 追加時点の比較):** + +| 指標 | 現状 | 改善後 | +|------|:----:|:------:| +| 予約語×(未使用) | 41語 | 34語(7語削減:CANCEL/I-O-CONTROL/NEXT/SENTENCE/EJECT/SKIP2/FALSE) | +| PERFORM | △ | ◎(多重ループ+複合条件IFで実質的カバー) | +| SET | △ | ◎(条件名 SET TO FALSE で実質的カバー) | +| ◎+△率 | 80.0%(164/205) | 83.4%(171/205) | +| プログラムタイプカバレッジ | 97.2%(35/36) | 97.2%(変更なし) | diff --git a/詳細設計書/詳細設計書_JIN09RPT.md b/詳細設計書/詳細設計書_JIN09RPT.md new file mode 100644 index 0000000..dd9c9eb --- /dev/null +++ b/詳細設計書/詳細設計書_JIN09RPT.md @@ -0,0 +1,221 @@ +# 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 | + +--- + +## 処理詳細 + +### 段落一覧 + +| 段落名 | 機能 | +|:-------|:-----| +| JIN09RPT-OPEN | ファイルOPEN + ワーク初期化 | +| JIN09RPT-LOAD-MST | 評価基準マスタ(R02)全件LOAD → 内部表構築 | +| JIN09RPT-READ-EVAL | 評価明細(R01)1件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. マスタLOAD(JIN09RPT-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-TABLE(OCCURS 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-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 | 予約語 | 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 |