Add KIN08DBU (勤怠DB更新処理) and KIN09CSV (CSV出力処理)
This commit is contained in:
@@ -0,0 +1,693 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. KIN08DBU.
|
||||
*****************************************************************
|
||||
* システム名 : 勤怠休暇管理システム *
|
||||
* プログラムID : KIN08DBU *
|
||||
* プログラム名 : 勤怠DB更新処理 *
|
||||
* 作成日 : 2026-06-28 *
|
||||
* 処理概要 : DAILY-RECORDを読込み、DAILY_RECORDSにINSERT、*
|
||||
* 社員別月次集計後MONTHLY_ABSENCEにUPSERT、 *
|
||||
* 集計結果をABSENCE_SUMMARYファイルに出力する。*
|
||||
* SYSIN制御カード(T/P/M)をGO TO DEPENDING ON *
|
||||
* で分岐処理する。 *
|
||||
*****************************************************************
|
||||
* 更新履歴 *
|
||||
*---------------------------------------------------------------*
|
||||
* 更新日付 担当者 更新内容 *
|
||||
*---------------------------------------------------------------*
|
||||
* 26-06-28 @@@ 新規作成 *
|
||||
* *
|
||||
*****************************************************************
|
||||
ENVIRONMENT DIVISION.
|
||||
CONFIGURATION SECTION.
|
||||
SOURCE-COMPUTER. IBM-ZSERIES.
|
||||
OBJECT-COMPUTER. IBM-ZSERIES.
|
||||
*
|
||||
INPUT-OUTPUT SECTION.
|
||||
FILE-CONTROL.
|
||||
SELECT R01INNFIL ASSIGN TO "KIN08R01".
|
||||
SELECT SYSINFILE ASSIGN TO "KIN08S01".
|
||||
SELECT W01OUTFIL ASSIGN TO "KIN08W01".
|
||||
*
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
*
|
||||
*****************************************************************
|
||||
* R01 (DAILY-RECORD) 200B FB *
|
||||
*****************************************************************
|
||||
FD R01INNFIL
|
||||
LABEL RECORD IS STANDARD
|
||||
BLOCK CONTAINS 0
|
||||
RECORDING MODE IS F.
|
||||
01 R01INNREC.
|
||||
COPY KIN07REC REPLACING ==(A)== BY ==R01==.
|
||||
*
|
||||
*****************************************************************
|
||||
* SYSIN 80B FB *
|
||||
*****************************************************************
|
||||
FD SYSINFILE
|
||||
LABEL RECORD IS STANDARD
|
||||
BLOCK CONTAINS 0
|
||||
RECORDING MODE IS F.
|
||||
01 SYSINREC PIC X(080).
|
||||
*
|
||||
*****************************************************************
|
||||
* W01 (ABSENCE-SUMMARY) 80B FB *
|
||||
*****************************************************************
|
||||
FD W01OUTFIL
|
||||
LABEL RECORD IS STANDARD
|
||||
BLOCK CONTAINS 0
|
||||
RECORDING MODE IS F.
|
||||
01 W01OUTREC.
|
||||
COPY KIN08REC REPLACING ==(A)== BY ==W01==.
|
||||
*
|
||||
WORKING-STORAGE SECTION.
|
||||
*
|
||||
*****************************************************************
|
||||
* SQLCA *
|
||||
*****************************************************************
|
||||
EXEC SQL INCLUDE SQLCA END-EXEC.
|
||||
*
|
||||
*****************************************************************
|
||||
* コンスタント領域 *
|
||||
*****************************************************************
|
||||
01 CNSARA.
|
||||
03 CNS-PRGIDX PIC X(008) VALUE 'KIN08DBU'.
|
||||
03 CNS-MSGSTR PIC 9(003) VALUE 001.
|
||||
03 CNS-MSGFIN PIC 9(003) VALUE 002.
|
||||
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
|
||||
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
|
||||
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
|
||||
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
|
||||
03 CNS-KN0002 PIC 9(001) VALUE 2.
|
||||
03 CNS-ABD999 PIC 9(003) VALUE 999.
|
||||
*
|
||||
*****************************************************************
|
||||
* カウンタ領域 *
|
||||
*****************************************************************
|
||||
01 CUNARA.
|
||||
03 CUN-R01INN PIC S9(009) COMP-3
|
||||
VALUE ZERO.
|
||||
03 CUN-DBXINS PIC S9(009) COMP-3
|
||||
VALUE ZERO.
|
||||
03 CUN-DBXUPD PIC S9(009) COMP-3
|
||||
VALUE ZERO.
|
||||
03 CUN-DBXDEL PIC S9(009) COMP-3
|
||||
VALUE ZERO.
|
||||
03 CUN-W01OUT PIC S9(009) COMP-3
|
||||
VALUE ZERO.
|
||||
*
|
||||
*****************************************************************
|
||||
* 作業領域 *
|
||||
*****************************************************************
|
||||
01 WRKARA.
|
||||
*** EOF判定
|
||||
03 WRK-R01EOF PIC X(001).
|
||||
88 WRK-R01-EOF VALUE '1'.
|
||||
03 WRK-SYSIN-EOF PIC X(001).
|
||||
88 WRK-SYSIN-EOF-Y VALUE '1'.
|
||||
*** SYSINカード種別
|
||||
03 WRK-CARD-TYPE PIC X(001).
|
||||
03 WRK-DISP-IDX PIC 9(001).
|
||||
*** SYSIN解析値
|
||||
03 WRK-YEAR-MONTH PIC X(006).
|
||||
03 WRK-MODE-VALUE PIC X(010).
|
||||
88 RESET-MODE VALUE 'RESET'.
|
||||
88 NORMAL-MODE VALUE 'NORMAL'.
|
||||
03 WRK-PERIOD-FOUND PIC X(001).
|
||||
88 WRK-PERIOD-OK VALUE '1'.
|
||||
03 WRK-ALL-TARGETS PIC X(001).
|
||||
88 WRK-ALL-EMP VALUE '1'.
|
||||
*** SYSIN解析作業変数
|
||||
03 WS-PARM-NAME PIC X(020).
|
||||
03 WS-PARM-VALUE PIC X(020).
|
||||
*** SQLホスト変数
|
||||
03 HV-EMP-ID PIC X(008).
|
||||
03 HV-TARGET-DATE PIC X(008).
|
||||
03 HV-TIME-IN PIC X(004).
|
||||
03 HV-TIME-OUT PIC X(004).
|
||||
03 HV-ANNUAL-H PIC 9(004)V9(001).
|
||||
03 HV-PERSONAL-H PIC 9(004)V9(001).
|
||||
03 HV-OFFICIAL-H PIC 9(004)V9(001).
|
||||
03 HV-SICK-H PIC 9(004)V9(001).
|
||||
03 HV-ABSENT-H PIC 9(004)V9(001).
|
||||
03 HV-YEAR-MONTH PIC X(006).
|
||||
03 HV-CNT PIC 9(009).
|
||||
*** SYSINレコード退避
|
||||
03 WS-SYSIN-REC PIC X(080).
|
||||
*** 日付→年月抽出
|
||||
03 WRK-DATE-STR PIC X(008).
|
||||
*** INSPECT TALLYING用
|
||||
03 WS-ZERO-CNT PIC 9(002).
|
||||
*** 集計テーブル索引
|
||||
03 WS-AGG-IDX PIC 9(003).
|
||||
03 WS-FOUND-IDX PIC 9(003).
|
||||
*** SQLCODE表示用
|
||||
03 WRK-SQLCODE-DISP PIC +9(009).
|
||||
*
|
||||
*****************************************************************
|
||||
* 集計テーブル(社員別月次集計) *
|
||||
*****************************************************************
|
||||
01 AGGREGATION-TABLE.
|
||||
03 AGG-ENTRIES OCCURS 100 TIMES.
|
||||
05 AGG-EMP-ID PIC X(008).
|
||||
05 AGG-YEAR-MONTH PIC X(006).
|
||||
05 AGG-ANNUAL-H PIC 9(004)V9(001).
|
||||
05 AGG-PERSONAL-H PIC 9(004)V9(001).
|
||||
05 AGG-OFFICIAL-H PIC 9(004)V9(001).
|
||||
05 AGG-SICK-H PIC 9(004)V9(001).
|
||||
05 AGG-ABSENT-H PIC 9(004)V9(001).
|
||||
03 AGG-COUNT PIC 9(003).
|
||||
*
|
||||
*****************************************************************
|
||||
* 対象社員テーブル(Tカード指定用) *
|
||||
*****************************************************************
|
||||
01 TARGET-TABLE.
|
||||
03 TARGET-EMP OCCURS 100 TIMES
|
||||
PIC X(008).
|
||||
03 TARGET-COUNT PIC 9(003).
|
||||
*
|
||||
*****************************************************************
|
||||
* サブプログラム連絡領域 *
|
||||
*****************************************************************
|
||||
*** メッセージ編集出力SR用
|
||||
COPY ZANMSGAC.
|
||||
*** ABEND処理SR用
|
||||
COPY ZANENDAC.
|
||||
*
|
||||
PROCEDURE DIVISION.
|
||||
*****************************************************************
|
||||
* サブモジュールNO: (0.0) *
|
||||
* サブモジュール名: 制御処理 *
|
||||
* 処理概要 : メインコントロール処理 *
|
||||
*****************************************************************
|
||||
0000MAJCOLSOR SECTION.
|
||||
*
|
||||
*** 初期処理
|
||||
PERFORM 1000ITTSOR.
|
||||
*
|
||||
*** 主処理
|
||||
PERFORM 2000MAJSOR
|
||||
UNTIL WRK-R01-EOF.
|
||||
*
|
||||
*** 終了処理
|
||||
PERFORM 3000STPSOR.
|
||||
*
|
||||
0000MAJCOLSOR-EXT.
|
||||
GOBACK.
|
||||
*****************************************************************
|
||||
* サブモジュールNO: (1.0) *
|
||||
* サブモジュール名: 初期処理 *
|
||||
* 処理概要 : 開始メッセージ出力・SYSIN読込・OPEN *
|
||||
*****************************************************************
|
||||
1000ITTSOR SECTION.
|
||||
*
|
||||
*** 開始メッセージ出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGSTR TO M00MSGCOD.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
*** コンパイル日時出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGKEYINF TO M00MSGCOD.
|
||||
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
|
||||
MOVE 'COMPILED' TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
*** ワークエリア初期化
|
||||
INITIALIZE WRKARA
|
||||
AGGREGATION-TABLE.
|
||||
SET NORMAL-MODE TO TRUE.
|
||||
SET WRK-ALL-EMP TO TRUE.
|
||||
*
|
||||
*** DB接続
|
||||
EXEC SQL
|
||||
CONNECT TO 'data/kin.db'
|
||||
END-EXEC.
|
||||
*
|
||||
*** SYSINファイルOPEN+読込ループ
|
||||
OPEN INPUT SYSINFILE.
|
||||
MOVE '0' TO WRK-SYSIN-EOF.
|
||||
PERFORM 1199-SYSIN-LOOP
|
||||
THRU 1199-SYSIN-EXIT
|
||||
UNTIL WRK-SYSIN-EOF-Y.
|
||||
CLOSE SYSINFILE.
|
||||
*
|
||||
*** 必須パラメータ未設定チェック
|
||||
IF NOT WRK-PERIOD-OK
|
||||
MOVE CNS-ABD999 TO E01ABDCOD
|
||||
CALL 'SUB03END' USING E01ABDPAR
|
||||
END-IF.
|
||||
*
|
||||
*** 入出力ファイルOPEN
|
||||
OPEN INPUT R01INNFIL
|
||||
OUTPUT W01OUTFIL.
|
||||
*
|
||||
1000ITTSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(1.1) *
|
||||
* サブモジュール名:SYSIN読込制御 *
|
||||
* 処理概要 : SYSINを1行読込み、カード種別でGO TO分岐 *
|
||||
*****************************************************************
|
||||
1199-SYSIN-LOOP SECTION.
|
||||
*
|
||||
READ SYSINFILE INTO WS-SYSIN-REC
|
||||
AT END
|
||||
SET WRK-SYSIN-EOF-Y TO TRUE
|
||||
NOT AT END
|
||||
CONTINUE
|
||||
END-READ.
|
||||
*
|
||||
IF NOT WRK-SYSIN-EOF-Y
|
||||
MOVE WS-SYSIN-REC(1:1) TO WRK-CARD-TYPE
|
||||
MOVE 0 TO WRK-DISP-IDX
|
||||
IF WRK-CARD-TYPE = 'T'
|
||||
MOVE 1 TO WRK-DISP-IDX
|
||||
END-IF
|
||||
IF WRK-CARD-TYPE = 'P'
|
||||
MOVE 2 TO WRK-DISP-IDX
|
||||
END-IF
|
||||
IF WRK-CARD-TYPE = 'M'
|
||||
MOVE 3 TO WRK-DISP-IDX
|
||||
END-IF
|
||||
IF WRK-DISP-IDX > 0
|
||||
GO TO 1110-TARGETSOR
|
||||
1120-PERIODSOR
|
||||
1130-MODESOR
|
||||
DEPENDING ON WRK-DISP-IDX
|
||||
ELSE
|
||||
IF WRK-CARD-TYPE = '*'
|
||||
DISPLAY 'COMMENT: ' WS-SYSIN-REC
|
||||
ELSE
|
||||
DISPLAY 'WARNING: Unknown card type ['
|
||||
WRK-CARD-TYPE ']'
|
||||
END-IF
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
GO TO 1199-SYSIN-EXIT.
|
||||
*
|
||||
1110-TARGETSOR.
|
||||
*** Tカード: 対象社員一覧
|
||||
INITIALIZE TARGET-TABLE.
|
||||
UNSTRING WS-SYSIN-REC(3:78)
|
||||
DELIMITED BY ','
|
||||
INTO TARGET-EMP(1)
|
||||
TARGET-EMP(2)
|
||||
TARGET-EMP(3)
|
||||
TARGET-EMP(4)
|
||||
TARGET-EMP(5)
|
||||
TARGET-EMP(6)
|
||||
TARGET-EMP(7)
|
||||
TARGET-EMP(8)
|
||||
TARGET-EMP(9)
|
||||
TARGET-EMP(10)
|
||||
TALLYING IN TARGET-COUNT
|
||||
END-UNSTRING.
|
||||
DISPLAY 'TARGET: ' TARGET-COUNT ' employees'.
|
||||
MOVE 0 TO WRK-ALL-TARGETS.
|
||||
GO TO 1199-SYSIN-EXIT.
|
||||
*
|
||||
1120-PERIODSOR.
|
||||
*** Pカード: 処理対象年月
|
||||
UNSTRING WS-SYSIN-REC(3:78)
|
||||
DELIMITED BY '='
|
||||
INTO WS-PARM-NAME
|
||||
WS-PARM-VALUE
|
||||
END-UNSTRING.
|
||||
MOVE WS-PARM-VALUE(1:6) TO WRK-YEAR-MONTH.
|
||||
MOVE '1' TO WRK-PERIOD-FOUND.
|
||||
DISPLAY 'PERIOD: ' WRK-YEAR-MONTH.
|
||||
GO TO 1199-SYSIN-EXIT.
|
||||
*
|
||||
1130-MODESOR.
|
||||
*** Mカード: モード指定
|
||||
MOVE WS-SYSIN-REC(3:78) TO WRK-MODE-VALUE.
|
||||
INSPECT WRK-MODE-VALUE
|
||||
REPLACING ALL 'MODE=' BY SPACES.
|
||||
IF FUNCTION TRIM(WRK-MODE-VALUE) = 'RESET'
|
||||
SET RESET-MODE TO TRUE
|
||||
ELSE
|
||||
SET NORMAL-MODE TO TRUE
|
||||
END-IF.
|
||||
DISPLAY 'MODE: ' FUNCTION TRIM(WRK-MODE-VALUE).
|
||||
GO TO 1199-SYSIN-EXIT.
|
||||
*
|
||||
1199-SYSIN-EXIT.
|
||||
EXIT.
|
||||
*
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(2.0) *
|
||||
* サブモジュール名:主処理 *
|
||||
* 処理概要 : DAILY-RECORD読込→INSERT→集計 *
|
||||
*****************************************************************
|
||||
2000MAJSOR SECTION.
|
||||
*
|
||||
*** R01(DAILY-RECORD)読込
|
||||
READ R01INNFIL
|
||||
AT END
|
||||
MOVE '1' TO WRK-R01EOF
|
||||
NOT AT END
|
||||
ADD 1 TO CUN-R01INN
|
||||
END-READ.
|
||||
*
|
||||
IF WRK-R01-EOF
|
||||
EXIT SECTION
|
||||
END-IF.
|
||||
*
|
||||
*** 社員番号有効性チェック(INSPECT TALLYING)
|
||||
MOVE ZERO TO WS-ZERO-CNT.
|
||||
INSPECT R01EMP-ID TALLYING WS-ZERO-CNT
|
||||
FOR LEADING '0'.
|
||||
IF R01EMP-ID = SPACE
|
||||
OR R01EMP-ID = LOW-VALUES
|
||||
DISPLAY 'WARNING: Empty EMP-ID record '
|
||||
CUN-R01INN
|
||||
EXIT SECTION
|
||||
END-IF.
|
||||
*
|
||||
*** ホスト変数設定
|
||||
MOVE R01EMP-ID TO HV-EMP-ID.
|
||||
MOVE R01DATE TO HV-TARGET-DATE.
|
||||
MOVE R01TIME-IN TO HV-TIME-IN.
|
||||
MOVE R01TIME-OUT TO HV-TIME-OUT.
|
||||
MOVE R01ANNUAL-H TO HV-ANNUAL-H.
|
||||
MOVE R01PERSONAL-H TO HV-PERSONAL-H.
|
||||
MOVE R01OFFICIAL-H TO HV-OFFICIAL-H.
|
||||
MOVE R01SICK-H TO HV-SICK-H.
|
||||
MOVE R01ABSENT-H TO HV-ABSENT-H.
|
||||
*
|
||||
*** DAILY_RECORDS INSERT
|
||||
EXEC SQL
|
||||
INSERT INTO DAILY_RECORDS
|
||||
(EMP_ID, TARGET_DATE, TIME_IN, TIME_OUT,
|
||||
ANNUAL_LEAVE_H, PERSONAL_LEAVE_H,
|
||||
OFFICIAL_LEAVE_H, SICK_LEAVE_H,
|
||||
UNAPPROVED_ABSENT_H, UPDATED_AT)
|
||||
VALUES
|
||||
(:HV-EMP-ID, :HV-TARGET-DATE,
|
||||
:HV-TIME-IN, :HV-TIME-OUT,
|
||||
:HV-ANNUAL-H, :HV-PERSONAL-H,
|
||||
:HV-OFFICIAL-H, :HV-SICK-H,
|
||||
:HV-ABSENT-H, CURRENT_TIMESTAMP)
|
||||
END-EXEC.
|
||||
*
|
||||
IF SQLCODE NOT = 0
|
||||
DISPLAY 'WARNING: INSERT failed SQLCODE='
|
||||
SQLCODE ' EMP=' HV-EMP-ID
|
||||
' DATE=' HV-TARGET-DATE
|
||||
PERFORM 9100DBERRSOR
|
||||
ELSE
|
||||
ADD 1 TO CUN-DBXINS
|
||||
END-IF.
|
||||
*
|
||||
*** 対象社員フィルタリング(Tカード指定時)
|
||||
IF NOT WRK-ALL-EMP
|
||||
MOVE ZERO TO WS-FOUND-IDX
|
||||
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
|
||||
UNTIL WS-AGG-IDX > TARGET-COUNT
|
||||
IF TARGET-EMP(WS-AGG-IDX) = HV-EMP-ID
|
||||
MOVE WS-AGG-IDX TO WS-FOUND-IDX
|
||||
EXIT PERFORM
|
||||
END-IF
|
||||
END-PERFORM
|
||||
IF WS-FOUND-IDX = 0
|
||||
EXIT SECTION
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
*** 年月抽出(YYYYMMDD→YYYYMM)
|
||||
MOVE HV-TARGET-DATE TO WRK-DATE-STR.
|
||||
MOVE WRK-DATE-STR(1:6) TO HV-YEAR-MONTH.
|
||||
*
|
||||
*** 集計テーブルに加算(線形探索)
|
||||
MOVE ZERO TO WS-FOUND-IDX.
|
||||
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
|
||||
UNTIL WS-AGG-IDX > AGG-COUNT
|
||||
IF AGG-EMP-ID(WS-AGG-IDX) = HV-EMP-ID
|
||||
AND AGG-YEAR-MONTH(WS-AGG-IDX) = HV-YEAR-MONTH
|
||||
MOVE WS-AGG-IDX TO WS-FOUND-IDX
|
||||
EXIT PERFORM
|
||||
END-IF
|
||||
END-PERFORM.
|
||||
*
|
||||
IF WS-FOUND-IDX > 0
|
||||
COMPUTE AGG-ANNUAL-H(WS-FOUND-IDX)
|
||||
ROUNDED =
|
||||
AGG-ANNUAL-H(WS-FOUND-IDX) + HV-ANNUAL-H
|
||||
ON SIZE ERROR
|
||||
DISPLAY 'WARNING: Annual-H overflow '
|
||||
HV-EMP-ID
|
||||
MOVE ZERO TO
|
||||
AGG-ANNUAL-H(WS-FOUND-IDX)
|
||||
END-COMPUTE
|
||||
ADD HV-PERSONAL-H TO
|
||||
AGG-PERSONAL-H(WS-FOUND-IDX)
|
||||
ADD HV-OFFICIAL-H TO
|
||||
AGG-OFFICIAL-H(WS-FOUND-IDX)
|
||||
ADD HV-SICK-H TO
|
||||
AGG-SICK-H(WS-FOUND-IDX)
|
||||
ADD HV-ABSENT-H TO
|
||||
AGG-ABSENT-H(WS-FOUND-IDX)
|
||||
ELSE
|
||||
IF AGG-COUNT < 100
|
||||
ADD 1 TO AGG-COUNT
|
||||
MOVE HV-EMP-ID TO
|
||||
AGG-EMP-ID(AGG-COUNT)
|
||||
MOVE HV-YEAR-MONTH TO
|
||||
AGG-YEAR-MONTH(AGG-COUNT)
|
||||
MOVE HV-ANNUAL-H TO
|
||||
AGG-ANNUAL-H(AGG-COUNT)
|
||||
MOVE HV-PERSONAL-H TO
|
||||
AGG-PERSONAL-H(AGG-COUNT)
|
||||
MOVE HV-OFFICIAL-H TO
|
||||
AGG-OFFICIAL-H(AGG-COUNT)
|
||||
MOVE HV-SICK-H TO
|
||||
AGG-SICK-H(AGG-COUNT)
|
||||
MOVE HV-ABSENT-H TO
|
||||
AGG-ABSENT-H(AGG-COUNT)
|
||||
ELSE
|
||||
DISPLAY 'WARNING: Agg table full '
|
||||
HV-EMP-ID
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
2000MAJSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(3.0) *
|
||||
* サブモジュール名:終了処理 *
|
||||
* 処理概要 : RESET→DELETE、UPSERT、ファイル出力、COMMIT *
|
||||
*****************************************************************
|
||||
3000STPSOR SECTION.
|
||||
*
|
||||
*** MODE=RESET: 既存レコード削除
|
||||
IF RESET-MODE
|
||||
EXEC SQL
|
||||
DELETE FROM MONTHLY_ABSENCE
|
||||
WHERE YEAR_MONTH = :WRK-YEAR-MONTH
|
||||
END-EXEC
|
||||
IF SQLCODE NOT = 0
|
||||
PERFORM 9100DBERRSOR
|
||||
ELSE
|
||||
ADD 1 TO CUN-DBXDEL
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
*** 集計結果→MONTHLY_ABSENCE UPSERT
|
||||
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
|
||||
UNTIL WS-AGG-IDX > AGG-COUNT
|
||||
MOVE AGG-EMP-ID(WS-AGG-IDX)
|
||||
TO HV-EMP-ID
|
||||
MOVE AGG-YEAR-MONTH(WS-AGG-IDX)
|
||||
TO HV-YEAR-MONTH
|
||||
MOVE AGG-ANNUAL-H(WS-AGG-IDX)
|
||||
TO HV-ANNUAL-H
|
||||
MOVE AGG-PERSONAL-H(WS-AGG-IDX)
|
||||
TO HV-PERSONAL-H
|
||||
MOVE AGG-OFFICIAL-H(WS-AGG-IDX)
|
||||
TO HV-OFFICIAL-H
|
||||
MOVE AGG-SICK-H(WS-AGG-IDX)
|
||||
TO HV-SICK-H
|
||||
MOVE AGG-ABSENT-H(WS-AGG-IDX)
|
||||
TO HV-ABSENT-H
|
||||
*
|
||||
EXEC SQL
|
||||
SELECT COUNT(*) INTO :HV-CNT
|
||||
FROM MONTHLY_ABSENCE
|
||||
WHERE EMP_ID = :HV-EMP-ID
|
||||
AND YEAR_MONTH = :HV-YEAR-MONTH
|
||||
END-EXEC
|
||||
*
|
||||
IF SQLCODE = 0
|
||||
IF HV-CNT > 0
|
||||
EXEC SQL
|
||||
UPDATE MONTHLY_ABSENCE SET
|
||||
ANNUAL_LEAVE_H =
|
||||
:HV-ANNUAL-H
|
||||
, PERSONAL_LEAVE_H =
|
||||
:HV-PERSONAL-H
|
||||
, OFFICIAL_LEAVE_H =
|
||||
:HV-OFFICIAL-H
|
||||
, SICK_LEAVE_H =
|
||||
:HV-SICK-H
|
||||
, UNAPPROVED_ABSENT_H =
|
||||
:HV-ABSENT-H
|
||||
, UPDATED_AT =
|
||||
CURRENT_TIMESTAMP
|
||||
WHERE EMP_ID = :HV-EMP-ID
|
||||
AND YEAR_MONTH =
|
||||
:HV-YEAR-MONTH
|
||||
END-EXEC
|
||||
IF SQLCODE NOT = 0
|
||||
PERFORM 9100DBERRSOR
|
||||
ELSE
|
||||
ADD 1 TO CUN-DBXUPD
|
||||
END-IF
|
||||
ELSE
|
||||
EXEC SQL
|
||||
INSERT INTO MONTHLY_ABSENCE
|
||||
(EMP_ID, YEAR_MONTH,
|
||||
ANNUAL_LEAVE_H,
|
||||
PERSONAL_LEAVE_H,
|
||||
OFFICIAL_LEAVE_H,
|
||||
SICK_LEAVE_H,
|
||||
UNAPPROVED_ABSENT_H,
|
||||
UPDATED_AT)
|
||||
VALUES
|
||||
(:HV-EMP-ID,
|
||||
:HV-YEAR-MONTH,
|
||||
:HV-ANNUAL-H,
|
||||
:HV-PERSONAL-H,
|
||||
:HV-OFFICIAL-H,
|
||||
:HV-SICK-H,
|
||||
:HV-ABSENT-H,
|
||||
CURRENT_TIMESTAMP)
|
||||
END-EXEC
|
||||
IF SQLCODE NOT = 0
|
||||
PERFORM 9100DBERRSOR
|
||||
ELSE
|
||||
ADD 1 TO CUN-DBXINS
|
||||
END-IF
|
||||
END-IF
|
||||
ELSE
|
||||
DISPLAY 'WARNING: SELECT COUNT failed '
|
||||
HV-EMP-ID
|
||||
END-IF
|
||||
END-PERFORM.
|
||||
*
|
||||
*** ABSENCE_SUMMARYファイル出力
|
||||
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
|
||||
UNTIL WS-AGG-IDX > AGG-COUNT
|
||||
INITIALIZE W01OUTREC
|
||||
MOVE AGG-EMP-ID(WS-AGG-IDX)
|
||||
TO W01EMP-ID
|
||||
MOVE AGG-YEAR-MONTH(WS-AGG-IDX)
|
||||
TO W01YEAR-MONTH
|
||||
MOVE AGG-ANNUAL-H(WS-AGG-IDX)
|
||||
TO W01ANNUAL-LEAVE-H
|
||||
MOVE AGG-PERSONAL-H(WS-AGG-IDX)
|
||||
TO W01PERSONAL-LEAVE-H
|
||||
MOVE AGG-OFFICIAL-H(WS-AGG-IDX)
|
||||
TO W01OFFICIAL-LEAVE-H
|
||||
MOVE AGG-SICK-H(WS-AGG-IDX)
|
||||
TO W01SICK-LEAVE-H
|
||||
MOVE AGG-ABSENT-H(WS-AGG-IDX)
|
||||
TO W01ABSENT-H
|
||||
WRITE W01OUTREC
|
||||
ADD 1 TO CUN-W01OUT
|
||||
END-PERFORM.
|
||||
*
|
||||
*** COMMIT
|
||||
EXEC SQL
|
||||
COMMIT WORK
|
||||
END-EXEC.
|
||||
*
|
||||
*** 入出力ファイルCLOSE
|
||||
CLOSE R01INNFIL
|
||||
W01OUTFIL.
|
||||
*
|
||||
*** 件数メッセージ出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGIINKES TO M00MSGCOD.
|
||||
MOVE 'KIN08R01' TO M00UMKDATS22-01.
|
||||
MOVE CUN-R01INN TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGIINKES TO M00MSGCOD.
|
||||
MOVE 'INS' TO M00UMKDATS22-01.
|
||||
MOVE CUN-DBXINS TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGIINKES TO M00MSGCOD.
|
||||
MOVE 'UPD' TO M00UMKDATS22-01.
|
||||
MOVE CUN-DBXUPD TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
IF CUN-DBXDEL > 0
|
||||
INITIALIZE M00MHOPAR
|
||||
MOVE CNS-MSGOUTKES TO M00MSGCOD
|
||||
MOVE 'DEL' TO M00UMKDATS22-01
|
||||
MOVE CUN-DBXDEL TO M00UMKDATS22-02
|
||||
PERFORM 4000MSGOUTSOR
|
||||
END-IF.
|
||||
*
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGOUTKES TO M00MSGCOD.
|
||||
MOVE 'KIN08W01' TO M00UMKDATS22-01.
|
||||
MOVE CUN-W01OUT TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
*** 終了メッセージ出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGFIN TO M00MSGCOD.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
3000STPSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブプログラムNO:(4.0) *
|
||||
* サブプログラム名:メッセージ編集出力処理 *
|
||||
* 処理概要 : メッセージ編集出力サブPGM呼出 *
|
||||
*****************************************************************
|
||||
4000MSGOUTSOR SECTION.
|
||||
*
|
||||
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
|
||||
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
|
||||
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
|
||||
CALL 'SUB02MSG' USING M00MHOPAR.
|
||||
*
|
||||
4000MSGOUTSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブプログラムNO:(9.1) *
|
||||
* サブプログラム名:DBエラー処理 *
|
||||
* 処理概要 : ROLLBACK+DISPLAY+ABEND *
|
||||
*****************************************************************
|
||||
9100DBERRSOR SECTION.
|
||||
*
|
||||
MOVE SQLCODE TO WRK-SQLCODE-DISP.
|
||||
DISPLAY 'SQL ERROR: ' WRK-SQLCODE-DISP
|
||||
' PGM=KIN08DBU'.
|
||||
EXEC SQL
|
||||
ROLLBACK WORK
|
||||
END-EXEC.
|
||||
PERFORM 9999ABDSOR.
|
||||
*
|
||||
9100DBERRSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブプログラムNO:(9.9) *
|
||||
* サブプログラム名:ABEND処理 *
|
||||
* 処理概要 : ABENDサブPGM呼出 *
|
||||
*****************************************************************
|
||||
9999ABDSOR SECTION.
|
||||
*
|
||||
MOVE CNS-ABD999 TO E01ABDCOD.
|
||||
CALL 'SUB03END' USING E01ABDPAR.
|
||||
*
|
||||
9999ABDSOR-EXT.
|
||||
EXIT.
|
||||
@@ -0,0 +1,608 @@
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. KIN09CSV.
|
||||
*****************************************************************
|
||||
* システム名 : 勤怠休暇管理システム *
|
||||
* プログラムID : KIN09CSV *
|
||||
* プログラム名 : 勤怠CSV出力処理 *
|
||||
* 作成日 : 2026-06-28 *
|
||||
* 処理概要 : DAILY_RECORDSをDBからSELECTし、STRING WITH *
|
||||
* POINTERでCSV行を編集、WRITE AFTER ADVANCING *
|
||||
* (PAGE/2LINES/1LINE)で出力する。 *
|
||||
* INSPECT REPLACINGでCSV危険文字をサニタイズ。*
|
||||
* MODE=FULL/SHORTで出力範囲を制御。 *
|
||||
*****************************************************************
|
||||
* 更新履歴 *
|
||||
*---------------------------------------------------------------*
|
||||
* 更新日付 担当者 更新内容 *
|
||||
*---------------------------------------------------------------*
|
||||
* 26-06-28 @@@ 新規作成 *
|
||||
* *
|
||||
*****************************************************************
|
||||
ENVIRONMENT DIVISION.
|
||||
CONFIGURATION SECTION.
|
||||
SOURCE-COMPUTER. IBM-ZSERIES.
|
||||
OBJECT-COMPUTER. IBM-ZSERIES.
|
||||
*
|
||||
INPUT-OUTPUT SECTION.
|
||||
FILE-CONTROL.
|
||||
SELECT CSVOUTFIL ASSIGN TO KIN09W01.
|
||||
*
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
*
|
||||
*****************************************************************
|
||||
* W01 (CSV-OUTPUT) 200B FB *
|
||||
*****************************************************************
|
||||
FD CSVOUTFIL
|
||||
LABEL RECORD IS STANDARD
|
||||
BLOCK CONTAINS 0
|
||||
RECORDING MODE IS F.
|
||||
01 CSVOUTREC.
|
||||
COPY KIN09REC REPLACING ==(A)== BY ==OUT==.
|
||||
*
|
||||
WORKING-STORAGE SECTION.
|
||||
*
|
||||
*****************************************************************
|
||||
* SQLCA *
|
||||
*****************************************************************
|
||||
EXEC SQL INCLUDE SQLCA END-EXEC.
|
||||
*
|
||||
*****************************************************************
|
||||
* コンスタント領域 *
|
||||
*****************************************************************
|
||||
01 CNSARA.
|
||||
03 CNS-PRGIDX PIC X(008) VALUE 'KIN09CSV'.
|
||||
03 CNS-MSGSTR PIC 9(003) VALUE 001.
|
||||
03 CNS-MSGFIN PIC 9(003) VALUE 002.
|
||||
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
|
||||
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
|
||||
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
|
||||
03 CNS-KN0002 PIC 9(001) VALUE 2.
|
||||
03 CNS-ABD999 PIC 9(003) VALUE 999.
|
||||
*
|
||||
*****************************************************************
|
||||
* カウンタ領域 *
|
||||
*****************************************************************
|
||||
01 CUNARA.
|
||||
03 CUN-W01OUT PIC S9(009) COMP-3
|
||||
VALUE ZERO.
|
||||
*
|
||||
*****************************************************************
|
||||
* 作業領域 *
|
||||
*****************************************************************
|
||||
01 WRKARA.
|
||||
*** 日付範囲
|
||||
03 WS-YEARMONTH PIC X(006).
|
||||
03 WS-DATE-FROM PIC X(008).
|
||||
03 WS-DATE-TO PIC X(008).
|
||||
*** モード
|
||||
03 WS-MODE PIC X(005).
|
||||
88 MODE-FULL VALUE 'FULL'.
|
||||
88 MODE-SHORT VALUE 'SHORT'.
|
||||
*** PARM解析
|
||||
03 WS-CMDLINE PIC X(200).
|
||||
03 WS-COMMA-CNT PIC 9(002).
|
||||
03 WS-PARM1 PIC X(100).
|
||||
03 WS-PARM2 PIC X(100).
|
||||
03 WS-KEY1 PIC X(020).
|
||||
03 WS-VALUE1 PIC X(080).
|
||||
03 WS-KEY2 PIC X(020).
|
||||
03 WS-VALUE2 PIC X(080).
|
||||
*** ホスト変数
|
||||
03 HV-EMP-ID PIC X(008).
|
||||
03 HV-TARGET-DATE PIC X(008).
|
||||
03 HV-TIME-IN PIC X(004).
|
||||
03 HV-TIME-OUT PIC X(004).
|
||||
03 HV-ANNUAL-H PIC 9(004)V9(001).
|
||||
03 HV-PERSONAL-H PIC 9(004)V9(001).
|
||||
03 HV-OFFICIAL-H PIC 9(004)V9(001).
|
||||
03 HV-SICK-H PIC 9(004)V9(001).
|
||||
03 HV-ABSENT-H PIC 9(004)V9(001).
|
||||
03 HV-MTH-EMP-ID PIC X(008).
|
||||
03 HV-MTH-YEAR-MONTH PIC X(006).
|
||||
03 HV-MTH-ANNUAL-H PIC 9(004)V9(001).
|
||||
03 HV-MTH-PERSONAL-H PIC 9(004)V9(001).
|
||||
03 HV-MTH-OFFICIAL-H PIC 9(004)V9(001).
|
||||
03 HV-MTH-SICK-H PIC 9(004)V9(001).
|
||||
03 HV-MTH-ABSENT-H PIC 9(004)V9(001).
|
||||
*** CSV編集
|
||||
03 WS-CSV-LINE PIC X(200).
|
||||
03 WS-PTR PIC 9(003).
|
||||
03 WS-SAFE-FIELD PIC X(080).
|
||||
03 WS-LEAVE-TYPE PIC X(002).
|
||||
*** CSV時間編集(Z(3)9.9→"xxx.x"形式)
|
||||
03 WS-EDIT-ANNUAL PIC Z(3)9.9.
|
||||
03 WS-EDIT-PERSONAL PIC Z(3)9.9.
|
||||
03 WS-EDIT-OFFICIAL PIC Z(3)9.9.
|
||||
03 WS-EDIT-SICK PIC Z(3)9.9.
|
||||
03 WS-EDIT-ABSENT PIC Z(3)9.9.
|
||||
03 WS-EDIT-MTH-ANNUAL PIC Z(3)9.9.
|
||||
03 WS-EDIT-MTH-PERSONAL PIC Z(3)9.9.
|
||||
03 WS-EDIT-MTH-OFFICIAL PIC Z(3)9.9.
|
||||
03 WS-EDIT-MTH-SICK PIC Z(3)9.9.
|
||||
03 WS-EDIT-MTH-ABSENT PIC Z(3)9.9.
|
||||
*** 行数カウンタ(ヘッダー再出力用)
|
||||
03 WS-LINE-COUNT PIC 9(004).
|
||||
*** FETCH EOF
|
||||
03 WS-DAILY-EOF PIC X(001).
|
||||
88 WS-DAILY-EOF-Y VALUE '1'.
|
||||
03 WS-CNT PIC 9(009).
|
||||
*** SQLCODE表示
|
||||
03 WRK-SQLCODE-DISP PIC +9(009).
|
||||
*
|
||||
*****************************************************************
|
||||
* サブプログラム連絡領域 *
|
||||
*****************************************************************
|
||||
*** メッセージ編集出力SR用
|
||||
COPY ZANMSGAC.
|
||||
*** ABEND処理SR用
|
||||
COPY ZANENDAC.
|
||||
*
|
||||
PROCEDURE DIVISION.
|
||||
*****************************************************************
|
||||
* サブモジュールNO: (0.0) *
|
||||
* サブモジュール名: 制御処理 *
|
||||
* 処理概要 : メインコントロール処理 *
|
||||
*****************************************************************
|
||||
0000MAJCOLSOR SECTION.
|
||||
*
|
||||
*** 初期処理
|
||||
PERFORM 1000ITTSOR.
|
||||
*
|
||||
*** 主処理
|
||||
PERFORM 2000MAJSOR
|
||||
UNTIL WS-DAILY-EOF-Y.
|
||||
*
|
||||
*** MODE=SHORT時追加処理
|
||||
IF MODE-SHORT
|
||||
PERFORM 2500-SHORT-MODE
|
||||
END-IF.
|
||||
*
|
||||
*** 終了処理
|
||||
PERFORM 3000STPSOR.
|
||||
*
|
||||
0000MAJCOLSOR-EXT.
|
||||
GOBACK.
|
||||
*****************************************************************
|
||||
* サブモジュールNO: (1.0) *
|
||||
* サブモジュール名: 初期処理 *
|
||||
* 処理概要 : 開始メッセージ・PARM解析・DB接続・OPEN *
|
||||
*****************************************************************
|
||||
1000ITTSOR SECTION.
|
||||
*
|
||||
*** 開始メッセージ出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGSTR TO M00MSGCOD.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
*** コンパイル日時出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGKEYINF TO M00MSGCOD.
|
||||
MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01.
|
||||
MOVE 'COMPILED' TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
*** PARM解析(ACCEPT FROM COMMAND-LINE)
|
||||
PERFORM 1100PARMSOR.
|
||||
*
|
||||
*** ワークエリア初期化
|
||||
INITIALIZE WRKARA.
|
||||
*
|
||||
*** DB接続
|
||||
EXEC SQL
|
||||
CONNECT TO 'data/kin.db'
|
||||
END-EXEC.
|
||||
*
|
||||
*** 出力ファイルOPEN
|
||||
OPEN OUTPUT CSVOUTFIL.
|
||||
*
|
||||
*** ヘッダー行書出(PAGE)
|
||||
MOVE '社員番号,日付,出勤時刻'
|
||||
TO WS-CSV-LINE(1:28)
|
||||
MOVE ',退勤時刻,休暇種別,年休時間'
|
||||
TO WS-CSV-LINE(29:28)
|
||||
MOVE ',事假時間,因公特批假時間'
|
||||
TO WS-CSV-LINE(57:24)
|
||||
MOVE ',病欠時間,未申請欠勤時間'
|
||||
TO WS-CSV-LINE(81:24)
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING PAGE.
|
||||
ADD 1 TO CUN-W01OUT.
|
||||
MOVE ZERO TO WS-LINE-COUNT.
|
||||
*
|
||||
*** CURSOR OPEN + 初回FETCH
|
||||
PERFORM 1200-DAILY-OPEN.
|
||||
*
|
||||
1000ITTSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(1.1) *
|
||||
* サブモジュール名:PARM解析 *
|
||||
* 処理概要 : コマンドライン引数を解析 *
|
||||
*****************************************************************
|
||||
1100PARMSOR SECTION.
|
||||
*
|
||||
ACCEPT WS-CMDLINE FROM COMMAND-LINE.
|
||||
*
|
||||
*** カンマ区切り数チェック
|
||||
MOVE ZERO TO WS-COMMA-CNT.
|
||||
INSPECT WS-CMDLINE TALLYING WS-COMMA-CNT
|
||||
FOR ALL ','.
|
||||
*
|
||||
IF WS-COMMA-CNT < 1
|
||||
DISPLAY 'WARNING: Missing MODE, using FULL'
|
||||
END-IF.
|
||||
*
|
||||
*** UNSTRINGでPARM分解
|
||||
UNSTRING WS-CMDLINE
|
||||
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設定
|
||||
IF WS-KEY1 = 'YEARMONTH'
|
||||
MOVE WS-VALUE1(1:6) TO WS-YEARMONTH
|
||||
ELSE
|
||||
IF WS-KEY2 = 'YEARMONTH'
|
||||
MOVE WS-VALUE2(1:6) TO WS-YEARMONTH
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
*** 必須チェック
|
||||
IF WS-YEARMONTH = SPACE
|
||||
MOVE CNS-ABD999 TO E01ABDCOD
|
||||
CALL 'SUB03END' USING E01ABDPAR
|
||||
END-IF.
|
||||
*
|
||||
*** 日付範囲設定(YYYYMM01〜YYYYMM31)
|
||||
MOVE WS-YEARMONTH TO WS-DATE-FROM(1:6).
|
||||
MOVE '01' TO WS-DATE-FROM(7:2).
|
||||
MOVE WS-YEARMONTH TO WS-DATE-TO(1:6).
|
||||
MOVE '31' TO WS-DATE-TO(7:2).
|
||||
*
|
||||
*** MODE設定
|
||||
MOVE 'FULL' TO WS-MODE.
|
||||
IF WS-KEY1 = 'MODE'
|
||||
MOVE WS-VALUE1(1:5) TO WS-MODE
|
||||
ELSE
|
||||
IF WS-KEY2 = 'MODE'
|
||||
MOVE WS-VALUE2(1:5) TO WS-MODE
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
1100PARMSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(1.2) *
|
||||
* サブモジュール名:DAILY_RECORDS CURSOR OPEN + 初回FETCH *
|
||||
* 処理概要 : 該当月の全レコードをSELECT *
|
||||
*****************************************************************
|
||||
1200-DAILY-OPEN SECTION.
|
||||
*
|
||||
EXEC SQL
|
||||
DECLARE C_DAILY CURSOR FOR
|
||||
SELECT EMP_ID, TARGET_DATE,
|
||||
TIME_IN, TIME_OUT,
|
||||
ANNUAL_LEAVE_H, PERSONAL_LEAVE_H,
|
||||
OFFICIAL_LEAVE_H, SICK_LEAVE_H,
|
||||
UNAPPROVED_ABSENT_H
|
||||
FROM DAILY_RECORDS
|
||||
WHERE TARGET_DATE >= :WS-DATE-FROM
|
||||
AND TARGET_DATE <= :WS-DATE-TO
|
||||
ORDER BY EMP_ID, TARGET_DATE
|
||||
END-EXEC.
|
||||
*
|
||||
EXEC SQL
|
||||
OPEN C_DAILY
|
||||
END-EXEC.
|
||||
*
|
||||
EXEC SQL
|
||||
FETCH C_DAILY
|
||||
INTO :HV-EMP-ID,
|
||||
:HV-TARGET-DATE,
|
||||
:HV-TIME-IN,
|
||||
:HV-TIME-OUT,
|
||||
:HV-ANNUAL-H,
|
||||
:HV-PERSONAL-H,
|
||||
:HV-OFFICIAL-H,
|
||||
:HV-SICK-H,
|
||||
:HV-ABSENT-H
|
||||
END-EXEC.
|
||||
*
|
||||
IF SQLCODE NOT = 0
|
||||
MOVE '1' TO WS-DAILY-EOF
|
||||
END-IF.
|
||||
*
|
||||
1200-DAILY-OPEN-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(2.0) *
|
||||
* サブモジュール名:主処理(CSV行出力) *
|
||||
* 処理概要 : DAILY_RECORDS→CSV行編集→WRITE *
|
||||
*****************************************************************
|
||||
2000MAJSOR SECTION.
|
||||
*
|
||||
*** 休暇種別判定(99=なし)
|
||||
MOVE '99' TO WS-LEAVE-TYPE.
|
||||
IF HV-ANNUAL-H > 0
|
||||
MOVE '01' TO WS-LEAVE-TYPE
|
||||
ELSE
|
||||
IF HV-PERSONAL-H > 0
|
||||
MOVE '02' TO WS-LEAVE-TYPE
|
||||
ELSE
|
||||
IF HV-OFFICIAL-H > 0
|
||||
MOVE '03' TO WS-LEAVE-TYPE
|
||||
ELSE
|
||||
IF HV-SICK-H > 0
|
||||
MOVE '04' TO WS-LEAVE-TYPE
|
||||
END-IF
|
||||
END-IF
|
||||
END-IF
|
||||
END-IF.
|
||||
*
|
||||
*** CSV危険文字サニタイズ(INSPECT REPLACING)
|
||||
MOVE HV-EMP-ID TO WS-SAFE-FIELD.
|
||||
INSPECT WS-SAFE-FIELD
|
||||
REPLACING ALL ',' BY ';'
|
||||
ALL X"0D" BY SPACE
|
||||
ALL X"0A" BY SPACE.
|
||||
MOVE WS-SAFE-FIELD TO HV-EMP-ID.
|
||||
*
|
||||
*** 時間編集(小数点付き表示に変換)
|
||||
MOVE HV-ANNUAL-H TO WS-EDIT-ANNUAL.
|
||||
MOVE HV-PERSONAL-H TO WS-EDIT-PERSONAL.
|
||||
MOVE HV-OFFICIAL-H TO WS-EDIT-OFFICIAL.
|
||||
MOVE HV-SICK-H TO WS-EDIT-SICK.
|
||||
MOVE HV-ABSENT-H TO WS-EDIT-ABSENT.
|
||||
*** CSV行編集(STRING WITH POINTER)
|
||||
MOVE 1 TO WS-PTR.
|
||||
STRING
|
||||
HV-EMP-ID DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
HV-TARGET-DATE DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
HV-TIME-IN DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
HV-TIME-OUT DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-LEAVE-TYPE DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-ANNUAL DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-PERSONAL DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-OFFICIAL DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-SICK DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-ABSENT DELIMITED BY SIZE
|
||||
INTO WS-CSV-LINE
|
||||
WITH POINTER WS-PTR
|
||||
END-STRING.
|
||||
*
|
||||
*** 100行ごとにヘッダー再出力
|
||||
ADD 1 TO WS-LINE-COUNT.
|
||||
IF WS-LINE-COUNT > 100
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING 2 LINES
|
||||
MOVE '社員番号,日付,出勤時刻'
|
||||
TO WS-CSV-LINE(1:28)
|
||||
MOVE ',退勤時刻,休暇種別,年休時間'
|
||||
TO WS-CSV-LINE(29:28)
|
||||
MOVE ',事假時間,因公特批假時間'
|
||||
TO WS-CSV-LINE(57:24)
|
||||
MOVE ',病欠時間,未申請欠勤時間'
|
||||
TO WS-CSV-LINE(81:24)
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING 1 LINE
|
||||
ADD 1 TO CUN-W01OUT
|
||||
MOVE ZERO TO WS-LINE-COUNT
|
||||
END-IF.
|
||||
*
|
||||
*** データ行出力
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING 1 LINE.
|
||||
ADD 1 TO CUN-W01OUT.
|
||||
*
|
||||
*** 次FETCH
|
||||
EXEC SQL
|
||||
FETCH C_DAILY
|
||||
INTO :HV-EMP-ID,
|
||||
:HV-TARGET-DATE,
|
||||
:HV-TIME-IN,
|
||||
:HV-TIME-OUT,
|
||||
:HV-ANNUAL-H,
|
||||
:HV-PERSONAL-H,
|
||||
:HV-OFFICIAL-H,
|
||||
:HV-SICK-H,
|
||||
:HV-ABSENT-H
|
||||
END-EXEC.
|
||||
*
|
||||
IF SQLCODE NOT = 0
|
||||
MOVE '1' TO WS-DAILY-EOF
|
||||
END-IF.
|
||||
*
|
||||
2000MAJSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(2.5) *
|
||||
* サブモジュール名:MODE=SHORT集計行出力 *
|
||||
* 処理概要 : MONTHLY_ABSENCEをSELECTしてCSVに追加 *
|
||||
*****************************************************************
|
||||
2500-SHORT-MODE SECTION.
|
||||
*
|
||||
*** セクション区切り
|
||||
MOVE SPACE TO WS-CSV-LINE.
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING 2 LINES.
|
||||
*
|
||||
*** 集計行ヘッダー
|
||||
MOVE '社員番号,年月,年休計,事假計'
|
||||
TO WS-CSV-LINE(1:24)
|
||||
MOVE ',因公特批假計,病欠計,未申請欠勤計'
|
||||
TO WS-CSV-LINE(25:32)
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING 1 LINE.
|
||||
ADD 1 TO CUN-W01OUT.
|
||||
*
|
||||
*** MONTHLY_ABSENCE CURSOR
|
||||
EXEC SQL
|
||||
DECLARE C_MONTHLY CURSOR FOR
|
||||
SELECT EMP_ID, YEAR_MONTH,
|
||||
ANNUAL_LEAVE_H, PERSONAL_LEAVE_H,
|
||||
OFFICIAL_LEAVE_H, SICK_LEAVE_H,
|
||||
UNAPPROVED_ABSENT_H
|
||||
FROM MONTHLY_ABSENCE
|
||||
WHERE YEAR_MONTH = :WS-YEARMONTH
|
||||
ORDER BY EMP_ID
|
||||
END-EXEC.
|
||||
*
|
||||
EXEC SQL
|
||||
OPEN C_MONTHLY
|
||||
END-EXEC.
|
||||
*
|
||||
EXEC SQL
|
||||
FETCH C_MONTHLY
|
||||
INTO :HV-MTH-EMP-ID,
|
||||
:HV-MTH-YEAR-MONTH,
|
||||
:HV-MTH-ANNUAL-H,
|
||||
:HV-MTH-PERSONAL-H,
|
||||
:HV-MTH-OFFICIAL-H,
|
||||
:HV-MTH-SICK-H,
|
||||
:HV-MTH-ABSENT-H
|
||||
END-EXEC.
|
||||
*
|
||||
PERFORM UNTIL SQLCODE NOT = 0
|
||||
MOVE HV-MTH-ANNUAL-H TO WS-EDIT-MTH-ANNUAL
|
||||
MOVE HV-MTH-PERSONAL-H TO WS-EDIT-MTH-PERSONAL
|
||||
MOVE HV-MTH-OFFICIAL-H TO WS-EDIT-MTH-OFFICIAL
|
||||
MOVE HV-MTH-SICK-H TO WS-EDIT-MTH-SICK
|
||||
MOVE HV-MTH-ABSENT-H TO WS-EDIT-MTH-ABSENT
|
||||
MOVE 1 TO WS-PTR
|
||||
STRING
|
||||
HV-MTH-EMP-ID DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
HV-MTH-YEAR-MONTH DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-MTH-ANNUAL
|
||||
DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-MTH-PERSONAL
|
||||
DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-MTH-OFFICIAL
|
||||
DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-MTH-SICK DELIMITED BY SIZE
|
||||
',' DELIMITED BY SIZE
|
||||
WS-EDIT-MTH-ABSENT
|
||||
DELIMITED BY SIZE
|
||||
INTO WS-CSV-LINE
|
||||
WITH POINTER WS-PTR
|
||||
END-STRING
|
||||
WRITE CSVOUTREC FROM WS-CSV-LINE
|
||||
AFTER ADVANCING 1 LINE
|
||||
ADD 1 TO CUN-W01OUT
|
||||
EXEC SQL
|
||||
FETCH C_MONTHLY
|
||||
INTO :HV-MTH-EMP-ID,
|
||||
:HV-MTH-YEAR-MONTH,
|
||||
:HV-MTH-ANNUAL-H,
|
||||
:HV-MTH-PERSONAL-H,
|
||||
:HV-MTH-OFFICIAL-H,
|
||||
:HV-MTH-SICK-H,
|
||||
:HV-MTH-ABSENT-H
|
||||
END-EXEC
|
||||
END-PERFORM.
|
||||
*
|
||||
EXEC SQL
|
||||
CLOSE C_MONTHLY
|
||||
END-EXEC.
|
||||
*
|
||||
2500-SHORT-MODE-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブモジュールNO:(3.0) *
|
||||
* サブモジュール名:終了処理 *
|
||||
* 処理概要 : CURSOR CLOSE・ファイルCLOSE・件数出力 *
|
||||
*****************************************************************
|
||||
3000STPSOR SECTION.
|
||||
*
|
||||
*** CURSOR CLOSE
|
||||
EXEC SQL
|
||||
CLOSE C_DAILY
|
||||
END-EXEC.
|
||||
*
|
||||
*** 出力ファイルCLOSE
|
||||
CLOSE CSVOUTFIL.
|
||||
*
|
||||
*** 出力件数メッセージ
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGOUTKES TO M00MSGCOD.
|
||||
MOVE 'KIN09W01' TO M00UMKDATS22-01.
|
||||
MOVE CUN-W01OUT TO M00UMKDATS22-02.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
*** 終了メッセージ出力
|
||||
INITIALIZE M00MHOPAR.
|
||||
MOVE CNS-MSGFIN TO M00MSGCOD.
|
||||
PERFORM 4000MSGOUTSOR.
|
||||
*
|
||||
3000STPSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブプログラムNO:(4.0) *
|
||||
* サブプログラム名:メッセージ編集出力処理 *
|
||||
* 処理概要 : メッセージ編集出力サブPGM呼出 *
|
||||
*****************************************************************
|
||||
4000MSGOUTSOR SECTION.
|
||||
*
|
||||
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
|
||||
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
|
||||
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
|
||||
CALL 'SUB02MSG' USING M00MHOPAR.
|
||||
*
|
||||
4000MSGOUTSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブプログラムNO:(9.1) *
|
||||
* サブプログラム名:DBエラー処理 *
|
||||
* 処理概要 : ROLLBACK+DISPLAY+ABEND *
|
||||
*****************************************************************
|
||||
9100DBERRSOR SECTION.
|
||||
*
|
||||
MOVE SQLCODE TO WRK-SQLCODE-DISP.
|
||||
DISPLAY 'SQL ERROR: ' WRK-SQLCODE-DISP
|
||||
' PGM=KIN09CSV'.
|
||||
EXEC SQL
|
||||
ROLLBACK WORK
|
||||
END-EXEC.
|
||||
PERFORM 9999ABDSOR.
|
||||
*
|
||||
9100DBERRSOR-EXT.
|
||||
EXIT.
|
||||
*****************************************************************
|
||||
* サブプログラムNO:(9.9) *
|
||||
* サブプログラム名:ABEND処理 *
|
||||
* 処理概要 : ABENDサブPGM呼出 *
|
||||
*****************************************************************
|
||||
9999ABDSOR SECTION.
|
||||
*
|
||||
MOVE CNS-ABD999 TO E01ABDCOD.
|
||||
CALL 'SUB03END' USING E01ABDPAR.
|
||||
*
|
||||
9999ABDSOR-EXT.
|
||||
EXIT.
|
||||
Reference in New Issue
Block a user