# 詳細設計書 ## 基本情報 | # | 項目 | 内容 | |---|------|------| | 1 | システム名 | 勤怠休暇管理システム | | 2 | プログラムID | KIN03EXP | | 3 | プログラム名 | 休暇日別展開処理 | | 4 | PGMタイプ | メイン | | 5 | PGMパターン | キーブレイク(集計) | | 6 | 機能概要 | LEAVE_RECORDS(DB2)より有効申請(STATUS='1')を読込み、開始日〜終了日の期間を日別に展開し、休日・週末を除外してLEAVE-DAILYファイルを出力する。 | | 7 | | 社員番号(EMP_ID)キーブレイクで小計出力を行う。 | ※PGMタイプ:メイン、サブ ※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 ### 前提条件 | NO | 対象ファイル | 条件 | |----|-------------|------| | 1 | DB(LEAVE_RECORDS) | EMP_ID, START_DATE順にソート済(ORDER BYで取得) | ### 使用ファイル一覧 | NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | |----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| | 1 | LEAVE-DAILY | W01 | KIN02W01.DAT | O | KIN02REC | FB | | 80 | PS | 日別展開後レコード | | 2 | LEAVE_RECORDS | DB | — | I | — | — | — | — | DB | SQLite | | 3 | HOLIDAY_CALENDAR | DB | — | I | — | — | — | — | DB | SQLite | ### キー項目一覧 | NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | |----|-----------|---------------------|-------------------------------------------| | 1 | DB(LEAVE_RECORDS) | EMP-ID, START_DATE(昇順) | キーブレイク: EMP-ID | ### 使用モジュール一覧 | NO | 機能 | プログラムID | 使用COPY名 | |----|------|-------------|-----------| | 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | | 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | | 3 | ABEND処理SUB | SUB03END | ZANENDAC | --- ## 処理詳細 ``` 1.初期処理(1000ITTSOR) 1-1.開始メッセージ出力 【メッセージ編集】 メッセージ番号:1(開始メッセージ) 1-2.コンパイル日時出力 【メッセージ編集】 メッセージ番号:33(コンパイル日時) PARM1:コンパイル日時 PARM2:'COMPILED' 1-3.ワークエリアの初期化 1-4.DB接続 EXEC SQL CONNECT TO 'data/kin.db' 1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 【メッセージ編集】 メッセージ番号:5(サブエラー) PARM1:'SUB01DAT' PARM2:復帰コード 【ABEND処理SUB】 ABENDコード:999 1-6.休日カレンダーテーブル読込(1200HDINNSOR) 【SQL】 SELECT HOLIDAY_DATE FROM HOLIDAY_CALENDAR ORDER BY HOLIDAY_DATE FETCHループでWORKING-STORAGEのWRK-HOLIDAY-TABLEに全件格納する。 WRK-HD-COUNTに件数を保持。最大366件(ODO定義)。 1-7.出力ファイルOPEN(W01) 1-8.C1カーソル初回FETCH(1100C1INITSOR) 【SQL】 SELECT APPLICATION_ID, EMP_ID, LEAVE_TYPE, START_DATE, START_TIME, END_DATE, END_TIME FROM LEAVE_RECORDS WHERE STATUS = '1' ORDER BY EMP_ID, START_DATE INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE, :SQL-START-DATE, :SQL-START-TIME, :SQL-END-DATE, :SQL-END-TIME SQLCODE=0の場合、入力件数+1 SQLCODE≠0の場合、WRK-R01EOF='1'(EOF) 2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) 2-1.社員番号キー保存 SQL-EMP-ID → WRK-BFR-EMP-ID 2-2.1社員分処理(2100-PROCESS-EMP)(PERFORM THRU) 2-2-1.CUN-EMP-SUB初期化(ZERO) 2-2-2.EOFまたはキー変化(SQL-EMP-ID≠WRK-BFR-EMP-ID)まで繰り返し 2-2-2-1.日付展開処理(2200-EXPAND-DATE)(PERFORM THRU) 2-2-2-1-1.開始日(SQL-START-DATE)→WRK-DATE-CURRENT 終了日(SQL-END-DATE)→WRK-DATE-END 2-2-2-1-2.WRK-DATE-CURRENT > WRK-DATE-END までループ 2-2-2-1-2-1.曜日判定 COMPUTE WRK-DAY-OF-WEEK = FUNCTION MOD( FUNCTION INTEGER-OF-DATE(WRK-DATE-CURRENT), 7) 0=日曜日、6=土曜日 → 週末としてスキップ 2-2-2-1-2-2.非週末の場合、休日テーブル検索 SEARCH ALL WRK-HD-ENTRY(昇順KEY=WRK-HD-DATE) WRK-HD-DATE(WRK-HD-IDX) = WRK-DATE-CURRENT → 休日としてスキップ 2-2-2-1-2-3.非週末かつ非休日の場合、W01出力 W01レコード初期化 APPL-ID = SQL-APPL-ID EMP-ID = WRK-BFR-EMP-ID LEAVE-TYPE = SQL-LEAVE-TYPE START-TIME = SQL-START-TIME END-TIME = SQL-END-TIME DATE = WRK-DATE-ALPHA(現在日付) WRITE W01OUTREC CUN-W01OUT +1 CUN-EMP-SUB +1 2-2-2-1-2-4.日付加算(2300-DATE-ADD-1) WRK-DATE-DAY + 1 各月の最終日判定: - 1/3/5/7/8/10/12月:31日超で月+1、13月→年+1 - 4/6/9/11月:30日超で月+1 - 2月:閏年判定(MOD年400=0 または MOD年4=0 AND MOD年100≠0) 閏年→29日超、平年→28日超で月+1 2-2-3.次レコードFETCH(1100C1FETCHSOR) CALL 'br_fetch_next' USING SQLCODE SQLCODE=0の場合、br_get_colで各カラムを取得 SQLCODE≠0の場合、WRK-R01EOF='1' 2-2-4.社員別小計出力(キーブレイク) 【メッセージ編集】 メッセージ番号:33(情報メッセージ) PARM1:WRK-BFR-EMP-ID PARM2:CUN-EMP-SUB PARM3:'EMP SUB' 3.終了処理(3000STPSOR) 3-1.出力ファイルのクローズ 3-2.件数メッセージ出力 【メッセージ編集】 メッセージ番号:6(入力件数) PARM1:'LEAVE_RECORDS' PARM2:入力件数 【メッセージ編集】 メッセージ番号:7(出力件数) PARM1:'KIN02W01' PARM2:出力件数 【メッセージ編集】 メッセージ番号:33(情報) PARM1:'HOLIDAYS LOADED' PARM2:休日テーブル件数 3-3.終了メッセージ出力 【メッセージ編集】 メッセージ番号:2(終了メッセージ) ``` --- ## 出力レコード定義 ### 出力ファイル1(W01/LEAVE-DAILY) KIN02REC 80B FB | No | 項目名 | 設定元 | 備考 | |----|--------|--------|------| | 1 | EMP-ID | WRK-BFR-EMP-ID | キーブレイク単位 | | 2 | DATE | WRK-DATE-ALPHA | 展開された日付(YYYYMMDD) | | 3 | LEAVE-TYPE | SQL-LEAVE-TYPE | 01/02/03/04 | | 4 | START-TIME | SQL-START-TIME | 元申請の開始時刻(HHMM) | | 5 | END-TIME | SQL-END-TIME | 元申請の終了時刻(HHMM) | | 6 | APPL-ID | SQL-APPL-ID | APPLICATION_ID | | 7 | FILLER | SPACE | 45B |