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:
qiuqiuqiu
2026-06-30 21:22:15 +08:00
parent a110bccdaf
commit baa5be54d2
40 changed files with 3382 additions and 350 deletions
+207
View File
@@ -0,0 +1,207 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN09CSV |
| 3 | プログラム名 | 勤怠CSV出力処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | GETPUT(編集出力) |
| 6 | 機能概要 | DAILY_RECORDSをDBからSELECTし、STRING WITH POINTERでCSV行を編集、WRITE AFTER ADVANCINGPAGE/2 LINES/1 LINE)で出力する。INSPECT REPLACINGでCSV危険文字をサニタイズする。 |
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|----------------|------|
| 1 | DAILY_RECORDS | KIN08DBUにより当月勤怠データが登録済みであること |
| 2 | MONTHLY_ABSENCE | KIN08DBUにより当月集計が完了していること |
| 3 | PARM | YEARMONTH=YYYYMM は必須。省略時はABEND |
### PARM引数
コマンドラインで以下の形式で指定。
```
YEARMONTH=202605,MODE=FULL
```
| パラメータ | 必須 | デフォルト | 説明 |
|-----------|:---:|:--------:|------|
| YEARMONTH | ○ | — | 処理対象年月(YYYYMM形式) |
| MODE | ○ | FULL | FULL=日別+月次全項目出力, SHORT=月次集計のみ |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|
| 1 | CSV-OUTPUT | OUTREC | KIN09W01 | O | KIN09REC | FB | | 200 | PS |
### 使用DBテーブル
| NO | テーブル名 | 処理内容 |
|----|-----------|---------|
| 1 | DAILY_RECORDS | SELECT WHERE TARGET_DATE LIKE 'YYYYMM%' ORDER BY EMP_ID, TARGET_DATE |
| 2 | MONTHLY_ABSENCE | SELECT WHERE YEAR_MONTH = :WS-YEAR-MONTH ORDER BY EMP_ID |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.PARM解析(ACCEPT FROM COMMAND-LINE
INSPECT WS-PARM TALLYING WS-COMMA-CNT FOR ALL ','
IF WS-COMMA-CNT < 1
DISPLAY 'WARNING: Missing MODE, using FULL'
END-IF
UNSTRING WS-PARM DELIMITED BY ','
INTO WS-PARM1 WS-PARM2
END-UNSTRING
UNSTRING WS-PARM1 DELIMITED BY '='
INTO WS-KEY1 WS-VALUE1
END-UNSTRING
UNSTRING WS-PARM2 DELIMITED BY '='
INTO WS-KEY2 WS-VALUE2
END-UNSTRING
YEARMONTH設定、MODE設定(FULL/SHORT判定)
必須チェック:YEARMONTH未設定 → ABEND(CALL SUB03END)
1-4.ワークエリア初期化
1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
1-6.出力ファイルOPENKIN09W01
1-7.ヘッダー行書出(WRITE AFTER ADVANCING PAGE
社員番号,日付,出勤時刻,退勤時刻,休暇種別,
年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間
2.主処理(2000MAJSOR)(FETCH EOFまで下記を繰り返す)
2-1.CURSOR FETCHDAILY_RECORDS
2-2.CSV危険文字サニタイズ(INSPECT REPLACING
MOVE 各項目を退避 → WS-SAFE-FIELD
INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';'
ALL X"0D" BY SPACE
ALL X"0A" BY SPACE
2-3.CSV行編集(STRING WITH POINTER
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
2-4.行数カウンタ加算
2-5.100行ごとにヘッダー再出力(WRITE AFTER ADVANCING 2 LINES + ヘッダー行)
100件毎 → WRITE WS-SEC-REC AFTER ADVANCING 2 LINES
WRITE WS-HDR-REC AFTER ADVANCING 1 LINE
2-6.データ行出力(WRITE AFTER ADVANCING 1 LINE
WRITE WS-OUT-REC FROM WS-CSV-LINE AFTER ADVANCING 1 LINE
3.MODE=SHORT時のみ追加処理(2500-SHORT-MODE
3-1.MONTHLY_ABSENCE CURSOR OPEN
3-2.STRINGで集計行編集
3-3.セクション区切り出力
WRITE WS-SEC-REC AFTER ADVANCING 2 LINES
3-4.集計行出力
WRITE WS-OUT-REC AFTER ADVANCING 1 LINE
4.終了処理(3000STPSOR
4-1.CURSOR CLOSE
4-2.DB切断
4-3.出力ファイルCLOSE
4-4.出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(出力件数)
PARM1'CSV-OUTPUT'
PARM2CUN-W01OUT(出力行数)
4-5.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
### WRITE AFTER ADVANCING 3種の使い分け
| タイミング | 構文 | 説明 |
|-----------|------|------|
| ファイル先頭 | WRITE header-rec AFTER ADVANCING PAGE | 改ページ(最初のヘッダー) |
| 100行ごと | WRITE sep-rec AFTER ADVANCING 2 LINES | セクション区切り(空行2行) |
| 100行ごと | WRITE header-rec AFTER ADVANCING 1 LINE | 再ヘッダー出力 |
| データ行 | WRITE data-rec AFTER ADVANCING 1 LINE | 通常データ行 |
---
## 出力レコード定義
### CSV-OUTPUTOUTREC/KIN09REC200B FB
| No | 項目名 | 設定元 | 属性 | 備考 |
|----|--------|--------|------|------|
| 1 | CSV-LINE | STRING編集結果 | X(200) | CSV1行分の文字列データ |
---
## CSVフォーマット
ヘッダー行(WRITE AFTER ADVANCING PAGEで出力):
```
社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間
```
データ行:
```
00000101,20260501,0900,1800,99,0.0,0.0,0.0,0.0,0.0
00000101,20260502,0900,1300,02,0.0,4.0,0.0,0.0,4.0
```
MODE=SHORT時の集計行(WRITE AFTER ADVANCING 2 LINESで区切り):
```
社員番号,年月,年休計,事假計,因公特批假計,病欠計,未申請欠勤計
00000101,202605,8.0,4.0,0.0,0.0,4.0
```
---
## カバレッジ構文一覧
| 構文 | 用途 |
|------|------|
| ACCEPT FROM COMMAND-LINE | PARM解析 |
| INSPECT TALLYING | カンマ区切り数チェック |
| 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読込 |
| DISPLAY | 警告メッセージ表示 |