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

7.4 KiB
Raw Permalink Blame History

詳細設計書

基本情報

# 項目 内容
1 システム名 勤怠休暇管理システム
2 プログラムID KIN09CSV
3 プログラム名 勤怠CSV出力処理
4 PGMタイプ メイン
5 PGMパターン GETPUT(編集出力)
6 機能概要 DAILY_RECORDSをDBからSELECTし、STRING WITH POINTERでCSV行を編集、WRITE AFTER ADVANCINGPAGE/2 LINES/1 LINE)で出力する。INSPECT REPLACINGでCSV危険文字をサニタイズする。

前提条件

NO 対象ファイル/DB 条件
1 DAILY_RECORDS KIN08DBUにより当月勤怠データが登録済みであること
2 MONTHLY_ABSENCE KIN08DBUにより当月集計が完了していること
3 PARM YEARMONTH=YYYYMM は必須。省略時はABEND

PARM引数

コマンドラインで以下の形式で指定。

YEARMONTH=202605,MODE=FULL
パラメータ 必須 デフォルト 説明
YEARMONTH 処理対象年月(YYYYMM形式)
MODE FULL FULL=日別+月次全項目出力, SHORT=月次集計のみ

使用ファイル一覧

NO 使用ファイル/DB名 識別子 DD名 I/O COPY群 形式 ブロック レコード長 媒体
1 CSV-OUTPUT OUTREC KIN09W01 O KIN09REC FB 200 PS

使用DBテーブル

NO テーブル名 処理内容
1 DAILY_RECORDS SELECT WHERE TARGET_DATE LIKE 'YYYYMM%' ORDER BY EMP_ID, TARGET_DATE
2 MONTHLY_ABSENCE SELECT WHERE YEAR_MONTH = :WS-YEAR-MONTH ORDER BY EMP_ID

使用モジュール一覧

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解析(ACCEPT FROM COMMAND-LINE
    INSPECT WS-PARM TALLYING WS-COMMA-CNT FOR ALL ','
    IF WS-COMMA-CNT < 1
        DISPLAY 'WARNING: Missing MODE, using FULL'
    END-IF
    UNSTRING WS-PARM DELIMITED BY ','
        INTO WS-PARM1 WS-PARM2
    END-UNSTRING
    UNSTRING WS-PARM1 DELIMITED BY '='
        INTO WS-KEY1 WS-VALUE1
    END-UNSTRING
    UNSTRING WS-PARM2 DELIMITED BY '='
        INTO WS-KEY2 WS-VALUE2
    END-UNSTRING
    YEARMONTH設定、MODE設定(FULL/SHORT判定)
    必須チェック:YEARMONTH未設定 → ABEND(CALL SUB03END)
  1-4.ワークエリア初期化
  1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
  1-6.出力ファイルOPENKIN09W01
  1-7.ヘッダー行書出(WRITE AFTER ADVANCING PAGE
    社員番号,日付,出勤時刻,退勤時刻,休暇種別,
    年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間

2.主処理(2000MAJSOR)(FETCH EOFまで下記を繰り返す)
  2-1.CURSOR FETCHDAILY_RECORDS
  2-2.CSV危険文字サニタイズ(INSPECT REPLACING
    MOVE 各項目を退避 → WS-SAFE-FIELD
    INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';'
                                   ALL X"0D" BY SPACE
                                   ALL X"0A" BY SPACE
  2-3.CSV行編集(STRING WITH POINTER
    MOVE 1 TO WS-PTR
    STRING
        WS-EMP-ID     DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-DATE       DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-TIME-IN    DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-TIME-OUT   DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-LEAVE-TYPE DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-ANNUAL-H   DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-PERSONAL-H DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-OFFICIAL-H DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-SICK-H     DELIMITED BY SIZE
        ','           DELIMITED BY SIZE
        WS-ABSENT-H   DELIMITED BY SIZE
      INTO WS-CSV-LINE WITH POINTER WS-PTR
    END-STRING
  2-4.行数カウンタ加算
  2-5.100行ごとにヘッダー再出力(WRITE AFTER ADVANCING 2 LINES + ヘッダー行)
    100件毎 → WRITE WS-SEC-REC AFTER ADVANCING 2 LINES
               WRITE WS-HDR-REC AFTER ADVANCING 1 LINE
  2-6.データ行出力(WRITE AFTER ADVANCING 1 LINE
    WRITE WS-OUT-REC FROM WS-CSV-LINE AFTER ADVANCING 1 LINE

3.MODE=SHORT時のみ追加処理(2500-SHORT-MODE
  3-1.MONTHLY_ABSENCE CURSOR OPEN
  3-2.STRINGで集計行編集
  3-3.セクション区切り出力
    WRITE WS-SEC-REC AFTER ADVANCING 2 LINES
  3-4.集計行出力
    WRITE WS-OUT-REC AFTER ADVANCING 1 LINE

4.終了処理(3000STPSOR
  4-1.CURSOR CLOSE
  4-2.DB切断
  4-3.出力ファイルCLOSE
  4-4.出力件数メッセージ出力
    【メッセージ編集】
    メッセージ番号:6(出力件数)
    PARM1'CSV-OUTPUT'
    PARM2CUN-W01OUT(出力行数)
  4-5.終了メッセージ出力
    【メッセージ編集】
    メッセージ番号:2(終了メッセージ)

WRITE AFTER ADVANCING 3種の使い分け

タイミング 構文 説明
ファイル先頭 WRITE header-rec AFTER ADVANCING PAGE 改ページ(最初のヘッダー)
100行ごと WRITE sep-rec AFTER ADVANCING 2 LINES セクション区切り(空行2行)
100行ごと WRITE header-rec AFTER ADVANCING 1 LINE 再ヘッダー出力
データ行 WRITE data-rec AFTER ADVANCING 1 LINE 通常データ行

出力レコード定義

CSV-OUTPUTOUTREC/KIN09REC200B FB

No 項目名 設定元 属性 備考
1 CSV-LINE STRING編集結果 X(200) CSV1行分の文字列データ

CSVフォーマット

ヘッダー行(WRITE AFTER ADVANCING PAGEで出力):

社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間

データ行:

00000101,20260501,0900,1800,99,0.0,0.0,0.0,0.0,0.0
00000101,20260502,0900,1300,02,0.0,4.0,0.0,0.0,4.0

MODE=SHORT時の集計行(WRITE AFTER ADVANCING 2 LINESで区切り):

社員番号,年月,年休計,事假計,因公特批假計,病欠計,未申請欠勤計
00000101,202605,8.0,4.0,0.0,0.0,4.0

カバレッジ構文一覧

構文 用途
ACCEPT FROM COMMAND-LINE PARM解析
INSPECT TALLYING カンマ区切り数チェック
INSPECT REPLACING CSV危険文字置換 ← 新規
STRING WITH POINTER 位置指定CSV行編集 ← 新規
WRITE AFTER ADVANCING PAGE ページヘッダー制御 ← 新規
WRITE AFTER ADVANCING 2 LINES セクション区切り ← 新規
WRITE AFTER ADVANCING 1 LINE データ行出力 ← 新規
STRING CSV行編集(DELIMITED BY SIZE
EXEC SQL SELECT(CURSOR) DB読込
DISPLAY 警告メッセージ表示