KIN03EXP: SELECT INTO → CURSOR(DECLARE/OPEN/FETCH/CLOSE) pattern; SUB01DAT: COPY ZANDATAC; 基本設計書A: KIN08DBU/KIN09CSV specs updated; 品質管理: coverage stats, keyword docs, test criteria
This commit is contained in:
@@ -543,28 +543,75 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
|
||||
|------|------|
|
||||
| **PGMパターン** | DB更新 + **SYSIN読込(P28)** |
|
||||
| **JCL前処理** | なし |
|
||||
| **入力** | DAILY-RECORD(200B)、**SYSIN(集計対象社員指定)** |
|
||||
| **入力** | DAILY-RECORD(200B)、**SYSIN(制御カード)** |
|
||||
| **出力** | DAILY_RECORDS / MONTHLY_ABSENCE(DB2)、ABSENCE_SUMMARY(80B)|
|
||||
|
||||
**SYSIN制御カード(3種):**
|
||||
|
||||
```
|
||||
* コメント行(先頭*)
|
||||
T 社員番号,社員番号,... ← TARGET: 集計対象社員指定(省略時=全社員)
|
||||
P YEARMONTH=YYYYMM ← PERIOD: 処理対象年月(必須)
|
||||
M MODE=RESET|NORMAL ← MODE: RESET=再実行(既存削除後に再INSERT), NORMAL=通常(UPSERT)
|
||||
```
|
||||
|
||||
カード種別('T','P','M')を第1桁で識別。**GO TO DEPENDING ON** で処理分岐する。
|
||||
|
||||
**機能:**
|
||||
|
||||
1. **SYSIN読込(パターン28)**:集計対象の社員番号一覧をSYSINから読み込む(省略時は全社員が対象)。
|
||||
1. **SYSIN読込(パターン28)**:制御カードをSYSINから順次読み込み、カード種別で**GO TO DEPENDING ON**分岐
|
||||
- `T`カード → 対象社員一覧をWORKING-STORAGEの内部テーブルに保持
|
||||
- `P`カード → YEARMONTHを解析(`UNSTRING` + `INSPECT TALLYING`でカンマ区切り数検証)
|
||||
- `M`カード → MODEを判定。未指定ならNORMAL
|
||||
- `*`カード → コメント行としてスキップ(`CONTINUE`)
|
||||
- 不明カード → `DISPLAY`で警告表示
|
||||
2. DAILY-RECORDを1レコードずつ読込み、DAILY_RECORDSに**EXEC SQL INSERT**
|
||||
- 各INSERT前に`INSPECT TALLYING`で社員番号の有効性チェック → 空または無効値は`DISPLAY`で警告表示
|
||||
3. 社員別・月別の集計値を**PERFORM VARYING**で積算(全社員ループ)
|
||||
4. 全件処理後、MONTHLY_ABSENCEを**EXEC SQL UPDATE / INSERT**(UPSERT)
|
||||
5. **INSPECT TALLYING**で社員番号の有効性チェック → 空または無効値は**DISPLAY**で警告表示
|
||||
- **COMPUTE ROUNDED ON SIZE ERROR** で時間計算(桁あふれ時に警告表示)
|
||||
4. MODE=RESETの場合:**EXEC SQL DELETE**で該当月の既存レコードを削除
|
||||
5. MONTHLY_ABSENCEに対して**EXEC SQL SELECT COUNT(*) → IF >0 → UPDATE ELSE INSERT**(UPSERT)
|
||||
6. 病欠時間はSICK_LEAVE_RATEテーブルを参照し、控除前時間として保持
|
||||
7. 集計後データをABSENCE_SUMMARYファイルに出力
|
||||
|
||||
**GO TO DEPENDING ON ロジック:**
|
||||
|
||||
```cobol
|
||||
READ SYSINFILE INTO WS-SYSIN-REC
|
||||
AT END SET SYSIN-EOF TO TRUE
|
||||
END-READ.
|
||||
IF NOT SYSIN-EOF
|
||||
MOVE WS-SYSIN-REC(1:1) TO WS-CARD-TYPE
|
||||
IF WS-CARD-TYPE = 'T' OR 'P' OR 'M'
|
||||
IF WS-CARD-TYPE = 'T' MOVE 1 TO WS-DISP-IDX
|
||||
IF WS-CARD-TYPE = 'P' MOVE 2 TO WS-DISP-IDX
|
||||
IF WS-CARD-TYPE = 'M' MOVE 3 TO WS-DISP-IDX
|
||||
GO TO DEPENDING ON WS-DISP-IDX
|
||||
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
|
||||
.
|
||||
ELSE
|
||||
IF WS-CARD-TYPE = '*'
|
||||
DISPLAY 'COMMENT: ' WS-SYSIN-REC
|
||||
ELSE
|
||||
DISPLAY 'WARNING: Unknown SYSIN card type ['
|
||||
WS-CARD-TYPE ']'
|
||||
END-IF
|
||||
END-IF
|
||||
END-IF.
|
||||
```
|
||||
|
||||
**新規カバレッジ構文:**
|
||||
|
||||
| 構文 | 用途 |
|
||||
|------|------|
|
||||
| **READ SYSIN**(パターン28) | 対象社員一覧の読込 ← 新規パターン |
|
||||
| **READ SYSIN(パターン28)** | 制御カード読込 ← 新規パターン |
|
||||
| **GO TO DEPENDING ON** | カード種別による3分岐 ← 新規 |
|
||||
| DISPLAY | 警告メッセージ表示 ← 新規 |
|
||||
| INSPECT TALLYING | 社員番号の空チェック ← 新規 |
|
||||
| INSPECT TALLYING | 社員番号の空チェック、カンマ区切り数検証 |
|
||||
| **COMPUTE ON SIZE ERROR** | 時間計算の桁あふれ処理 ← 新規 |
|
||||
| **EXEC SQL DELETE** | RESETモード時既存レコード削除 ← 新規(メインPGM) |
|
||||
| PERFORM VARYING | 社員別月次集計ループ |
|
||||
| EXEC SQL INSERT / UPDATE | DB更新(INSERT+UPDATEでUPSERT) |
|
||||
| EXEC SQL SELECT / INSERT / UPDATE | DB操作(UPSERTパターン) |
|
||||
|
||||
---
|
||||
|
||||
@@ -572,24 +619,27 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
|
||||
|
||||
| 項目 | 内容 |
|
||||
|------|------|
|
||||
| **PGMパターン** | GETPUT |
|
||||
| **PGMパターン** | GETPUT(編集出力) |
|
||||
| **JCL前処理** | なし |
|
||||
| **入力** | DAILY_RECORDS / MONTHLY_ABSENCE(DB2)、**COMMAND-LINE PARM** |
|
||||
| **出力** | CSVファイル(社員確認用)|
|
||||
|
||||
**PARM解析:**
|
||||
- `YEARMONTH=202605` — 必須。対象年月。
|
||||
- `MODE=FULL` — オプション。`FULL`=全項目出力, `SUMMARY`=集計のみ。
|
||||
- `MODE=FULL` — オプション。`FULL`=全項目出力(日別+月次), `SHORT`=月次集計のみ。
|
||||
|
||||
**機能:**
|
||||
|
||||
1. **ACCEPT FROM COMMAND-LINE** でPARM解析(対象年月・出力モード)
|
||||
2. DAILY_RECORDSから当月の全レコードをCURSOR SELECT
|
||||
3. **STRING** でCSV行を編集(DELIMITED BY SIZE)
|
||||
4. **WRITE AFTER ADVANCING PAGE** でページヘッダー制御 ← **新カバレッジ**
|
||||
- 100行ごとにヘッダー行を出力
|
||||
- WRITE header-record AFTER ADVANCING PAGE
|
||||
5. CSVフォーマット:
|
||||
1. **ACCEPT FROM COMMAND-LINE** でPARM解析(`INSPECT TALLYING`でカンマ区切り数チェック)
|
||||
2. DAILY_RECORDSから当月の全レコードをCURSOR SELECT(ORDER BY EMP_ID, TARGET_DATE)
|
||||
3. **INSPECT REPLACING** でCSV危険文字をサニタイズ(カンマ→セミコロン、改行→スペース)
|
||||
4. **STRING WITH POINTER** でCSV行を位置指定編集 ← **新カバレッジ**
|
||||
5. **WRITE AFTER ADVANCING 3種** でページ制御 ← **新カバレッジ**
|
||||
- 先頭ページ:`WRITE header-rec AFTER ADVANCING PAGE`
|
||||
- セクション区切り:`WRITE section-rec AFTER ADVANCING 2 LINES`
|
||||
- データ行:`WRITE data-rec AFTER ADVANCING 1 LINE`
|
||||
6. MODE=FULL時:100行ごとにヘッダー行を再出力
|
||||
7. CSVフォーマット:
|
||||
|
||||
```
|
||||
社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間
|
||||
@@ -599,14 +649,54 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
|
||||
00000101,20260504,0000,0000,99,0.0,0.0,0.0,0.0,8.0
|
||||
```
|
||||
|
||||
6. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99'
|
||||
8. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99'
|
||||
|
||||
**INSPECT REPLACING によるCSVサニタイズ:**
|
||||
|
||||
```cobol
|
||||
MOVE WS-FIELD TO WS-SAFE-FIELD.
|
||||
INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';'
|
||||
ALL X"0D" BY SPACE
|
||||
ALL X"0A" BY SPACE.
|
||||
```
|
||||
|
||||
**STRING WITH POINTER によるCSV行編集:**
|
||||
|
||||
```cobol
|
||||
MOVE 1 TO WS-PTR.
|
||||
STRING WS-EMP-ID DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-DATE DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-TIME-IN DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-TIME-OUT DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-LEAVE-TYPE DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-ANNUAL-H DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-PERSONAL-H DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-OFFICIAL-H DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-SICK-H DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-ABSENT-H DELIMITED BY SIZE
|
||||
INTO WS-CSV-LINE WITH POINTER WS-PTR
|
||||
END-STRING.
|
||||
```
|
||||
|
||||
**新規カバレッジ構文:**
|
||||
|
||||
| 構文 | 用途 |
|
||||
|------|------|
|
||||
| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)← 新規 |
|
||||
| **WRITE AFTER ADVANCING PAGE** | ページ制御出力 ← 新規 |
|
||||
| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)|
|
||||
| **INSPECT REPLACING** | CSV危険文字置換 ← 新規 |
|
||||
| **STRING WITH POINTER** | 位置指定CSV行編集 ← 新規 |
|
||||
| **WRITE AFTER ADVANCING PAGE** | ページヘッダー制御 ← 新規 |
|
||||
| **WRITE AFTER ADVANCING 2 LINES** | セクション区切り ← 新規 |
|
||||
| **WRITE AFTER ADVANCING 1 LINE** | データ行出力 ← 新規 |
|
||||
| STRING | CSV行編集(DELIMITED BY SIZE) |
|
||||
| EXEC SQL SELECT(CURSOR) | DB読込 |
|
||||
|
||||
@@ -677,15 +767,26 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT
|
||||
|---------------|:----:|----------------|
|
||||
| SEARCH(非ALL) | × | KIN01INP |
|
||||
| DELETE FROM(DB2) | × | KIN02UPD |
|
||||
| GO TO DEPENDING ON | × | — (KIN07DAIはフォールスルー問題のためEVALUATE+PERFORMに変更) |
|
||||
| **GO TO DEPENDING ON** | **×** | **KIN08DBU(← 新規)** |
|
||||
| PERFORM THRU | × | KIN03EXP |
|
||||
| WRITE FROM | × | KIN04CHK, KIN06CLD |
|
||||
| WRITE AFTER ADVANCING PAGE | × | KIN09CSV |
|
||||
| **MULTIPLY** | **○(ZAN06UPDのみ)** | **KIN07DAI** |
|
||||
| **SUBTRACT** | **○(ZAN06UPDのみ)** | **KIN07DAI** |
|
||||
| **ACCEPT FROM COMMAND-LINE** | **◎(ZAN05CAL,KIN06CLD)** | **KIN09CSV** |
|
||||
| **DISPLAY** | **△(SUB02MSG,SUB03ENDのみ)** | **KIN08DBU** |
|
||||
| **INSPECT** | **◎** | **KIN08DBU** |
|
||||
| **WRITE AFTER ADVANCING(PAGE/1/2)** | **×** | **KIN09CSV(← 新規)** |
|
||||
| **INSPECT REPLACING** | **×** | **KIN09CSV(← 新規)** |
|
||||
| **STRING WITH POINTER** | **×** | **KIN09CSV(← 新規)** |
|
||||
| **COMPUTE ON SIZE ERROR** | **○(ZAN系のみ)** | **KIN08DBU(← 新規)** |
|
||||
| MULTIPLY | ○(ZAN06UPDのみ) | KIN07DAI |
|
||||
| SUBTRACT | ○(ZAN06UPDのみ) | KIN07DAI |
|
||||
| ACCEPT FROM COMMAND-LINE | ◎(ZAN05CAL,KIN06CLD) | KIN09CSV |
|
||||
| DISPLAY | △(SUB02MSG,SUB03ENDのみ) | KIN08DBU |
|
||||
| INSPECT TALLYING | ◎ | KIN08DBU |
|
||||
|
||||
### 全体カバレッジ目標
|
||||
|
||||
| カテゴリ | 現状 | 追加後(目標) |
|
||||
|---------|:---:|:-------------:|
|
||||
| プログラムタイプ(35種) | 14使用(40.0%) | 15使用(42.9%) |
|
||||
| ステートメント(45ユニーク) | 33使用(73.3%) | 36使用(80.0%) |
|
||||
| カテゴリ(9種) | 8/9カバー(88.9%) | 9/9カバー(100%) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user