# 詳細設計書 ## 基本情報 | # | 項目 | 内容 | |---|------|------| | 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-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) | |