Files
cobol-tna-system/基本設計書/05_人事情報管理システム_設計書(サブシステムE).md

376 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 人事情報管理システム 設計書(サブシステムE)
## システム概要
本サブシステムは、従業員の基本情報(氏名カナ/漢字)のフォーマット検証、
スキル評価データの集計・分析、社員台帳印刷、および
人事異動データによるDB更新を行う。
既存プログラム(JIN01KNS/JIN02SKL/JIN03RAN)に加え、
JIN04PRT(社員台帳印刷)と JIN05UPD(人事異動DB更新)を新規追加し、
未カバーのCOBOL予約語を計16語カバーする。
さらに JIN06SRT(社員データ並替)・JIN07SUB(社員情報取得サブPGM)・
JIN08TSTJIN07SUB呼出テスト)を追加し、
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 は DB2EMPLOYEE マスタ)へアクセスするため、EXEC SQL を使用する。
DBアクセス用の COPY 書式として `DB-COMMON` を WORKING-STORAGE に取り込む。
---
## 処理フロー
```
╞══ JINJ010 ═══════════════════════════════════╡
│ JIN01KNS(カナ氏名チェック) PGMパターン: 27
│ 人事取込データ(EMP-IMPORT)を1レコードずつ読み込み
│ IF KANA-SEI IS ALPHABETIC-UPPER AND KANA-MEI IS ALPHABETIC-UPPER → 正常
│ 半角20桁超過 OR 補助コード4桁不一致 → エラーファイル出力
│ ADD 1 TO WS-READ-CNT END-ADD(件数カウント)
│ RETURN-CODE に終了ステータス設定
│ PROGRAM-ID IS INITIAL 指定
├── 正常 → EMP-VALID200B 正常データ)
└── 異常 → VALID-ERROR(80B エラーレコード)
╞══ JINJ020 ═══════════════════════════════════╡
│ JIN02SKL(スキル別評価集計) PGMパターン: 19
│ SKILL-EVALM件の評価明細)× SKILL-MST(N件の評価基準)
│ SEARCH ALL でSKILL-CODEに対応するLEVEL判定
│ 内部表にスキルコード×レベル別の件数と合計点を集計
│ 集計後、PERFORM VARYINGで降順(DESCENDING)走査し出力
│ DIVIDE ... GIVING ... END-DIVIDE で平均点算出
│ SUBTRACT 1 FROM WS-IDX END-SUBTRACT で内部表走査
│ USAGE BINARY / USAGE PACKED-DECIMAL でカウンタ・金額定義
│ エラー件数表示に 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-LEDGER132B 台帳印刷ファイル)
╞══ JINJ050 ═══════════════════════════════════╡
│ JIN05UPD(人事異動DB更新) PGMパターン: DB更新
│ HR-TRANS200B 人事異動)を読込み、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-VALID200B)を INPUT PROCEDURE で読込
│ PERFORM UNTIL + WRK-SORT-CNT 比較で最大件数制限(MAX-SORT-REC
│ RELEASE で SORT ファイルへ送出
│ SORT ... ON ASCENDING KEY EMP-ID
│ OUTPUT PROCEDURE で RETURN 受取 → SORTED-EMP へ書出
├── → SORTED-EMP200B 並替済社員データ)
╞══ JINJ070 ═══════════════════════════════════╡
│ JIN07SUB(社員情報取得サブPGM PGMパターン: 25(サブPGM
│ LINKAGE SECTION で検索条件(EMP-ID)と取得項目(JIN01REC 既存項目)を受取
│ EMP-VALID を順次検索し一致レコードの項目を返却
│ IS OMITTED 判定で OMITTED 引数対応(ADDRESS OF は MOVE ADDRESS OF で別途カバー)
│ 終了は EXIT PROGRAMGOBACK 不使用)
└── JIN08TST から CALL2回:全引数 / KANJI-NAME OMITTED
╞══ JINJ090 ═══════════════════════════════════╡
│ JIN09RPT(社員別スキル集計レポート) PGMパターン: 32(1:N+キーブレイク)
│ SKILL-EVALM件)を EMP-ID 昇順で読み込み、社員キーブレイク集計
│ I-O-CONTROL 段落(予約語カバー)を記載
│ NESTED IF3〜4段)でスコア→S/A/B/C レベル判定(複合条件 AND/OR)
│ PERFORM VARYING の多重ループ(社員×明細×内部表20要素)
│ NEXT SENTENCE で文言継続制御、SET 条件名 TO FALSE で状態リセット
│ 集計完了後、社員別に SKILL-SUM(120B)へ出力
│ CANCEL 'SUB02MSG' でメッセージサブPGMを解放
│ EJECT でソースページ・行制御
├── → SKILL-SUM(120B 社員別スキル集計結果)
└── 異常 → VALID-ERROR(80B エラーレコード)
```
---
## JCL
### JINJ010 — カナ氏名チェック
```jcl
//JINJ010 JOB (ACCT),'カナ氏名チェック',CLASS=A
//*
//*=====================================================================
//* STEP010: 半角カナチェック(Type 27)
//*=====================================================================
//STEP010 EXEC PGM=JIN01KNS
//JIN01R01 DD DSN=EMP-IMPORT.DAT,DISP=SHR
//JIN01W01 DD DSN=EMP-VALID.DAT,DISP=(NEW,CATLG)
//JIN01W02 DD DSN=VALID-ERROR.DAT,DISP=(NEW,PASS)
```
### JINJ020 — スキル別評価集計
```jcl
//JINJ020 JOB (ACCT),'スキル別評価集計',CLASS=A
//*
//*=====================================================================
//* STEP010: M:N→N件(Type 19
//*=====================================================================
//STEP010 EXEC PGM=JIN02SKL
//JIN02R01 DD DSN=SKILL-EVAL.DAT,DISP=SHR
//JIN02R02 DD DSN=SKILL-MST.DAT,DISP=SHR
//JIN02W01 DD DSN=SKILL-AGG.DAT,DISP=(NEW,CATLG)
//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: SORTType 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 を読込むための DDJIN07R01)は、呼出側 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)
```
---
## プログラム一覧
| # | 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 | DB2EMPLOYEE | 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 | VALUES88複数値) | × | 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 > 500TIMES相当の上限ガード制御) | 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%(変更なし) |