Files
cobol-tna-system/詳細設計書/詳細設計書_KIN06CLD.md

117 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 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) | |