docs: add detailed design documents (詳細設計書)

This commit is contained in:
hangshuo652
2026-08-09 17:43:28 +08:00
parent ff51bda962
commit f67a5bf769
22 changed files with 3357 additions and 0 deletions
+326
View File
@@ -0,0 +1,326 @@
# ファイル定義書
## 変更履歴
| No | 変更内容 | 担当者 | 変更日 | 承認者 | 備考 |
|----|---------|--------|--------|--------|------|
| 1 | 新規作成 | AI | 2026/06/15 | | COPY10部品を一括定義 |
---
# ZAN01REC — 加班申請レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-VALID / OVT-CANCEL / OVT-SORTED / OVT-CSORT / OVT-VSORT / OVT-NODUP / OVT-CHECKED | ZAN01REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | YYYYMMDD+SEQ |
| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | |
| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD |
| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM |
| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM |
| 6 | 03 | ステータス | (A)STATUS | X(1) | 1 | | 33 | | | 0:有効/1:確定/9:取消 |
| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 34 | | | W:平日/H:休日 |
| 8 | 03 | 予約 | (A)FILLER | X(46) | 46 | | 35 | | | |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O |
|-----------|--------------|------|-----|
| ZAN01CHK | W01 | OVT-VALID出力(STATUS=0/1 | O |
| ZAN01CHK | W02 | OVT-CANCEL出力(STATUS=9 | O |
| ZAN02CHK | R01 | OVT-VSORT入力 | I |
| ZAN02CHK | W01 | OVT-NODUP出力 | O |
| ZAN03CHK | R01 | OVT-NODUP入力 | I |
| ZAN03CHK | W01 | OVT-CHECKED出力 | O |
| ZAN04MAT | R01 | OVT-SORTED入力(有効申請) | I |
| ZAN04MAT | R02 | OVT-CSORT入力(取消申請) | I |
---
# ZAN02REC — マッチング結果レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-MATCHED | ZAN02REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | |
| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | |
| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD |
| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM |
| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM |
| 6 | 03 | ステータス | (A)STATUS | X(1) | 1 | | 33 | | | |
| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 34 | | | W:平日/H:休日 |
| 8 | 03 | 処理番号 | (A)PROC-SEQ | 9(2) | 2 | | 35 | | | 01固定 |
| 9 | 03 | 予約 | (A)FILLER | X(44) | 44 | | 37 | | | |
### ZAN01RECとの差分
| 項目 | ZAN01REC | ZAN02REC |
|------|----------|----------|
| 追加 | — | PROC-SEQ9(2) |
| FILLER | X(46) | X(44) |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O |
|-----------|--------------|------|-----|
| ZAN04MAT | W01 | OVT-MATCHED出力 | O |
---
# ZAN03REC — 集約結果レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-AGGREGATED | ZAN03REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | |
| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | |
| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD |
| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM |
| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM |
| 6 | 03 | 残業時間 | (A)OVT-HOURS | 9(4)V9(1) | 5 | | 33 | | | HH.h0.1h単位) |
| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 38 | | | W:平日/H:休日 |
| 8 | 03 | 予約 | (A)FILLER | X(42) | 42 | | 39 | | | |
### ZAN01RECとの差分
| 項目 | ZAN01REC | ZAN03REC |
|------|----------|----------|
| 削除 | STATUS | — |
| 追加 | — | OVT-HOURS9(4)V9(1) |
| FILLER | X(46) | X(42) |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O | 備考 |
|-----------|--------------|------|-----|------|
| ZAN05CAL | (未定) | 集約結果出力 | O | 未実装 |
---
# ZAN04REC — DBCLEAN対象レコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| OVT-DBCLEAN | ZAN04REC | PS | FB | 80 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | DB削除対象申請番号 |
| 2 | 03 | 予約 | (A)FILLER | X(72) | 72 | | 9 | | | |
### 使用プログラム
| プログラム | プレフィックス | 用途 | I/O |
|-----------|--------------|------|-----|
| ZAN04MAT | W02 | OVT-DBCLEAN出力(APPL-IDのみ設定) | O |
---
# ZAN05REC — エラーログレコード
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| ERROR-LOG | ZAN05REC | PS | VB | 200 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 03 | エラーカテゴリ | (A)ERR-CATEGORY | 9(2) | 2 | | 1 | | | 01:項目CHK/02:重複/03:打刻不突合/03:取消監査 |
| 2 | 03 | エラー詳細 | (A)ERR-DETAIL | X(198) | 198 | | 3 | | | STRING編集値 |
### 使用プログラム
| プログラム | プレフィックス | エラーカテゴリ | I/O |
|-----------|--------------|---------------|-----|
| ZAN01CHK | W03 | 01(項目チェックエラー) | O |
| ZAN02CHK | W02 | 02(時間重複エラー) | O |
| ZAN03CHK | W02 | 03(打刻不突合エラー) | O |
| ZAN04MAT | W03 | 03(取消マッチ監査証跡) | O |
---
# ZANDATAC — SUB01DAT 運用日付取得用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB01DAT連絡領域 | ZANDATAC | — | — | 10 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | 運用日付パラメタ | D01UBSPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | 復帰コード | D01FKICOD | S9(4) COMP | 2 | | 1 | | D01UBSPAR | 0000:正常 |
| 3 | 03 | 運用日付 | D01UBSUDATE | 9(8) | 8 | | 3 | | D01UBSPAR | YYYYMMDD |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| ZAN01CHK | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 |
| ZAN02CHK | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 |
| ZAN04MAT | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 |
※ ZAN03CHKはFUNCTION CURRENT-DATEを使用し本COPY未使用
---
# ZANMSGAC — SUB02MSG メッセージ出力用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB02MSG連絡領域 | ZANMSGAC | — | — | 303 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | メッセージパラメタ | M00MHOPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | メッセージ番号 | M00MSGCOD | 9(3) | 3 | | 1 | | M00MHOPAR | |
| 3 | 03 | パラメータ1 | M00UMKDATS22-01 | X(30) | 30 | | 4 | | M00MHOPAR | |
| 4 | 03 | パラメータ2 | M00UMKDATS22-02 | X(30) | 30 | | 34 | | M00MHOPAR | |
| 5 | 03 | パラメータ3 | M00UMKDATS22-03 | X(30) | 30 | | 64 | | M00MHOPAR | |
| 6 | 03 | パラメータ4 | M00UMKDATS22-04 | X(30) | 30 | | 94 | | M00MHOPAR | |
| 7 | 03 | パラメータ5 | M00UMKDATS22-05 | X(30) | 30 | | 124 | | M00MHOPAR | |
| 8 | 03 | パラメータ6 | M00UMKDATS22-06 | X(30) | 30 | | 154 | | M00MHOPAR | |
| 9 | 03 | パラメータ7 | M00UMKDATS22-07 | X(30) | 30 | | 184 | | M00MHOPAR | |
| 10 | 03 | パラメータ8 | M00UMKDATS22-08 | X(30) | 30 | | 214 | | M00MHOPAR | |
| 11 | 03 | パラメータ9 | M00UMKDATS22-09 | X(30) | 30 | | 244 | | M00MHOPAR | |
| 12 | 03 | パラメータ10 | M00UMKDATS22-10 | X(30) | 30 | | 274 | | M00MHOPAR | |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| ZAN01CHK | CALL 'SUB02MSG' USING M00MHOPAR | |
| ZAN02CHK | CALL 'SUB02MSG' USING M00MHOPAR | |
| ZAN03CHK | CALL 'SUB02MSG' USING M00MHOPAR | |
| ZAN04MAT | CALL 'SUB02MSG' USING M00MHOPAR | |
---
# ZANENDAC — SUB03END ABEND処理用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB03END連絡領域 | ZANENDAC | — | — | 3 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | ABENDパラメタ | E01ABDPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | ABENDコード | E01ABDCOD | 9(3) | 3 | | 1 | | E01ABDPAR | 999:汎用 |
### 使用プログラム
| プログラム | 呼出方法 |
|-----------|---------|
| ZAN01CHK | CALL 'SUB03END' USING E01ABDPAR |
| ZAN02CHK | CALL 'SUB03END' USING E01ABDPAR |
| ZAN03CHK | CALL 'SUB03END' USING E01ABDPAR |
| ZAN04MAT | CALL 'SUB03END' USING E01ABDPAR |
---
# ZANCHKAC — SUB04CHK 項目チェック用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB04CHK連絡領域 | ZANCHKAC | — | — | 92 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | 項目チェックパラメタ | C01CHKPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | チェックタイプ | C01CHKTYP | X(8) | 8 | | 1 | | C01CHKPAR | DATE/TIME/NUM/EMPID |
| 3 | 03 | チェック対象データ | C01CHKDAT | X(80) | 80 | | 9 | | C01CHKPAR | |
| 4 | 03 | 復帰コード | C01CHKRRC | 9(4) | 4 | | 89 | | C01CHKPAR | 0000:正常/0001:日付/0002:時刻/0003:数字/0004:社員番号/9999:不明 |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| ZAN01CHK | CALL 'SUB04CHK' USING C01CHKPAR | 日付/時刻チェック |
---
# ZANTIMAC — SUB05TIM 時刻丸め用連絡領域
## Layout(レコードレイアウト)
### ファイル基本情報
| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 |
|-----------|---------|------|-------------|-----------|
| SUB05TIM連絡領域 | ZANTIMAC | — | — | 14 |
### レコード定義
| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 |
|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------|
| 1 | 01 | 時刻丸めパラメタ | T01TIMPAR | | | | 1 | | | CALL USING対象 |
| 2 | 03 | 入力時間 | T01TIMHRS | 9(4)V9(1) | 5 | | 1 | | T01TIMPAR | HH.h |
| 3 | 03 | 出力時間 | T01TIMOUT | 9(4)V9(1) | 5 | | 6 | | T01TIMPAR | 丸め後 |
| 4 | 03 | 丸めモード | T01TIMRRC | 9(4) | 4 | | 11 | | T01TIMPAR | 0:0.5h切上/1:0.1h切上/2:0.1h切捨/3:四捨五入 |
### 使用プログラム
| プログラム | 呼出方法 | 備考 |
|-----------|---------|------|
| — | — | ZAN05CALで使用予定(未実装) |
+232
View File
@@ -0,0 +1,232 @@
# DB定義書
## 変更履歴
| No | 変更内容 | 担当者 | 変更日 | 承認者 | 備考 |
|----|---------|--------|--------|--------|------|
| 1 | 新規作成(全8テーブル) | AI | 2026/06/23 | | サブシステムA(6) + B(2) |
---
# EMP_MASTER — 社員マスタ
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 勤怠休暇管理DB | EMP_MASTER | — | PK: EMP_ID |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | |
| 2 | 部署ID | DEPT_ID | CHAR | 4 | | 4 | NOT NULL | | | | | | |
| 3 | 氏名 | EMP_NAME | VARCHAR | 50 | | 50 | NOT NULL | | | | | | |
| 4 | ステータス | STATUS | CHAR | 1 | | 1 | NOT NULL | | | | | | '1'=在籍, '9'=退職 |
### 備考
- サブシステムA: 参照のみ(SELECT)
- サブシステムB: 使用しない
---
# LEAVE_RECORDS — 休暇申請記録
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 勤怠休暇管理DB | LEAVE_RECORDS | — | PK: APPLICATION_ID |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 申請番号 | APPLICATION_ID | INTEGER | 10 | | 4 | NOT NULL | | ✓ | | | | 自動採番 |
| 2 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | | | | | |
| 3 | 休暇種別 | LEAVE_TYPE | CHAR | 2 | | 2 | NOT NULL | | | | | | 01/02/03/04 |
| 4 | 開始日 | START_DATE | CHAR | 8 | | 8 | NOT NULL | | | | | | YYYYMMDD |
| 5 | 開始時刻 | START_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM |
| 6 | 終了日 | END_DATE | CHAR | 8 | | 8 | NOT NULL | | | | | | YYYYMMDD |
| 7 | 終了時刻 | END_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM |
| 8 | ステータス | STATUS | CHAR | 1 | | 1 | NOT NULL | | | | | | '1'=有効, '9'=取消 |
### 備考
- KIN02UPDがINSERT/DELETEを実行
- KIN03EXPがSELECT(日付展開用)
- 取消はDELETE FROM で物理削除
---
# HOLIDAY_CALENDAR — 休日カレンダー
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 勤怠休暇管理DB | HOLIDAY_CALENDAR | — | PK: HOLIDAY_DATE |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 休日日付 | HOLIDAY_DATE | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | YYYYMMDD |
| 2 | 説明 | DESCRIPTION | VARCHAR | 50 | | 50 | NULL許可 | NULL | | | | | 例:「建国記念の日」 |
### 備考
- 土日は曜日判定で処理するため、このテーブルには祝日のみ格納
- KIN03EXP, KIN06CLDがSELECTで参照
---
# SICK_LEAVE_RATE — 病欠控除率
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 勤怠休暇管理DB | SICK_LEAVE_RATE | — | PK: LEAVE_TYPE |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 休暇種別 | LEAVE_TYPE | CHAR | 2 | | 2 | NOT NULL | | ✓ | | | | '04'固定 |
| 2 | 控除率 | DEDUCTION_RATE | DECIMAL | 3 | 2 | 3 | NOT NULL | | | | | | 例:0.5050%控除) |
### 備考
- 全社員共通の設定値
- 現時点では参照プログラム未実装(設計上定義)
---
# DAILY_RECORDS — 日別勤怠記録
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 勤怠休暇管理DB | DAILY_RECORDS | — | PK: (EMP_ID, TARGET_DATE) |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | |
| 2 | 対象日 | TARGET_DATE | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | YYYYMMDD |
| 3 | 出勤時刻 | TIME_IN | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM, '0000'=打刻なし |
| 4 | 退勤時刻 | TIME_OUT | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM, '0000'=打刻なし |
| 5 | 年休時間 | ANNUAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 |
| 6 | 事假時間 | PERSONAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 |
| 7 | 因公特批假時間 | OFFICIAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 |
| 8 | 病欠時間 | SICK_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 |
| 9 | 未申請欠勤時間 | UNAPPROVED_ABSENT_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 |
| 10 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | DEFAULT CURRENT_TIMESTAMP |
### 備考
- KIN08DBUがKIN07DAIの出力ファイルからINSERT
- 1社員1日=1レコード。出勤日のみ存在。
---
# MONTHLY_ABSENCE — 月次統計
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 勤怠休暇管理DB | MONTHLY_ABSENCE | — | PK: (EMP_ID, YEAR_MONTH) |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | |
| 2 | 対象年月 | YEAR_MONTH | CHAR | 6 | | 6 | NOT NULL | | ✓ | | | | YYYYMM |
| 3 | 年休合計 | ANNUAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | |
| 4 | 事假合計 | PERSONAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | |
| 5 | 因公特批假合計 | OFFICIAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | |
| 6 | 病欠合計 | SICK_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | |
| 7 | 未申請欠勤合計 | UNAPPROVED_ABSENT_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | |
| 8 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | DEFAULT CURRENT_TIMESTAMP |
### 備考
- KIN08DBUが月次集計後にUPSERTMERGE
- サブシステムC(給与計算)への連携元
---
# OVT_APPLICATIONS — 個別加班申請テーブル
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 残業統計管理DB | OVT_APPLICATIONS | — | PK: APPL_ID |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 申請番号 | APPL_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | YYYYMMDD+SEQ |
| 2 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | | | | | |
| 3 | 申請日 | APPL_DATE | CHAR | 8 | | 8 | NOT NULL | | | | | | YYYYMMDD |
| 4 | 残業種別 | OVT_TYPE | CHAR | 1 | | 1 | NOT NULL | | | | | | W=平日, H=休日 |
| 5 | 開始時刻 | START_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM |
| 6 | 終了時刻 | END_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM |
| 7 | 加班時間 | OVT_HOURS | DECIMAL | 4 | 1 | 4 | NOT NULL | | | | | | 0.1h単位 |
| 8 | ステータス | STATUS | CHAR | 1 | | 1 | NOT NULL | | | | | | 0=有効, 9=取消 |
| 9 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | |
### 備考
- ZAN06UPDがINSERT/UPDATEを実行
- STATUS=9で取消(物理削除はしない)
---
# OVT_MONTHLY — 月次集計テーブル
## Layout(テーブル定義)
### DB基本情報
| DB名 | DB ID | COPY ID | INDEX |
|------|-------|---------|-------|
| 残業統計管理DB | OVT_MONTHLY | — | PK: (EMP_ID, YEAR_MONTH, OVT_TYPE) |
### カラム定義
| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 |
|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------|
| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | |
| 2 | 対象年月 | YEAR_MONTH | CHAR | 6 | | 6 | NOT NULL | | ✓ | | | | YYYYMM |
| 3 | 残業種別 | OVT_TYPE | CHAR | 1 | | 1 | NOT NULL | | ✓ | | | | W=平日, H=休日 |
| 4 | 加班時間合計 | OVT_HOURS | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | |
| 5 | 加班回数 | OVT_COUNT | INTEGER | 10 | | 4 | NOT NULL | | | | | | |
| 6 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | |
### 備考
- ZAN06UPDが月次集計結果をUPSERT
+153
View File
@@ -0,0 +1,153 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN01INP |
| 3 | プログラム名 | 休暇申請CSV取込・検証処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 振り分け |
| 6 | 機能概要 | CSV形式の休暇申請ファイルを読み込み、休暇種別テーブル検索と項目チェックを行い、ステータスによってWORK-LEAVEまたはERROR-LOGへ振り分ける。 |
| 7 | | ステータス'1':有効申請としてWORK-LEAVEに出力(項目チェック実施) |
| 8 | | ステータス'9':取消申請としてWORK-LEAVEに出力(項目チェックなし、APPL-ID保持) |
| 9 | | その他・フィールド数異常・休暇種別異常:ERROR-LOGに出力 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | KIN01R01(CSV) | ソート不要。CSV形式(カンマ区切り、8項目) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | CSV-INPUT | R01 | KIN01R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 |
| 2 | WORK-LEAVE | W01 | KIN01W01 | O | KIN01REC | FB | | 80 | PS | |
| 3 | ERROR-LOG | W02 | KIN01W02 | O | KIN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | CSV-INPUT | なし | なし |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.休暇種別テーブル設定(WRK-LEAVE-TYPE-TABLE)
WRK-LT-CODE(1)='01' (年休/年假)
WRK-LT-CODE(2)='02' (事假)
WRK-LT-CODE(3)='03' (因公特批假)
WRK-LT-CODE(4)='04' (病欠)
1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-6.使用ファイルのオープン(R01:入力、W01/W02:出力)
1-7.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.CSVの分解(2010CSVSOR)
UNSTRINGでカンマ区切りのCSVを8項目に分解する。
(APPL-ID, EMP-ID, START-DATE, START-TIME, END-DATE, END-TIME, LEAVE-TYPE, STATUS)
2-2.休暇種別テーブル検索(2020LEAVSERSOR)
SEARCH(非ALL)でWRK-LEAVE-TYPE-TABLEを検索し、休暇種別の妥当性を検証する。
2-3.エラー判定
2-3-1.フィールド数≠8の場合
ERROR-LOGに出力する。(2050ERRORSOR)
エラー種別:'F'(FIELD COUNT ERROR)
2-3-2.休暇種別がテーブルに存在しない場合
ERROR-LOGに出力する。(2050ERRORSOR)
エラー種別:'L'(INVALID LEAVE TYPE)
2-3-3.ステータス'1'(有効)の場合
項目チェックを実施し、エラーがあればERROR-LOGに出力、なければWORK-LEAVEに出力する。(2030VALIDATESOR)
2-3-3-1.SUB04CHKで社員番号チェック(EMPID): WRK-CSV-EMP-IDをC01CHKDATに設定し、CALL 'SUB04CHK' EMPIDタイプで社員番号フォーマットの妥当性を検証する。エラーの場合はW02ERR-CATEGORY='01'でエラーログに出力し本レコードをスキップ。
2-3-3-2.開始日付チェック(SUB04CHK)。エラー→W02出力
2-3-3-3.開始時刻チェック(SUB04CHK)。エラー→W02出力
2-3-3-4.終了日付チェック(SUB04CHK)。エラー→W02出力
2-3-3-5.終了時刻チェック(SUB04CHK)。エラー→W02出力
2-3-3-6.複合条件チェック(AND+OR+3段ネスト)
開始日>0 AND 終了日>0 AND 開始時刻>0 の場合:
- 開始日>終了日 → WRK-DEMO-TYPE=10
- 開始日=終了日 AND 開始時刻>=終了時刻 → WRK-DEMO-TYPE=10
- 上記以外 → WRK-DEMO-TYPE=20
2-3-3-7.すべて通過→W01出力(APPL-ID=0, STATUS='1')
2-3-4.ステータス'9'(取消)の場合
WORK-LEAVEにそのまま出力する。(2040CANCELSOR)
APPL-ID=CSV値、STATUS='9'(項目チェックなし)
2-3-5.その他のステータスの場合
ERROR-LOGに出力する。(2050ERRORSOR)
エラー種別:'S'(INVALID STATUS)
2-4.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'KIN01R01'
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'KIN01W01'、'KIN01W02'
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/WORK-LEAVE KIN01REC 80B FB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | WRK-CSV-APPL-ID | 有効時=0、取消時=CSV値 |
| 2 | EMP-ID | WRK-CSV-EMP-ID | |
| 3 | LEAVE-TYPE | WRK-CSV-LEAVE-TYPE | 01/02/03/04 |
| 4 | START-DATE | WRK-CSV-START-DATE | YYYYMMDD |
| 5 | START-TIME | WRK-CSV-START-TIME | HHMM |
| 6 | END-DATE | WRK-CSV-END-DATE | YYYYMMDD |
| 7 | END-TIME | WRK-CSV-END-TIME | HHMM |
| 8 | STATUS | WRK-CSV-STATUS | '1'(有効)または'9'(取消) |
| 9 | FILLER | SPACE | 36B |
### 出力ファイル2W02/ERROR-LOG KIN05REC 200B VB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | '01'固定 | |
| 2 | ERR-DETAIL | STRING編集 | エラー内容(198B) |
+155
View File
@@ -0,0 +1,155 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN02UPD |
| 3 | プログラム名 | 休暇申請DB更新処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | DB更新 |
| 6 | 機能概要 | WORK-LEAVEファイルの各レコードをDB2テーブルLEAVE_RECORDSに反映する。 |
| 7 | | ステータスによって新規登録(INSERT)、変更(DELETE+INSERT)、取消(DELETE)を行う。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | KIN01W01 | KIN01INPの出力順に従う。ソート不要。 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | WORK-LEAVE | R01 | KIN01W01 | I | KIN01REC | FB | | 80 | PS | |
| 2 | ERROR-LOG | W01 | KIN02W01 | O | KIN05REC | VB | | 200 | PS | DBエラー時出力 |
| 3 | LEAVE_RECORDS | DB | — | I/U/D | — | — | — | — | DB | SQLite |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | WORK-LEAVE | なし | なし |
### 使用モジュール一覧
| 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.ワークエリアの初期化
1-4.DB接続
EXEC SQL CONNECT TO 'data/kin.db'
1-5.R01ファイルOPEN(入力)+ W01ファイルOPEN(出力)
1-6.R01を初回読込(1100R01INNSOR)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.レコード処理(2100PROCSOR)
2-1-1.R01各項目をホスト変数(WS-*)にMOVEする。
2-1-2.ロジック分岐判定(EVALUATE)
2-1-2-1.STATUS='1' AND APPL-ID=0(新規)の場合
INSERT処理(2110INSERTSOR)
【SQL】
INSERT INTO LEAVE_RECORDS
(EMP_ID, LEAVE_TYPE, START_DATE, START_TIME,
END_DATE, END_TIME, STATUS)
VALUES
(:WS-EMP-ID, :WS-LEAVE-TYPE,
:WS-START-DATE, :WS-START-TIME,
:WS-END-DATE, :WS-END-TIME,
:WS-STATUS)
SQLCODE≠0の場合、DBエラー処理(9100DBERRSOR)を実行する。
CUN-DBXINSを+1する。
2-1-2-2.STATUS='1' AND APPL-ID>0(変更)の場合
UPDATE処理(2120UPDATESOR)
【SQL】
DELETE FROM LEAVE_RECORDS
WHERE APPLICATION_ID = :WS-APPL-ID
INSERT INTO LEAVE_RECORDS
(EMP_ID, LEAVE_TYPE, START_DATE, START_TIME,
END_DATE, END_TIME, STATUS)
VALUES
(:WS-EMP-ID, :WS-LEAVE-TYPE,
:WS-START-DATE, :WS-START-TIME,
:WS-END-DATE, :WS-END-TIME,
:WS-STATUS)
各SQLでSQLCODE≠0の場合、DBエラー処理(9100DBERRSOR)を実行する。
CUN-DBXUPDを+1する。
2-1-2-3.STATUS='9'(取消)の場合
DELETE処理(2130DELETESOR)
【SQL】
DELETE FROM LEAVE_RECORDS
WHERE APPLICATION_ID = :WS-APPL-ID
SQLCODE≠0の場合、DBエラー処理(9100DBERRSOR)を実行する。
CUN-DBXDELを+1する。
2-1-2-4.その他
何も処理しない(CONTINUE)
2-2.次レコード読込(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.COMMIT
EXEC SQL COMMIT WORK
3-2.入出力ファイルのクローズ
3-3.件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(入力件数)
PARM1'KIN01W01'
PARM2:入力件数
PARM1'INS'、'UPD'、'DEL'
PARM2:各処理件数
3-4.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
4.DBエラー処理(9100DBERRSOR
4-1.ROLLBACK
EXEC SQL ROLLBACK WORK
4-2.ERROR-LOG出力(W01OUTFIL
【MOVE → INITIALIZE & WRITE】
MOVE SQLCODE TO WRK-SQLCODE-DISP
W01ERR-CATEGORY = '01'(固定)
W01ERR-DETAIL = 'KIN02UPD SQLCODE=' + WRK-SQLCODE-DISP + ' APPL-ID=' + WS-APPL-ID
CUN-W01OUTを+1する。
4-3.エラーメッセージ出力
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'KIN02UPD SQL ERROR'
PARM2SQLCODE
PARM3WS-APPL-ID
4-4.ABEND処理SUB呼出(9999ABDSOR)
ABENDコード:999
```
---
## 出力レコード定義
### 出力ファイル1W01/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | DBエラー |
| 2 | ERR-DETAIL | STRINGで編集 | KIN02UPD SQLCODE= + WRK-SQLCODE-DISP + APPL-ID= + WS-APPL-ID |
### DB更新結果
LEAVE_RECORDSテーブルに直接反映される。
+170
View File
@@ -0,0 +1,170 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN03EXP |
| 3 | プログラム名 | 休暇日別展開処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | キーブレイク(集計) |
| 6 | 機能概要 | LEAVE_RECORDS(DB2)より有効申請(STATUS='1')を読込み、開始日〜終了日の期間を日別に展開し、休日・週末を除外してLEAVE-DAILYファイルを出力する。 |
| 7 | | 社員番号(EMP_ID)キーブレイクで小計出力を行う。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | DB(LEAVE_RECORDS) | EMP_ID, START_DATE順にソート済(ORDER BYで取得) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | LEAVE-DAILY | W01 | KIN02W01.DAT | O | KIN02REC | FB | | 80 | PS | 日別展開後レコード |
| 2 | LEAVE_RECORDS | DB | — | I | — | — | — | — | DB | SQLite |
| 3 | HOLIDAY_CALENDAR | DB | — | I | — | — | — | — | DB | SQLite |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | DB(LEAVE_RECORDS) | EMP-ID, START_DATE(昇順) | キーブレイク: EMP-ID |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.DB接続
EXEC SQL CONNECT TO 'data/kin.db'
1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-6.休日カレンダーテーブル読込(1200HDINNSOR)
【SQL】
SELECT HOLIDAY_DATE FROM HOLIDAY_CALENDAR ORDER BY HOLIDAY_DATE
FETCHループでWORKING-STORAGEのWRK-HOLIDAY-TABLEに全件格納する。
WRK-HD-COUNTに件数を保持。最大366件(ODO定義)。
1-7.出力ファイルOPENW01
1-8.C1カーソル初回FETCH(1100C1INITSOR)
【SQL】
SELECT APPLICATION_ID, EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME, END_DATE, END_TIME
FROM LEAVE_RECORDS
WHERE STATUS = '1'
ORDER BY EMP_ID, START_DATE
INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE,
:SQL-START-DATE, :SQL-START-TIME,
:SQL-END-DATE, :SQL-END-TIME
SQLCODE=0の場合、入力件数+1
SQLCODE≠0の場合、WRK-R01EOF='1'EOF
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.社員番号キー保存
SQL-EMP-ID → WRK-BFR-EMP-ID
2-2.1社員分処理(2100-PROCESS-EMP)(PERFORM THRU)
2-2-1.CUN-EMP-SUB初期化(ZERO)
2-2-2.EOFまたはキー変化(SQL-EMP-ID≠WRK-BFR-EMP-ID)まで繰り返し
2-2-2-1.日付展開処理(2200-EXPAND-DATE)(PERFORM THRU)
2-2-2-1-1.開始日(SQL-START-DATE)→WRK-DATE-CURRENT
終了日(SQL-END-DATE)→WRK-DATE-END
2-2-2-1-2.WRK-DATE-CURRENT > WRK-DATE-END までループ
2-2-2-1-2-1.曜日判定
COMPUTE WRK-DAY-OF-WEEK = FUNCTION MOD(
FUNCTION INTEGER-OF-DATE(WRK-DATE-CURRENT), 7)
0=日曜日、6=土曜日 → 週末としてスキップ
2-2-2-1-2-2.非週末の場合、休日テーブル検索
SEARCH ALL WRK-HD-ENTRY(昇順KEY=WRK-HD-DATE
WRK-HD-DATE(WRK-HD-IDX) = WRK-DATE-CURRENT → 休日としてスキップ
2-2-2-1-2-3.非週末かつ非休日の場合、W01出力
W01レコード初期化
APPL-ID = SQL-APPL-ID
EMP-ID = WRK-BFR-EMP-ID
LEAVE-TYPE = SQL-LEAVE-TYPE
START-TIME = SQL-START-TIME
END-TIME = SQL-END-TIME
DATE = WRK-DATE-ALPHA(現在日付)
WRITE W01OUTREC
CUN-W01OUT +1
CUN-EMP-SUB +1
2-2-2-1-2-4.日付加算(2300-DATE-ADD-1)
WRK-DATE-DAY + 1
各月の最終日判定:
- 1/3/5/7/8/10/12月:31日超で月+1、13月→年+1
- 4/6/9/11月:30日超で月+1
- 2月:閏年判定(MOD年400=0 または MOD年4=0 AND MOD年100≠0)
閏年→29日超、平年→28日超で月+1
2-2-3.次レコードFETCH(1100C1FETCHSOR)
CALL 'br_fetch_next' USING SQLCODE
SQLCODE=0の場合、br_get_colで各カラムを取得
SQLCODE≠0の場合、WRK-R01EOF='1'
2-2-4.社員別小計出力(キーブレイク)
【メッセージ編集】
メッセージ番号:33(情報メッセージ)
PARM1WRK-BFR-EMP-ID
PARM2CUN-EMP-SUB
PARM3'EMP SUB'
3.終了処理(3000STPSOR
3-1.出力ファイルのクローズ
3-2.件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(入力件数)
PARM1'LEAVE_RECORDS'
PARM2:入力件数
【メッセージ編集】
メッセージ番号:7(出力件数)
PARM1'KIN02W01'
PARM2:出力件数
【メッセージ編集】
メッセージ番号:33(情報)
PARM1'HOLIDAYS LOADED'
PARM2:休日テーブル件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/LEAVE-DAILY KIN02REC 80B FB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | WRK-BFR-EMP-ID | キーブレイク単位 |
| 2 | DATE | WRK-DATE-ALPHA | 展開された日付(YYYYMMDD) |
| 3 | LEAVE-TYPE | SQL-LEAVE-TYPE | 01/02/03/04 |
| 4 | START-TIME | SQL-START-TIME | 元申請の開始時刻(HHMM) |
| 5 | END-TIME | SQL-END-TIME | 元申請の終了時刻(HHMM) |
| 6 | APPL-ID | SQL-APPL-ID | APPLICATION_ID |
| 7 | FILLER | SPACE | 45B |
+155
View File
@@ -0,0 +1,155 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN04CHK |
| 3 | プログラム名 | 打刻項目チェック処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 項目チェック(重複なし) |
| 6 | 機能概要 | CSV形式の打刻データファイルを読み込み、項目チェックを行い、正常レコードをEDITED-PUNCHへ、異常レコードをERROR-LOGへ振り分ける。 |
| 7 | | チェックはIF多重ネスト(THEN句)で4段階:社員番号必須→日付妥当性→時刻妥当性→出勤<退勤 |
| 8 | | 正常出力はWRITE FROMを使用する(新規カバレッジ) |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | KIN04R01(CSV) | ソート不要。CSV形式(カンマ区切り、6項目) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | RAW-PUNCH | R01 | KIN04R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 |
| 2 | EDITED-PUNCH | W01 | KIN04W01 | O | KIN04REC | FB | | 80 | PS | WRITE FROM使用 |
| 3 | ERROR-LOG | W02 | KIN04W02 | O | KIN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | RAW-PUNCH | なし | なし |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン(R01:入力、W01/W02:出力)
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.CSVの分解(2010CSVSOR)
UNSTRINGでカンマ区切りのCSVを6項目に分解する。
(EMP-ID, DATE, TIME-IN, TIME-OUT, DEPT-ID, TERMINAL)
2.1.5.社員番号チェック(2021EMPIDSOR)
SUB04CHK('EMPID')により社員番号のフォーマットチェックを実施する。
SUB04CHKの復帰コードにより正常/異常を判定する。
2-2.IF多重ネストチェック(2020VALIDATESOR)
第1段階: フィールド数チェック + 社員番号チェック(2021EMPIDSOR)
IF フィールド数=6 THEN
2021EMPIDSORを実行
IF 社員番号正常 THEN
SUB04CHK('DATE')で日付チェック
IF 正常 THEN
SUB04CHK('TIME')で時刻チェック(出勤)
IF 正常 THEN
SUB04CHK('TIME')で時刻チェック(退勤)
IF 正常 THEN
IF 出勤時刻 < 退勤時刻 THEN
WRITE FROMでW01出力(2050NORMSOR)
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
2021EMPIDSOR (社員番号チェック)
本Paragraphは2020VALIDATESORの第1段階(フィールド数OK時)に
PERFORMされる。
SUB04CHK('EMPID')により社員番号のフォーマットチェックを実施する。
復帰コード=ZEROなら正常、≠ZEROなら異常として呼び出し元に戻る。
2-3.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'KIN04R01'
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'KIN04W01'、'KIN04W02'
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/EDITED-PUNCH KIN04REC 80B FB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | WRK-CSV-EMP-ID | 社員番号 |
| 2 | WORK-DATE | WRK-CSV-DATE | YYYYMMDD |
| 3 | STR-TIME | WRK-CSV-TIME-IN | HHMM |
| 4 | END-TIME | WRK-CSV-TIME-OUT | HHMM |
| 5 | DEPT-ID | WRK-CSV-DEPT-ID | 部署ID |
| 6 | TERMINAL | WRK-CSV-TERMINAL | 端末ID |
| 7 | FILLER | SPACE | 46B |
### 出力ファイル2W02/ERROR-LOG KIN05REC 200B VB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | '02'固定 | 打刻エラー |
| 2 | ERR-DETAIL | STRING編集 | エラー内容(198B) |
+128
View File
@@ -0,0 +1,128 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN05MAT |
| 3 | プログラム名 | 打刻休暇照合処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:N) |
| 6 | 機能概要 | EDITED-PUNCH(打刻側、R01)とLEAVE-DAILY(休暇側、R02)を社員番号+日付キーで照合し、KIN-LEAVE(160B)に出力する。R01側が主駆動で、1件の打刻に対してN件の休暇レコードが存在しうる(1:N)。 |
| 7 | | マッチング制御はEVALUATE TRUEで3分岐:R01key<R02key(打刻のみ)、R01key=R02key(マッチ)、R01key>R02key(休暇のみスキップ)。 |
| 8 | | マッチ時は休暇種別優先順位(01>02>03>04)で最適な1件を選定し、KIN-LEAVEに出力する。 |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | KIN04W01(R01) | 社員番号+日付で昇順ソート済み(JCL SORT KINJ022 |
| 2 | KIN02W01(R02) | 社員番号+日付で昇順ソート済み(KIN03EXP出力保証) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EDITED-PUNCH | R01 | KIN04W01 | I | KIN04REC | FB | | 80 | PS | 打刻側、主駆動 |
| 2 | LEAVE-DAILY | R02 | KIN02W01 | I | KIN02REC | FB | | 80 | PS | 休暇側、N件あり |
| 3 | KIN-LEAVE | W01 | KIN05W01 | O | KIN03REC | FB | | 160 | PS | 照合結果 |
### ファイルステータス
| ファイル | DD名 | ファイルステータス項目 |
|---------|------|---------------------|
| EDITED-PUNCH(R01) | KIN04W01 | WS-R01-STATUS |
| LEAVE-DAILY(R02) | KIN02W01 | WS-R02-STATUS |
| KIN-LEAVE(W01) | KIN05W01 | WS-W01-STATUS |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | EDITED-PUNCH | 社員番号(1-8B)+日付(9-16B) | 主キー(R01) |
| 2 | LEAVE-DAILY | 社員番号(1-8B)+日付(9-16B) | 従キー(R02)、N件あり |
### 使用モジュール一覧
| 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.ワークエリアの初期化
1-4.使用ファイルのオープン(R01/R02:入力、W01:出力)
1-4-1.OPENチェック
各ファイルのFILE STATUS(WS-R01-STATUS/WS-R02-STATUS/WS-W01-STATUS)を確認
ステータス≠00の場合、SUB03END(ZANENDAC)で異常終了
1-5.R01を読み込む。(1100R01INNSOR)(1回目)
1-6.R02を読み込む。(1200R02INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.R02キー設定
R02が有効な場合、R02レコードからWRK-R02KEYを設定。
2-2.EVALUATE TRUE マッチング制御
WHEN R01key < R02key OR R02-EOF:
打刻のみ(休暇なし)→ KIN-LEAVE出力(LEAVE-TYPE='99', HOURS=0)
R01を次へ読み込み
WHEN R01key = R02key:
マッチング処理実行(2020MATCHSOR)
R01を次へ読み込み
R02も次へ読み込み(N:1の場合はループ内で全R02処理)
WHEN R01key > R02key:
R02のみ(該当打刻なし)→ スキップ
R02を次へ読み込み
2-3.上記をR01終了まで繰り返す。
3.マッチング処理(2020MATCHSOR
R02がEOFになるか、キーが変わるまで、以下のループを実行:
3-1.現在のR02レコードから休暇種別・時刻・申請IDを取得
3-2.選定ロジック:
- 初回 → ベストとして保持
- 既にベストあり → 優先順位で比較(01>02>03>04)
- 同種別 → 申請IDの小さい方を採用
3-3.R02を次へ読み込み
3-4.キーが一致しなくなるかR02-EOFまで3-1〜3-3を繰り返す
3-5.ベストの休暇情報をKIN-LEAVEに出力
ベストがない場合は'99'として出力
4.終了処理(3000STPSOR
4-1.入出力ファイルのクローズ
4-2.入出力件数出力メッセージ出力
4-3.終了メッセージ出力
```
---
## 出力レコード定義
### 出力ファイル(W01/KIN-LEAVE KIN03REC 160B FB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01EMP-ID | 打刻情報(1-80BはEDITED-PUNCHと同一) |
| 2 | WORK-DATE | R01WORK-DATE | |
| 3 | STR-TIME | R01STR-TIME | |
| 4 | END-TIME | R01END-TIME | |
| 5 | DEPT-ID | R01DEPT-ID | |
| 6 | TERMINAL | R01TERMINAL | |
| 7-13 | 休暇情報 | マッチ結果 | 81-160B |
| 7 | LEAVE-TYPE | 選定結果 | '01'〜'04' or '99' |
| 8 | LEAVE-STR-TIME | 選定したR02START-TIME | |
| 9 | LEAVE-END-TIME | 選定したR02END-TIME | |
| 10 | LEAVE-HOURS | ZERO | KIN07DAIで後に計算 |
| 11 | APPLICATION-ID | 選定したR02APPL-ID | 該当なしはZERO |
+116
View File
@@ -0,0 +1,116 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN06CLD |
| 3 | プログラム名 | 出勤日カレンダー生成処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | レイアウト編集のみ(GETPUT) |
| 6 | 機能概要 | PARMで指定された年月の出勤日カレンダーを生成する。在籍社員一覧をDBから取得し、各社員について当月1日〜月末日をPERFORM VARYINGでループ。休日判定(PERFORM VARYING線形探索 + 曜日判定)を行い、出勤日のみWORK-DAY-FILEに出力する。 |
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|----------------|------|
| 1 | EMP_MASTER | 在籍社員(STATUS='1')が登録済みであること |
| 2 | HOLIDAY_CALENDAR | 対象年月の休日が登録済みであること |
### PARM引数
コマンドラインで `YEARMONTH=YYYYMM` 形式で指定。必須。
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|
| 1 | WORK-DAY-FILE | OUTREC | KIN06W01 | O | KIN06REC | FB | | 80 | PS |
### 使用DBテーブル
| NO | テーブル名 | 処理内容 |
|----|-----------|---------|
| 1 | EMP_MASTER | SELECT EMP_ID WHERE STATUS='1' ORDER BY EMP_ID (CURSOR) |
| 2 | HOLIDAY_CALENDAR | SELECT HOLIDAY_DATE WHERE HOLIDAY_DATE LIKE 'YYYYMM%' → WORKING-STORAGE格納 |
### 使用モジュール一覧
| 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解析(YEARMONTH=YYYYMM から対象年月を抽出)
必須チェック:PARMなし→ABEND
形式チェック:YEARMONTH= から始まること
値範囲:XXXX01〜XXXX12
月チェック(1-12): WRK-MONTH < 1 OR > 12 → ABEND(CALL SUB03END)
1-4.ワークエリア初期化
1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
1-6.休日データ読込(HOLIDAY_CALENDARから対象月の祝日をSELECT
テーブルに格納(PERFORM VARYING線形探索用)
【ガード】HOLIDAY-COUNTが50未満の場合のみADD+参照を行う(テーブル溢れ防止)
ループ条件で HOLIDAY-COUNT < 50 をチェック(HOLIDAY-COUNT PIC 9(2)対応)
1-7.出力ファイルOPEN
1-8.社員一覧取得(EMP_MASTER CURSOR OPEN→初回FETCH
2.主処理(2000MAJSOR)(社員EOFまで下記を繰り返す)
2-1.当月1日〜月末日をループ(PERFORM VARYING
2-1-1.日付文字列構築(YYYYMMDD
2-1-2.曜日計算(INTEGER-OF-DATE
- INTEGER-OF-DATE('YYYYMMDD') で通算日数を取得
- MOD(通算日数, 7) で曜日:0=日, 1=月, 2=火, …, 6=土
2-1-3.休日判定(PERFORM VARYING線形探索)
祝日テーブルを先頭から線形探索(部分埋めテーブル対応のためSEARCH ALL不使用)
2-1-4.曜日判定
土曜(0) または 日曜(6)→休日としてスキップ(CONTINUE)
2-1-5.出勤日 → WRITE FROMで出力(社員番号+日付+曜日)
2-2.次の社員をFETCH
3.終了処理(3000STPSOR
3-1.CURSOR CLOSE
3-2.DB切断
3-3.出力ファイルCLOSE
3-4.出力件数メッセージ出力
3-5.終了メッセージ出力
```
### 曜日計算
INTEGER-OF-DATE('YYYYMMDD') は1601-01-01からの通算日数を返す。
- 1601-01-01 = Monday → MOD(x,7)0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat
### 休日判定ロジック
1. HOLIDAY_CALENDARに日付が存在する → 休日(PERFORM VARYING線形探索)
2. 曜日が土曜(6)または日曜(0) → 休日
3. 上記以外 → 出勤日
---
## 出力レコード定義
### 出力ファイル(OUTREC/WORK-DAY-FILEKIN06REC 80B FB
| No | 項目名 | 設定元 | 属性 | 備考 |
|----|--------|--------|------|------|
| 1 | EMP-ID | 社員マスタのEMP_ID | X(8) | 社員番号 |
| 2 | DATE | ループ変数 | 9(8) | YYYYMMDD |
| 3 | DAY-OF-WEEK | 曜日計算結果 | 9(1) | 1=月…7=日 |
| 4 | FILLER | SPACE | X(63) | |
+167
View File
@@ -0,0 +1,167 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN07DAI |
| 3 | プログラム名 | 日別勤怠計算処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:N) + EVALUATE 4パターン分岐 |
| 6 | 機能概要 | WORK-DAY-FILE(主駆動)とKIN-LEAVE/LEAVE-DAILYを社員番号+日付で照合し、 |
| 7 | | 4パターンに分岐して日別勤怠記録(DAILY-RECORD)を出力する。 |
| 8 | | パターンA: 打刻+休暇あり / B: 打刻のみ / C: 休暇のみ / D: 欠勤 |
| 9 | | 休暇時間はランチ除外+0.1h切上丸め。MULTIPLY/SUBTRACT時間計算。 |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | R01(WORK-DAY-FILE) | 社員番号+日付の昇順でソートされていること |
| 2 | R02(KIN-LEAVE) | 社員番号+日付の昇順でソートされていること |
| 3 | R03(LEAVE-DAILY) | 社員番号+日付の昇順でソートされていること |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|---------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | WORK-DAY-FILE | R01 | KIN07R01 | I | KIN06REC | FB | | 80 | PS | 出勤日カレンダー(COPY句定義書.md参照) |
| 2 | KIN-LEAVE | R02 | KIN07R02 | I | KIN03REC | FB | | 160 | PS | 打刻+休暇照合結果(COPY句定義書.md参照) |
| 3 | LEAVE-DAILY | R03 | KIN07R03 | I | KIN02REC | FB | | 80 | PS | 日別展開休暇(COPY句定義書.md参照) |
| 4 | DAILY-RECORD | W01 | KIN07W01 | O | KIN07REC | FB | | 200 | PS | 日別勤怠計算結果(COPY句定義書.md参照) |
| 5 | ERROR-LOG | W02 | KIN07E01 | O | KIN05REC | VB | | 200 | PS | エラーログ(COPY句定義書.md参照) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) |
| 2 | ファイルR02 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) |
| 3 | ファイルR03 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力 | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理 | SUB03END | ZANENDAC |
| 3 | 時刻丸め計算(0.1h切上) | SUB05TIM | ZANTIMAC |
---
## 処理詳細
```
1.初期処理 (1000ITTSOR)
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化(INITIALIZE WRKARA
1-4.入出力ファイルOPEN
INPUT: R01INNFIL, R02INNFIL, R03INNFIL
OUTPUT: W01OUTFIL, W02OUTFIL
1-5.R01を読み込む。(1100R01INNSOR)(1回目)
1-6.R02を読み込む。(1200R02INNSOR)(1回目)
1-7.R03を読み込む。(1300R03INNSOR)(1回目)
2.主処理 (2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.キー比較:R01とR02/R03のキーを比較し、PATTERN-NUMを設定
【MULTIPLY使用】時間→分換算時にMULTIPLY文を使用
【SUBTRACT使用】ランチ除外時にSUBTRACT文を使用
2-2.パターン判定(EVALUATE)
EVALUATE PATTERN-NUM
WHEN 1 → PERFORM 6100PATTERNASOR (打刻+休暇)
WHEN 2 → PERFORM 6200PATTERNSOR (打刻のみ)
WHEN 3 → PERFORM 6300PATTERNSOR (休暇のみ)
WHEN 4 → PERFORM 6400PATTERNSOR (欠勤)
END-EVALUATE
2-3.【パターンA(6100PATTERNASOR)】:R01+R02+R03(打刻+休暇)
2-3-1.打刻情報設定:R02の出勤時刻/退勤時刻をDAILY-RECORDに設定
2-3-2.休暇時間計算:R03の開始時刻/終了時刻からランチ除外+丸め計算
MULTIPLY: WRK-START-HOUR × 60 GIVING WRK-START-MIN(時→分変換)
SUBTRACT: ランチ時間(60分)をWRK-START-MINから除外
2-3-3.SUB05TIM呼出(モード1:0.1h切上)
【CALL 'SUB05TIM'】
CALL 'SUB05TIM' USING T01TIMPAR
T01TIMHRS=WRK-LEAVE-HOURS, T01TIMRRC=1(0.1h切上モード)
T01TIMOUTをWRK-LEAVE-HOURSに退避
2-3-4.DAILY-RECORD出力
2-3-5.R01/R02/R03次読込
2-4.【パターンB(6200PATTERNSOR)】:R01+R02のみ(打刻のみ)
2-4-1.打刻情報設定:R02の出勤時刻/退勤時刻をDAILY-RECORDに設定
2-4-2.休暇時間=0, 欠勤=0
2-4-3.DAILY-RECORD出力
2-4-4.R01/R02次読込(R03はキー不一致のため読込済み)
2-5.【パターンC(6300PATTERNSOR)】:R01+R03のみ(休暇のみ)
2-5-1.打刻情報=0000
2-5-2.休暇時間計算:ランチ除外+丸め(所定労働時間8h上限)
MULTIPLY/SUBTRACT使用(パターンAと同様)
WRK-LEAVE-HOURS > 8.0 → 8.0に制限
2-5-3.SUB05TIM呼出(モード1:0.1h切上)
2-5-4.DAILY-RECORD出力
2-5-5.R01/R03次読込(R02はキー不一致のため読込済み)
2-6.【パターンD(6400PATTERNSOR)】:R01のみ(欠勤)
2-6-1.打刻情報=0000, 休暇=0
2-6-2.未申請欠勤=8.0h
2-6-3.DAILY-RECORD出力
2-6-4.R01次読込(R02/R03はキー不一致のため読込済み)
2-7.各パターンセクションはPERFORMで呼び出され、EXITで自動復帰
主処理ループ(2000MAJSOR)に戻り、次のR01レコードを処理する。
3.終了処理(3000STPSOR)
3-1.入出力ファイルのクローズ
3-2.入出力件数出力
【メッセージ編集】
メッセージ番号:6(入力件数)
PARM1:該当ファイルDD名
PARM2:該当ファイル件数
メッセージ番号:7(出力件数)
PARM1:該当ファイルDD名
PARM2:該当ファイル件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
4.メッセージ出力(4000MSGOUTSOR)
SUB02MSG呼出し
9.ABEND処理(9999ABDSOR)
SUB03END呼出し
```
---
## 出力レコード定義
### 出力ファイル1W01: DAILY-RECORD
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | SD-EMP-ID | SW-EMP-ID(R01) | 社員番号 |
| 2 | SD-DATE | SW-DATE(R01) | YYYYMMDD |
| 3 | SD-TIME-IN | SR-STR-TIME(R02) or '0000' | 出勤時刻(パターンC/Dは0000) |
| 4 | SD-TIME-OUT | SR-END-TIME(R02) or '0000' | 退勤時刻(パターンC/Dは0000) |
| 5 | SD-ANNUAL-H | R03(LEAVE-TYPE='01')より計算 | 年休使用時間(ランチ除外+丸め) |
| 6 | SD-PERSONAL-H | R03(LEAVE-TYPE='02')より計算 | 事假時間 |
| 7 | SD-OFFICIAL-H | R03(LEAVE-TYPE='03')より計算 | 因公特批假時間 |
| 8 | SD-SICK-H | R03(LEAVE-TYPE='04')より計算 | 病欠時間 |
| 9 | SD-ABSENT-H | パターンDのみ8.0固定 | 未申請欠勤時間 |
| 10 | SD-FILLER | SPACE | 予備領域 |
### 出力ファイル2W02: ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | WEERR-CATEGORY | '99'固定 | エラー区分(未使用だが予約) |
| 2 | WEERR-DETAIL | STRING編集 | エラー詳細(SUB05TIM異常時等) |
+211
View File
@@ -0,0 +1,211 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN08DBU |
| 3 | プログラム名 | 勤怠DB更新処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | DB更新 + SYSIN読込(P28) |
| 6 | 機能概要 | DAILY-RECORDを読込み、DAILY_RECORDSにINSERT。社員別月次集計後、MONTHLY_ABSENCEにUPSERT。集計結果をABSENCE_SUMMARYファイルに出力する。SYSIN制御カード(T/P/Mの3種)をGO TO DEPENDING ONで分岐処理する。 |
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|----------------|------|
| 1 | DAILY-RECORD | KIN07DAIが出力した日別勤怠計算結果が存在すること |
| 2 | DAILY_RECORDS | 同一日付のレコードが既に存在してもMODE=NORMALではUPSERT動作 |
| 3 | MONTHLY_ABSENCE | 集計対象月の統計レコードが未作成でもINSERTできること |
| 4 | SYSIN | 省略時は全社員対象、NORMALモードで動作 |
### SYSIN制御カード仕様
| カード種別 | 第1桁 | フォーマット | 説明 |
|-----------|:-----:|-------------|------|
| TARGET | T | `T 社員番号,社員番号,...` | 集計対象社員指定。省略時=全社員 |
| PERIOD | P | `P YEARMONTH=YYYYMM` | 処理対象年月。必須 |
| MODE | M | `M MODE=RESET\|NORMAL` | RESET=既存削除後再INSERT、NORMAL=UPSERT |
| コメント | * | `* 任意コメント` | 読み飛ばし |
| 不明 | 他 | — | DISPLAYで警告表示 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|
| 1 | DAILY-RECORD | INREC | KIN08R01 | I | KIN07REC | FB | | 200 | PS |
| 2 | ABSENCE-SUMMARY | OUTREC | KIN08W01 | O | KIN08REC | FB | | 80 | PS |
| 3 | SYSIN | SYSIN | KIN08S01 | I | — | FB | | 80 | PS |
### 使用DBテーブル
| NO | テーブル名 | 処理内容 |
|----|-----------|---------|
| 1 | DAILY_RECORDS | INSERTMODE=NORMAL時) / DELETE+INSERTMODE=RESET時) |
| 2 | MONTHLY_ABSENCE | SELECT COUNT(*) → IF >0 UPDATE ELSE INSERTUPSERT |
| 3 | SICK_LEAVE_RATE | SELECT DEDUCTION_RATE WHERE LEAVE_TYPE='04' |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |
| 3 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリア初期化
1-4.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
1-5.SYSINファイルOPEN
1-6.SYSIN読込ループ(EOFまで)
READ SYSINFILE INTO WS-SYSIN-REC
AT END SET SYSIN-EOF TO TRUE
END-READ.
カード種別判定(WS-SYSIN-REC(1:1)):
'T' → MOVE 1 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
'P' → MOVE 2 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
'M' → MOVE 3 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
'*' → コメント行としてDISPLAY表示後スキップ(CONTINUE
他 → DISPLAY 'WARNING: Unknown card type [x]'
1-7.必須パラメータ未設定チェック
Pカード未読込 → ABEND(CALL SUB03END)
1-8.集計対象社員テーブル設定(Tカード省略時は全社員フラグON)
1-9.入力ファイルOPENDAILY-RECORD
1-10.出力ファイルOPENABSENCE-SUMMARY
2.主処理(2000MAJSOR)(R01 EOFまで下記を繰り返す)
2-1.DAILY-RECORD読込(READ INTO
【ガード】社員番号の有効性チェック
INSPECT WS-EMP-ID TALLYING WS-ZERO-CNT FOR LEADING '0'
空文字判定 → DISPLAY警告
2-2.DAILY_RECORDS INSERT
EXEC SQL INSERT INTO DAILY_RECORDS (...) VALUES (:WS-...)
IF SQLCODE NOT = 0 → DISPLAY警告 + 9100DBERRSOR
2-3.社員別月次集計(PERFORM VARYING 内部テーブル)
該当社員の集計行を線形探索
集計計算(COMPUTE ROUNDED ON SIZE ERROR
COMPUTE WS-TOTAL-HOURS ROUNDED =
WS-ANNUAL-H + WS-PERSONAL-H + WS-OFFICIAL-H
+ WS-SICK-H + WS-ABSENT-H
ON SIZE ERROR
DISPLAY 'WARNING: Total hours overflow '
WS-EMP-ID ' date ' WS-DATE
MOVE ZERO TO WS-TOTAL-HOURS
END-COMPUTE
3.終了処理(3000STPSOR
3-1.MODE判定
MODE=RESETの場合:
EXEC SQL DELETE FROM MONTHLY_ABSENCE
WHERE YEAR_MONTH = :WS-YEAR-MONTH
3-2.集計結果のMONTHLY_ABSENCE書出(PERFORM VARYING 集計テーブル)
各社員・月ごとに:
EXEC SQL SELECT COUNT(*) INTO WS-CNT
FROM MONTHLY_ABSENCE
WHERE EMP_ID = :WS-EMP-ID
AND YEAR_MONTH = :WS-YEAR-MONTH
IF WS-CNT > 0
EXEC SQL UPDATE MONTHLY_ABSENCE SET ...
ELSE
EXEC SQL INSERT INTO MONTHLY_ABSENCE (...)
END-IF
IF SQLCODE NOT = 0 → 9100DBERRSOR
3-3.ABSENCE_SUMMARYファイル出力
STRINGで編集後 WRITE
3-4.EXEC SQL COMMIT
3-5.全CURSOR/ファイルCLOSE
3-6.出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(出力件数)
PARM1'DAILY_RECORDS'
PARM2CUN-DBXINSINSERT件数)
3-7.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
### SYSINカード処理詳細
```
2100-TARGETSOR SECTION.
UNSTRING WS-SYSIN-REC(3:) DELIMITED BY ','
INTO WS-TARGET-EMP(1) WS-TARGET-EMP(2) ...
TALLYING IN WS-EMP-COUNT
END-UNSTRING.
DISPLAY 'TARGET EMPLOYEES: ' WS-EMP-COUNT ' persons'.
EXIT.
GO TO 2000-EXIT.
2200-PERIODSOR SECTION.
UNSTRING WS-SYSIN-REC(3:) DELIMITED BY '='
INTO WS-PARM-NAME WS-PARM-VALUE
END-UNSTRING.
MOVE WS-PARM-VALUE TO WS-YEAR-MONTH.
DISPLAY 'PERIOD: ' WS-YEAR-MONTH.
EXIT.
GO TO 2000-EXIT.
2300-MODESOR SECTION.
INSPECT WS-SYSIN-REC
REPLACING ALL 'MODE=' BY SPACES.
MOVE WS-SYSIN-REC(3:) TO WS-MODE-VALUE.
IF WS-MODE-VALUE = 'RESET'
SET RESET-MODE TO TRUE
ELSE
SET NORMAL-MODE TO TRUE
END-IF.
DISPLAY 'MODE: ' WS-MODE-VALUE.
EXIT.
GO TO 2000-EXIT.
```
---
## 出力レコード定義
### ABSENCE-SUMMARYOUTREC/KIN08REC80B FB
| No | 項目名 | 設定元 | 属性 | 備考 |
|----|--------|--------|------|------|
| 1 | EMP-ID | MONTHLY_ABSENCE.EMP_ID | X(8) | 社員番号 |
| 2 | YEAR-MONTH | MONTHLY_ABSENCE.YEAR_MONTH | X(6) | YYYYMM |
| 3 | ANNUAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 年休使用合計 |
| 4 | PERSONAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 事假合計 |
| 5 | OFFICIAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 因公特批假合計 |
| 6 | SICK-LEAVE-H | 集計結果 | 9(4)V9(1) | 病欠合計 |
| 7 | UNAPPROVED-ABSENT-H | 集計結果 | 9(4)V9(1) | 未申請欠勤合計 |
| 8 | FILLER | SPACE | X(24) | |
---
## カバレッジ構文一覧
| 構文 | 用途 |
|------|------|
| READ SYSIN(パターン28) | 制御カード読込 ← 新規パターン |
| GO TO DEPENDING ON | カード種別による3分岐 ← 新規 |
| DISPLAY | 警告メッセージ表示 ← 新規 |
| INSPECT TALLYING | 社員番号空チェック、カンマ区切り数検証 |
| COMPUTE ROUNDED ON SIZE ERROR | 時間計算桁あふれ処理 ← 新規 |
| EXEC SQL DELETE | RESETモード既存削除 ← 新規 |
| EXEC SQL INSERT / UPDATE / SELECT | DB操作 |
| PERFORM VARYING | 社員別集計ループ |
| UNSTRING | SYSINカード値解析 |
| STRING | メッセージ編集 |
+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 | 警告メッセージ表示 |
@@ -0,0 +1,52 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | SUB01DAT |
| 3 | プログラム名 | 運用日付取得サブ |
| 4 | PGMタイプ | サブ |
| 5 | PGMパターン | - |
| 6 | 機能概要 | 現在日付を取得し、運用日付(YYYYMMDD)として返す |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法
```
CALL 'SUB01DAT' USING D01UBSPAR
```
### 入出力パラメータ
| COPY句 | ZANDATAC |
|------------|----------|
| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 |
|----|-----------|------|------|------|------|
| 1 | O | D01FKICOD | S9(4) COMP | 4 | 復帰コード(0000:正常) |
| 2 | O | D01UBSUDATE | 9(8) | 8 | 運用日付(YYYYMMDD) |
### リターンコード一覧
| NO | コード | 説明 |
|----|--------|------|
| 1 | 0000 | 正常終了 |
---
## 処理詳細
```
1.制御処理(0000MAINSOR
1-1.現在日時を取得する。
MOVE FUNCTION CURRENT-DATE TO WRK-SYS-DATE.
1-2.YYYYMMDD部分を抽出する。
MOVE WRK-SYS-DATE(1:8) TO D01UBSUDATE.
1-3.正常終了
MOVE ZERO TO D01FKICOD.
1-4.復帰(GOBACK)。
```
@@ -0,0 +1,72 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | SUB02MSG |
| 3 | プログラム名 | メッセージ編集出力サブ |
| 4 | PGMタイプ | サブ |
| 5 | PGMパターン | - |
| 6 | 機能概要 | メッセージ番号とパラメータを編集し、標準出力へ出力する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法
```
CALL 'SUB02MSG' USING M00MHOPAR
```
### 入出力パラメータ
| COPY句 | ZANMSGAC |
|------------|----------|
| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 |
|----|-----------|------|------|------|------|
| 1 | I | M00MSGCOD | 9(3) | 3 | メッセージ番号 |
| 2 | I | M00UMKDATS22-01 | X(30) | 30 | パラメータ1 |
| 3 | I | M00UMKDATS22-02 | X(30) | 30 | パラメータ2 |
| 4 | I | M00UMKDATS22-03 | X(30) | 30 | パラメータ3 |
| 5 | I | M00UMKDATS22-04 | X(30) | 30 | パラメータ4 |
| 6 | I | M00UMKDATS22-05 | X(30) | 30 | パラメータ5 |
| 7 | I | M00UMKDATS22-06 | X(30) | 30 | パラメータ6 |
| 8 | I | M00UMKDATS22-07 | X(30) | 30 | パラメータ7 |
| 9 | I | M00UMKDATS22-08 | X(30) | 30 | パラメータ8 |
| 10 | I | M00UMKDATS22-09 | X(30) | 30 | パラメータ9 |
| 11 | I | M00UMKDATS22-10 | X(30) | 30 | パラメータ10 |
### リターンコード一覧
| NO | コード | 説明 |
|----|--------|------|
| 1 | - | 復帰コードなし(GOBACKで復帰) |
---
## 処理詳細
```
1.制御処理(0000MAINSOR
1-1.メッセージ行(WRK-MSG-LINE)を編集する。
STRING 'MSG['
M00MSGCOD
'] P1='
M00UMKDATS22-01
' P2='
M00UMKDATS22-02
' P3='
M00UMKDATS22-03
' P4='
M00UMKDATS22-04
' P5='
M00UMKDATS22-05
INTO WRK-MSG-LINE
END-STRING.
1-2.標準出力へ出力する。
DISPLAY WRK-MSG-LINE.
1-3.復帰(GOBACK)。
```
@@ -0,0 +1,51 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | SUB03END |
| 3 | プログラム名 | ABEND処理サブ |
| 4 | PGMタイプ | サブ |
| 5 | PGMパターン | - |
| 6 | 機能概要 | ABENDコードを表示し、異常終了する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法
```
CALL 'SUB03END' USING E01ABDPAR
```
### 入出力パラメータ
| COPY句 | ZANENDAC |
|------------|----------|
| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 |
|----|-----------|------|------|------|------|
| 1 | I | E01ABDCOD | 9(3) | 3 | ABENDコード |
### リターンコード一覧
| NO | コード | 説明 |
|----|--------|------|
| 1 | - | ABENDするため復帰コードなし(STOP RUN実行) |
---
## 処理詳細
```
1.制御処理(0000MAINSOR
1-1.ABENDメッセージを編集する。
MOVE 'ABEND CODE=' TO WRK-ABEND-MSG.
MOVE E01ABDCOD TO WRK-ABEND-MSG(12:3).
1-2.メッセージを表示する。
DISPLAY WRK-ABEND-MSG.
1-3.異常終了する。
STOP RUN.
```
+115
View File
@@ -0,0 +1,115 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | SUB04CHK |
| 3 | プログラム名 | 項目チェックサブ |
| 4 | PGMタイプ | サブ |
| 5 | PGMパターン | 項目チェック |
| 6 | 機能概要 | チェックタイプに応じてデータ妥当性を検証する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法
```
CALL 'SUB04CHK' USING C01CHKPAR
```
### 入出力パラメータ
| COPY句 | ZANCHKAC |
|------------|----------|
| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 |
|----|-----------|------|------|------|------|
| 1 | I | C01CHKTYP | X(8) | 8 | チェックタイプ(DATE/TIME/NUM/EMPID) |
| 2 | I | C01CHKDAT | X(80) | 80 | チェック対象データ |
| 3 | O | C01CHKRRC | 9(4) | 4 | 復帰コード(0000:正常,0001:日付不正,0002:時刻不正,0003:数字不正) |
### リターンコード一覧
| NO | コード | 説明 |
|----|--------|------|
| 1 | 0000 | 正常終了(チェックOK) |
| 2 | 0001 | 日付不正(DATE指定時、月01〜12/日01〜31範囲外) |
| 3 | 0002 | 時刻不正(TIME指定時、時00〜23/分00〜59範囲外) |
| 4 | 0003 | 数字不正(NUM指定時、非数字文字を含む) |
| 5 | 0004 | 社員番号不正(EMPID指定時、8桁以外または空欄) |
| 6 | 9999 | チェックタイプ不明 |
---
## 処理詳細
```
1.制御処理(0000MAINSOR
1-1.C01CHKTYPにより分岐する。
1-1-1.C01CHKTYP = 'DATE' の場合
1000CHKDATEへ。
1-1-2.C01CHKTYP = 'TIME' の場合
2000CHKTIMEへ。
1-1-3.C01CHKTYP = 'NUM' の場合
3000CHKNUMへ。
1-1-4.C01CHKTYP = 'EMPID' の場合
4000CHKEMPへ。
1-1-5.その他の場合
C01CHKRRC = 9999 を設定し、1-2へ。
1-2.復帰(GOBACK)。
2.日付チェック(1000CHKDATE
2-1.C01CHKDATから年月日を抽出する。
YYYY = C01CHKDAT(1:4)
MM = C01CHKDAT(5:2)
DD = C01CHKDAT(7:2)
2-2.月チェック(MM)
2-2-1.MM < 1 OR MM > 12
→ C01CHKRRC = 0001 を設定し、2-5へ。
2-3.日チェック(DD)
2-3-1.DD < 1 OR DD > 31
→ C01CHKRRC = 0001 を設定し、2-5へ。
2-4.正常の場合
C01CHKRRC = 0000 を設定する。
2-5.復帰(0000MAINSOR-EXTへ)。
3.時刻チェック(2000CHKTIME
3-1.C01CHKDATから時分を抽出する。
HH = C01CHKDAT(1:2)
MM = C01CHKDAT(3:2)
3-2.時チェック(HH)
3-2-1.HH > 23
→ C01CHKRRC = 0002 を設定し、3-5へ。
3-3.分チェック(MM)
3-3-1.MM > 59
→ C01CHKRRC = 0002 を設定し、3-5へ。
3-4.正常の場合
C01CHKRRC = 0000 を設定する。
3-5.復帰(0000MAINSOR-EXTへ)。
4.数字チェック(3000CHKNUM
4-1.C01CHKDATにSPACEより前の文字があるかチェックする。
INSPECT C01CHKDAT TALLYING WRK-NN FOR
CHARACTERS BEFORE INITIAL SPACE.
4-2.WRK-NN > 0 の場合
C01CHKRRC = 0003 を設定し、4-4へ。
4-3.正常の場合
C01CHKRRC = 0000 を設定する。
4-4.復帰(0000MAINSOR-EXTへ)。
5.社員番号チェック(4000CHKEMP
5-1.桁数チェック(8桁以内)
C01CHKDAT(9:72)にSPACES以外がある場合
C01CHKRRC = 0004 を設定し、5-4へ。
5-2.空欄チェック
INSPECT C01CHKDAT(1:8) TALLYING WRK-NN FOR
CHARACTERS BEFORE INITIAL SPACE.
WRK-NN > 0 の場合
C01CHKRRC = 0004 を設定し、5-4へ。
5-3.正常の場合
C01CHKRRC = 0000 を設定する。
5-4.復帰(0000MAINSOR-EXTへ)。
```
+107
View File
@@ -0,0 +1,107 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | SUB05TIM |
| 3 | プログラム名 | 時刻丸め計算サブ |
| 4 | PGMタイプ | サブ |
| 5 | PGMパターン | - |
| 6 | 機能概要 | 時間値を指定単位で丸め計算する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 使用方法
```
CALL 'SUB05TIM' USING T01TIMPAR
```
### 入出力パラメータ
| COPY句 | ZANTIMAC |
|------------|----------|
| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 |
|----|-----------|------|------|------|------|
| 1 | I | T01TIMHRS | 9(4)V9(1) | 4.1 | 入力時間(HH.h) |
| 2 | O | T01TIMOUT | 9(4)V9(1) | 4.1 | 出力時間(丸め後) |
| 3 | I | T01TIMRRC | 9(4) | 4 | 丸めモード(0:0.5h切上,1:0.1h切上,2:0.1h切捨,3:単純四捨五入) |
### リターンコード一覧
| NO | コード | 説明 |
|----|--------|------|
| 1 | 0000 | 正常終了 |
---
## 処理詳細
```
1.制御処理(0000MAINSOR
1-1.T01TIMRRCにより丸めモードを分岐する。
1-1-1.T01TIMRRC = 0 の場合(0.5時間単位・切上)
1000RNDHALFへ。
1-1-2.T01TIMRRC = 1 の場合(0.1時間単位・切上)
2000RNDUPへ。
1-1-3.T01TIMRRC = 2 の場合(0.1時間単位・切捨)
3000RNDDOWNへ。
1-1-4.T01TIMRRC = 3 の場合(単純四捨五入・0.1h単位)
4000RNDNORMALへ。
1-1-5.その他の場合
T01TIMOUT = T01TIMHRS をそのまま設定する。
1-2.復帰(GOBACK)。
2.0.5時間単位・切上(1000RNDHALF
2-1.T01TIMHRSを分に変換する。
WRK-MINUTES = T01TIMHRS * 60.
2-2.30分単位で切り上げる(DIVIDE REMAINDER)。
DIVIDE WRK-MINUTES BY 30
GIVING WRK-HOURS
REMAINDER WRK-REMAINDER.
2-2-1.WRK-REMAINDER > 0 の場合
WRK-HOURS = WRK-HOURS + 1.
2-2-2.WRK-REMAINDER = 0 の場合
そのまま。
2-3.時間に戻す。
T01TIMOUT = WRK-HOURS * 0.5.
2-4.復帰(0000MAINSOR-EXTへ)。
3.0.1時間単位・切上(2000RNDUP
3-1.T01TIMHRSを分に変換する。
WRK-MINUTES = T01TIMHRS * 60.
3-2.6分単位で切り上げる(DIVIDE REMAINDER)。
DIVIDE WRK-MINUTES BY 6
GIVING WRK-HOURS
REMAINDER WRK-REMAINDER.
3-2-1.WRK-REMAINDER > 0 の場合
WRK-HOURS = WRK-HOURS + 1.
3-2-2.WRK-REMAINDER = 0 の場合
そのまま。
3-3.時間に戻す。
T01TIMOUT = WRK-HOURS * 0.1.
3-4.復帰(0000MAINSOR-EXTへ)。
4.0.1時間単位・切捨(3000RNDDOWN
4-1.T01TIMHRSを分に変換する。
WRK-MINUTES = T01TIMHRS * 60.
4-2.6分単位で切り捨てる(DIVIDE REMAINDER)。
DIVIDE WRK-MINUTES BY 6
GIVING WRK-HOURS
REMAINDER WRK-REMAINDER.
4-3.時間に戻す。
T01TIMOUT = WRK-HOURS * 0.1.
4-4.復帰(0000MAINSOR-EXTへ)。
5.単純四捨五入・0.1h単位(4000RNDNORMAL
5-1.T01TIMHRSに0.05を加算する。
WRK-HOURS = T01TIMHRS + 0.05.
5-2.小数点第2位以下を切り捨てる。
T01TIMOUT = WRK-HOURS.
*> 9(4)V9(1)へのMOVEにより自動で切捨
5-3.復帰(0000MAINSOR-EXTへ)。
```
+144
View File
@@ -0,0 +1,144 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN01CHK |
| 3 | プログラム名 | 残業申請振分処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 振り分け |
| 6 | 機能概要 | CSV形式の残業申請ファイルを読み込み、ステータスによって振り分ける。 |
| 7 | | ステータス0/1:有効申請としてOVT-VALIDに出力 |
| 8 | | ステータス9:取消申請としてOVT-CANCELに出力 |
| 9 | | その他:エラーとしてERROR-LOGに出力 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | OVT-APPLY(CSV) | ソート不要。CSV形式(カンマ区切り) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-APPLY | R01 | ZAN01R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 |
| 2 | OVT-VALID | W01 | ZAN01W01 | O | ZAN01REC | FB | | 80 | PS | |
| 3 | OVT-CANCEL | W02 | ZAN01W02 | O | ZAN01REC | FB | | 80 | PS | |
| 4 | ERROR-LOG | W03 | ZAN01W03 | O | ZAN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | OVT-APPLY | なし | なし |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.CSVの分解
UNSTRINGでカンマ区切りのCSVを各項目に分解する。(2010CSVSOR)
2-2.ステータス判定
2-2-1.ステータスが0または1の場合
項目チェックを実施し、エラーがあればERROR-LOGに出力、なければOVT-VALIDに出力。(2020VALIDATESOR)
2-2-1-1.日付チェック(SUB04CHK)。エラー→W03出力
2-2-1-2.開始時刻>=1830チェック。NG→W03出力
2-2-1-3.開始時刻<終了時刻チェック。NG→W03出力
2-2-1-4.時間差>=30分チェック。NG→W03出力
2-2-1-5.すべて通過→W01出力
2-2-2.ステータスが9の場合
OVT-CANCELにそのまま出力する。(2030CANCELSOR)
2-2-3.その他の場合
ERROR-LOGに出力する。(2040ERRORSOR)
2-3.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-VALID
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | CSV同項目を設定 | |
| 2 | EMP-ID | CSV同項目を設定 | |
| 3 | APPL-DATE | CSV同項目を設定 | |
| 4 | START-TIME | CSV同項目を設定 | |
| 5 | END-TIME | CSV同項目を設定 | |
| 6 | STATUS | CSV同項目を設定 | 0または1 |
| 7 | OVT-TYPE | CSV同項目を設定 | |
| 8 | FILLER | CSV同項目を設定 | |
### 出力ファイル2W02/OVT-CANCEL
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | CSV同項目を設定 | |
| 2 | EMP-ID | CSV同項目を設定 | |
| 3 | APPL-DATE | CSV同項目を設定 | |
| 4 | START-TIME | CSV同項目を設定 | |
| 5 | END-TIME | CSV同項目を設定 | |
| 6 | STATUS | CSV同項目を設定 | 9 |
| 7 | OVT-TYPE | CSV同項目を設定 | |
| 8 | FILLER | CSV同項目を設定 | |
### 出力ファイル3W03/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |
+123
View File
@@ -0,0 +1,123 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN02CHK |
| 3 | プログラム名 | 時間帯重複チェック処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 項目チェック |
| 6 | 機能概要 | OVT-VSORTファイルの同一社員・同一日付内の時間帯重複をチェックする。 |
| 7 | | 重複なしのレコードはOVT-NODUPに出力 |
| 8 | | 重複ありのレコードはERROR-LOGに出力 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | OVT-VSORT | 社員番号>日付>開始時刻で昇順ソート済み |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-VSORT | R01 | ZAN02R01 | I | ZAN01REC | FB | | 80 | PS | |
| 2 | OVT-NODUP | W01 | ZAN02W01 | O | ZAN01REC | FB | | 80 | PS | |
| 3 | ERROR-LOG | W02 | ZAN02W02 | O | ZAN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | OVT-VSORT | EMP-ID>APPL-DATE>START-TIME(昇順) | EMP-ID>APPL-DATE |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
1-7.1件目をW01に出力し、前レコードに保持する。
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.前レコードとの比較
2-1-1.同一社員番号かつ同一日付の場合
2-1-1-1.前終了時刻>現開始時刻 → 重複あり(2011OVERLAPERRSOR)
エラーカテゴリ02でERROR-LOGに出力
2-1-1-2.前終了時刻<=現開始時刻 → 重複なし(2012NORMALOUTSOR)
W01に出力
2-1-2.異なる社員番号または日付の場合(キーブレイク)
キーブレイク処理として前レコードを更新しW01に出力(2013KEYBRSOR)
2-2.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-NODUP
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | R01.同項目を設定 | |
| 2 | EMP-ID | R01.同項目を設定 | |
| 3 | APPL-DATE | R01.同項目を設定 | |
| 4 | START-TIME | R01.同項目を設定 | |
| 5 | END-TIME | R01.同項目を設定 | |
| 6 | STATUS | R01.同項目を設定 | |
| 7 | OVT-TYPE | R01.同項目を設定 | |
| 8 | FILLER | R01.同項目を設定 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 02で固定 | 重複エラー |
| 2 | ERR-DETAIL | STRINGで編集 | EMP-IDと日付を編集 |
+122
View File
@@ -0,0 +1,122 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN03CHK |
| 3 | プログラム名 | 打刻時間照合処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(N:1) |
| 6 | 機能概要 | OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の照合を行う。 |
| 7 | | 申請時間帯が出勤〜退勤の範囲内かを確認する。 |
| 8 | | 申請日が休日かを判定しOVT-TYPEを付加する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | OVT-NODUP | 社員番号>日付で昇順ソート済み |
| 2 | PUNCH-SORTED | 社員番号>日付で昇順ソート済み |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-NODUP | R01 | ZAN03R01 | I | ZAN01REC | FB | | 80 | PS | |
| 2 | PUNCH-SORTED | R02 | ZAN03R02 | I | 自前(80B) | FB | | 80 | PS | |
| 3 | HOLIDAY-FILE | R03 | ZAN03R03 | I | 自前(80B) | FB | | 80 | PS | 休日カレンダー |
| 4 | OVT-CHECKED | W01 | ZAN03W01 | O | ZAN01REC | FB | | 80 | PS | |
| 5 | ERROR-LOG | W02 | ZAN03W02 | O | ZAN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | OVT-NODUP | EMP-ID>APPL-DATE(昇順) | EMP-ID>APPL-DATE |
| 2 | PUNCH-SORTED | EMP-ID>DATE(昇順) | EMP-ID>DATE |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |※ コード上では未使用(PERFORM元なし)|
※ ZAN03CHKはSUB01DATを使用しない。日付取得は不要のためFUNCTION CURRENT-DATEも使用しない。
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.使用ファイルのオープン
1-6.HOLIDAY-FILEを全件読込しHOLIDAY-TABLEに設定する。(1300HOLIDAYSOR)
1-7.R01を読み込む。(1100R01INNSOR)(1回目)
1-8.R02を読み込む。(1200R02INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.R01キーとR02キーを比較
2-1-1.R01キー < R02キー(打刻データなし)
ERROR-LOGにエラー出力する(エラーカテゴリ03)。(2010NOMATCHSOR)
2-1-2.R01キー = R02キー(マッチ)
時間範囲チェックを実施する。(2020MATCHSOR)
2-1-2-1.開始時刻>=出勤時刻 かつ 終了時刻<=退勤時刻 → 通過
OVT-TYPEを設定しW01に出力する。(2200SETOVTSOR)
2-1-2-2.範囲外 → ERROR-LOGに出力(エラーカテゴリ03)
2-1-3.R01キー > R02キー(R02スキップ)
R02を1件読み進める。(1200R02INNSOR)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-CHECKED
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | R01.同項目を設定 | |
| 2 | EMP-ID | R01.同項目を設定 | |
| 3 | APPL-DATE | R01.同項目を設定 | |
| 4 | START-TIME | R01.同項目を設定 | |
| 5 | END-TIME | R01.同項目を設定 | |
| 6 | STATUS | R01.同項目を設定 | |
| 7 | OVT-TYPE | 2200SETOVTSORで設定 | W:平日/H:休日 |
| 8 | FILLER | R01.同項目を設定 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 03で固定 | 打刻不突合 |
| 2 | ERR-DETAIL | STRINGで編集 | 社員番号と日付を編集 |
+144
View File
@@ -0,0 +1,144 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN04MAT |
| 3 | プログラム名 | 取消マッチング処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:1) |
| 6 | 機能概要 | OVT-SORTED(有効申請)とOVT-CSORT(取消申請)を申請番号(APPL-ID)で1:1マッチングし、結果を振り分ける。 |
| 7 | | 申請番号一致(取消済):監査証跡としてERROR-LOGに記録 |
| 8 | | 申請のみ(取消なし):OVT-MATCHEDに出力(処理番号=1 |
| 9 | | 取消のみ(既DB登録済):OVT-DBCLEANに出力(DB削除用) |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SORTED | 申請番号(APPL-ID)で昇順ソート済、重複なし |
| 2 | ファイルR02OVT-CSORT | 申請番号(APPL-ID)で昇順ソート済、重複なし |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SORTED | R01 | ZAN04R01 | I | ZAN01REC | FB | | 80 | PS | 有効申請(APPL-ID昇順) |
| 2 | OVT-CSORT | R02 | ZAN04R02 | I | ZAN01REC | FB | | 80 | PS | 取消申請(APPL-ID昇順) |
| 3 | OVT-MATCHED | W01 | ZAN04W01 | O | ZAN02REC | FB | | 80 | PS | マッチング結果(処理番号付) |
| 4 | OVT-DBCLEAN | W02 | ZAN04W02 | O | ZAN04REC | FB | | 80 | PS | DB削除用(APPL-IDのみ) |
| 5 | ERROR-LOG | W03 | ZAN04W03 | O | ZAN05REC | VB | | 200 | PS | 監査証跡(取消マッチ記録) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | APPL-ID(重複NG | APPL-ID |
| 2 | ファイルR02 | APPL-ID(重複NG | APPL-ID |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
1-7.R02を読み込む。(1200R02INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01、R02を全て読み終えるまで下記を繰り返す)
2-1.マッチの場合(R01.APPL-ID = R02.APPL-ID
取消済みの申請のため、OVT-MATCHEDには出力しない。
監査証跡としてERROR-LOGにマッチ情報を出力する。(2100MATCHSOR)
【STRING編集】
ERR-CATEGORY = 04
ERR-DETAIL = 'CANCEL-MATCH: ' + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻
R01を読み込む。(1100R01INNSOR)(2件目以降)
R02を読み込む。(1200R02INNSOR)(2件目以降)
2-2.R01のみの場合(R01.APPL-ID < R02.APPL-ID
R01をOVT-MATCHEDにSTRING編集して出力する。(2200R01OUTSOR)
【STRING編集】
W01 = 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 + ステータス + OVT-TYPE + 処理番号(01)
R01を読み込む。(1100R01INNSOR)(2件目以降)
2-3.R02のみの場合(R01.APPL-ID > R02.APPL-ID
R02をOVT-DBCLEANに出力する。(2300R02OUTSOR)
W02.APPL-ID = R02.APPL-ID
R02を読み込む。(1200R02INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-MATCHED
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | R01.APPL-ID | |
| 2 | EMP-ID | R01.EMP-ID | |
| 3 | APPL-DATE | R01.APPL-DATE | |
| 4 | START-TIME | R01.START-TIME | |
| 5 | END-TIME | R01.END-TIME | |
| 6 | STATUS | R01.STATUS | |
| 7 | OVT-TYPE | R01.OVT-TYPE | |
| 8 | PROC-SEQ | 01固定 | 同一申請番号グループ内連番 |
| 9 | FILLER | 初期値 | |
### 出力ファイル2W02/OVT-DBCLEAN
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | R02.APPL-ID | DB削除対象申請番号 |
| 2 | FILLER | 初期値 | |
### 出力ファイル3W03/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 04で固定 | 取消マッチ監査証跡 |
| 2 | ERR-DETAIL | STRINGで編集 | CANCEL-MATCH: + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 |
+169
View File
@@ -0,0 +1,169 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN05CAL |
| 3 | プログラム名 | 残業時間集約処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | キーブレイク(集計) |
| 6 | 機能概要 | OVT-SORTED2(申請番号+処理番号昇順)をキーブレイク集約し、 |
| 7 | | 同一APPL-IDの全レコードの加班時間を積算し、 |
| 8 | | OVT-SUMMARYに1レコードに集計して出力する。 |
| 9 | | キーブレイク制御にCONTINUE/SET、時間計算にCOMPUTE ROUNDED/DIVIDEをそれぞれ使用する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SORTED2 | 申請番号(APPL-ID)>処理番号(PROC-SEQ)で昇順ソート済 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SORTED2 | R01 | ZAN05R01 | I | ZAN02REC | FB | | 80 | PS | マッチング結果(APPL-ID+PROC-SEQ昇順) |
| 2 | OVT-SUMMARY | W01 | ZAN05W01 | O | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | APPL-ID>PROC-SEQ(同一APPL-ID内複数明細あり) | APPL-ID(キーブレイク) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 時刻丸め計算SUB | SUB05TIM | ZANTIMAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化(WRK-ACCUM-MIN含む)
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-6.使用ファイルのオープン(R01入力、W01出力)
1-7.R01の初回読込(1100R01INNSOR
1-8.初回読込成功時、WRK-PREV-APPL-IDに設定
WRK-GROUP-STARTに現レコードのSTARTを保持
WRK-LAST-RECに現レコードを保持
SET WRK-GROUP-IS-ACTIVE TO TRUE
(積算は主処理2000MAJSOR内の各分岐で行う)
2.主処理(2000MAJSOR)(R01を全て読み終え、最終グループ出力完了まで下記を繰り返す)
2-1.EOFの場合(WRK-R01KEY = HIGH-VALUE
2-1-1.WRK-GROUP-IS-ACTIVEなら最終グループを出力(2100OUTSOR)
2-1-2.SET WRK-GROUP-NOT-ACTIVE TO TRUE(ループ終了条件)
2-2.初回設定済みの場合(WRK-PREV-APPL-ID = 初回値あり)
2-2-1.同一APPL-IDの場合
現レコードの時間差分を積算(2200ACCUMSOR
現レコードをWRK-LAST-RECに上書き保持(ENDは最終明細で上書きされる)
グループ内最初の明細のSTARTはWRK-GROUP-STARTに保持済のため不変
R01次回読込(1100R01INNSOR
2-2-2.異なるAPPL-IDの場合(キーブレイク)
WRK-GROUP-IS-ACTIVEなら直前に保持していたグループを出力(2100OUTSOR)
WRK-PREV-APPL-IDを現レコードのAPPL-IDで更新
WRK-GROUP-STARTに現レコードのSTARTを保持
現レコードをWRK-LAST-RECに設定
2200ACCUMSORを呼出(新グループ初回レコードの時間差分を積算)
SET WRK-GROUP-IS-ACTIVE TO TRUE
R01次回読込(1100R01INNSOR
3.積算処理(2200ACCUMSOR
3-1.現レコードの時刻→分変換
DIVIDE R01START-TIME BY 100 GIVING WRK-START-HOUR REMAINDER WRK-START-MIN
DIVIDE R01END-TIME BY 100 GIVING WRK-END-HOUR REMAINDER WRK-END-MIN
COMPUTE WRK-START-TOTAL = WRK-START-HOUR * 60 + WRK-START-MIN
COMPUTE WRK-END-TOTAL = WRK-END-HOUR * 60 + WRK-END-MIN
3-2.差分計算
COMPUTE WRK-DIFF-MIN = WRK-END-TOTAL - WRK-START-TOTAL
3-3.WRK-ACCUM-MINに積算
COMPUTE WRK-ACCUM-MIN = WRK-ACCUM-MIN + WRK-DIFF-MIN
4.計算出力処理(2100OUTSOR
4-1.分→時間変換(DIVIDE for coverage
DIVIDE WRK-ACCUM-MIN BY 60 GIVING WRK-INT-HOURS REMAINDER WRK-REMAIN-MIN
4-2.COMPUTE ROUNDED for coverage(結果はSUB05TIMには渡さない)
COMPUTE WRK-OVT-HOURS ROUNDED = WRK-ACCUM-MIN / 60
ON SIZE ERROR
CONTINUE
MOVE ZERO TO WRK-OVT-HOURS
END-COMPUTE
4-3.SUB05TIM呼出(mode 20.1h単位切捨)
COMPUTE WRK-TEMP-HOURS = WRK-ACCUM-MIN / 60(切捨用にそのまま)
MOVE WRK-TEMP-HOURS TO T01TIMHRS
MOVE 2 TO T01TIMRRCmode 2
CALL 'SUB05TIM' USING T01TIMPAR
MOVE T01TIMOUT TO WRK-OVT-HOURS
4-4.OVT-SUMMARY出力
【STRING編集相当(MOVE)】
INITIALIZE W01OUTREC
MOVE WRK-LAST-APPL-ID TO W01APPL-ID
MOVE WRK-LAST-EMP-ID TO W01EMP-ID
MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE
MOVE WRK-GROUP-START TO W01START-TIME
MOVE WRK-LAST-END TO W01END-TIME
MOVE WRK-OVT-HOURS TO W01OVT-HOURS
MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE
WRITE W01OUTREC
W01出力カウンタ加算
4-5.WRK-ACCUM-MINをZEROに初期化(次グループ用)
5.終了処理(3000STPSOR
5-1.入出力ファイルのクローズ
5-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'ZAN05R01'
PARM2:入力件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'ZAN05W01'
PARM2:出力件数
5-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/OVT-SUMMARY
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | APPL-ID | WRK-LAST-APPL-ID | 申請番号 |
| 2 | EMP-ID | WRK-LAST-EMP-ID | 社員番号 |
| 3 | APPL-DATE | WRK-LAST-APPL-DATE | 申請日 YYYYMMDD |
| 4 | START-TIME | WRK-GROUP-START | 開始時刻 HHMM(グループ最初の明細のSTART) |
| 5 | END-TIME | WRK-LAST-END | 終了時刻 HHMM |
| 6 | OVT-HOURS | SUB05TIM出力(T01TIMOUT | 加班時間(0.1h単位切捨) |
| 7 | OVT-TYPE | WRK-LAST-OVT-TYPE | W=平日 / H=休日 |
| 8 | FILLER | 初期値 | |
+238
View File
@@ -0,0 +1,238 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 残業統計管理システム |
| 2 | プログラムID | ZAN06UPD |
| 3 | プログラム名 | 残業統計DB更新処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | DB更新 |
| 6 | 機能概要 | OVT-SUMMARYの各レコードをOVT-APPLICATIONSテーブルにINSERT/UPSERTし、 |
| 7 | | OVT-MONTHLYテーブルに月次集計を反映する。 |
| 8 | | またOVT-DBCLEANの各レコードについて、該当申請を取消状態に更新し、 |
| 9 | | OVT-MONTHLYから該当加班時間を減算する。 |
| 10 | | 新規カバレッジ:EXEC SQL(INSERT/UPDATE/SELECT)、COMMIT/ROLLBACK、 |
| 11 | | PERFORM VARYING/TEST AFTER、COBOL MULTIPLY |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01OVT-SUMMARY | ZAN05CALの出力、APPL-ID順ソート済 |
| 2 | ファイルR02OVT-DBCLEAN | ZAN04MATの出力、DB上に該当APPL-IDが存在すること(孤立取消はエラー) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | OVT-SUMMARY | R01 | ZAN06R01 | I | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) |
| 2 | OVT-DBCLEAN | R02 | ZAN06R02 | I | ZAN04REC | FB | | 80 | PS | 孤立取消(DB削除対象) |
| 3 | ERROR-LOG | W01 | ZAN06W01 | O | ZAN05REC | VB | | 200 | PS | DBエラー・データ不整合記録 |
| 4 | OVERTIME-DB | DB | - | - | - | DB2 | - | - | DASD | EXEC SQLで直接操作 |
### キー項目一覧
| NO | ファイル名 | キー項目 | 用途 |
|----|-----------|---------|------|
| 1 | ファイルR01 | APPL-ID | OVT-APPLICATIONS INSERT/UPDATEのキー |
| 2 | ファイルR02 | APPL-ID | OVT-APPLICATIONS SELECT/UPDATEのキー |
| 3 | DB OVT-MONTHLY | EMP-ID + YEAR-MONTH + OVT-TYPE | 月次集計UPSERTのキー |
### テーブル定義
#### OVT-APPLICATIONS(個別加班申請テーブル)
| カラム | 型 | 内容 |
|--------|-----|------|
| APPL-ID | CHAR(8) | 申請番号(PK |
| EMP-ID | CHAR(8) | 社員番号 |
| APPL-DATE | CHAR(8) | 申請日 YYYYMMDD |
| OVT-TYPE | CHAR(1) | W=平日 / H=休日 |
| START-TIME | CHAR(4) | 開始時刻 HHMM |
| END-TIME | CHAR(4) | 終了時刻 HHMM |
| OVT-HOURS | DECIMAL(4,1) | 加班時間 |
| STATUS | CHAR(1) | 0=有効 / 9=取消 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
#### OVT-MONTHLY(月次集計テーブル)
| カラム | 型 | 内容 |
|--------|-----|------|
| EMP-ID | CHAR(8) | 社員番号(PK |
| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMMPK |
| OVT-TYPE | CHAR(1) | W=平日 / H=休日(PK |
| OVT-HOURS | DECIMAL(6,1) | 加班時間合計 |
| OVT-COUNT | INTEGER | 加班回数 |
| UPDATED-AT | TIMESTAMP | 更新日時 |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン(R01/R02入力、W01出力)
1-6.R01、R02の初回読込(1100R01INNSOR、1200R02INNSOR
2.主処理(2000MAJSOR
2-1.処理フェーズ1OVT-SUMMARYR01)を全件処理
R01 EOFまで以下の処理を繰り返す
2-1-1.OVT-APPLICATIONSへのINSERTを試行
【EXEC SQL INSERT】
INSERT INTO OVT-APPLICATIONS (APPL-ID, EMP-ID, APPL-DATE, OVT-TYPE,
START-TIME, END-TIME, OVT-HOURS, STATUS, UPDATED-AT)
VALUES (:WRK-SQL-APPL-ID, :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE,
:WRK-SQL-OVT-TYPE, :WRK-SQL-START-TIME, :WRK-SQL-END-TIME,
:WRK-SQL-OVT-HOURS, :WRK-SQL-STATUS, CURRENT TIMESTAMP)
2-1-2.SQLCODE NOT = 0の場合(APPL-ID重複):
【EXEC SQL UPDATE】
UPDATE OVT-APPLICATIONS SET STATUS = :WRK-SQL-STATUS,
UPDATED-AT = CURRENT TIMESTAMP
WHERE APPL-ID = :WRK-SQL-APPL-ID
SQLCODE異常時は9100DBERRSORへ
2-1-3.SQLCODE = 0の場合:CUN-DBXINS加算、それ以外:CUN-DBXUPD加算
2-1-4.OVT-MONTHLYのUPSERT2110MONTHLYUPSOR
2-1-5.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX
2-2.処理フェーズ2OVT-DBCLEANR02)を全件処理
R02 EOFまで以下の処理を繰り返す
2-2-1.SELECTでOVT-APPLICATIONSから該当レコード取得
【EXEC SQL SELECT INTO】
SELECT EMP-ID, APPL-DATE, OVT-TYPE, OVT-HOURS
INTO :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE, :WRK-SQL-OVT-TYPE,
:WRK-SQL-OVT-HOURS
FROM OVT-APPLICATIONS
WHERE APPL-ID = :WRK-SQL-APPL-ID
2-2-2.SQLCODE NOT = 0(該当なし=孤立取消):
ERROR-LOGに出力(カテゴリ=20)、9999ABDSORで異常終了
2-2-3.OVT-APPLICATIONSのSTATUSを'9'に更新
【EXEC SQL UPDATE】
UPDATE OVT-APPLICATIONS SET STATUS = '9',
UPDATED-AT = CURRENT TIMESTAMP
WHERE APPL-ID = :WRK-SQL-APPL-ID
2-2-4.YEAR-MONTH抽出:APPL-DATE(1:6)
2-2-5.OVT-MONTHLYから減算(2210MONTHLYSUBSOR
【EXEC SQL UPDATE(減算)】
UPDATE OVT-MONTHLY SET
OVT-HOURS = OVT-HOURS - :WRK-SQL-OVT-HOURS,
OVT-COUNT = OVT-COUNT - 1,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WRK-SQL-EMP-ID
AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH
AND OVT-TYPE = :WRK-SQL-OVT-TYPE
リトライ制御:PERFORM TEST AFTER VARYING(最大3回)
SQLCODE≠0時はROLLBACKしてリトライ
全リトライ消費後もSQLCODE≠0の場合、
ERROR-LOG(カテゴリ=21)に出力し9999ABDSORで異常終了する
9100DBERRSORは通らない)
2-2-6.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX
3.OVT-MONTHLY UPSERT処理(2110MONTHLYUPSOR
3-1.OVT-MONTHLYの存在確認SELECT
【EXEC SQL SELECT INTODB-OVT-HOURS, DB-OVT-COUNT)】
SELECT OVT-HOURS, OVT-COUNT
INTO :DB-OVT-HOURS, :DB-OVT-COUNT
FROM OVT-MONTHLY
WHERE EMP-ID = :WRK-SQL-EMP-ID
AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH
AND OVT-TYPE = :WRK-SQL-OVT-TYPE
3-2.SQLCODE = 0(既存レコードあり):
【EXEC SQL UPDATE(加算)】
UPDATE OVT-MONTHLY SET
OVT-HOURS = OVT-HOURS + :WRK-SQL-OVT-HOURS,
OVT-COUNT = OVT-COUNT + 1,
UPDATED-AT = CURRENT TIMESTAMP
WHERE EMP-ID = :WRK-SQL-EMP-ID
AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH
AND OVT-TYPE = :WRK-SQL-OVT-TYPE
3-3.SQLCODE NOT = 0(新規):
【EXEC SQL INSERT】
INSERT INTO OVT-MONTHLY
(EMP-ID, YEAR-MONTH, OVT-TYPE, OVT-HOURS, OVT-COUNT, UPDATED-AT)
VALUES
(:WRK-SQL-EMP-ID, :WRK-SQL-YEAR-MONTH, :WRK-SQL-OVT-TYPE,
:WRK-SQL-OVT-HOURS, 1, CURRENT TIMESTAMP)
3-4.SQLCODE異常時は9100DBERRSORへ
4.COMMIT処理(2300COMMITDBX
4-1.【EXEC SQL COMMIT】
COMMIT WORK
4-2.CUN-COMMITをZEROにリセット
5.終了処理(3000STPSOR
5-1.最終COMMIT2300COMMITDBX
5-2.入出力ファイルのクローズ
5-3.DB操作件数メッセージ出力
メッセージ番号:6(入力件数メッセージ)
PARM1'ZAN06R01' / PARM2CUN-R01INN
PARM1'ZAN06R02' / PARM2CUN-R02INN
PARM1'INS' / PARM2CUN-DBXINS
PARM1'UPD' / PARM2CUN-DBXUPD
PARM1'W01' / PARM2CUN-W01OUT
5-4.終了メッセージ出力
メッセージ番号:2(終了メッセージ)
6.DBエラー処理(9100DBERRSOR
6-1.ERROR-LOGにDBエラー情報出力(カテゴリ=30)
【COBOL STRING】
STRING 'DB ERROR SQLCODE=' SQLCODE ' APPL-ID='
WRK-SQL-APPL-ID INTO WRK-ERR-DETAIL
6-2.【EXEC SQL ROLLBACK】
ROLLBACK WORK
6-3.9999ABDSORで異常終了
```
---
## 新規カバレッジ構文
| # | 構文 | 用途 |
|---|------|------|
| 1 | EXEC SQL INSERT | OVT-APPLICATIONSへの新規登録 |
| 2 | EXEC SQL UPDATE | OVT-APPLICATIONSステータス更新・OVT-MONTHLY加減算 |
| 3 | EXEC SQL SELECT INTO | OVT-MONTHLY存在確認・OVT-APPLICATIONS検索 |
| 4 | EXEC SQL COMMIT | 定期的なCOMMIT発行 |
| 5 | EXEC SQL ROLLBACK | DBエラー時のROLLBACK |
| 6 | PERFORM VARYING | 月(1-12)のバリデーションループ |
| 7 | PERFORM TEST AFTER VARYING | 月次減算のリトライ制御 |
| 8 | COBOL MULTIPLY | 加班時間→分変換 |
## 出力レコード定義
### 出力ファイル1W01/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | WRK-ERR-CATEGORY | 20=孤立取消 / 30=DBエラー |
| 2 | ERR-DETAIL | WRK-ERR-DETAIL | エラー詳細メッセージ |