人事情報管理システム 設計書(サブシステムE)
システム概要
本サブシステムは、従業員の基本情報(氏名カナ/漢字)のフォーマット検証、
スキル評価データの集計・分析、社員台帳印刷、および
人事異動データによるDB更新を行う。
既存プログラム(JIN01KNS/JIN02SKL/JIN03RAN)に加え、
JIN04PRT(社員台帳印刷)と JIN05UPD(人事異動DB更新)を新規追加し、
未カバーのCOBOL予約語を計16語カバーする。
さらに JIN06SRT(社員データ並替)・JIN07SUB(社員情報取得サブPGM)・
JIN08TST(JIN07SUB呼出テスト)を追加し、
SORT/RELEASE/EXIT PROGRAM/ADDRESS/OMITTED をカバーする。
最後に JIN09RPT(社員別スキル集計レポート)を追加し、
CANCEL/I-O-CONTROL/NEXT SENTENCE/EJECT/FALSE の5語をカバーし、
PERFORM(複合条件)・SET(条件名 SET)を昇格させる。
(SKIP2 はソース行 *SKIP2 がコメント扱いでディレクティブとして機能しないため、
実装せず統計対象から除外する。当初は SAME RECORD AREA もカバー予定だったが、GnuCOBOL 3.2 でレコード長の
異なるファイル間の共有領域が最小レコード長に固定される制約が判明したため、
SAME は断念した。)
サブシステム情報
| 項目 |
内容 |
| サブシステムID |
JIN(人事→JINji) |
| 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出力 |
新規 |
システム定数
| 定数 |
値 |
説明 |
| KANA-MAX-LEN |
20 |
氏名カナ最大桁数(半角) |
| 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 UNTIL + WRK-SORT-CNT の上限ガード) |
| SKILL-LIST-MAX |
20 |
JIN09RPT 内部表(スキル別集計)最大要素数 |
| SUM-LINES-MAX |
100 |
JIN09RPT 1社員あたり最大出力行数 |
共通関数利用方針
既存のサブプログラム(SUB01DAT〜SUB05TIM)は本サブシステムでも利用する。
連絡領域のCOPY書式は JINDATAC・JINMSGAC・JINENDAC を全プログラムで共用する。
JIN05UPD は DB2(EMPLOYEE マスタ)へアクセスするため、EXEC SQL を使用する。
DBアクセス用の COPY 書式として DB-COMMON を WORKING-STORAGE に取り込む。
処理フロー
JCL
JINJ010 — カナ氏名チェック
JINJ020 — スキル別評価集計
JINJ030 — スキル評価ランキング出力
JINJ040 — 社員台帳印刷
JINJ050 — 人事異動DB更新
JINJ060 — 社員データ並替
注:JIN07SUB はサブプログラム(CALL される側)のため JCL を持たない。
JIN08TST は JIN07SUB の動作確認用テストドライバであり、ローカル開発環境で単体実行する(本番 JCL は不要)。
JIN07SUB が EMP-VALID を読込むための DD(JIN07R01)は、呼出側 JIN08TST の実行時に環境変数で割当てる。
※ AGENTS.md 規約「サブプログラムは GOBACK を使用」に対し、JIN07SUB はキーワードカバー目的で EXIT PROGRAM を
使用する例外とする(IBM COBOL 上 EXIT PROGRAM は正しい終了文。GnuCOBOL でもコンパイル実証済み)。
JINJ090 — 社員別スキル集計レポート
プログラム一覧
| # |
PGM-ID |
PGMパターン |
機能概要 |
使用COPY |
DBアクセス |
CALL先 |
| 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 UNTIL+WRK-SORT-CNT>999) |
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/FALSEカバー |
SKILL-EVAL-REC, SKILL-MST-REC, JIN09REC, VALID-ERROR-REC, JINDATAC, JINMSGAC, JINENDAC |
なし |
SUB01DAT, SUB02MSG, SUB03END |
COPY書式一覧
| # |
COPY ID |
用途 |
サイズ |
備考 |
| 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出力、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 はコメント行であり 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 UNTIL + 上限カウンタ(WRK-SORT-CNT>MAX-SORT-REC)で上限ガードを実装 |
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 はコメント行であり 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語 |
35語(6語削減:CANCEL/I-O-CONTROL/NEXT/SENTENCE/EJECT/FALSE) |
| PERFORM |
△ |
◎(多重ループ+複合条件IFで実質的カバー) |
| SET |
△ |
◎(条件名 SET TO FALSE で実質的カバー) |
| ◎+△率 |
80.0%(164/205) |
83.4%(171/205) |
| プログラムタイプカバレッジ |
97.2%(35/36) |
97.2%(変更なし) |