サブシステムEをJIN04PRT〜JIN08TST追加で9本に拡充(全48プログラム)。JIN01-09のIBM COBOL完全版・bin再ビルド版・設計書・使用資源一覧・カバレッジ統計・DDL(schema_jin)・COPY(DB-COMMON/JIN04RPT-REC/JIN05REC)をroot側最新に同期。KYU03AGG/KYU08PRI/SHA02MNC/SHA10S10再テスト済み(全PASS)

This commit is contained in:
qiuqiuqiu
2026-08-05 00:11:07 +08:00
parent 182b161208
commit a918489f93
88 changed files with 2953 additions and 300 deletions
+58 -43
View File
@@ -5,13 +5,13 @@
| 項目 | 内容 |
|------|------|
| プログラムID | JIN01KNS(人事→JINji, 01, カナKana確認Chekku→KNS |
| プログラムタイプ | 27(半角20桁/4桁チェック) |
| 機能 | 人事取込データの氏名カナ(半角20桁以内・英大文字)および補助コード桁数のチェック |
| プログラムタイプ | 27(半角20桁/補助コード有効値チェック) |
| 機能 | 人事取込データの氏名カナ(半角20桁以内・英大文字)および補助コード有効値のチェック |
| CALL方式 | メインプログラム(JCLからCALL) |
| DBアクセス | なし |
| 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) |
| INITIAL指定 | PROGRAM-ID IS INITIALINITIAL 予約語使用) |
| RETURN-CODE | 正常終了時 MOVE ZERO TO RETURN-CODERETURN-CODE 予約語使用) |
| RETURN-CODE | エラー時 MOVE 4 TO RETURN-CODERETURN-CODE 予約語使用) |
## ファイル一覧
@@ -30,7 +30,7 @@
| KANA-SEI | X(20) | 姓(半角カナ) | 最大20桁チェック対象 |
| KANA-MEI | X(20) | 名(半角カナ) | 最大20桁チェック対象 |
| KANJI-NAME | N(40) | 漢字氏名(全角) | PIC N 使用(N(1)=2B、実長80B、合計200B |
| SUB-CODE | X(4) | 補助コード | 4桁チェック対象 |
| SUB-CODE | X(4) | 補助コード | 有効値チェック対象 |
| BIRTH-DATE | X(8) | 生年月日 CCYYMMDD | — |
| EMP-ID | X(8) | 社員番号 | — |
| FILLER | X(060) | — | — |
@@ -50,70 +50,85 @@
| 段落名 | 機能 |
|:-------|:-----|
| JIN01KNS-OPEN | ファイルOPEN |
| JIN01KNS-READ | 1レコードREAD |
| JIN01KNS-CHECK | カナチェック主処理 |
| JIN01KNS-CHK-KANA | 半角カナ文字チェック(IS ALPHABETIC-UPPER |
| JIN01KNS-CHK-SIZE | 桁数チェック(20桁超過チェック |
| JIN01KNS-CHK-SUB | 補助コード桁数チェック(4桁 |
| JIN01KNS-WRITE-OK | 正常データWRITE |
| JIN01KNS-WRITE-ERR | エラーデータWRITE |
| JIN01KNS-CLOSE | ファイルCLOSE + RETURN-CODE設定 |
| 0000MAJCOLSOR | メインコントロール(初期→読込→主処理→終了、RETURN-CODE設定) |
| 1000ITTSOR | 初期処理(開始・コンパイル日時メッセージ、初期化、運用日付、OPEN、初回読込) |
| 1100R01INNSOR | R01読込・EOF判定 |
| 2000MAJSOR | 主処理(エラーフラグ初期化→各チェック→振分 |
| 2010CHKANASOR | 半角カナ文字チェック(IS ALPHABETIC-UPPER |
| 2020CHKSIZSOR | 桁数チェック(20桁超過チェック |
| 2030CHKSUBSOR | 補助コード有効値チェック('0001'/'0002'/'0003' |
| 2100WRTOKSOR | 正常データWRITE |
| 2200WRTERRSOR | エラーデータWRITE |
| 3000STPSOR | 終了処理(統計表示・CLOSE) |
| 4000MSGOUTSOR | メッセージ編集出力SUB呼出 |
| 9999ABDSOR | エラー処理(ABEND |
### 処理ロジック
#### 初期処理(JIN01KNS-OPEN
1. JIN01R01 / JIN01W01 / JIN01W02 を OPEN
2. WS-READ-CNT, WS-ERR-CNT を INITIALIZE(数値=0, PIC X=SPACE
#### 初期処理(1000ITTSOR
1. 開始・コンパイル日時メッセージを SUB02MSG で出力(4000MSGOUTSOR 経由)
2. WRKARA, CUNARA を INITIALIZE
3. 運用日付取得(CALL SUB01DAT)。異常時は 4000MSGOUTSOR9999ABDSOR
4. JIN01R01 / JIN01W01 / JIN01W02 を OPEN
5. 初回読込(PERFORM 1100R01INNSOR
#### 主処理(JIN01KNS-READ → JIN01KNS-CHECK → JIN01KNS-READ
1. JIN01R01 から1レコード READ
2. READ 成功 → JIN01KNS-CHECK へ
3. READ 失敗(AT END)→ JIN01KNS-CLOSE へ
#### 制御・メイン(0000MAJCOLSOR
1. PERFORM 1000ITTSOR(初期処理)
2. PERFORM 2000MAJSOR UNTIL WRK-R01EOF-Y(読込EOFまでループ)
3. PERFORM 3000STPSOR(終了処理)
4. CUN-W02OUT > 0 → MOVE 4 TO RETURN-CODEGOBACK直前)
5. GOBACK
#### チェック処理(JIN01KNS-CHECK
1. ADD 1 TO WS-READ-CNT END-ADDEND-ADD 予約語
2. JIN01KNS-CHK-KANA 呼出
3. JIN01KNS-CHK-SIZE 呼出
4. JIN01KNS-CHK-SUB 呼出
5. エラーフラグ OFF → JIN01KNS-WRITE-OK
6. エラーフラグ ON → JIN01KNS-WRITE-ERR
#### 読込処理(1100R01INNSOR
1. JIN01R01 から1レコード READAT END → WRK-R01EOF='1'
#### カナ文字チェック(JIN01KNS-CHK-KANA
#### 主処理(2000MAJSOR
1. WRK-ERR-FLG に '0' を初期化
2. カナ文字チェック(2010CHKANASOR)呼出
3. エラー未設定時のみ桁数チェック(2020CHKSIZSOR)呼出
4. エラー未設定時のみ補助コードチェック(2030CHKSUBSOR)呼出
5. エラーフラグ ON → 2200WRTERRSOR / OFF → 2100WRTOKSOR へ振分
#### カナ文字チェック(2010CHKANASOR
1. IF KANA-SEI IS NOT ALPHABETIC-UPPER → エラー(ALPHABETIC-UPPER 予約語)
2. IF KANA-MEI IS NOT ALPHABETIC-UPPER → エラー
3. エラー時は WRK-ERR-CODE に 'K002' を MOVE88-level VALUESは使用なし)
3. エラー時は ERR-CODE に 'K002' を設定
#### 桁数チェック(JIN01KNS-CHK-SIZE
#### 桁数チェック(2020CHKSIZSOR
1. KANA-SEI の20桁超過をチェック(FUNCTION LENGTH
2. 超過時はエラーフラグ ON + エラーコード設定
#### 補助コードチェック(JIN01KNS-CHK-SUB
#### 補助コードチェック(2030CHKSUBSOR
1. SUB-CODE が有効値(VALUES '0001' '0002' '0003' 等)かチェック
2. 範囲外はエラーフラグ ON
#### 正常出力(JIN01KNS-WRITE-OK
#### 正常出力(2100WRTOKSOR
1. JIN01W01 へレコード WRITE
#### エラー出力(JIN01KNS-WRITE-ERR
1. ADD 1 TO WS-ERR-CNT END-ADD
#### エラー出力(2200WRTERRSOR
1. ADD 1 TO CUN-W02OUT END-ADD
2. VALID-ERROR-REC にエラー情報設定
3. JIN01W02 へ WRITE
#### 終了処理(JIN01KNS-CLOSE
1. JIN01R01 / JIN01W01 / JIN01W02 を CLOSE
2. WS-ERR-CNT = 0 → MOVE ZERO TO RETURN-CODE
3. WS-ERR-CNT > 0 → MOVE 4 TO RETURN-CODE
4. GOBACK
#### 終了処理(3000STPSOR
1. 統計表示
2. JIN01R01 / JIN01W01 / JIN01W02 を CLOSE
3. 終了メッセージ OUTPUT4000MSGOUTSOR
#### メッセージ出力(4000MSGOUTSOR
1. CALL SUB02MSG でメッセージ出力
#### エラー処理(9999ABDSOR
1. CALL SUB03ENDABEND
## カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| PROGRAM-ID IS INITIAL | 予約語(95) | IDENTIFICATION DIVISION |
| RETURN-CODE | 予約語(145) | JIN01KNS-CLOSE |
| ALPHABETIC-UPPER | 予約語(7) | JIN01KNS-CHK-KANA |
| END-ADD | 予約語(55) | JIN01KNS-CHECK |
| VALUES | 予約語(183) | ERR-CODE 88-levelVALUE→VALUES表記 |
| RETURN-CODE | 予約語(145) | 0000MAJCOLSOR |
| ALPHABETIC-UPPER | 予約語(7) | 2010CHKANASOR |
| END-ADD | 予約語(55) | 2200WRTERRSOR |
| VALUES | 予約語(183) | JIN01KNS では未使用。JIN05UPD の EXEC SQL VALUES 句は SQL コンテキストのため、COBOL 予約語 VALUES のカバー対象外。カバレッジ統計は × |
| PIC N | PICTURE記号 | KANJI-NAME定義 |
| ZZZZ9 | PICTURE記号 | 自プログラムでは使用なし(JIN02SKLのAGG-COUNT-EDITでカバー) |
+58 -52
View File
@@ -80,69 +80,73 @@ SEARCH ALL のキー項目:TBL-SKILL-CODE
| 段落名 | 機能 |
|:-------|:-----|
| JIN02SKL-OPEN | ファイルOPEN + 内部表初期化 |
| JIN02SKL-LOAD-MST | 評価基準マスタ(R02)全件LOAD → 内部表構築 |
| JIN02SKL-READ-EVAL | 評価明細(R011件READ |
| JIN02SKL-AGGREGATE | 集計主処理(SEARCH ALL + 件数加算 + 合計加算) |
| JIN02SKL-SEARCH-LVL | SEARCH ALL で該当レベルを特定 |
| JIN02SKL-UPDATE-TBL | 内部表の件数・合計点をUPDATE |
| JIN02SKL-OUTPUT | 内部表を降順走査→平均点算出→WRITE |
| JIN02SKL-GET-AVG | DIVIDEで平均点算出(END-DIVIDE |
| JIN02SKL-DESCEND | PERFORM VARYING 降順走査(DESCENDING |
| JIN02SKL-WRITE-AGG | 1エントリWRITE |
| JIN02SKL-CLOSE | ファイルCLOSE + GOBACK |
| 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)内にインラインで実装されている。
### 処理ロジック
#### 初期処理(JIN02SKL-OPEN
1. JIN02R01 / JIN02R02 / JIN02W01 / JIN02W02 を OPEN
2. WS-TBL-ENTRY を INITIALIZE(内部表初期化)
#### 初期処理(1000ITTSOR
1. 開始メッセージを OUTPUT6000MSGOUTSOR 経由)
2. JIN02R01 / JIN02R02 / JIN02W01 / JIN02W02 を OPEN
3. WS-TBL-MAX-IDX を ZERO で初期化(内部表初期化)
#### マスタLOADJIN02SKL-LOAD-MST
1. JIN02R02 から SKILL-MST を全件 LOAD
2. ADD 1 TO WS-MAX-ENTRY END-ADD
3. 内部表 WS-SKILL-TABLE に設定MST-SKILL-CODE, MST-LEVEL, MST-LEVEL-NAME, TBL-EMP-COUNT=0, TBL-SCORE-SUM=0
4. AT END → JIN02SKL-READ-EVAL へ
5. JIN02R02 CLOSE(不要になったので)
#### マスタLOAD1100R02INNSOR / 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 END1100R02INNSOR で WRK-R02EOF='1')→ マスタLOADループ終了
4. JIN02R02 CLOSE は 3000OUTPUSOR で実施
#### 主処理ループ(JIN02SKL-READ-EVAL → JIN02SKL-AGGREGATE → ループ)
1. JIN02R01 から SKILL-EVAL を1件 READ
2. AT END → JIN02SKL-OUTPUT
3. JIN02SKL-AGGREGATE を PERFORM
#### 主処理ループ(1300R01INNSOR → 2000MAJSOR → ループ)
1. JIN02R01 から SKILL-EVAL を 1 件 READ1300R01INNSOR
2. AT END → 3000OUTPUSOR
3. 2000MAJSOR を PERFORM
#### 集計処理(JIN02SKL-AGGREGATE
1. JIN02SKL-SEARCH-LVL を呼出(SEARCH ALL
2. WHEN 該当 → JIN02SKL-UPDATE-TBL を PERFORM
3. WHEN NOT 該当 → JIN02SKL-WRITE-ERR を PERFORM
#### 集計処理(2000MAJSOR
1. SEARCH ALL で該当レベルを特定
2. WHEN 該当 → 2200UPDTTLSOR を PERFORM
3. WHEN NOT 該当 → 2100WRTERRSOR を PERFORM
#### SEARCH ALLJIN02SKL-SEARCH-LVL
#### SEARCH ALL2000MAJSOR 内
1. SEARCH ALL WS-SKILL-TABLE
2. AT END → 直接 PERFORM 2100WRTERRSOR(該当するレベルがない)
3. WHEN TBL-SKILL-CODE(WS-IDX) = SKILL-CODE → 直接 PERFORM 2200UPDTTLSOR
2. AT END → PERFORM 2100WRTERRSOR(該当するレベルがない)
3. WHEN TBL-SKILL-CODE(WS-IDX) = SKILL-CODE → PERFORM 2200UPDTTLSOR
#### 内部表UPDATEJIN02SKL-UPDATE-TBL
#### 内部表UPDATE2200UPDTTLSOR
1. ADD 1 TO TBL-EMP-COUNT(WS-IDX) END-ADD
2. ADD SCORE TO TBL-SCORE-SUM(WS-IDX) END-ADD
#### 集計結果出力(JIN02SKL-OUTPUT
1. 内部表を件数降順(DESCENDING)で走査
2. JIN02SKL-DESCEND を PERFORM THRU JIN02SKL-WRITE-AGG
3. 各エントリについて:
d. WS-AVG を ZERO で初期化
e. JIN02SKL-GET-AVG を PERFORMDIVIDE TBL-SCORE-SUM BY TBL-EMP-COUNT GIVING WS-AVG END-DIVIDE
f. SKILL-AGG-REC に編集設定(ZZZZ9 編集文字
g. JIN02W01 へ WRITE
#### 集計結果出力(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 を PERFORMJIN02W01 へ WRITE
#### 降順走査(JIN02SKL-DESCEND
#### 降順走査(3000OUTPUSOR 内
```
PERFORM VARYING WS-IDX FROM WS-MAX-ENTRY BY -1
UNTIL WS-IDX = 0
PERFORM JIN02SKL-WRITE-AGG
PERFORM 3100WRITEAGSOR
END-PERFORM
```
SUBTRACT 1 FROM WS-IDX END-SUBTRACTEND-SUBTRACT 予約語使用)
#### 平均点算出(JIN02SKL-GET-AVG
#### 平均点算出(3000OUTPUSOR 内
```
DIVIDE TBL-SCORE-SUM(WS-IDX) BY TBL-EMP-COUNT(WS-IDX)
GIVING WS-AVG-TEMP REMAINDER WS-REM
@@ -150,24 +154,26 @@ DIVIDE TBL-SCORE-SUM(WS-IDX) BY TBL-EMP-COUNT(WS-IDX)
```
(DIVIDE 予約語カバレッジ + END-DIVIDE
#### エラー出力(JIN02SKL-WRITE-ERR
#### エラー出力(2100WRTERRSOR
1. VALID-ERROR-REC にエラー情報設定
2. JIN02W02 へ WRITE
#### 終了処理(JIN02SKL-CLOSE
1. JIN02R01 / JIN02W01 / JIN02W02 を CLOSE
2. GOBACK
#### 終了処理(4000STPSOR
1. 統計表示
2. JIN02W01 / JIN02W02 を CLOSEJIN02R01 / JIN02R02 は 3000OUTPUSOR で CLOSE 済み)
3. 終了メッセージ OUTPUT6000MSGOUTSOR
4. GOBACK
## カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| USAGE BINARY | 予約語(16) | MST-LEVEL, TBL-EMP-COUNT |
| 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 -1JIN02SKL-DESCEND相当 |
| END-DIVIDE | 予約語(58) | JIN02SKL-GET-AVG |
| END-SUBTRACT | 予約語(66) | JIN02SKL-DESCEND |
| BY(降順走査) | 予約語(18) | PERFORM VARYING BY -13000OUTPUSOR |
| 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記号 | JIN01RECから継承、未使用でもCOPY参照でカバー) |
| PIC N | PICTURE記号 | JIN02SKL では PIC N 未使用。PIC N は JIN01KNS が JIN01REC の KANJI-NAME でカバー) |
+10 -5
View File
@@ -6,7 +6,7 @@
|------|------|
| プログラムID | JIN03RAN(人事→JINji, 03, ランキング→RAN |
| プログラムタイプ | 編集出力(ランキング生成) |
| 機能 | SKILL-AGGJIN02SKL出力のスキル別評価集計結果)を読み込み、平均点降順でランキング出力 |
| 機能 | SKILL-AGGJIN02SKL出力のスキル別評価集計結果)を読み込み、平均点降順でランキング出力(前提:R01はJCL SORTにより平均点降順ソート済み) |
| CALL方式 | メインプログラム(JCLからCALL) |
| DBアクセス | なし |
| 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ) |
@@ -18,8 +18,8 @@
| COMP-4 | 予約語(25) | `PIC 9(004) COMP-4` バイナリカウンタ + `ADD 1 TO CUN-COMP4` |
| CORR | 予約語(33) | `MOVE CORRESPONDING WS-CORR-SRC TO WS-CORR-DST` |
| DESCENDING | 予約語(45) | `OCCURS 3 TIMES DESCENDING KEY IS WS-THR` 内部表定義 |
| DOWN | 予約語(50) | `SET WRK-IDX DOWN BY 1` |
| UP | 予約語(177) | `SET WRK-RANK-NO UP BY 1`, `SET WRK-OUT-IDX UP BY 1` |
| ADD | 予約語(3) | `ADD 1 TO WRK-RANK-NO`, `ADD 1 TO WRK-OUT-IDX`2000MAINSOR |
| SUBTRACT | 予約語(164) | `SUBTRACT 1 FROM WRK-IDX`4000STPSOR |
| VALUES | 予約語(183) | 88-level 単一VALUE(複数VALUESは未カバー) |
## ファイル一覧
@@ -29,6 +29,11 @@
| JIN03R01 | SKILL-AGG | SEQUENTIAL | FB | 200 | INPUT | スキル別評価集計結果(JIN02SKL出力) |
| JIN03W01 | RANK-OUT | SEQUENTIAL | FB | 200 | OUTPUT | ランキング出力 |
## 前提条件
- JIN03R01SKILL-AGG)は、JCL の SORT ステップにより**平均点降順**にソート済みであること
- 本プログラムはソートを行わず、入力順にランク番号(WRK-RANK-NO)を採番する
## レコード定義
### SKILL-AGG-RECJIN03R01, 200B
@@ -68,7 +73,7 @@ JIN02SKL 詳細設計書の W01 定義と同じ(SKILL-AGG-REC.cpy 参照)。
- R01 初回 READ
2. **2000MAINSOR(主処理ループ)**
- WRK-RANK-NO を SET UP BY 1 で順位UP
- WRK-RANK-NO を ADD 1 で順位UP
- COMP-4 カウンタ ADD 1
- MOVE CORRESPONDING で項目編集
- 平均点に基づきランク区分設定(S: >= 900, A: >= 600, B: < 600
@@ -78,5 +83,5 @@ JIN02SKL 詳細設計書の W01 定義と同じ(SKILL-AGG-REC.cpy 参照)。
3. **4000STPSOR(終了処理)**
- R01 / W01 CLOSE
- SET WRK-IDX DOWN BY 1
- SUBTRACT 1 FROM WRK-IDX
- DISPLAY 'JIN03RAN END' UPON CONSOLE
+157
View File
@@ -0,0 +1,157 @@
# JIN04PRT 詳細設計書
## プログラム概要
| 項目 | 内容 |
|------|------|
| プログラムID | JIN04PRT(人事→JINji, 04, 社員台帳印刷→PRT |
| プログラムタイプ | 04(レイアウト編集のみ。LINAGE印刷制御) |
| 機能 | EMP-VALID(チェック済社員データ)を読込み、社員台帳(JIN-LEDGER)形式で印刷出力する |
| CALL方式 | メインプログラム(JCLからCALL) |
| DBアクセス | なし |
| 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | EMP-VALID | JCL の SORTSTEP010)で社員番号昇順に並替済であること |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 |
|----|--------------|--------|------|-----|--------|------|-----------|------|------|
| 1 | EMP-VALID | R01 | JIN04R01 | I | JIN01REC | FB | 200 | PS | チェック済社員データ |
| 2 | JIN-LEDGER | W01 | JIN04W01 | O | JIN04RPT-REC | | 132 | PS | 社員台帳印刷(LINAGE 66行) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------|
| 1 | EMP-VALID | JIN04R01: EMP-ID 升順 | なし(順次印刷) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | JINDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | JINMSGAC |
| 3 | ABEND処理SUB | SUB03END | JINENDAC |
---
## 処理詳細
### 段落一覧(実装コードの SOR 規約名に対応)
| 段落名 | 機能 |
|:-------|:-----|
| 0000MAJCOLSOR | メインコントロール(初期→読込→印刷ループ→終了) |
| 1000ITTSOR | 初期処理(開始表示・初期化・日付/時刻取得・OPEN・ヘッダー) |
| 2000MAINSOR | 主処理(明細行編集→WRITE) |
| 2100READSOR | R01読込・EOF判定 |
| 3000HEADER | ページヘッダー出力(改ページ+頁番号) |
| 4000STPSOR | 終了処理(CLOSE・終了表示・終了メッセージ) |
| 9000ERRSOR | エラー処理(STOP literal 予約語カバー。通常フローでは呼ばれない) |
### 処理フロー
```
1. 0000MAJCOLSOR(メインコントロール)
1-1. PERFORM 1000ITTSOR(初期処理)
1-2. PERFORM 2000MAINSOR UNTIL WRK-R01EOF-Y(読込→印刷ループ)
1-3. PERFORM 4000STPSOR(終了処理)
1-4. GOBACK
2. 1000ITTSOR(初期処理)
2-1. DISPLAY 'JIN04PRT START' UPON CONSOLE
2-2. M00MHOPAR 初期化 → M00MSGCOD=001 → CALL SUB02MSG(開始)
2-3. INITIALIZE WRKARA / CUNARA
2-4. ACCEPT WRK-DATE FROM DATE(システム日付)
2-5. STRING で WRK-DISP-DATEYYYY/MM/DD)編集
2-6. ACCEPT WRK-TIME FROM TIME(システム時刻)
2-7. STRING で WRK-DISP-TIMEHH:MM:SS)編集
2-8. CALL SUB01DAT(運用日付)
2-9. OPEN INPUT (INNFIL) OUTPUT (W01OUTFIL)
2-10. PERFORM 3000HEADER(ヘッダー出力)
2-11. PERFORM 2100READSOR(初回読込)
3. 2000MAINSOR(主処理)
3-1. INITIALIZE W01OUTREC
3-2. STRING R01EMP-ID/…/…/… INTO W01OUTREC
3-3. WRITE W01OUTREC AFTER ADVANCING 1 LINE
AT END-OF-PAGE → PERFORM 3000HEADER
3-4. ADD 1 TO CUN-W01OUT / CUN-R01INN
3-5. PERFORM 2100READSOR(次読込)
4. 2100READSOR(読込)
READ R01INNFIL AT END → WRK-R01EOF='1'
NOT AT END → CONTINUE
5. 3000HEADER(ページヘッダー)
5-1. ADD 1 TO WRK-PAGE-NO
5-2. MOVE SPACES → WRITE 改ページ(AFTER ADVANCING PAGE
5-3. タイトル行 STRING → WRITE AFTER ADVANCING 1 LINE
5-4. 日付・時刻・ページ行 STRING → WRITE AFTER ADVANCING 2 LINES
6. 4000STPSOR(終了処理)
6-1. DISPLAY 'JIN04PRT END' UPON CONSOLE
6-2. DISPLAY TOTAL RECORDS(件数)WITH NO ADVANCING
6-3. CLOSE R01INNFIL
6-4. CLOSE W01OUTFIL WITH LOCK
6-5. CALL SUB02MSG(終了 002
6-6. CALL SUB03END(正常終了)
7. 9000ERRSOR(エラー処理)
DISPLAY 'ABEND' → STOP 'JIN04PRT ABNORMAL END'
```
### I-O-CONTROL / 印刷制御
```
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO EXTERNAL JIN04R01.
SELECT W01OUTFIL ASSIGN TO EXTERNAL JIN04W01.
FD W01OUTFIL LINAGE IS 66 LINES
FOOTING AT 60 TOP 2 BOTTOM 4.
```
> LINAGE 句でページ制御(66行・本文60行・論理頁上下餘白)。WRITE AFTER ADVANCING PAGE で改ページ、AT END-OF-PAGE でヘッダー再出力。
### カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| ACCEPT FROM DATE | 予約語 | 1000ITTSOR: ACCEPT WRK-DATE FROM DATE |
| ACCEPT FROM TIME | 予約語 | 1000ITTSOR: ACCEPT WRK-TIME FROM TIME |
| LINAGEPAGE | 予約語 | FD W01OUTFIL LINAGE IS 66 LINES |
| AT END-OF-PAGE | 予約語 | 2000MAINSOR: WRITE AT END-OF-PAGE |
| STRING ... ON OVERFLOW | 予約語 | 各種STRINGで ON OVERFLOW 使用 |
| DISPLAY UPON / WITH NO ADVANCING | 予約語 | 1000/4000: UPON CONSOLE、4000: WITH NO ADVANCING |
| CLOSE WITH LOCK | 予約語 | 4000STPSOR: CLOSE W01OUTFIL WITH LOCK |
| STOP literal | 予約語 | 9000ERRSOR: STOP '…ABNORMAL END' |
---
## 出力レコード定義
### 出力ファイル1W01/JIN-LEDGER)— JIN04RPT-REC 132B
| No | 項目名 | 設定元 | PIC | 備考 |
|----|--------|--------|:---:|------|
| 1 | W01RPT-EMP-ID | R01EMP-ID | X(8) | 社員ID |
| 2 | W01RPT-KANA-SEI | R01KANA-SEI | X(20) | 半角カナ姓 |
| 3 | W01RPT-KANA-MEI | R01KANA-MEI | X(20) | 半角カナ名 |
| 4 | W01RPT-KANJI-NAME | R01KANJI-NAME | X(40) | 漢字氏名 |
| 5 | W01RPT-DEPT-CD | SPACES(未設定) | X(4) | 部門コード(STRING対象外) |
| 6 | W01RPT-ENTRY-DATE | SPACES(未設定) | X(8) | 入社日(STRING対象外) |
| 7 | FILLER | SPACES | X(32) | |
> レコード長 132B(実規格)。設計書他行の記載値 133B は誤記 → 132B に統一。
### COPY 参照書式の確認
- R01: JIN01REC200B)を REPLACING (A)→R01 で定義
- W01: JIN04RPT-REC132B)を REPLACING (A)→W01 で定義
+190
View File
@@ -0,0 +1,190 @@
# JIN05UPD 詳細設計書
## プログラム概要
| 項目 | 内容 |
|------|------|
| プログラムID | JIN05UPD(人事→JINji, 05, 人事異動DB更新→UPD |
| プログラムタイプ | 09(DB更新) |
| 機能 | HR-TRANS(人事異動トランザクション)を読込み、DB2 EMPLOYEEテーブルをINSERT/UPDATEする |
| CALL方式 | メインプログラム(JCLからCALL) |
| DBアクセス | DB2 EMPLOYEECONNECT / INSERT / UPDATE |
| 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | HR-TRANS | JCL の SORT で社員番号昇順に並替済であること |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 |
|----|--------------|--------|------|-----|--------|------|-----------|------|------|
| 1 | HR-TRANS | R01 | JIN05R01 | I | JIN05REC | FB | 200 | PS | 人事異動トランザクション |
| 2 | VALID-ERROR | W01 | JIN05W01 | O | (内約80B | FB | 80 | PS | エラー退避 |
> 補足:VALID-ERROR レコードは COPY を使用せず WORKING-STORAGE/W01OUTREC に内約定義(PROGRAMID 8B + EMP-ID 8B + CODE 4B + DETAIL 60B = 80B)。ID 設計上 COPY VALID-ERROR-REC を使用していない。将来は COPY 化推奨。
### DB 使用一覧
| NO | テーブル | I/O | 内容 |
|----|---------|:---:|------|
| 1 | EMPLOYEE | I/U | 人事異動の新規登録(INSERT/ 更新(UPDATE |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | JINDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | JINMSGAC |
| 3 | ABEND処理SUB | SUB03END | JINENDAC |
---
## 処理詳細
### 段落一覧(SOR規約名)
| 段落名 | 機能 |
|:-------|:-----|
| 0000MAJCOLSOR | メインコントロール(初期→読込→DB更新ループ→終了) |
| 1000ITTSOR | 初期処理(開始表示・初期化・運用日付・CONNECT・OPEN・初回読込) |
| 2000MAINSOR | 主処理(ホスト変数転記→種別判定→対応処理) |
| 2100READSOR | R01読込・EOF判定 |
| 3100INSERTSOR | INSERT処理(新規社員追加) |
| 3200UPDATESOR | UPDATE処理(既存社員更新) |
| 3300ERRSOR | 不明トランザクション→VALID-ERROR出力 |
| 3400DBERRSOR | DBエラー(SQLCODE≠0)→VALID-ERROR出力 |
| 4000STPSOR | 終了処理(統計表示・CLOSE・終了メッセージ) |
| 9000ERRSOR | エラー処理(ABEND |
### 処理フロー
```
1. 0000MAJCOLSOR
1-1. PERFORM 1000ITTSOR(初期処理)
1-2. PERFORM 2000MAINSOR
UNTIL WRK-R01EOF-Y OR WRK-COUNT >= CNS-MAX-TRANS
PERFORM UNTIL ... OR ... カバー。上限500件ガード)
1-3. PERFORM 4000STPSOR
1-4. GOBACK
2. 1000ITTSOR(初期処理)
2-1. DISPLAY 'JIN05UPD START' UPON CONSOLE
2-2. M00MHOPAR 初期化 → CALL SUB02MSG(開始 001
2-3. INITIALIZE WRKARA REPLACING NUMERIC BY ZEROS ALPHANUMERIC BY SPACES
2-4. INITIALIZE CUNARA
2-5. CALL SUB01DAT ... ON EXCEPTION → PERFORM 9000ERRSORCALL ON EXCEPTION カバー)
2-6. EXEC SQL CONNECTDB接続)
2-7. OPEN INPUT R01INNFIL OUTPUT W01OUTFIL
2-8. PERFORM 2100READSOR(初回読込)
3. 2000MAINSOR(主処理)
3-1. ADD 1 TO WRK-COUNT(処理件数増)
3-2. R01TRAN-* → HV-* へホスト変数転記
3-3. MOVE R01TRAN-TYPE TO WRK-TRAN-TYPE
3-4. EVALUATE TRUE
WHEN WRK-TRAN-INSERT → PERFORM 3100INSERTSOR
WHEN WRK-TRAN-UPDATE → PERFORM 3200UPDATESOR
WHEN WRK-TRAN-DELETE → PERFORM 3300ERRSOR(削除未実装)
WHEN OTHER → PERFORM 3300ERRSOR
3-5. PERFORM 2100READSOR
4. 2100READSOR(読込)
READ R01INNFIL AT END → WRK-R01EOF='1'
NOT AT END → ADD 1 TO CUN-R01INN
5. 3100INSERTSORINSERT
EXEC SQL INSERT INTO EMPLOYEE:HV-* 9カラム)
IF SQLCODE NOT = 0 → 3400DBERRSOR
ELSE → ADD 1 TO CUN-DBINS
6. 3200UPDATESORUPDATE
STRING 'UPDATING: ' HV-EMP-ID INTO WS-SQL-STR ON OVERFLOW
DISPLAY WS-SQL-STR UPON CONSOLE WITH NO ADVANCING
EXEC SQL UPDATE EMPLOYEE SET:HV-* 8-カラム→9列)
WHERE EMP_ID = :HV-EMP-ID
IF SQLCODE NOT = 0 → 3400DBERRSOR
ELSE → ADD 1 TO CUN-DBUPD
7. 3300ERRSOR(不明種別)
W01ERR-PROGRAMID=PGMID / W01ERR-EMP-ID=HV-EMP-ID / W01ERR-CODE='0001'
STRING `INVALID TRAN-TYPE:` ... INTO W01ERR-DETAIL → WRITE
ADD 1 TO CUN-W01OUT
8. 3400DBERRSORDBエラー)
MOVE SQLCODE → WS-SQLCODE-DISP
STRING `DB ERROR SQLCODE=` ... INTO W01ERR-DETAIL
W01ERR-CODE='0002' → WRITE
CALL SUB02MSG USING BY CONTENT
9. 4000STPSOR(終了)
DISPLAY READ/INSERT/UPDATE/ERROR 件数 UPON CONSOLE
CLOSE R01INNFIL
CLOSE W01OUTFIL WITH LOCK
CALL SUB02MSG(終了 002
CALL SUB03END(正常終了)
10. 9000ERRSORABEND
DISPLAY 'JIN05UPD ABEND' UPON CONSOLE
CALL SUB03ENDE01ABDCOD
```
### トランザクション種別(88-level)
| 88条件名 | VALUE | 対応処理 |
|:---------|:------|:---------|
| WRK-TRAN-INSERT | 'A' 'B' 'C' | 3100INSERTSOR |
| WRK-TRAN-UPDATE | 'D' THRU 'G' | 3200UPDATESOR |
| WRK-TRAN-DELETE | 'Z' | 3300ERRSOR(削除未実装) |
| WHEN OTHER | 上記以外 | 3300ERRSOR |
> 88-level の複数VALUE'A' 'B' 'C')と VALUE THRU'D' THRU 'G')をカバー。
### カバレッジ対象キーワード
| 予約語/記号 | 使用箇所 |
|:-----------|:---------|
| PERFORM UNTIL ... OR ... | 0000MAJCOLSOR: ループ上限 |
| INITIALIZE ... REPLACING | 1000ITTSOR: REPLACING NUMERIC / ALPHANUMERIC |
| CALL ... ON EXCEPTION | 1000ITTSOR: SUB01DAT(異常時9000 |
| EXEC SQL CONNECT / INSERT / UPDATE | DB操作 |
| 88-level 複数VALUE + VALUE THRU | 種別判定 |
| EVALUATE TRUE | 2000MAINSOR: WHEN分岐 |
| STRING ... ON OVERFLOW | 3200/3300/3400 |
| DISPLAY ... UPON CONSOLE WITH NO ADVANCING | 自編集 |
| CALL ... BY CONTENT | 3400DBERRSOR |
---
## 出力レコード定義
### 出力ファイル1W01/VALID-ERROR)— COPY VALID-ERROR-REC 80B
| No | 項目名 | 設定元 | PIC | 備考 |
|----|--------|--------|:---:|------|
| 1 | ERR-PROGRAMID | CNS-PRGIDX | X(8) | 'JIN05UPD' |
| 2 | ERR-EMP-ID | HV-EMP-ID | X(8) | 社員ID |
| 3 | ERR-CODE | '0001'/'0002' | X(4) | エラー種別 |
| 4 | ERR-DETAIL | STRING編集 | X(60) | 詳細メッセージ |
> ER-CODE: 0001=不明種別、0002=DBエラー。
### 入力レコード(R01/HR-TRANS)— JIN05REC 200B
| No | 項目名 | PIC | 備考 |
|----|--------|:---:|------|
| 1 | TRAN-TYPE | X(1) | A/B/C=Insert, D-G=Update |
| 2 | TRAN-EMP-ID | X(8) | |
| 3 | TRAN-KANA-SEI | X(20) | |
| 4 | TRAN-KANA-MEI | X(20) | |
| 5 | TRAN-KANJI-NAME | X(40) | |
| 6 | TRAN-SUB-CODE | X(4) | |
| 7 | TRAN-BIRTH-DATE | X(8) | |
| 8 | TRAN-DEPT-CODE | X(4) | |
| 9 | TRAN-ENTRY-DATE | X(8) | |
| 10 | TRAN-STATUS | X(1) | |
| 11 | FILLER | X(86) | |
> COPY JIN05REC200B)を REPLACING (A)→R01 で定義。
+139
View File
@@ -0,0 +1,139 @@
# JIN06SRT 詳細設計書
## プログラム概要
| 項目 | 内容 |
|------|------|
| プログラムID | JIN06SRT(人事→JINji, 06, 社員データ並替→SRT |
| プログラムタイプ | 34(SORT) |
| 機能 | EMP-VALID200B)を INPUT PROCEDURE で読込み、EMP-ID 昇順に SORT し、OUTPUT PROCEDURE で RETURN して SORTED-EMP へ書出す |
| CALL方式 | メインプログラム(JCLからCALL) |
| DBアクセス | なし |
| 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | EMP-VALID | JIN01KNS でチェック済のデータであること |
| 2 | EMP-VALID | 並替は COBOL の SORT 文で実施(本プログラム内) |
> キーワードカバー目的で、並替は COBOL の `SORT` 文(INPUT/OUTPUT PROCEDURE)を明示使用する。本番では JCL の SORTWK* でソートワーク領域を確保する。
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 |
|----|--------------|--------|------|-----|--------|------|-----------|------|------|
| 1 | EMP-VALID | R01 | JIN06R01 | I | JIN01REC | FB | 200 | PS | チェック済社員データ |
| 2 | SORTED-EMP | W01 | JIN06W01 | O | JIN01REC | FB | 200 | PS | 並替済社員データ |
| 3 | VALID-ERROR | W02 | JIN06W02 | O | VALID-ERROR-REC | FB | 80 | PS | 上限超過エラー |
| 4 | SORTWORK | SD | SORTWK01 | — | JIN01REC | FB | 200 | ワーク | SORTファイル |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件 |
|----|-----------|---------------------|----------|
| 1 | SORTWORK | EMP-ID 昇順 | ON ASCENDING KEY |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | JINDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | JINMSGAC |
| 3 | ABEND処理SUB | SUB03END | JINENDAC |
---
## 処理詳細
### 段落一覧(SOR規約名)
| 段落名 | 機能 |
|:-------|:-----|
| 0000MAJCOLSOR | メインコントロール(初期→SORT→終了) |
| 1000ITTSOR | 初期処理(開始MSG・初期化・運用日付・出力OPEN) |
| 2000MAJSOR | SORT実行(ON ASCENDING KEY + INPUT/OUTPUT PROCEDURE + 復帰コード判定) |
| 2110INPUTSOR | INPUT PROCEDUREEOF 到達まで読込ループ + R01読込→RELEASE |
| 2110READSOR | 1件読込→SORTレコード転記→RELEASE / 上限超過はVALID-ERROR |
| 2120OUTPUSOR | OUTPUT PROCEDURERETURN→SORTED-EMP書出) |
| 3000STPSOR | 終了処理(統計表示・CLOSE・終了MSG) |
| 4000MSGOUTSOR | メッセージ編集出力SUB呼出 |
| 9000ERRSOR | エラー処理(ABEND |
### 処理フロー
```
1. 0000MAJCOLSOR
1-1. PERFORM 1000ITTSOR(初期処理)
1-2. PERFORM 2000MAJSORSORT処理)
1-3. PERFORM 3000STPSOR(終了処理)
1-4. GOBACK
2. 1000ITTSOR(初期処理)
2-1. DISPLAY 'JIN06SRT START' UPON CONSOLE
2-2. SUB02MSG で開始メッセージ(001)出力
2-3. INITIALIZE WRKARA, CUNARA
2-4. CALL SUB01DAT(運用日付取得)。異常時は 4000MSGOUTSOR9000ERRSOR
2-5. OPEN OUTPUT W01OUTFIL, W02OUTFIL
3. 2000MAJSORSORT実行)
3-1. SORT SORTWORK
ON ASCENDING KEY SREMP-ID
INPUT PROCEDURE 2110INPUTSOR
OUTPUT PROCEDURE 2120OUTPUSOR
3-2. MOVE RETURN-CODE TO WRK-SORT-STAT
3-3. WRK-SORT-STAT ≠ 0 → 4000MSGOUTSOR + CALL SUB03ENDABEND
4. 2110INPUTSORINPUT PROCEDURE
4-1. OPEN INPUT R01INNFIL
4-2. PERFORM UNTIL WRK-R01EOF-YEOF 到達まで 2110READSOR を繰返す)
※READ は EOF まで行い、上限超過(WRK-SORT-CNT > 999)分を VALID-ERROR へ出力する
4-3. CLOSE R01INNFIL
5. 2110READSOR(読込・RELEASE
5-1. WRK-R01EOF-Y なら EXIT SECTION(上限到達後の空処理)
5-2. READ R01INNFIL
AT END → WRK-R01EOF='1'
NOT AT END → CUN-R01INN +1、WRK-SORT-CNT +1
R01→SR へ全項目転記
WRK-SORT-CNT <= 999 → RELEASE SORTREC、CUN-SORT-IN +1
WRK-SORT-CNT > 999 → VALID-ERROR9999WRITE、CUN-W02OUT +1
6. 2120OUTPUSOROUTPUT PROCEDURE
6-1. PERFORM UNTIL 1=2
RETURN SORTWORK RECORD
AT END → EXIT PERFORM
NOT AT END → SR→W01 へ転記 → WRITE W01OUTREC、CUN-W01OUT +1
END-RETURN
7. 3000STPSOR(終了処理)
7-1. DISPLAY READ/SORT/OUT/ERROR 件数 UPON CONSOLE
7-2. CLOSE W01OUTFIL, W02OUTFIL
7-3. SUB02MSG で終了メッセージ(002)出力
8. 9000ERRSOR(エラー処理)
8-1. CALL SUB03ENDABEND
```
### 上限超過時のエラー出力(W02/VALID-ERROR
| 項目名 | 設定値 | PIC | 備考 |
|--------|--------|:---:|------|
| ERR-PROGRAMID | CNS-PRGIDX | X(8) | 'JIN06SRT' |
| ERR-EMP-ID | SREMP-ID | X(8) | 超過レコードの社員番号 |
| ERR-CODE | '9999' | X(4) | 上限超過 |
| ERR-DETAIL | 'SORT LIMIT OVER' | X(60) | |
---
## カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| SORT | 予約語 | 2000MAJSOR: SORT ファイル ON ASCENDING KEY + INPUT/OUTPUT PROCEDURE |
| RELEASE | 予約語 | 2110READSOR: INPUT PROCEDURE 内で RELEASE 送出 |
| RETURN | 予約語 | 2120OUTPUSOR: RETURN SORTWORK RECORD / END-RETURN |
| PERFORM UNTIL | 予約語 | 2110INPUTSOR: EOF 到達まで 2110READSOR を繰返す |
| SDSort Description | 予約語 | FILE SECTION: SD SORTWORK |
| SAME SORT AREA | 予約語 | ENVIRONMENT DIVISION: SAME SORT AREA 句(SHA08SRT と同様) |
+118
View File
@@ -0,0 +1,118 @@
# JIN07SUB 詳細設計書
## プログラム概要
| 項目 | 内容 |
|------|------|
| プログラムID | JIN07SUB(人事→JINji, 07, 社員情報取得→SUB |
| プログラムタイプ | サブプログラム(CALL される側) |
| PGMパターン | 25(サブPGM |
| 機能 | 指定 EMP-ID に一致する EMP-VALID レコードの項目を返却する |
| 終了方式 | EXIT PROGRAMGOBACK 不使用。キーワードカバー目的で基本設計書の承認に基づき例外的に採用) |
| DBアクセス | なし |
| 使用ファイル | JIN07R01EMP-VALID, 200B, JIN01REC |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | EMP-VALID | JIN01KNS でチェック済のデータであること |
| 2 | EMP-VALID | 社員番号で 1 件ヒットすることを前提とする(複数ヒット時は先頭一致レコードを返却) |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 |
|----|--------------|--------|------|-----|--------|------|-----------|------|------|
| 1 | EMP-VALID | R01 | JIN07R01 | I | JIN01REC | FB | 200 | PS | 社員情報検索対象 |
### キー項目一覧
| NO | ファイル名 | マッチングキー | キー条件 |
|----|-----------|--------------|----------|
| 1 | EMP-VALID | EMP-ID | 指定 EMP-ID と完全一致 |
---
## 入出力パラメータ(LINKAGE SECTION 個別引数)
> OMITTED 引数対応のため、各引数を独立した 01 レベルで定義する(連絡領域 COPY は単一 01 のため OMITTED 引数を表現できない。個別引数方式を採用)。
| NO | 入出力 | 引数名 | PIC | 説明 |
|----|--------|--------|-----|------|
| 1 | I | LK-EMP-ID | X(8) | 検索条件(社員番号) |
| 2 | O | LK-KANA-SEI | X(20) | 一致レコード返却値 |
| 3 | O | LK-KANA-MEI | X(20) | 一致レコード返却値 |
| 4 | O | LK-KANJI-NAME | N(40) | 一致レコード返却値。CALL 時に OMITTED 指定可能 |
| 5 | O | LK-SUB-CODE | X(4) | 一致レコード返却値 |
| 6 | O | LK-BIRTH-DATE | X(8) | 一致レコード返却値 |
| 7 | O | LK-EMP-ID-OUT | X(8) | 一致レコード返却値(社員番号) |
| 8 | O | LK-FILLER | X(60) | 一致レコード返却値 |
| 9 | O | LK-RESULT | X(2) | 検索結果('OK'=一致 / 'NG'=不一致) |
### 呼出し例(JIN08TST
```
CALL 'JIN07SUB' USING LK-EMP-ID, LK-KANA-SEI, LK-KANA-MEI, LK-KANJI-NAME,
LK-SUB-CODE, LK-BIRTH-DATE, LK-EMP-ID-OUT, LK-FILLER,
LK-RESULT
CALL 'JIN07SUB' USING LK-EMP-ID, LK-KANA-SEI, LK-KANA-MEI, OMITTED,
LK-SUB-CODE, LK-BIRTH-DATE, LK-EMP-ID-OUT, LK-FILLER,
LK-RESULT
```
### リターンコード一覧(LK-RESULT)
| NO | コード | 説明 |
|----|--------|------|
| 1 | 'OK' | 一致レコードを検索し、返却値へ設定した |
| 2 | 'NG' | 一致レコードなし(返却値は初期状態のまま) |
---
## 処理詳細
### 段落一覧(SOR規約名)
| 段落名 | 機能 |
|:-------|:-----|
| 0000MAINSOR | 制御処理(ADDRESS OF 取得 → OPEN → 検索 → CLOSE → EXIT PROGRAM |
| 1000FNDSOR | EMP-VALID 順次検索(一致レコード項目返却 / IS OMITTED 判定) |
### 処理フロー
```
1. 0000MAINSOR(制御処理)
1-1. MOVE ADDRESS OF LK-EMP-ID TO WS-PTRADDRESS OF 予約語カバー)
1-2. OPEN INPUT JIN07R01
1-3. PERFORM 1000FNDSOR(社員検索)
1-4. CLOSE JIN07R01
1-5. EXIT PROGRAMGOBACK 不使用)
2. 1000FNDSOR(社員検索)
2-1. PERFORM UNTIL LK-RESULT = 'OK' OR WRK-R01EOF-Y
2-2. READ JIN07R01
AT END → WRK-R01EOF='1''NG' のまま終了)
NOT AT END → IF R01EMP-ID = LK-EMP-ID
・LK-KANA-SEI / LK-KANA-MEI / LK-SUB-CODE / LK-BIRTH-DATE /
LK-EMP-ID-OUT / LK-FILLER へ転記
・IF LK-KANJI-NAME NOT OMITTED → LK-KANJI-NAME へ転記
IS OMITTED 判定。OMITTED 時は返却スキップ)
・LK-RESULT = 'OK'PERFORM UNTIL 条件成立により次ループで検索終了)
END-IF
```
---
## カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| EXIT PROGRAM | 予約語 | 0000MAINSOR: サブプログラム終了(GOBACK 不使用) |
| ADDRESS OF | 予約語 | 0000MAINSOR: MOVE ADDRESS OF LK-EMP-ID TO WS-PTR |
| OMITTED | 予約語 | 1000FNDSOR: IF LK-KANJI-NAME OMITTED 判定(呼出側は CALL USING ... OMITTED |
## 補足
- AGENTS.md 規約は「サブプログラムは GOBACK」だが、基本設計書の承認により JIN07SUB はキーワードカバー目的で EXIT PROGRAM を使用する。
- EMP-VALID は 200B 固定長(JIN01REC)。R01 レコード 01 レベルは JIN01REC REPLACING (A)→R01。
- 検索は順次 READ のみ(インデックスなし)。全件走査し一致レコードを返す。
+104
View File
@@ -0,0 +1,104 @@
# JIN08TST 詳細設計書
## プログラム概要
| 項目 | 内容 |
|------|------|
| プログラムID | JIN08TST(人事→JINji, 08, JIN07SUB呼出テスト→TST |
| プログラムタイプ | メインプログラム(テストドライバ) |
| PGMパターン | 05(振り分け IF) |
| 機能 | JIN07SUB を 2 回 CALL(全引数 / KANJI-NAME OMITTED)して、一致レコード取得と OMITTED 引数動作を確認するテスト専用プログラム |
| CALL方式 | メインプログラム(JCLからCALL。ただしテスト専用のため本番 JCL は不要) |
| DBアクセス | なし |
| 使用サブプログラム | JIN07SUB, SUB01DAT, SUB02MSG, SUB03END |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | EMP-VALID | JIN07SUB が検索対象とするデータ。JIN08TST 実行時の環境変数 JIN07R01 で割当てる |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 |
|----|--------------|--------|------|-----|--------|------|-----------|------|------|
| — | — | — | — | — | — | — | — | — | ファイル入出力なし(JIN07SUB が JIN07R01 を読込む) |
### 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| JINDATAC | SUB01DAT 運用日付連絡領域 | WORKING-STORAGE |
| JINMSGAC | SUB02MSG メッセージ連絡領域 | WORKING-STORAGE |
| JINENDAC | SUB03END ABEND連絡領域 | WORKING-STORAGE |
---
## 処理詳細
### 段落一覧(SOR規約名)
| 段落名 | 機能 |
|:-------|:-----|
| 0000MAINTST | メインコントロール(初期→テストCALL→終了) |
| 1000ITTTST | 初期処理(開始MSG・初期化・運用日付取得) |
| 2000CALTST | JIN07SUB を 2 回 CALL(全引数 / KANJI-NAME OMITTED)して結果を DISPLAY |
| 3000STPTST | 終了処理(終了MSG |
| 4000MSGOUTTST | SUB02MSG 呼出 |
| 9000ERRTST | エラー処理(ABEND |
### 処理フロー
```
1. 0000MAINTST(メインコントロール)
1-1. PERFORM 1000ITTTST(初期処理)
1-2. PERFORM 2000CALTST(テストCALL
1-3. PERFORM 3000STPTST(終了処理)
1-4. GOBACK
2. 1000ITTTST(初期処理)
2-1. DISPLAY 'JIN08TST START' UPON CONSOLE
2-2. SUB02MSG で開始メッセージ(001)出力
2-3. INITIALIZE ワークエリア
2-4. CALL SUB01DAT(運用日付取得)。異常時は 4000MSGOUTTST9000ERRTST
3. 2000CALTST(テストCALL
3-1. 検索条件(WRK-TST-EMP-ID)に 'EMP00001' を設定
3-2. CALL 1: JIN07SUB 全引数
CALL 'JIN07SUB' USING WRK-TST-EMP-ID, WRK-TST-KANA-SEI, WRK-TST-KANA-MEI,
WRK-TST-KANJI-NAME, WRK-TST-SUB-CODE,
WRK-TST-BIRTH-DATE, WRK-TST-EMP-ID-OUT,
WRK-TST-FILLER, WRK-TST-RESULT
3-3. WRK-TST-RESULT 判定
IF = 'OK' → DISPLAY 'CALL1 OK: EMP=' WRK-TST-EMP-ID-OUT
' SUB=' WRK-TST-SUB-CODE
ELSE → DISPLAY 'CALL1 NG: RESULT=' WRK-TST-RESULT
3-4. CALL 2: JIN07SUB KANJI-NAME OMITTED
CALL 'JIN07SUB' USING WRK-TST-EMP-ID, WRK-TST-KANA-SEI, WRK-TST-KANA-MEI,
OMITTED, WRK-TST-SUB-CODE, WRK-TST-BIRTH-DATE,
WRK-TST-EMP-ID-OUT, WRK-TST-FILLER, WRK-TST-RESULT
3-5. WRK-TST-RESULT 判定
IF = 'OK' → DISPLAY 'CALL2 OK: EMP=' WRK-TST-EMP-ID-OUT
' KANA-SEI=' WRK-TST-KANA-SEI
ELSE → DISPLAY 'CALL2 NG: RESULT=' WRK-TST-RESULT
4. 3000STPTST(終了処理)
4-1. DISPLAY 'JIN08TST END' UPON CONSOLE
4-2. SUB02MSG で終了メッセージ(002)出力
```
---
## カバレッジ対象キーワード
| 予約語/記号 | 区分 | 使用箇所 |
|:-----------|:----:|:---------|
| OMITTED | 予約語 | 2000CALTST: CALL 'JIN07SUB' USING ... OMITTEDKANJI-NAME 省略) |
| CALL | 予約語 | 2000CALTST: CALL 'JIN07SUB'2回) |
| ON EXCEPTION | 予約語 | 1000ITTTST: CALL 'SUB01DAT' ON EXCEPTION |
## 補足
- 本プログラムは JIN07SUB の動作確認用テストドライバのため、本番 JCL は不要(ローカル開発環境で単体実行する)。
- JIN07SUB が EMP-VALID を読込むための DD(JIN07R01)は、実行時に環境変数で割当てる。
- 検証は DISPLAY 出力(CALL1 OK/NG、CALL2 OK/NG)で実施する。
+62 -56
View File
@@ -50,53 +50,59 @@
| 段落名 | 機能 |
|:-------|:-----|
| JIN09RPT-OPEN | ファイルOPEN + ワーク初期化 |
| JIN09RPT-LOAD-MST | 評価基準マスタ(R02)全件LOAD → 内部表構築 |
| JIN09RPT-READ-EVAL | 評価明細(R011件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 多重ループ |
| 0000MAJCOLSOR | メインコントロール(初期→マスタLOAD→主処理→終了) |
| 1000ITTSOR | 初期処理(開始メッセージ・初期化・OPEN・運用日付) |
| 1100R02INNSOR | 評価基準マスタ(R02)読込・EOF判定 |
| 1200MSTLDASOR | 評価基準マスタ全件LOAD → 内部表構築 |
| 1250R02CLOSOR | 評価基準マスタ(R02CLOSE |
| 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行の集計レコードWRITEDIVIDE平均点含む) |
| 4000STPSOR | 終了処理(統計表示・CLOSE・CANCEL・終了メッセージ) |
| 6000MSGOUTSOR | メッセージ編集出力SUB呼出 |
| 9999ABDSOR | エラー処理(ABEND |
### 処理フロー
```
1. 初期処理(JIN09RPT-OPEN
1-1. JIN09R01 / JIN09R02 / JIN09W01 / JIN09W02 を OPEN
1-2. SUB01DAT で運用日取得(復帰コード≠0なら SUB03END で異常終了
1-3. 内部表 WS-SKILL-TABLE を INITIALIZE
1-4. SUB02MSG で開始メッセージ出力
1. 初期処理(1000ITTSOR
1-1. SUB02MSG で開始メッセージ出力(6000MSGOUTSOR
1-2. 内部表 WS-SKILL-TABLE を INITIALIZE1500TBLINITSOR
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. マスタLOADJIN09RPT-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 → 主処理へ
2. マスタLOAD1100R02INNSOR / 1200MSTLDASOR
2-1. JIN09R02 から SKILL-MST を 1 件 READ1100R02INNSOR
2-2. 1200MSTLDASOR で内部表 WS-SKILL-TABLE(WS-TBL-ENTRY) に設定
2-3. AT END → 1250R02CLOSORJIN09R02 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
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 と不一致 → キーブレイク)
JIN09RPT-OUTPUT-GRP で前社員分を出力、内部表を INITIALIZE
3-4. JIN09RPT-AGGREGATE を PERFORM
3000OUTPUSOR で前社員分を出力、1600TBLRSTSOR で内部表リセット
3-4. 2100AGGRtASOR を 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
4. 集計処理(2100AGGRGASOR
4-1. 2200JUDGESOR でレベル判定
4-2. SEARCH ALL で評価基準を特定
4-3. WHEN 該当 → 2300UPDTTLSOR を PERFORM
4-4. WHEN 未該当 → 2400WRTERRSOR を PERFORM
5. レベル判定(JIN09RPT-JUDGE-LEVEL)— NESTED IF 3段 + 複合条件
5. レベル判定(2200JUDGESOR)— NESTED IF 3段 + 複合条件
IF SCORE >= 80 AND SCORE <= 999
IF SCORE >= 90 OR SCORE = 100
MOVE 'S' TO WS-LEVEL
@@ -116,17 +122,17 @@
END-IF
END-IF
6. 社員グループ出力(JIN09RPT-OUTPUT-GRP
6. 社員グループ出力(3000OUTPUSOR
6-1. 内部表を 1 から WS-TBL-ENTRY まで PERFORM VARYING で走査
6-2. 件数 > 0 のエントリのみ JIN09RPT-WRITE-SUM で出力
6-3. JIN09RPT-CALC-AVG で平均点算出(DIVIDE
6-4. 出力行数カウンタを加算
6-2. 件数 > 0 のエントリのみ 3100WRITEAGSOR で出力(DIVIDE平均点含む)
6-3. 出力行数カウンタを加算
7. 終了処理(JIN09RPT-CLOSE
7-1. JIN09R01 / JIN09W01 / JIN09W02 を CLOSE
7-2. CANCEL 'SUB02MSG' でサブPGM解放
7-3. SUB02MSG で件数メッセージ出力
7-4. GOBACK
7. 終了処理(4000STPSOR
7-1. 統計表示
7-2. JIN09R01 / JIN09W01 / JIN09W02 を CLOSE
7-3. CANCEL 'SUB02MSG'サブPGM解放
7-4. SUB02MSG で件数メッセージ出力
7-5. GOBACK
```
### I-O-CONTROL
@@ -144,7 +150,7 @@ I-O-CONTROL.
> 補足:I-O-CONTROL 段落は予約語カバー目的で記載する。当初 SAME RECORD AREA FOR
> R01INNFIL R02INNFIL を指定したが、GnuCOBOL 3.2 はレコード長の異なるファイル
> R01=200B / R02=79B)間で共有領域が最小レコード長に固定され、R01 の READ が
> R01=200B / R02=80B)間で共有領域が最小レコード長に固定され、R01 の READ が
> 破綻することが判明したため、SAME 句は使用しない(IBM COBOL では正しく動作する
> が、ローカル検証の再現性を優先して SAME 予約語カバーは断念)。
@@ -152,21 +158,21 @@ I-O-CONTROL.
| 予約語 | 使用箇所 |
|:-------|:---------|
| SET 条件名 TO FALSE | 内部表初期化後に SET WRK-FIRST-FLG TO FALSE で初回フラグ解除 |
| SET 条件名 TO FALSE | 2000MAJSOR: キーブレイク検知時に SET WRK-FIRST-FLG TO FALSE で初回フラグ解除 |
| NEXT SENTENCE | レベル判定の ELSE 内で未判定時、後続文へ制御 |
| CANCEL | 終了処理で CANCEL 'SUB02MSG' |
| EJECT | PROCEDURE DIVISION 先頭直後にソース行 EJECT |
| SKIP2 | 段落境界にソース行 SKIP2 |
| EJECT | 段落境界の第7桁に `*` 付きコメント行 `*EJECT`(コメント化) |
| SKIP2 | (実装せず。EJECT 同様に `*SKIP2` コメント行のみ。W-1 にて統計から除外決定) |
### 内部表
#### WS-SKILL-TABLEOCCURS 20
#### WS-SKILL-TABLEOCCURS 1 TO 20 DEPENDING ON WS-TBL-MAX-IDX
| 項目 | PIC | USAGE | 内容 |
|:----|:---:|:-----:|------|
| TBL-SKILL-CODE | X(4) | — | スキルコード |
| TBL-LEVEL | 9(2) | BINARY | レベル |
| TBL-LEVEL-NAME | X(20) | — | レベル名称 |
| 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) | — | 社員番号(出力用) |
@@ -211,10 +217,10 @@ SEARCH ALL のキー項目:TBL-SKILL-CODESKILL-MST LOAD後に確定)
| 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 | 予約語(昇格) | 内部表走査の多重ループ |
| EJECT | 予約語 | 段落境界の `*EJECT` コメント行(コメント化) |
| SKIP2 | 予約語 | (実装せず。W-1 にて統計対象から除外決定) |
| SET 条件名 TO FALSE | 予約語 | 2000MAJSOR: 初回フラグ解除に SET ... TO FALSE |
| PERFORM VARYING | 予約語(昇格) | 内部表走査(単一ループ |
| NESTED IF(複合条件 AND/OR | 予約語(昇格) | レベル判定 IF ネスト 3 段 |
| SEARCH ALL | 予約語 | 評価基準マッチング |
| DIVIDE ... GIVING | 予約語 | 平均点算出 |