KIN08DBU/KIN09CSV: fix comment col, quoted ASSIGN, INITIALIZE order, WRITE logic; fix resource docs & coverage stats

This commit is contained in:
qiuqiuqiu
2026-06-28 21:35:28 +08:00
parent f7199f81fd
commit cea0a60a07
6 changed files with 79 additions and 79 deletions
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+11 -13
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION. IDENTIFICATION DIVISION.
PROGRAM-ID. KIN09CSV. PROGRAM-ID. KIN09CSV.
***************************************************************** *****************************************************************
* システム名 : 勤怠休暇管理システム * * システム名 : 勤怠休暇管理システム *
@@ -25,7 +25,7 @@
* *
INPUT-OUTPUT SECTION. INPUT-OUTPUT SECTION.
FILE-CONTROL. FILE-CONTROL.
SELECT CSVOUTFIL ASSIGN TO KIN09W01. SELECT CSVOUTFIL ASSIGN TO "KIN09W01".
* *
DATA DIVISION. DATA DIVISION.
FILE SECTION. FILE SECTION.
@@ -182,12 +182,12 @@
MOVE 'COMPILED' TO M00UMKDATS22-02. MOVE 'COMPILED' TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR. PERFORM 4000MSGOUTSOR.
* *
*** PARM解析(ACCEPT FROM COMMAND-LINE)
PERFORM 1100PARMSOR.
*
*** ワークエリア初期化 *** ワークエリア初期化
INITIALIZE WRKARA. INITIALIZE WRKARA.
* *
*** PARM解析(ACCEPT FROM COMMAND-LINE)
PERFORM 1100PARMSOR.
*
*** DB接続 *** DB接続
EXEC SQL EXEC SQL
CONNECT TO 'data/kin.db' CONNECT TO 'data/kin.db'
@@ -393,11 +393,14 @@
WITH POINTER WS-PTR WITH POINTER WS-PTR
END-STRING. END-STRING.
* *
*** データ行出力
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE.
ADD 1 TO CUN-W01OUT.
*
*** 100行ごとにヘッダー再出力 *** 100行ごとにヘッダー再出力
ADD 1 TO WS-LINE-COUNT. ADD 1 TO WS-LINE-COUNT.
IF WS-LINE-COUNT > 100 IF WS-LINE-COUNT > 100
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 2 LINES
MOVE '社員番号,日付,出勤時刻' MOVE '社員番号,日付,出勤時刻'
TO WS-CSV-LINE(1:28) TO WS-CSV-LINE(1:28)
MOVE ',退勤時刻,休暇種別,年休時間' MOVE ',退勤時刻,休暇種別,年休時間'
@@ -407,16 +410,11 @@
MOVE ',病欠時間,未申請欠勤時間' MOVE ',病欠時間,未申請欠勤時間'
TO WS-CSV-LINE(81:24) TO WS-CSV-LINE(81:24)
WRITE CSVOUTREC FROM WS-CSV-LINE WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE AFTER ADVANCING 2 LINES
ADD 1 TO CUN-W01OUT ADD 1 TO CUN-W01OUT
MOVE ZERO TO WS-LINE-COUNT MOVE ZERO TO WS-LINE-COUNT
END-IF. END-IF.
* *
*** データ行出力
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE.
ADD 1 TO CUN-W01OUT.
*
*** 次FETCH *** 次FETCH
EXEC SQL EXEC SQL
FETCH C_DAILY FETCH C_DAILY
@@ -2,22 +2,23 @@
## プログラム概要 ## プログラム概要
- **プログラムID**: KIN08DBU - **プログラムID**: KIN08DBU
- **プログラム名**: 月次集計更新処理 - **プログラム名**: 勤怠DB更新処理
- **処理概要**: SYSIN制御カード(T/P/M)で処理対象を指定し、DAILY_RECORDSテーブルをDELETE/INSERT(日別→月次集計)し、MONTHLY_ABSENCEテーブルにUPSERT。ABSENCE_SUMMARYファイル(80B)に出力する - **処理概要**: SYSIN制御カード(T/P/M)で処理対象を指定し、DAILY_RECORD200B)を読込み、DAILY_RECORDSテーブルにINSERT。社員別月次集計MONTHLY_ABSENCEにUPSERT。集計結果をABSENCE_SUMMARYファイル(80B)に出力。
## 使用ファイル ## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | 定義参照先 | | DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | 定義参照先 |
|------|---------------|------|-------------|-----------|--------|-----------| |------|---------------|------|-------------|-----------|--------|-----------|
| KIN08R01 | SYSIN | 順編成 | F (固定長) | 80B | - | JCL DD定義 | | KIN08R01 | DAILY-RECORD(日別勤怠) | 順編成 | F (固定長) | 200B | KIN07REC | COPY句定義書.md |
| KIN08W01 | ABSENCE-SUMMARY | 順編成 | F (固定長) | 80B | KIN08REC | COPY句定義書.md | | KIN08S01 | SYSIN(制御カード) | 順編成 | F (固定長) | 80B | - | JCL DD定義 |
| KIN08W01 | ABSENCE-SUMMARY(月次集計) | 順編成 | F (固定長) | 80B | KIN08REC | COPY句定義書.md |
## 使用COPY句 ## 使用COPY句
| COPY句 | 用途 | 使用箇所 | | COPY句 | 用途 | 使用箇所 |
|--------|------|---------| |--------|------|---------|
| KIN07REC | DAILY-RECORDINSERT用ホスト変数参照 | FILE SECTIONSQL宿主 | | KIN07REC | DAILY-RECORDR01入力レコード定義 | FILE SECTIONFD R01INNFIL |
| KIN08REC | W01出力レコード定義(ABSENCE-SUMMARY-REC | FILE SECTION | | KIN08REC | ABSENCE-SUMMARYW01出力レコード定義 | FILE SECTIONFD W01OUTFIL |
| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | | ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | | ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
@@ -26,35 +27,35 @@
| サブPGM | 役割 | CALL箇所 | | サブPGM | 役割 | CALL箇所 |
|---------|------|---------| |---------|------|---------|
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | | SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR | | SUB03END | ABEND処理 | 1000ITTSOR(パラメータ不足時)/ 9100DBERRSOR / 9999ABDSOR |
## 使用DB2テーブル ## 使用DB2テーブル
| テーブル名 | 操作種別 | 使用箇所 | SQL種別 | | テーブル名 | 操作種別 | 使用箇所 | SQL種別 |
|-----------|---------|---------|--------| |-----------|---------|---------|--------|
| DAILY_RECORDS | DELETE/INSERT | 1000PROCSOR | DELETE / INSERT | | DAILY_RECORDS | INSERT | 2000MAJSOR | INSERT |
| MONTHLY_ABSENCE | SELECT/INSERT/UPDATE | 2000MAJSOR | SELECT COUNT / INSERT / UPDATE | | MONTHLY_ABSENCE | DELETE/SELECT/INSERT/UPDATE | 3000STPSOR | DELETERESETモード)/ SELECT COUNT / INSERT / UPDATE |
## 処理フロー ## 処理フロー
1. 初期処理開始メッセージ→OPEN SYSIN→SYSIN読込ループ 1. 初期処理(1000ITTSOR): 開始メッセージ→OPEN SYSIN→SYSIN読込ループ
2. SYSINカード解析: GO TO DEPENDING ON でT/P/M分岐 2. SYSINカード解析(1199-SYSIN-LOOP): GO TO DEPENDING ON でT/P/M分岐
- Tカード(1110-TARGETSOR): UNSTRINGで対象社員一覧を内部表に格納 - Tカード(1110-TARGETSOR): UNSTRINGで対象社員一覧を内部表に格納
- Pカード(1120-PERIODSOR): 年月範囲を設定 - Pカード(1120-PERIODSOR): 処理対象年月を設定
- Mカード(1130-MODESOR): RESETDELETE/ UPDATEモード切替 - Mカード(1130-MODESOR): MODERESET/NORMAL)を設定
3. 主処理(2000MAJSOR): DAILY_RECORDSのSELECT→INSERT→集計テーブルに累積 3. 主処理(2000MAJSOR): DAILY-RECORD読込→DAILY_RECORDS INSERT→集計テーブルに累積
4. 月次UPDATE処理(3000UPDSOR): MONTHLY_ABSENCEにSELECT COUNTINSERTUPDATE 4. 終了処理(3000STPSOR): RESET時DELETE→MONTHLY_ABSENCE UPSERT→ABSENCE_SUMMARY出力→COMMIT→CLOSE
5. 終了処理(4000MSGOUTSOR): 件数出力→CLOSE→終了メッセージ
## 使用構文(特記事項) ## 使用構文(特記事項)
| 構文 | 使用箇所 | 備考 | | 構文 | 使用箇所 | 備考 |
|------|---------|------| |------|---------|------|
| GO TO DEPENDING ON | 1100PARMSOR/1199-SYSIN-LOOP | T/P/Mカードパラグラフ分岐 | | GO TO DEPENDING ON | 1199-SYSIN-LOOP | T/P/Mカードパラグラフ分岐 |
| UNSTRING | 1110-TARGETSOR/1120-PERIODSOR/1130-MODESOR | カンマ/区切り/代入符でカード分割 | | UNSTRING | 1110-TARGETSOR / 1120-PERIODSOR | カンマ区切り/代入符で文字列分割 |
| INSPECT TALLYING | 1110-TARGETSOR | UNSTRING後のtarget句末尾ゼロ数 | | INSPECT TALLYING | 2000MAJSOR | 社員番号先頭ゼロ数チェック |
| COMPUTE ROUNDED ON SIZE ERROR | 2000MAJSOR | 丸め+サイズエラー検出 | | COMPUTE ROUNDED ON SIZE ERROR | 2000MAJSOR | 丸め+サイズエラー検出 |
| DELETE | 2100-DELETE-SQL | SQL: DAILY_RECORDS DELETE | | UPSERTSELECT COUNT→INSERT/UPDATE | 3000STPSOR | 月次集計行の存在確認後分岐 |
| UPSERTSELECT COUNT→INSERT/UPDATE | 3000UPDSOR | 月次集計行の存在確認後分岐 | | OCCURS | WORKING-STORAGE | AGG-ENTRIES(100), TARGET-EMP(100) |
| OCCURS | WORKING-STORAGE | TARGET-EMP(100), 内部集計表(9999) | | INITIALIZE | 1000ITTSOR | WRKARA + AGGREGATION-TABLE初期化 |
| INITIALIZE REPLACING | 1110-TARGETSOR | TARGET-TABLEの初期化 | | EXEC SQL INCLUDE | WORKING-STORAGE | SQLCA(ブリッジ変数) |
| EXEC SQL INCLUDE | WORKING-STORAGE | SQLCA | | FUNCTION WHEN-COMPILED | 1000ITTSOR | コンパイル日時表示 |
| INSPECT REPLACING | 1130-MODESOR | 'MODE='除去 |
@@ -3,7 +3,7 @@
## プログラム概要 ## プログラム概要
- **プログラムID**: KIN09CSV - **プログラムID**: KIN09CSV
- **プログラム名**: CSV出力処理 - **プログラム名**: CSV出力処理
- **処理概要**: DAILY_RECORDSテーブルをCURSORで読込み、CSV形式に編集して出力。MODE=FULLで日別明細+月次サマリ、MODE=SHORTで月次サマリのみ。100行ごとにヘッダー再出力。 - **処理概要**: DAILY_RECORDSテーブルをCURSORで読込み、CSV形式に編集STRING WITH POINTERして出力。MODE=FULLで日別明細+月次サマリ、MODE=SHORTで月次サマリのみ。100行ごとにヘッダー再出力。
## 使用ファイル ## 使用ファイル
@@ -24,7 +24,7 @@
| サブPGM | 役割 | CALL箇所 | | サブPGM | 役割 | CALL箇所 |
|---------|------|---------| |---------|------|---------|
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | | SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR | | SUB03END | ABEND処理 | 1100PARMSORYEARMONTH未設定時)/ 9999ABDSOR |
## 使用DB2テーブル ## 使用DB2テーブル
@@ -34,24 +34,25 @@
| MONTHLY_ABSENCE | SELECT | 2500-SHORT-MODE | DECLARE CURSOR / OPEN / FETCH / CLOSE | | MONTHLY_ABSENCE | SELECT | 2500-SHORT-MODE | DECLARE CURSOR / OPEN / FETCH / CLOSE |
## 処理フロー ## 処理フロー
1. 初期処理(開始メッセージ→COMMAND-LINE解析→OPEN出力 1. 初期処理(1000ITTSOR): 開始メッセージ→ワーク初期化→COMMAND-LINE解析→OPEN出力
2. ヘッダー出力SHIFT JIS CSVヘッダー 2. ヘッダー出力: WRITE AFTER ADVANCING PAGE(改ページ+CSVヘッダー)
3. 日別明細ループ:DAILY_RECORDS CURSOR OPEN→FETCH→CSV編集(STRING WITH POINTER)→WRITE AFTER ADVANCING 1 LINE 3. CURSOR OPEN(1200-DAILY-OPEN): DAILY_RECORDS CURSOR OPEN + 初回FETCH
4. 100行ごとにヘッダー再出力(WRITE AFTER ADVANCING PAGE 4. 日別明細ループ(2000MAJSOR): CSV編集(STRING WITH POINTER)→WRITE AFTER ADVANCING 1 LINE
5. MODE=SHORT: MONTHLY_ABSENCE CURSOR OPEN→FETCH→月次サマリCSV出力 - 100行ごとにヘッダー再出力: WRITE AFTER ADVANCING 2 LINES
6. 終了処理(CLOSE→件数出力→終了メッセージ) - CSV危険文字サニタイズ: INSPECT REPLACING
5. MODE=SHORT(2500-SHORT-MODE): MONTHLY_ABSENCE CURSOR→月次サマリCSV出力
6. 終了処理(3000STPSOR): CLOSE→件数出力→終了メッセージ
## 使用構文(特記事項) ## 使用構文(特記事項)
| 構文 | 使用箇所 | 備考 | | 構文 | 使用箇所 | 備考 |
|------|---------|------| |------|---------|------|
| ACCEPT FROM COMMAND-LINE | 1100PARMSOR | "YEARMONTH=202605 MODE=FULL"解析 | | ACCEPT FROM COMMAND-LINE | 1100PARMSOR | "YEARMONTH=202605,MODE=FULL"解析 |
| STRING DELIMITED BY | 2000MAJSOR/2500-SHORT-MODE | CSV行編集(WITH POINTER | | STRING DELIMITED BY | 2000MAJSOR/2500-SHORT-MODE | CSV行編集(WITH POINTER |
| WRITE AFTER ADVANCING PAGE | 2000MAJSOR | 改ページ+ヘッダー出力 | | WRITE AFTER ADVANCING PAGE | 1000ITTSOR | 改ページ+CSVヘッダー初回出力 |
| WRITE AFTER ADVANCING 2 LINES | 2500-SHORT-MODE | ヘッダー後改行 | | WRITE AFTER ADVANCING 2 LINES | 2000MAJSOR | 100行ごとのヘッダー再出力時 |
| WRITE AFTER ADVANCING 1 LINE | 2000MAJSOR/2500-SHORT-MODE | データ行改行 | | WRITE AFTER ADVANCING 1 LINE | 2000MAJSOR/2500-SHORT-MODE | データ行・ヘッダー行改行 |
| INSPECT REPLACING | 2000MAJSOR | CSVカンマ・改行サニタイズ | | INSPECT REPLACING | 2000MAJSOR | CSVカンマ・改行サニタイズ |
| DECLARE CURSOR / OPEN / FETCH / CLOSE | 1200-DAILY-OPEN/2500-SHORT-MODE | 2重CURSORDAILY→MONTHLY | | DECLARE CURSOR / OPEN / FETCH / CLOSE | 1200-DAILY-OPEN/2500-SHORT-MODE | 2重CURSORDAILY→MONTHLY |
| OCCURS | WORKING-STORAGE | TARGET-EMP(100) | | INITIALIZE | 1000ITTSOR | WRKARA初期化 |
| INITIALIZE | 1100PARMSOR/1200-DAILY-OPEN | 変数初期化 | | FUNCTION WHEN-COMPILED | 1000ITTSOR | コンパイル日時表示 |
| MOVE CORRESPONDING | 2000MAJSOR | HV → CSV行項目編集 |
+9 -9
View File
@@ -53,12 +53,12 @@
| 指標 | 値 | | 指標 | 値 |
|------|:----:| |------|:----:|
| 全タイプ数 | 35 | | 全タイプ数 | 35 |
| ◎(使用済) | 15 | | ◎(使用済) | 16 |
| ○(一部使用) | 1 | | ○(一部使用) | 1 |
| △(調査中) | 0 | | △(調査中) | 0 |
| ×(未使用) | 19 | | ×(未使用) | 18 |
| カバレッジ率(◎/35 | 42.9% | | カバレッジ率(◎/35 | 45.7% |
| カバレッジ率(◎+○/35) | 45.7% | | カバレッジ率(◎+○/35) | 48.6% |
--- ---
@@ -253,13 +253,13 @@
| 指標 | 値 | | 指標 | 値 |
|------|:----:| |------|:----:|
| **プログラムタイプカバレッジ(35タイプ)** | | | **プログラムタイプカバレッジ(35タイプ)** | |
| ◎(使用済) | 14 / 35 | | ◎(使用済) | 16 / 35 |
| ○(一部使用) | 1 / 35 | | ○(一部使用) | 1 / 35 |
| ×(未使用) | 20 / 35 | | ×(未使用) | 18 / 35 |
| △(調査中) | 0 / 35 | | △(調査中) | 0 / 35 |
| カバレッジ率(◎/35 | 40.0% | | カバレッジ率(◎/35 | 45.7% |
| カバレッジ率(◎+○/35) | 42.9% | | カバレッジ率(◎+○/35) | 48.6% |
| 実装対象限定(1-9,13-15,24-26,28,30-31= 20種中 | 16件 = 80.0% | | 実装対象限定(1-9,13-15,24-26,28,30-31= 20種中 | 17件 = 85.0% |
| **カテゴリカバレッジ(9カテゴリ)** | | | **カテゴリカバレッジ(9カテゴリ)** | |
| 全カテゴリ数 | 9 | | 全カテゴリ数 | 9 |
| カバー済カテゴリ(使用文あり) | 8 / 9 | | カバー済カテゴリ(使用文あり) | 8 / 9 |