8.0 KiB
8.0 KiB
詳細設計書
基本情報
| # | 項目 | 内容 |
|---|---|---|
| 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 | INSERT(MODE=NORMAL時) / DELETE+INSERT(MODE=RESET時) |
| 2 | MONTHLY_ABSENCE | SELECT COUNT(*) → IF >0 UPDATE ELSE INSERT(UPSERT) |
| 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.入力ファイルOPEN(DAILY-RECORD)
1-10.出力ファイルOPEN(ABSENCE-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'
PARM2:CUN-DBXINS(INSERT件数)
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-SUMMARY(OUTREC/KIN08REC)80B 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 | メッセージ編集 |