4.6 KiB
4.6 KiB
詳細設計書
基本情報
| # | 項目 | 内容 |
|---|---|---|
| 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
休日判定ロジック
- HOLIDAY_CALENDARに日付が存在する → 休日(PERFORM VARYING線形探索)
- 曜日が土曜(6)または日曜(0) → 休日
- 上記以外 → 出勤日
出力レコード定義
出力ファイル(OUTREC/WORK-DAY-FILE)KIN06REC 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) |