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

8.0 KiB
Raw Permalink Blame History

詳細設計書

基本情報

# 項目 内容
1 システム名 勤怠休暇管理システム
2 プログラムID KIN08DBU
3 プログラム名 勤怠DB更新処理
4 PGMタイプ メイン
5 PGMパターン DB更新 + SYSIN読込(P28)
6 機能概要 DAILY-RECORDを読込み、DAILY_RECORDSにINSERT。社員別月次集計後、MONTHLY_ABSENCEにUPSERT。集計結果をABSENCE_SUMMARYファイルに出力する。SYSIN制御カード(T/P/Mの3種)をGO TO DEPENDING ONで分岐処理する。

前提条件

NO 対象ファイル/DB 条件
1 DAILY-RECORD KIN07DAIが出力した日別勤怠計算結果が存在すること
2 DAILY_RECORDS 同一日付のレコードが既に存在してもMODE=NORMALではUPSERT動作
3 MONTHLY_ABSENCE 集計対象月の統計レコードが未作成でもINSERTできること
4 SYSIN 省略時は全社員対象、NORMALモードで動作

SYSIN制御カード仕様

カード種別 第1桁 フォーマット 説明
TARGET T T 社員番号,社員番号,... 集計対象社員指定。省略時=全社員
PERIOD P P YEARMONTH=YYYYMM 処理対象年月。必須
MODE M M MODE=RESET|NORMAL RESET=既存削除後再INSERT、NORMAL=UPSERT
コメント * * 任意コメント 読み飛ばし
不明 DISPLAYで警告表示

使用ファイル一覧

NO 使用ファイル/DB名 識別子 DD名 I/O COPY群 形式 ブロック レコード長 媒体
1 DAILY-RECORD INREC KIN08R01 I KIN07REC FB 200 PS
2 ABSENCE-SUMMARY OUTREC KIN08W01 O KIN08REC FB 80 PS
3 SYSIN SYSIN KIN08S01 I FB 80 PS

使用DBテーブル

NO テーブル名 処理内容
1 DAILY_RECORDS INSERTMODE=NORMAL時) / DELETE+INSERTMODE=RESET時)
2 MONTHLY_ABSENCE SELECT COUNT(*) → IF >0 UPDATE ELSE INSERTUPSERT
3 SICK_LEAVE_RATE SELECT DEDUCTION_RATE WHERE LEAVE_TYPE='04'

使用モジュール一覧

NO 機能 プログラムID 使用COPY名
1 メッセージ編集出力SUB SUB02MSG ZANMSGAC
2 ABEND処理SUB SUB03END ZANENDAC
3 運用日付取得SUB SUB01DAT ZANDATAC

