# 詳細設計書 ## 基本情報 | # | 項目 | 内容 | |---|------|------| | 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分岐:R01keyR02key(休暇のみスキップ)。 | | 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 |