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

4.6 KiB
Raw Permalink Blame History

詳細設計書

基本情報

# 項目 内容
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)