処理詳細

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.SYSINファイルOPEN
  1-6.SYSIN読込ループ(EOFまで)
    READ SYSINFILE INTO WS-SYSIN-REC
      AT END SET SYSIN-EOF TO TRUE
    END-READ.
    カード種別判定(WS-SYSIN-REC(1:1)):
      'T' → MOVE 1 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
             2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
      'P' → MOVE 2 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
             2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
      'M' → MOVE 3 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX
             2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR
      '*' → コメント行としてDISPLAY表示後スキップ(CONTINUE
      他  → DISPLAY 'WARNING: Unknown card type [x]'
  1-7.必須パラメータ未設定チェック
    Pカード未読込 → ABEND(CALL SUB03END)
  1-8.集計対象社員テーブル設定(Tカード省略時は全社員フラグON)
  1-9.入力ファイルOPENDAILY-RECORD
  1-10.出力ファイルOPENABSENCE-SUMMARY

2.主処理(2000MAJSOR)(R01 EOFまで下記を繰り返す)
  2-1.DAILY-RECORD読込(READ INTO)
    【ガード】社員番号の有効性チェック
      INSPECT WS-EMP-ID TALLYING WS-ZERO-CNT FOR LEADING '0'
      空文字判定 → DISPLAY警告
  2-2.DAILY_RECORDS INSERT
    EXEC SQL INSERT INTO DAILY_RECORDS (...) VALUES (:WS-...)
    IF SQLCODE NOT = 0 → DISPLAY警告 + 9100DBERRSOR
  2-3.社員別月次集計(PERFORM VARYING 内部テーブル)
    該当社員の集計行を線形探索
    集計計算(COMPUTE ROUNDED ON SIZE ERROR
      COMPUTE WS-TOTAL-HOURS ROUNDED =
          WS-ANNUAL-H + WS-PERSONAL-H + WS-OFFICIAL-H
          + WS-SICK-H + WS-ABSENT-H
      ON SIZE ERROR
          DISPLAY 'WARNING: Total hours overflow '
                  WS-EMP-ID ' date ' WS-DATE
          MOVE ZERO TO WS-TOTAL-HOURS
      END-COMPUTE

3.終了処理(3000STPSOR
  3-1.MODE判定
    MODE=RESETの場合:
      EXEC SQL DELETE FROM MONTHLY_ABSENCE
          WHERE YEAR_MONTH = :WS-YEAR-MONTH
  3-2.集計結果のMONTHLY_ABSENCE書出(PERFORM VARYING 集計テーブル)
    各社員・月ごとに:
      EXEC SQL SELECT COUNT(*) INTO WS-CNT
          FROM MONTHLY_ABSENCE
          WHERE EMP_ID = :WS-EMP-ID
          AND YEAR_MONTH = :WS-YEAR-MONTH
      IF WS-CNT > 0
          EXEC SQL UPDATE MONTHLY_ABSENCE SET ...
      ELSE
          EXEC SQL INSERT INTO MONTHLY_ABSENCE (...)
      END-IF
      IF SQLCODE NOT = 0 → 9100DBERRSOR
  3-3.ABSENCE_SUMMARYファイル出力
    STRINGで編集後 WRITE
  3-4.EXEC SQL COMMIT
  3-5.全CURSOR/ファイルCLOSE
  3-6.出力件数メッセージ出力
    【メッセージ編集】
    メッセージ番号:6(出力件数)
    PARM1'DAILY_RECORDS'
    PARM2CUN-DBXINSINSERT件数)
  3-7.終了メッセージ出力
    【メッセージ編集】
    メッセージ番号:2(終了メッセージ)

SYSINカード処理詳細

2100-TARGETSOR SECTION.
    UNSTRING WS-SYSIN-REC(3:) DELIMITED BY ','
        INTO WS-TARGET-EMP(1) WS-TARGET-EMP(2) ...
        TALLYING IN WS-EMP-COUNT
    END-UNSTRING.
    DISPLAY 'TARGET EMPLOYEES: ' WS-EMP-COUNT ' persons'.
    EXIT.
    GO TO 2000-EXIT.

2200-PERIODSOR SECTION.
    UNSTRING WS-SYSIN-REC(3:) DELIMITED BY '='
        INTO WS-PARM-NAME WS-PARM-VALUE
    END-UNSTRING.
    MOVE WS-PARM-VALUE TO WS-YEAR-MONTH.
    DISPLAY 'PERIOD: ' WS-YEAR-MONTH.
    EXIT.
    GO TO 2000-EXIT.

2300-MODESOR SECTION.
    INSPECT WS-SYSIN-REC
        REPLACING ALL 'MODE=' BY SPACES.
    MOVE WS-SYSIN-REC(3:) TO WS-MODE-VALUE.
    IF WS-MODE-VALUE = 'RESET'
        SET RESET-MODE TO TRUE
    ELSE
        SET NORMAL-MODE TO TRUE
    END-IF.
    DISPLAY 'MODE: ' WS-MODE-VALUE.
    EXIT.
    GO TO 2000-EXIT.

出力レコード定義

ABSENCE-SUMMARYOUTREC/KIN08REC80B FB

No 項目名 設定元 属性 備考
1 EMP-ID MONTHLY_ABSENCE.EMP_ID X(8) 社員番号
2 YEAR-MONTH MONTHLY_ABSENCE.YEAR_MONTH X(6) YYYYMM
3 ANNUAL-LEAVE-H 集計結果 9(4)V9(1) 年休使用合計
4 PERSONAL-LEAVE-H 集計結果 9(4)V9(1) 事假合計
5 OFFICIAL-LEAVE-H 集計結果 9(4)V9(1) 因公特批假合計
6 SICK-LEAVE-H 集計結果 9(4)V9(1) 病欠合計
7 UNAPPROVED-ABSENT-H 集計結果 9(4)V9(1) 未申請欠勤合計
8 FILLER SPACE X(24)

カバレッジ構文一覧

構文 用途
READ SYSIN(パターン28 制御カード読込 ← 新規パターン
GO TO DEPENDING ON カード種別による3分岐 ← 新規
DISPLAY 警告メッセージ表示 ← 新規
INSPECT TALLYING 社員番号空チェック、カンマ区切り数検証
COMPUTE ROUNDED ON SIZE ERROR 時間計算桁あふれ処理 ← 新規
EXEC SQL DELETE RESETモード既存削除 ← 新規
EXEC SQL INSERT / UPDATE / SELECT DB操作
PERFORM VARYING 社員別集計ループ
UNSTRING SYSINカード値解析
STRING メッセージ編集