Subsystem A: Add FILE STATUS + OPEN error checks to 6 KIN programs

KIN01INP/KIN02UPD/KIN03EXP/KIN04CHK/KIN06CLD/KIN07DAI:
- FILE STATUS added to all FILE-CONTROL SELECT statements
- WS-xx-STATUS variables declared in WORKING-STORAGE
- OPEN error: IF WS-xx-STATUS NOT = '00' -> CALL SUB03END
- KIN06CLD: added missing 9999ABDSOR section
- All programs build; KIN04CHK/KIN06CLD/KIN07DAI tests pass
This commit is contained in:
qiuqiuqiu
2026-06-24 23:59:33 +08:00
parent 235de714ea
commit 47866d2db4
12 changed files with 3166 additions and 0 deletions
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+615
View File
@@ -0,0 +1,615 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN01INP.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN01INP *
* プログラム名 : 休暇申請CSV取込・検証処理 *
* 作成日 : 2026-06-17 *
* 処理概要 : CSV形式の休暇申請ファイルを読み込み、 *
* 休暇種別テーブル検索と項目チェックを行い、 *
* ステータスによってWORK-LEAVEまたは *
* ERROR-LOGへ振り分ける。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-17 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO KIN01R01
FILE STATUS IS WS-R01-STATUS.
SELECT W01OUTFIL ASSIGN TO KIN01W01
FILE STATUS IS WS-W01-STATUS.
SELECT W02OUTFIL ASSIGN TO KIN01W02
FILE STATUS IS WS-W02-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* ##R01## *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
03 R01LINE PIC X(80).
*
*****************************************************************
* ##W01## *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY KIN01REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* ##W02## *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY KIN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN01INP'.
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.
03 CNS-STAT-1 PIC X(001) VALUE '1'.
03 CNS-STAT-9 PIC X(001) VALUE '9'.
03 CNS-LEAVE-01 PIC X(002) VALUE '01'.
03 CNS-LEAVE-02 PIC X(002) VALUE '02'.
03 CNS-LEAVE-03 PIC X(002) VALUE '03'.
03 CNS-LEAVE-04 PIC X(002) VALUE '04'.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-R01-STATUS PIC X(002).
03 WS-W01-STATUS PIC X(002).
03 WS-W02-STATUS PIC X(002).
*** 運用日付
03 WRK-U06 PIC 9(008).
*** 読込フラグ
03 WRK-R01EOF PIC X(001).
*** CSV分解用
03 WRK-COMMA-CNT PIC 9(002) COMP.
03 WRK-COMMA-DISP PIC 9(002).
03 WRK-LT-FOUND PIC X(001).
03 WRK-ERR-TYPE PIC X(001).
03 WRK-CSV-APPL-ID PIC X(009).
03 WRK-CSV-EMP-ID PIC X(008).
03 WRK-CSV-START-DATE PIC X(008).
03 WRK-CSV-START-TIME PIC X(004).
03 WRK-CSV-END-DATE PIC X(008).
03 WRK-CSV-END-TIME PIC X(004).
03 WRK-CSV-LEAVE-TYPE PIC X(002).
03 WRK-CSV-STATUS PIC X(001).
*** ステータス再定義(数値+88条件)
03 WRK-STATUS-NUM REDEFINES WRK-CSV-STATUS
PIC 9(001).
88 WRK-STATUS-ACTIVE VALUE 1.
88 WRK-STATUS-CANCEL VALUE 9.
*** 休暇種別内部テーブル(4件)
03 WRK-LEAVE-TYPE-TABLE.
05 WRK-LT-ENTRY OCCURS 4 TIMES
INDEXED BY WRK-LT-IDX.
07 WRK-LT-CODE PIC X(002).
*** REDEFINESデモ(同一領域 複数型 来回代入)
03 WRK-DEMO-AREA PIC 9(008).
03 WRK-DEMO-ALPHA REDEFINES WRK-DEMO-AREA
PIC X(008).
03 WRK-DEMO-GRP REDEFINES WRK-DEMO-AREA.
05 WRK-DEMO-TYPE PIC 9(004).
05 WRK-DEMO-VALUE PIC 9(004).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*** 項目チェックSR用
COPY ZANCHKAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理
PERFORM 2000MAJSOR
UNTIL WRK-R01EOF = '1'.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
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.
*
*** 休暇種別テーブル設定
MOVE '01' TO WRK-LT-CODE(1).
MOVE '02' TO WRK-LT-CODE(2).
MOVE '03' TO WRK-LT-CODE(3).
MOVE '04' TO WRK-LT-CODE(4).
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-U06
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
OUTPUT W01OUTFIL
W02OUTFIL.
*
*** OPENチェック
IF WS-R01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-W01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-W02-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** #R01#を読み込み
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:##R01##読込処理 *
* 処理概要 : レコード読込・EOF判定処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名: 主処理 *
* 処理概要 : CSV分解・休暇種別検索・ステータス振分 *
*****************************************************************
2000MAJSOR SECTION.
*
*** CSV分解
PERFORM 2010CSVSOR.
*
*** 休暇種別テーブル検索
PERFORM 2020LEAVSERSOR.
*
*** エラー判定(フィールド数/休暇種別)
IF WRK-COMMA-CNT NOT = 8
MOVE 'F' TO WRK-ERR-TYPE
PERFORM 2050ERRORSOR
ELSE IF WRK-LT-FOUND NOT = '1'
MOVE 'L' TO WRK-ERR-TYPE
PERFORM 2050ERRORSOR
ELSE
*** ステータス判定(IF/ELSE連鎖)
IF WRK-STATUS-ACTIVE
PERFORM 2030VALIDATESOR
ELSE IF WRK-STATUS-CANCEL
PERFORM 2040CANCELSOR
ELSE
MOVE 'S' TO WRK-ERR-TYPE
PERFORM 2050ERRORSOR
END-IF
END-IF.
*
*** 次のレコード読込
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名: CSV分解処理 *
* 処理概要 : UNSTRINGでCSVを8項目に分解する *
*****************************************************************
2010CSVSOR SECTION.
*
MOVE ZERO TO WRK-COMMA-CNT.
INITIALIZE WRK-CSV-APPL-ID
WRK-CSV-EMP-ID
WRK-CSV-START-DATE
WRK-CSV-START-TIME
WRK-CSV-END-DATE
WRK-CSV-END-TIME
WRK-CSV-LEAVE-TYPE
WRK-CSV-STATUS.
UNSTRING R01INNREC
DELIMITED BY ','
INTO WRK-CSV-APPL-ID
WRK-CSV-EMP-ID
WRK-CSV-START-DATE
WRK-CSV-START-TIME
WRK-CSV-END-DATE
WRK-CSV-END-TIME
WRK-CSV-LEAVE-TYPE
WRK-CSV-STATUS
TALLYING IN WRK-COMMA-CNT
END-UNSTRING.
*
2010CSVSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名: 休暇種別テーブル検索処理 *
* 処理概要 : SEARCH(非ALL)で休暇種別の妥当性を検証 *
*****************************************************************
2020LEAVSERSOR SECTION.
*
MOVE '0' TO WRK-LT-FOUND.
SET WRK-LT-IDX TO 1.
SEARCH WRK-LT-ENTRY
VARYING WRK-LT-IDX
AT END
CONTINUE
WHEN WRK-LT-CODE(WRK-LT-IDX)
= WRK-CSV-LEAVE-TYPE
MOVE '1' TO WRK-LT-FOUND
END-SEARCH.
*
2020LEAVSERSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.3) *
* サブモジュール名: 有効申請処理 *
* 処理概要 : SUB04CHKで日付/時刻チェックしW01出力 *
*****************************************************************
2030VALIDATESOR SECTION.
*
*** W01レコード初期化
INITIALIZE W01OUTREC.
*
*** SUB04CHKで社員番号チェック
INITIALIZE C01CHKPAR.
MOVE WRK-CSV-EMP-ID TO C01CHKDAT.
MOVE 'EMPID' TO C01CHKTYP.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = ZERO
MOVE '01' TO W02ERR-CATEGORY
STRING 'EMP-ID ERROR EMP='
WRK-CSV-EMP-ID
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
GO TO 2030VALIDATESOR-EXT
END-IF.
*
*** SUB04CHKで開始日付チェック
INITIALIZE C01CHKPAR.
MOVE WRK-CSV-START-DATE TO C01CHKDAT.
MOVE 'DATE' TO C01CHKTYP.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = ZERO
MOVE '01' TO W02ERR-CATEGORY
STRING 'START-DATE ERROR EMP='
WRK-CSV-EMP-ID
' DATE='
WRK-CSV-START-DATE
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
GO TO 2030VALIDATESOR-EXT
END-IF.
*
*** SUB04CHKで開始時刻チェック
INITIALIZE C01CHKPAR.
MOVE WRK-CSV-START-TIME TO C01CHKDAT.
MOVE 'TIME' TO C01CHKTYP.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = ZERO
MOVE '01' TO W02ERR-CATEGORY
STRING 'START-TIME ERROR EMP='
WRK-CSV-EMP-ID
' TIME='
WRK-CSV-START-TIME
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
GO TO 2030VALIDATESOR-EXT
END-IF.
*
*** SUB04CHKで終了日付チェック
INITIALIZE C01CHKPAR.
MOVE WRK-CSV-END-DATE TO C01CHKDAT.
MOVE 'DATE' TO C01CHKTYP.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = ZERO
MOVE '01' TO W02ERR-CATEGORY
STRING 'END-DATE ERROR EMP='
WRK-CSV-EMP-ID
' DATE='
WRK-CSV-END-DATE
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
GO TO 2030VALIDATESOR-EXT
END-IF.
*
*** SUB04CHKで終了時刻チェック
INITIALIZE C01CHKPAR.
MOVE WRK-CSV-END-TIME TO C01CHKDAT.
MOVE 'TIME' TO C01CHKTYP.
CALL 'SUB04CHK' USING C01CHKPAR.
IF C01CHKRRC NOT = ZERO
MOVE '01' TO W02ERR-CATEGORY
STRING 'END-TIME ERROR EMP='
WRK-CSV-EMP-ID
' TIME='
WRK-CSV-END-TIME
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WRITE W02OUTREC
ADD 1 TO CUN-W02OUT
GO TO 2030VALIDATESOR-EXT
END-IF.
*
*** 複合条件デモ(AND+OR+3段ネスト)
IF W01START-DATE NOT = ZERO
AND W01END-DATE NOT = ZERO
AND W01START-TIME NOT = ZERO
IF W01START-DATE > W01END-DATE
OR (W01START-DATE = W01END-DATE
AND W01START-TIME >= W01END-TIME)
MOVE 10 TO WRK-DEMO-TYPE
ELSE
MOVE 20 TO WRK-DEMO-TYPE
END-IF
END-IF.
*
*** W01出力(新規/変更: APPL-ID=CSV値, STATUS='1')
MOVE WRK-CSV-APPL-ID TO W01APPL-ID.
MOVE WRK-CSV-EMP-ID TO W01EMP-ID.
MOVE WRK-CSV-LEAVE-TYPE TO W01LEAVE-TYPE.
MOVE WRK-CSV-START-DATE TO W01START-DATE.
MOVE WRK-CSV-START-TIME TO W01START-TIME.
MOVE WRK-CSV-END-DATE TO W01END-DATE.
MOVE WRK-CSV-END-TIME TO W01END-TIME.
MOVE WRK-CSV-STATUS TO W01STATUS.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2030VALIDATESOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.4) *
* サブモジュール名: 取消申請処理 *
* 処理概要 : 取消レコードをW01出力(検証は行わない) *
*****************************************************************
2040CANCELSOR SECTION.
*
*** W01レコード初期化
INITIALIZE W01OUTREC.
*
*** W01出力(取消: APPL-ID=CSV値, STATUS='9')
MOVE WRK-CSV-APPL-ID TO W01APPL-ID.
MOVE WRK-CSV-EMP-ID TO W01EMP-ID.
MOVE WRK-CSV-LEAVE-TYPE TO W01LEAVE-TYPE.
MOVE WRK-CSV-START-DATE TO W01START-DATE.
MOVE WRK-CSV-START-TIME TO W01START-TIME.
MOVE WRK-CSV-END-DATE TO W01END-DATE.
MOVE WRK-CSV-END-TIME TO W01END-TIME.
MOVE WRK-CSV-STATUS TO W01STATUS.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2040CANCELSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.5) *
* サブモジュール名: エラー処理 *
* 処理概要 : エラーレコードをW02出力 *
*****************************************************************
2050ERRORSOR SECTION.
*
*** W02レコード初期化
INITIALIZE W02OUTREC.
MOVE '01' TO W02ERR-CATEGORY.
*
*** エラー種別判定
EVALUATE WRK-ERR-TYPE
WHEN 'F'
MOVE 1 TO WRK-DEMO-TYPE
MOVE WRK-COMMA-CNT TO WRK-DEMO-VALUE
STRING 'FIELD COUNT ERROR CNT='
WRK-DEMO-ALPHA
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WHEN 'L'
MOVE 2 TO WRK-DEMO-TYPE
MOVE 0 TO WRK-DEMO-VALUE
STRING 'INVALID LEAVE TYPE='
WRK-CSV-LEAVE-TYPE
' EMP='
WRK-CSV-EMP-ID
' ERR='
WRK-DEMO-ALPHA
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WHEN 'S'
MOVE 3 TO WRK-DEMO-TYPE
MOVE 0 TO WRK-DEMO-VALUE
STRING 'INVALID STATUS='
WRK-CSV-STATUS
' EMP='
WRK-CSV-EMP-ID
' ERR='
WRK-DEMO-ALPHA
DELIMITED BY SIZE
INTO W02ERR-DETAIL
WHEN OTHER
MOVE 9 TO WRK-DEMO-TYPE
MOVE 0 TO WRK-DEMO-VALUE
STRING 'UNKNOWN ERROR EMP='
WRK-CSV-EMP-ID
' ERR='
WRK-DEMO-ALPHA
DELIMITED BY SIZE
INTO W02ERR-DETAIL
END-EVALUATE.
*
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2050ERRORSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
W01OUTFIL
W02OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN01R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN01W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN01W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT 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.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+454
View File
@@ -0,0 +1,454 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN02UPD.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN02UPD *
* プログラム名 : 休暇申請DB更新処理 *
* 作成日 : 2026-06-17 *
* 処理概要 : WORK-LEAVEの各レコードをDB2テーブル *
* LEAVE_RECORDSに反映する。 *
* ステータスに応じて新規登録(INSERT)、 *
* 変更(DELETE+INSERT)、取消(DELETE)を行う。 *
* *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-17 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO KIN01W01
FILE STATUS IS WS-R01-STATUS.
SELECT W01OUTFIL ASSIGN TO KIN02W01
FILE STATUS IS WS-W01-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01 (WORK-LEAVE) 80B FB *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY KIN01REC REPLACING ==(A)== BY ==R01==.
*
*
*****************************************************************
* W01 (ERROR-LOG) 200B VB *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W01OUTREC.
COPY KIN05REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN02UPD'.
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-ABD999 PIC 9(003) VALUE 999.
03 CNS-KN0002 PIC 9(001) VALUE 2.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXINS PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXDEL PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXUPD PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-R01-STATUS PIC X(002).
03 WS-W01-STATUS PIC X(002).
*** EOF判定
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
*** SQL用ホスト変数
03 WS-APPL-ID PIC 9(009).
03 WS-EMP-ID PIC X(008).
03 WS-LEAVE-TYPE PIC X(002).
03 WS-START-DATE PIC X(008).
03 WS-START-TIME PIC X(004).
03 WS-END-DATE PIC X(008).
03 WS-END-TIME PIC X(004).
03 WS-STATUS PIC X(001).
*** SQLCODE表示用
03 WRK-SQLCODE-DISP PIC +9(009).
*** エラーログ編集領域
03 WRK-ERR-CATEGORY PIC 9(002).
03 WRK-ERR-DETAIL PIC X(198).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** メッセージ編集出力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) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
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.
*
*** DB接続
EXEC SQL CONNECT TO 'data/kin.db' END-EXEC.
*
*** R01ファイルOPEN
OPEN INPUT R01INNFIL.
*** OPENチェック(R01)
IF WS-R01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*** W01ファイルOPEN
OPEN OUTPUT W01OUTFIL.
*** OPENチェック(W01)
IF WS-W01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** R01を初回読込
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : WORK-LEAVE読込 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : R01WORK-LEAVE)→DB更新処理 *
*****************************************************************
2000MAJSOR SECTION.
*
*** レコード処理
PERFORM 2100PROCSOR.
*
*** 次レコード読込
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名:レコード判定処理 *
* 処理概要 : ステータス判定→各DB更新処理分岐 *
*****************************************************************
2100PROCSOR SECTION.
*
MOVE R01APPL-ID TO WS-APPL-ID.
MOVE R01EMP-ID TO WS-EMP-ID.
MOVE R01LEAVE-TYPE TO WS-LEAVE-TYPE.
MOVE R01START-DATE TO WS-START-DATE.
MOVE R01START-TIME TO WS-START-TIME.
MOVE R01END-DATE TO WS-END-DATE.
MOVE R01END-TIME TO WS-END-TIME.
MOVE R01STATUS TO WS-STATUS.
*
EVALUATE TRUE
WHEN WS-STATUS = '1'
AND WS-APPL-ID = 0
PERFORM 2110INSERTSOR
WHEN WS-STATUS = '1'
AND WS-APPL-ID > 0
PERFORM 2120UPDATESOR
WHEN WS-STATUS = '9'
PERFORM 2130DELETESOR
WHEN OTHER
CONTINUE
END-EVALUATE.
*
2100PROCSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.1) *
* サブモジュール名:INSERT処理(新規登録) *
* 処理概要 : LEAVE_RECORDSに新規レコード追加 *
*****************************************************************
2110INSERTSOR SECTION.
*
EXEC SQL
INSERT INTO LEAVE_RECORDS
(EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME,
END_DATE, END_TIME,
STATUS)
VALUES
(:WS-EMP-ID, :WS-LEAVE-TYPE,
:WS-START-DATE, :WS-START-TIME,
:WS-END-DATE, :WS-END-TIME,
:WS-STATUS)
END-EXEC.
*
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO CUN-DBXINS.
*
2110INSERTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.2) *
* サブモジュール名:UPDATE処理(変更) *
* 処理概要 : DELETE(旧レコード)→INSERT(新レコード) *
*****************************************************************
2120UPDATESOR SECTION.
*
EXEC SQL
DELETE FROM LEAVE_RECORDS
WHERE APPLICATION_ID = :WS-APPL-ID
END-EXEC.
*
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
EXEC SQL
INSERT INTO LEAVE_RECORDS
(EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME,
END_DATE, END_TIME,
STATUS)
VALUES
(:WS-EMP-ID, :WS-LEAVE-TYPE,
:WS-START-DATE, :WS-START-TIME,
:WS-END-DATE, :WS-END-TIME,
:WS-STATUS)
END-EXEC.
*
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO CUN-DBXUPD.
*
2120UPDATESOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.3) *
* サブモジュール名:DELETE処理(取消) *
* 処理概要 : APPL-ID一致レコードをDELETE *
*****************************************************************
2130DELETESOR SECTION.
*
EXEC SQL
DELETE FROM LEAVE_RECORDS
WHERE APPLICATION_ID = :WS-APPL-ID
END-EXEC.
*
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO CUN-DBXDEL.
*
2130DELETESOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : COMMIT・ファイルクローズ・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** COMMIT
EXEC SQL
COMMIT WORK
END-EXEC.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
W01OUTFIL.
*
*** 件数メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN01W01' 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.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'DEL' TO M00UMKDATS22-01.
MOVE CUN-DBXDEL TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN02W01' 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エラー処理 *
* 処理概要 : SQLエラー→ROLLBACK+メッセージ出力+ABEND *
*****************************************************************
9100DBERRSOR SECTION.
*
*** ROLLBACK
EXEC SQL
ROLLBACK WORK
END-EXEC.
*
*** エラーログ出力
INITIALIZE W01OUTREC.
MOVE '01' TO W01ERR-CATEGORY.
MOVE SQLCODE TO WRK-SQLCODE-DISP.
STRING 'KIN02UPD SQLCODE='
WRK-SQLCODE-DISP DELIMITED BY SIZE
' APPL-ID='
WS-APPL-ID DELIMITED BY SIZE
INTO W01ERR-DETAIL
END-STRING.
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
*** エラーメッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGSUBEEK TO M00MSGCOD.
MOVE 'KIN02UPD SQL ERROR' TO M00UMKDATS22-01.
MOVE WRK-SQLCODE-DISP TO M00UMKDATS22-02.
MOVE WS-APPL-ID TO M00UMKDATS22-03.
PERFORM 4000MSGOUTSOR.
*
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.
+520
View File
@@ -0,0 +1,520 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN03EXP.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN03EXP *
* プログラム名 : 休暇日別展開処理 *
* 作成日 : 2026-06-17 *
* 処理概要 : LEAVE_RECORDS(DB2)より有効申請を読込み、 *
* 開始日〜終了日の期間を日別に展開し、 *
* 休日・週末を除外してLEAVE-DAILY-fileを出力 *
* する。社員番号キーブレイクで小計出力を行う。*
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-17 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT W01OUTFIL ASSIGN TO "KIN02W01.DAT"
FILE STATUS IS WS-W01-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* W01 (LEAVE-DAILY) 80B FB *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY KIN02REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN03EXP'.
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-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* DBホスト変数(DISPLAY形式:bridgeテキストI/F対応) *
*****************************************************************
01 SQL-HOST-VARS.
03 SQL-APPL-ID PIC X(009).
03 SQL-EMP-ID PIC X(008).
03 SQL-LEAVE-TYPE PIC X(002).
03 SQL-START-DATE PIC X(008).
03 SQL-START-TIME PIC X(004).
03 SQL-END-DATE PIC X(008).
03 SQL-END-TIME PIC X(004).
03 SQL-HD-DATE PIC X(008).
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-W01-STATUS PIC X(002).
*** EOF判定
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
*** キーブレイク用
03 WRK-BFR-EMP-ID PIC X(008).
*** 社員別小計カウンタ
03 CUN-EMP-SUB PIC S9(009) COMP-3
VALUE ZERO.
*** 日付展開用
03 WRK-DATE-CURRENT PIC 9(008).
03 WRK-DATE-ALPHA REDEFINES WRK-DATE-CURRENT
PIC X(008).
03 WRK-DATE-NUM REDEFINES WRK-DATE-CURRENT.
05 WRK-DATE-YEAR PIC 9(004).
05 WRK-DATE-MONTH PIC 9(002).
05 WRK-DATE-DAY PIC 9(002).
03 WRK-DATE-END PIC 9(008).
*** 曜日判定用
03 WRK-DAY-OF-WEEK PIC 9(001).
*** 休日テーブル件数(ODO前に定義)
03 WRK-HD-COUNT PIC 9(004) COMP
VALUE ZERO.
*** 休日テーブル存在フラグ
03 WRK-HD-FOUND PIC X(001).
*** 休日テーブル(ODOは末尾に配置)
03 WRK-HOLIDAY-TABLE.
05 WRK-HD-ENTRY OCCURS 1 TO 366 TIMES
DEPENDING ON WRK-HD-COUNT
ASCENDING KEY IS WRK-HD-DATE
INDEXED BY WRK-HD-IDX.
07 WRK-HD-DATE PIC 9(008).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理
PERFORM 2000MAJSOR
UNTIL WRK-R01EOF = '1'.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
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.
*
*** DB接続
EXEC SQL CONNECT TO 'data/kin.db' END-EXEC.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
MOVE D01UBSUDATE TO WRK-DATE-CURRENT
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 休日カレンダーテーブル読込
PERFORM 1200HDINNSOR.
*
*** 出力ファイルOPEN
OPEN OUTPUT W01OUTFIL.
*
*** OPENチェック
IF WS-W01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** C1カーソル初回FETCH(SELECT INTO)
PERFORM 1100C1INITSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:C1初回FETCH処理 *
* 処理概要 : LEAVE_RECORDSをSELECT INTO(初回のみ) *
*****************************************************************
1100C1INITSOR SECTION.
*
MOVE SPACES TO SQL-APPL-ID.
EXEC 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
END-EXEC.
*
IF SQLCODE = 0
ADD 1 TO CUN-R01INN
ELSE
MOVE '1' TO WRK-R01EOF
END-IF.
*
1100C1INITSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.2) *
* サブモジュール名:C1次回FETCH処理 *
* 処理概要 : br_fetch_nextで次行を読込(2回目以降) *
*****************************************************************
1100C1FETCHSOR SECTION.
*
CALL 'br_fetch_next' USING SQLCODE.
*
IF SQLCODE = 0
MOVE SPACES TO SQL-APPL-ID
MOVE 0 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-APPL-ID, WS-COL-LEN
MOVE 1 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-EMP-ID, WS-COL-LEN
MOVE 2 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-LEAVE-TYPE, WS-COL-LEN
MOVE 3 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-START-DATE, WS-COL-LEN
MOVE 4 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-START-TIME, WS-COL-LEN
MOVE 5 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-END-DATE, WS-COL-LEN
MOVE 6 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-END-TIME, WS-COL-LEN
ADD 1 TO CUN-R01INN
ELSE
MOVE '1' TO WRK-R01EOF
END-IF.
*
1100C1FETCHSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.3) *
* サブモジュール名: 休日カレンダー読込処理 *
* 処理概要 : HOLIDAY_CALENDARをWORKING-STORAGEに格納 *
*****************************************************************
1200HDINNSOR SECTION.
*
*** C2初回FETCH(SELECT INTO)
EXEC SQL
SELECT HOLIDAY_DATE
FROM HOLIDAY_CALENDAR
ORDER BY HOLIDAY_DATE
INTO :SQL-HD-DATE
END-EXEC.
*
*** 休日テーブルに全件読込
PERFORM UNTIL SQLCODE NOT = 0
ADD 1 TO WRK-HD-COUNT
MOVE SQL-HD-DATE TO WRK-HD-DATE(WRK-HD-COUNT)
CALL 'br_fetch_next' USING SQLCODE
IF SQLCODE = 0
MOVE 0 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, SQL-HD-DATE, WS-COL-LEN
END-IF
END-PERFORM.
*
1200HDINNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO: (2.0) *
* サブモジュール名: 主処理 *
* 処理概要 : キーブレイク(社員番号)毎の処理を行う *
*****************************************************************
2000MAJSOR SECTION.
*
*** 社員番号キー保存
MOVE SQL-EMP-ID TO WRK-BFR-EMP-ID.
*
*** 1社員分処理(キーブレイク範囲)
PERFORM 2100-PROCESS-EMP
THRU 2100-PROCESS-EMP-EXIT.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO: (2.1) *
* サブモジュール名: 社員別処理 *
* 処理概要 : 1社員の全申請を処理(PERFORM THRU対象) *
*****************************************************************
2100-PROCESS-EMP SECTION.
*
MOVE ZERO TO CUN-EMP-SUB.
*
PERFORM UNTIL WRK-R01EOF = '1'
OR SQL-EMP-ID NOT = WRK-BFR-EMP-ID
PERFORM 2200-EXPAND-DATE
THRU 2200-EXPAND-DATE-EXIT
PERFORM 1100C1FETCHSOR
END-PERFORM.
*
*** 社員別小計出力(キーブレイク)
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE WRK-BFR-EMP-ID TO M00UMKDATS22-01.
MOVE CUN-EMP-SUB TO M00UMKDATS22-02.
MOVE 'EMP SUB' TO M00UMKDATS22-03.
PERFORM 4000MSGOUTSOR.
*
2100-PROCESS-EMP-EXIT.
EXIT.
*****************************************************************
* サブモジュールNO: (2.2) *
* サブモジュール名: 日付展開処理 *
* 処理概要 : 開始日〜終了日をループ(PERFORM THRU対象) *
* 休日/週末を除外してLEAVE-DAILYを出力 *
*****************************************************************
2200-EXPAND-DATE SECTION.
*
MOVE SQL-START-DATE TO WRK-DATE-CURRENT.
MOVE SQL-END-DATE TO WRK-DATE-END.
*
PERFORM UNTIL WRK-DATE-CURRENT > WRK-DATE-END
COMPUTE WRK-DAY-OF-WEEK =
FUNCTION MOD(
FUNCTION INTEGER-OF-DATE(WRK-DATE-CURRENT), 7)
IF WRK-DAY-OF-WEEK = 0
OR WRK-DAY-OF-WEEK = 6
IF WRK-HD-COUNT > 0
AND WRK-DATE-CURRENT NOT = ZERO
CONTINUE
ELSE
CONTINUE
END-IF
ELSE
*** 休日テーブル検索
MOVE '0' TO WRK-HD-FOUND
IF WRK-HD-COUNT > 0
SET WRK-HD-IDX TO 1
SEARCH ALL WRK-HD-ENTRY
AT END
CONTINUE
WHEN WRK-HD-DATE(WRK-HD-IDX)
= WRK-DATE-CURRENT
MOVE '1' TO WRK-HD-FOUND
END-SEARCH
END-IF
IF WRK-HD-FOUND = '0'
INITIALIZE W01OUTREC
MOVE FUNCTION NUMVAL(SQL-APPL-ID)
TO W01APPL-ID
MOVE WRK-BFR-EMP-ID TO W01EMP-ID
MOVE SQL-LEAVE-TYPE TO W01LEAVE-TYPE
MOVE SQL-START-TIME TO W01START-TIME
MOVE SQL-END-TIME TO W01END-TIME
MOVE WRK-DATE-ALPHA
TO W01DATE
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
ADD 1 TO CUN-EMP-SUB
END-IF
END-IF
*** 日付加算
PERFORM 2300-DATE-ADD-1
END-PERFORM.
*
2200-EXPAND-DATE-EXIT.
EXIT.
*****************************************************************
* サブモジュールNO: (2.3) *
* サブモジュール名: 日付加算処理 *
* 処理概要 : 日付を1日進める(月/年跨ぎ対応) *
*****************************************************************
2300-DATE-ADD-1 SECTION.
*
ADD 1 TO WRK-DATE-DAY.
*
EVALUATE WRK-DATE-MONTH
WHEN 1 WHEN 3 WHEN 5 WHEN 7
WHEN 8 WHEN 10 WHEN 12
IF WRK-DATE-DAY > 31
MOVE 1 TO WRK-DATE-DAY
ADD 1 TO WRK-DATE-MONTH
IF WRK-DATE-MONTH > 12
MOVE 1 TO WRK-DATE-MONTH
ADD 1 TO WRK-DATE-YEAR
END-IF
END-IF
WHEN 4 WHEN 6 WHEN 9 WHEN 11
IF WRK-DATE-DAY > 30
MOVE 1 TO WRK-DATE-DAY
ADD 1 TO WRK-DATE-MONTH
END-IF
WHEN 2
IF (FUNCTION MOD(WRK-DATE-YEAR, 400) = 0)
OR (FUNCTION MOD(WRK-DATE-YEAR, 4) = 0
AND FUNCTION MOD(WRK-DATE-YEAR, 100)
NOT = 0)
IF WRK-DATE-DAY > 29
MOVE 1 TO WRK-DATE-DAY
ADD 1 TO WRK-DATE-MONTH
END-IF
ELSE
IF WRK-DATE-DAY > 28
MOVE 1 TO WRK-DATE-DAY
ADD 1 TO WRK-DATE-MONTH
END-IF
END-IF
END-EVALUATE.
*
2300-DATE-ADD-1-EXT.
EXIT.
*****************************************************************
* サブモジュールNO: (3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルクローズ・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 出力ファイルCLOSE
CLOSE W01OUTFIL.
*
*** 入力件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'LEAVE_RECORDS' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 出力件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN02W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 休日テーブル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGKEYINF TO M00MSGCOD.
MOVE 'HOLIDAYS LOADED' TO M00UMKDATS22-01.
MOVE WRK-HD-COUNT 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.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+493
View File
@@ -0,0 +1,493 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN04CHK.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN04CHK *
* プログラム名 : 打刻項目チェック処理 *
* 作成日 : 2026-06-19 *
* 処理概要 : CSV形式の打刻データファイルを読み込み、 *
* IF多重ネスト(THEN句)で4段階チェックを実施、 *
* 正常はWRITE FROMでEDITED-PUNCHに出力、 *
* 異常はERROR-LOGに出力する。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-19 @@@ 新規作成 *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO KIN04R01
FILE STATUS IS WS-R01-STATUS.
SELECT W01OUTFIL ASSIGN TO KIN04W01
FILE STATUS IS WS-W01-STATUS.
SELECT W02OUTFIL ASSIGN TO KIN04W02
FILE STATUS IS WS-W02-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* ##R01## *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
03 R01LINE PIC X(80).
*
*****************************************************************
* ##W01## *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY KIN04REC REPLACING ==(A)== BY ==W01==.
*
*****************************************************************
* ##W02## *
*****************************************************************
FD W02OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS V.
01 W02OUTREC.
COPY KIN05REC REPLACING ==(A)== BY ==W02==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN04CHK'.
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.
03 CNS-ERR-PUNCH PIC 9(002) VALUE 02.
03 CNS-FIELD-COUNT-6 PIC 9(002) VALUE 6.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W02OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-R01-STATUS PIC X(002).
03 WS-W01-STATUS PIC X(002).
03 WS-W02-STATUS PIC X(002).
*** 読込フラグ
03 WRK-R01EOF PIC X(001).
*** CSV分解用
03 WRK-COMMA-CNT PIC 9(002) COMP.
03 WRK-CSV-EMP-ID PIC X(008).
03 WRK-CSV-DATE PIC X(008).
03 WRK-CSV-TIME-IN PIC X(004).
03 WRK-CSV-TIME-OUT PIC X(004).
03 WRK-CSV-DEPT-ID PIC X(004).
03 WRK-CSV-TERMINAL PIC X(006).
*** 時刻数値変換用
03 WRK-TIME-IN-NUM PIC 9(004).
03 WRK-TIME-OUT-NUM PIC 9(004).
*** DISPLAY変換用
03 WRK-COMMA-DISP PIC 9(002).
*** EMPIDチェック結果
03 WRK-EMPID-OK PIC X(001).
88 WRK-EMPID-IS-OK VALUE '1'.
*
*****************************************************************
* WRITE FROM用 出力レコード領域 *
*****************************************************************
01 WS-W01REC.
COPY KIN04REC REPLACING ==(A)== BY ==O1==.
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** 運用日付取得
COPY ZANDATAC.
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*** 項目チェックSR用
COPY ZANCHKAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** メイン処理
PERFORM 2000MAJSOR
UNTIL WRK-R01EOF = '1'.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
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.
*
*** 運用日付取得
INITIALIZE D01UBSPAR.
CALL 'SUB01DAT' USING D01UBSPAR.
IF D01FKICOD = ZERO
CONTINUE
ELSE
INITIALIZE M00MHOPAR
MOVE CNS-MSGSUBEEK TO M00MSGCOD
MOVE 'SUB01DAT' TO M00UMKDATS22-01
MOVE D01FKICOD TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
PERFORM 9999ABDSOR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
OUTPUT W01OUTFIL
W02OUTFIL.
*
*** OPENチェック
IF WS-R01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-W01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-W02-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** R01を読み込み
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : レコード読込・EOF判定処理 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名: 主処理 *
* 処理概要 : CSV分解・IF多重ネスト(THEN句)で4段階チェック *
*****************************************************************
2000MAJSOR SECTION.
*
*** CSV分解
PERFORM 2010CSVSOR.
*
*** 社員番号チェック
PERFORM 2021EMPIDSOR.
*
*** 項目チェック(IF多重ネスト THEN句)
PERFORM 2020VALIDATESOR.
*
*** 次のレコード読込
PERFORM 1100R01INNSOR.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名: CSV分解処理 *
* 処理概要 : UNSTRINGでCSVを6項目に分解する *
*****************************************************************
2010CSVSOR SECTION.
*
MOVE ZERO TO WRK-COMMA-CNT.
INITIALIZE WRK-CSV-EMP-ID
WRK-CSV-DATE
WRK-CSV-TIME-IN
WRK-CSV-TIME-OUT
WRK-CSV-DEPT-ID
WRK-CSV-TERMINAL.
UNSTRING R01INNREC
DELIMITED BY ','
INTO WRK-CSV-EMP-ID
WRK-CSV-DATE
WRK-CSV-TIME-IN
WRK-CSV-TIME-OUT
WRK-CSV-DEPT-ID
WRK-CSV-TERMINAL
TALLYING IN WRK-COMMA-CNT
END-UNSTRING.
*
2010CSVSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.5) *
* サブモジュール名: 社員番号チェック *
* 処理概要 : SUB04CHK EMPIDで社員番号の妥当性チェック *
*****************************************************************
2021EMPIDSOR SECTION.
*
MOVE '0' TO WRK-EMPID-OK.
IF WRK-COMMA-CNT = CNS-FIELD-COUNT-6
INITIALIZE C01CHKPAR
MOVE WRK-CSV-EMP-ID TO C01CHKDAT
MOVE 'EMPID' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
MOVE '1' TO WRK-EMPID-OK
END-IF
END-IF.
*
2021EMPIDSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名: 項目チェック(IF多重ネスト THEN句) *
* 処理概要 : フィールド数→社員番号→日付→時刻→時刻順の *
* 4段階ネストチェックをTHEN句で記述 *
*****************************************************************
2020VALIDATESOR SECTION.
*
*** IF多重ネスト THEN句 (4段階)
*** 第1段階: フィールド数 + 社員番号必須
IF WRK-COMMA-CNT = CNS-FIELD-COUNT-6
AND WRK-EMPID-IS-OK
THEN
*** 第2段階: 日付チェック(SUB04CHK)
INITIALIZE C01CHKPAR
MOVE WRK-CSV-DATE TO C01CHKDAT
MOVE 'DATE' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
THEN
*** 第3段階: 出勤時刻チェック(SUB04CHK)
INITIALIZE C01CHKPAR
MOVE WRK-CSV-TIME-IN TO C01CHKDAT
MOVE 'TIME' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
THEN
*** 第3段階: 退勤時刻チェック(SUB04CHK)
INITIALIZE C01CHKPAR
MOVE WRK-CSV-TIME-OUT
TO C01CHKDAT
MOVE 'TIME' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
THEN
*** 第4段階: 出勤<退勤チェック
MOVE WRK-CSV-TIME-IN
TO WRK-TIME-IN-NUM
MOVE WRK-CSV-TIME-OUT
TO WRK-TIME-OUT-NUM
IF WRK-TIME-IN-NUM
< WRK-TIME-OUT-NUM
THEN
PERFORM 2050NORMSOR
ELSE
PERFORM 2090ERRORSOR
END-IF
ELSE
PERFORM 2090ERRORSOR
END-IF
ELSE
PERFORM 2090ERRORSOR
END-IF
ELSE
PERFORM 2090ERRORSOR
END-IF
ELSE
PERFORM 2090ERRORSOR
END-IF.
*
2020VALIDATESOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.5) *
* サブモジュール名: 正常出力処理 *
* 処理概要 : WRITE FROMでEDITED-PUNCHに出力 *
*****************************************************************
2050NORMSOR SECTION.
*
*** WORKING-STORAGEに編集
MOVE WRK-CSV-EMP-ID TO O1EMP-ID.
MOVE WRK-CSV-DATE TO O1WORK-DATE.
MOVE WRK-CSV-TIME-IN TO O1STR-TIME.
MOVE WRK-CSV-TIME-OUT TO O1END-TIME.
MOVE WRK-CSV-DEPT-ID TO O1DEPT-ID.
MOVE WRK-CSV-TERMINAL TO O1TERMINAL.
*** WRITE FROM (新規カバレッジ)
WRITE W01OUTREC
FROM WS-W01REC.
ADD 1 TO CUN-W01OUT.
*
2050NORMSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.9) *
* サブモジュール名: エラー処理 *
* 処理概要 : エラーレコードをW02(ERROR-LOG)に出力 *
*****************************************************************
2090ERRORSOR SECTION.
*
*** W02レコード初期化
INITIALIZE W02OUTREC.
MOVE CNS-ERR-PUNCH TO W02ERR-CATEGORY.
*
*** エラー種別判定
IF WRK-COMMA-CNT NOT = CNS-FIELD-COUNT-6
MOVE WRK-COMMA-CNT TO WRK-COMMA-DISP
STRING
'FIELD COUNT ERR CNT='
WRK-COMMA-DISP
DELIMITED BY SIZE
INTO W02ERR-DETAIL
ELSE IF WRK-CSV-EMP-ID = SPACE
STRING
'EMP-ID EMPTY'
DELIMITED BY SIZE
INTO W02ERR-DETAIL
ELSE
STRING
'VALIDATION ERR EMP='
WRK-CSV-EMP-ID
' DATE='
WRK-CSV-DATE
' TI='
WRK-CSV-TIME-IN
' TO='
WRK-CSV-TIME-OUT
DELIMITED BY SIZE
INTO W02ERR-DETAIL
END-IF.
*
WRITE W02OUTREC.
ADD 1 TO CUN-W02OUT.
*
2090ERRORSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
W01OUTFIL
W02OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN04R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN04W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN04W02' TO M00UMKDATS22-01.
MOVE CUN-W02OUT 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.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+449
View File
@@ -0,0 +1,449 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN06CLD.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN06CLD *
* プログラム名 : 出勤日カレンダー生成処理 *
* 作成日 : 2026-06-20 *
* 処理概要 : PARM指定年月の出勤日カレンダーを生成。 *
* 在籍社員×当月全日をループし、休日判定 *
* (SEARCH ALL + 曜日)を行い出勤日のみ出力。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-20 @@@ 新規作成 *
* 26-06-21 @@@ GnuCOBOL CONTINUE-in-ELSE-IF 回避 *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUTRECFIL ASSIGN TO "data\KIN06W01.DAT"
FILE STATUS IS WS-OUT-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* ##OUTREC## WORK-DAY-FILE *
*****************************************************************
FD OUTRECFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 OUTREC.
COPY KIN06REC REPLACING ==(A)== BY ==OUT==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN06CLD'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
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 MONTH-DAYS.
03 FILLER PIC 9(002) VALUE 31.
03 FILLER PIC 9(002) VALUE 28.
03 FILLER PIC 9(002) VALUE 31.
03 FILLER PIC 9(002) VALUE 30.
03 FILLER PIC 9(002) VALUE 31.
03 FILLER PIC 9(002) VALUE 30.
03 FILLER PIC 9(002) VALUE 31.
03 FILLER PIC 9(002) VALUE 31.
03 FILLER PIC 9(002) VALUE 30.
03 FILLER PIC 9(002) VALUE 31.
03 FILLER PIC 9(002) VALUE 30.
03 FILLER PIC 9(002) VALUE 31.
01 MONTH-DAYS-R REDEFINES MONTH-DAYS.
03 MONTH-DAY PIC 9(002) OCCURS 12.
*
*****************************************************************
* 休日テーブル(SEARCH ALL用) *
*****************************************************************
01 HOLIDAY-TABLE.
03 HOLIDAY-ENTRIES OCCURS 50 TIMES
ASCENDING KEY IS HOLIDAY-DATE-ENT
INDEXED BY HOLIDAY-IDX.
05 HOLIDAY-DATE-ENT PIC X(008).
03 HOLIDAY-COUNT PIC 9(002).
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUN-OUTREC PIC S9(009) COMP-3 VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-OUT-STATUS PIC X(002).
* PARM解析
03 WRK-CMDLINE PIC X(200).
03 WRK-PARM-POS PIC 9(004).
03 WRK-PARM-OK PIC X(001).
88 WRK-PARM-FOUND VALUE '1'.
03 WRK-PARM-CHECK PIC X(006).
03 WRK-YEARMONTH PIC 9(006).
03 WRK-YEAR PIC 9(004).
03 WRK-MONTH PIC 9(002).
03 WRK-LAST-DAY PIC 9(002).
* 日付ループ
03 WRK-DAY PIC 9(002).
03 WRK-DATE-INT PIC S9(009).
03 WRK-DOW PIC 9(001).
88 WRK-IS-SUNDAY VALUE 0.
88 WRK-IS-SATURDAY VALUE 6.
03 WRK-DATE-STR PIC 9(008).
03 WRK-DATE-STR-X PIC X(008).
* 社員CURSOR
03 WRK-EMP-EOF PIC X(001).
88 WRK-EMP-EOF-Y VALUE '1'.
* 休日判定
03 WRK-HOLIDAY-FOUND PIC X(001).
88 WRK-IS-HOLIDAY VALUE '1'.
*
*****************************************************************
* DBホスト変数 *
*****************************************************************
01 HV-EMP-ID PIC X(008).
01 HV-HOLIDAY-DATE PIC X(008).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
* メッセージ編集出力SR用
COPY ZANMSGAC.
* ABEND処理SR用
COPY ZANENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
PERFORM 1000ITTSOR.
PERFORM 2000MAJSOR
UNTIL WRK-EMP-EOF-Y.
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・PARM解析・DB接続・ *
* 休日読込・社員CURSOR 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
HOLIDAY-TABLE.
*
* PARM解析
PERFORM 1100PARMSOR.
*
* DB接続(bridge直接→EXEC SQLはWAで追加変数生成)
CALL 'br_open' USING 'data/kin.db'.
*
* 休日データ読込(bridge直接→EXEC SQL変換回避)
PERFORM 1200HOLIDAYSOR.
*
* 出力ファイルOPEN
OPEN OUTPUT OUTRECFIL.
*
* OPENチェック
IF WS-OUT-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
* 社員CURSOR OPEN
PERFORM 1300EMPOPNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名: PARM解析 *
* 処理概要 : コマンドラインからYEARMONTH=を解析 *
*****************************************************************
1100PARMSOR SECTION.
*
INITIALIZE WRK-CMDLINE.
ACCEPT WRK-CMDLINE FROM COMMAND-LINE.
*
* YEARMONTH=を検索(PERFORM VARYINGでスキャン)
MOVE '0' TO WRK-PARM-OK.
MOVE 1 TO WRK-PARM-POS.
PERFORM UNTIL WRK-PARM-POS > 190
IF WRK-CMDLINE(WRK-PARM-POS:10) = 'YEARMONTH='
COMPUTE WRK-PARM-POS =
WRK-PARM-POS + 10
MOVE WRK-CMDLINE(WRK-PARM-POS:6)
TO WRK-PARM-CHECK
MOVE WRK-PARM-CHECK TO WRK-YEARMONTH
IF WRK-YEARMONTH NUMERIC
MOVE WRK-YEARMONTH
TO WRK-PARM-CHECK
IF WRK-CMDLINE(WRK-PARM-POS:6)
= WRK-PARM-CHECK
MOVE '1' TO WRK-PARM-OK
END-IF
END-IF
EXIT PERFORM
END-IF
ADD 1 TO WRK-PARM-POS
END-PERFORM.
*
* PARM必須チェック
IF NOT WRK-PARM-FOUND
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
* 年・月分解
MOVE WRK-YEARMONTH(1:4) TO WRK-YEAR.
MOVE WRK-YEARMONTH(5:2) TO WRK-MONTH.
*
* 月チェック(1-12)
IF WRK-MONTH < 1 OR WRK-MONTH > 12
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
* 月の日数計算(閏年対応)
MOVE MONTH-DAY(WRK-MONTH) TO WRK-LAST-DAY.
*
* 閏年判定(2月のみ)
IF WRK-MONTH = 02
IF (FUNCTION MOD(WRK-YEAR, 400) = 0)
OR (FUNCTION MOD(WRK-YEAR, 4) = 0
AND FUNCTION MOD(WRK-YEAR, 100) NOT = 0)
MOVE 29 TO WRK-LAST-DAY
END-IF
END-IF.
*
1100PARMSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.2) *
* サブモジュール名: 休日データ読込 *
* 処理概要 : HOLIDAY_CALENDARから全祝日をSELECT *
*****************************************************************
1200HOLIDAYSOR SECTION.
*
INITIALIZE HOLIDAY-TABLE.
*
* 休日SELECT(bridge直接)
>>SOURCE FORMAT IS FREE
STRING
'SELECT HOLIDAY_DATE FROM HOLIDAY_CALENDAR ORDER BY HOLIDAY_DATE'
X"00" INTO WS-SQL-STR
END-STRING
>>SOURCE FORMAT IS FIXED
*
CALL 'br_query' USING WS-SQL-STR, SQLCODE.
*
* 1行目を格納
IF SQLCODE = 0
IF HOLIDAY-COUNT < 50
ADD 1 TO HOLIDAY-COUNT
INITIALIZE HV-HOLIDAY-DATE
MOVE 0 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, HV-HOLIDAY-DATE, WS-COL-LEN
MOVE HV-HOLIDAY-DATE TO
HOLIDAY-DATE-ENT(HOLIDAY-COUNT)
END-IF
END-IF.
*
* 続行をbr_fetch_next+br_get_colで読込
PERFORM UNTIL SQLCODE NOT = 0
CALL 'br_fetch_next' USING SQLCODE
IF SQLCODE = 0
IF HOLIDAY-COUNT < 50
ADD 1 TO HOLIDAY-COUNT
INITIALIZE HV-HOLIDAY-DATE
MOVE 0 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, HV-HOLIDAY-DATE, WS-COL-LEN
MOVE HV-HOLIDAY-DATE TO
HOLIDAY-DATE-ENT(HOLIDAY-COUNT)
END-IF
END-IF
END-PERFORM.
*
1200HOLIDAYSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.3) *
* サブモジュール名: 社員CURSOR OPEN *
* 処理概要 : EMP_MASTERから在籍社員一覧を取得 *
*****************************************************************
1300EMPOPNSOR SECTION.
*
EXEC SQL
SELECT EMP_ID
FROM EMP_MASTER
WHERE STATUS = '1'
ORDER BY EMP_ID
INTO :HV-EMP-ID
END-EXEC.
*
IF SQLCODE NOT = 0
MOVE '1' TO WRK-EMP-EOF
END-IF.
*
1300EMPOPNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名: 主処理(社員ループ) *
* 処理概要 : 各社員について当月1日〜月末日をループ *
*****************************************************************
2000MAJSOR SECTION.
*
* 当月1日〜月末日をループ
MOVE 1 TO WRK-DAY.
PERFORM UNTIL WRK-DAY > WRK-LAST-DAY
*
* 日付文字列構築(COMPUTE演算→参照変更バグ回避)
COMPUTE WRK-DATE-STR = WRK-YEAR * 10000
+ WRK-MONTH * 100 + WRK-DAY
MOVE WRK-DATE-STR TO WRK-DATE-STR-X
*
* 曜日計算
COMPUTE WRK-DATE-INT =
FUNCTION INTEGER-OF-DATE(WRK-DATE-STR)
COMPUTE WRK-DOW =
FUNCTION MOD(WRK-DATE-INT, 7)
*
* 休日判定(部分埋め→PERFORM VARYING)
MOVE '0' TO WRK-HOLIDAY-FOUND
PERFORM VARYING WS-COL-IDX FROM 1 BY 1
UNTIL WS-COL-IDX > HOLIDAY-COUNT
IF HOLIDAY-DATE-ENT(WS-COL-IDX) = WRK-DATE-STR-X
MOVE '1' TO WRK-HOLIDAY-FOUND
END-IF
END-PERFORM
*
* 出勤日のみ出力(単一IF+ORで記述→GnuCOBOL対策)
IF WRK-IS-HOLIDAY OR WRK-IS-SUNDAY
OR WRK-IS-SATURDAY
CONTINUE
ELSE
INITIALIZE OUTREC
MOVE HV-EMP-ID TO OUTEMP-ID
MOVE WRK-DATE-STR TO OUTDATE
* MOD(7):0=日…6=土 → 1=月…7=日に変換
IF WRK-DOW = 0
MOVE 7 TO OUTDAY-OF-WEEK
ELSE
MOVE WRK-DOW TO OUTDAY-OF-WEEK
END-IF
WRITE OUTREC
ADD 1 TO CUN-OUTREC
END-IF
*
ADD 1 TO WRK-DAY
END-PERFORM.
*
* 次の社員をFETCH(br_fetch_next+br_get_col)
CALL 'br_fetch_next' USING SQLCODE.
*
IF SQLCODE = 0
INITIALIZE HV-EMP-ID
MOVE 0 TO WS-COL-IDX
MOVE 256 TO WS-COL-LEN
CALL 'br_get_col' USING
WS-COL-IDX, HV-EMP-ID, WS-COL-LEN
ELSE
MOVE '1' TO WRK-EMP-EOF
END-IF.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルCLOSE・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
* 出力ファイルCLOSE
CLOSE OUTRECFIL.
*
* 出力件数メッセージ
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN06W01' TO M00UMKDATS22-01.
MOVE CUN-OUTREC 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.9) *
* サブモジュール名: ABEND処理 *
* 処理概要 : 異常終了処理 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+635
View File
@@ -0,0 +1,635 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN07DAI.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN07DAI *
* プログラム名 : 日別勤怠計算処理 *
* 作成日 : 2026-06-23 *
* 処理概要 : WORK-DAY-FILE(R01)を主駆動にKIN-LEAVE(R02) *
* とLEAVE-DAILY(R03)を社員番号+日付キーで *
* 照合し、4パターン(EVALUATE)で *
* 日別勤怠記録(DAILY-RECORD)を出力する。 *
* 休暇時間はランチ除外+0.1h切上丸め。 *
* MULTIPLY/SUBTRACTで時間計算。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-23 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO KIN07R01
FILE STATUS IS WS-R01-STATUS.
SELECT R02INNFIL ASSIGN TO KIN07R02
FILE STATUS IS WS-R02-STATUS.
SELECT R03INNFIL ASSIGN TO KIN07R03
FILE STATUS IS WS-R03-STATUS.
SELECT W01OUTFIL ASSIGN TO KIN07W01
FILE STATUS IS WS-W01-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* ##R01## WORK-DAY-FILE *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY KIN06REC REPLACING ==(A)== BY ==SW==.
*
*****************************************************************
* ##R02## KIN-LEAVE *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02INNREC.
COPY KIN03REC REPLACING ==(A)== BY ==SR==.
*
*****************************************************************
* ##R03## LEAVE-DAILY *
*****************************************************************
FD R03INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R03INNREC.
COPY KIN02REC REPLACING ==(A)== BY ==SL==.
*
*****************************************************************
* ##W01## DAILY-RECORD *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY KIN07REC REPLACING ==(A)== BY ==SD==.
*
*****************************************************************
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN07DAI'.
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.
*** 休暇種別定数
03 CNS-LEAVE-01 PIC X(002) VALUE '01'.
03 CNS-LEAVE-02 PIC X(002) VALUE '02'.
03 CNS-LEAVE-03 PIC X(002) VALUE '03'.
03 CNS-LEAVE-04 PIC X(002) VALUE '04'.
*** 時刻定数
03 CNS-TIME-ZERO PIC 9(004) VALUE 0000.
*** 時間定数(分)
03 CNS-LUNCH-START-MIN PIC 9(004) VALUE 0720.
03 CNS-LUNCH-END-MIN PIC 9(004) VALUE 0780.
03 CNS-DAILY-HOURS PIC 9(004)V9(001) VALUE 8.0.
03 CNS-MINUTES-PER-HOUR PIC 9(003) VALUE 060.
03 CNS-RND-MODE-UP PIC 9(004) VALUE 1.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-R02INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-R03INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-R01-STATUS PIC X(002).
03 WS-R02-STATUS PIC X(002).
03 WS-R03-STATUS PIC X(002).
03 WS-W01-STATUS PIC X(002).
*** 読込フラグ
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
03 WRK-R02EOF PIC X(001).
88 WRK-R02-EOF VALUE '1'.
03 WRK-R03EOF PIC X(001).
88 WRK-R03-EOF VALUE '1'.
*** マッチングキー領域
03 WRK-R01KEY.
05 WRK-R01K-EMP-ID PIC X(008).
05 WRK-R01K-DATE PIC 9(008).
03 WRK-R02KEY.
05 WRK-R02K-EMP-ID PIC X(008).
05 WRK-R02K-DATE PIC 9(008).
03 WRK-R03KEY.
05 WRK-R03K-EMP-ID PIC X(008).
05 WRK-R03K-DATE PIC 9(008).
*** パターン番号
03 PATTERN-NUM PIC 9(001).
88 PATTERN-A VALUE 1.
88 PATTERN-B VALUE 2.
88 PATTERN-C VALUE 3.
88 PATTERN-D VALUE 4.
*** 出力編集領域
03 WRK-TIME-IN PIC 9(004).
03 WRK-TIME-OUT PIC 9(004).
03 WRK-ABSENT-H PIC 9(004)V9(001).
*** 休暇時間積算領域
03 WRK-ANNUAL-H PIC 9(004)V9(001).
03 WRK-PERSONAL-H PIC 9(004)V9(001).
03 WRK-OFFICIAL-H PIC 9(004)V9(001).
03 WRK-SICK-H PIC 9(004)V9(001).
*** 時間計算領域(MULTIPLY/SUBTRACT使用)
03 WRK-START-HOUR PIC 9(002).
03 WRK-START-MIN PIC 9(002).
03 WRK-END-HOUR PIC 9(002).
03 WRK-END-MIN PIC 9(002).
03 WRK-START-MIN-TOTAL PIC 9(004).
03 WRK-END-MIN-TOTAL PIC 9(004).
03 WRK-TOTAL-MIN PIC 9(004).
03 WRK-LUNCH-OVERLAP PIC 9(004).
03 WRK-LEAVE-HOURS PIC 9(004)V9(001).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*** 時刻丸め計算SR用
COPY ZANTIMAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** 主処理
PERFORM 2000MAJSOR
UNTIL WRK-R01-EOF.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
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.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
R02INNFIL
R03INNFIL
OUTPUT W01OUTFIL.
*
*** OPENチェック
IF WS-R01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-R02-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-R03-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
IF WS-W01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** R01/R02/R03初回読込
PERFORM 1100R01INNSOR.
PERFORM 1200R02INNSOR.
PERFORM 1300R03INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : WORK-DAY-FILE読込・EOF判定 *
*****************************************************************
1100R01INNSOR SECTION.
*
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.2) *
* サブモジュール名:R02読込処理 *
* 処理概要 : KIN-LEAVE読込・EOF判定 *
*****************************************************************
1200R02INNSOR SECTION.
*
READ R02INNFIL
AT END
MOVE '1' TO WRK-R02EOF
NOT AT END
ADD 1 TO CUN-R02INN
END-READ.
*
1200R02INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.3) *
* サブモジュール名:R03読込処理 *
* 処理概要 : LEAVE-DAILY読込・EOF判定 *
*****************************************************************
1300R03INNSOR SECTION.
*
READ R03INNFIL
AT END
MOVE '1' TO WRK-R03EOF
NOT AT END
ADD 1 TO CUN-R03INN
END-READ.
*
1300R03INNSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(2.0) *
* サブプログラム名:主処理 *
* 処理概要 : R01駆動でR02/R03照合、4パターン分岐 *
*****************************************************************
2000MAJSOR SECTION.
*
*** R01キー設定
MOVE SWEMP-ID TO WRK-R01K-EMP-ID.
MOVE SWDATE TO WRK-R01K-DATE.
*
*** パターン・積算領域初期化
MOVE 4 TO PATTERN-NUM.
MOVE ZERO TO WRK-TIME-IN
WRK-TIME-OUT
WRK-ANNUAL-H
WRK-PERSONAL-H
WRK-OFFICIAL-H
WRK-SICK-H
WRK-ABSENT-H.
*
*** R02: 追越レコードをスキップ
PERFORM UNTIL WRK-R02-EOF
MOVE SREMP-ID TO WRK-R02K-EMP-ID
MOVE SRWORK-DATE TO WRK-R02K-DATE
IF WRK-R02KEY >= WRK-R01KEY
EXIT PERFORM
END-IF
PERFORM 1200R02INNSOR
END-PERFORM.
*
*** R02マッチ判定
IF NOT WRK-R02-EOF
AND WRK-R01KEY = WRK-R02KEY
MOVE SRSTR-TIME TO WRK-TIME-IN
MOVE SREND-TIME TO WRK-TIME-OUT
MOVE 2 TO PATTERN-NUM
PERFORM 1200R02INNSOR
END-IF.
*
*** R03: 追越レコードをスキップ
PERFORM UNTIL WRK-R03-EOF
MOVE SLEMP-ID TO WRK-R03K-EMP-ID
MOVE SLDATE TO WRK-R03K-DATE
IF WRK-R03KEY >= WRK-R01KEY
EXIT PERFORM
END-IF
PERFORM 1300R03INNSOR
END-PERFORM.
*
*** R03マッチループ(0〜N件の全休暇を処理)
IF NOT WRK-R03-EOF
AND WRK-R01KEY = WRK-R03KEY
PERFORM UNTIL WRK-R03-EOF
OR WRK-R01KEY NOT = WRK-R03KEY
PERFORM 5000CALCLVSOR
EVALUATE SLLEAVE-TYPE
WHEN CNS-LEAVE-01
ADD WRK-LEAVE-HOURS TO WRK-ANNUAL-H
WHEN CNS-LEAVE-02
ADD WRK-LEAVE-HOURS TO WRK-PERSONAL-H
WHEN CNS-LEAVE-03
ADD WRK-LEAVE-HOURS TO WRK-OFFICIAL-H
WHEN CNS-LEAVE-04
ADD WRK-LEAVE-HOURS TO WRK-SICK-H
WHEN OTHER
CONTINUE
END-EVALUATE
PERFORM 1300R03INNSOR
IF NOT WRK-R03-EOF
MOVE SLEMP-ID TO WRK-R03K-EMP-ID
MOVE SLDATE TO WRK-R03K-DATE
END-IF
END-PERFORM
IF PATTERN-NUM = 2
MOVE 1 TO PATTERN-NUM
ELSE
MOVE 3 TO PATTERN-NUM
END-IF
END-IF.
*
*** EVALUATE 4パターン分岐
EVALUATE TRUE
WHEN PATTERN-A
PERFORM 6100PATTERNASOR
WHEN PATTERN-B
PERFORM 6200PATTERNSOR
WHEN PATTERN-C
PERFORM 6300PATTERNSOR
WHEN PATTERN-D
PERFORM 6400PATTERNSOR
END-EVALUATE.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(5.0) *
* サブプログラム名:休暇時間計算 *
* 処理概要 : R03レコードの開始/終了時刻から *
* ランチ除外+MULTIPLY/SUBTRACT計算し、 *
* SUB05TIM(0.1h切上)で丸める *
*****************************************************************
5000CALCLVSOR SECTION.
*
*** 開始時刻を時と分に分解
DIVIDE SLSTART-TIME BY 100
GIVING WRK-START-HOUR
REMAINDER WRK-START-MIN.
*** 終了時刻を時と分に分解
DIVIDE SLEND-TIME BY 100
GIVING WRK-END-HOUR
REMAINDER WRK-END-MIN.
*
*** MULTIPLY: 時→分変換
MULTIPLY WRK-START-HOUR BY CNS-MINUTES-PER-HOUR
GIVING WRK-START-MIN-TOTAL.
ADD WRK-START-MIN TO WRK-START-MIN-TOTAL.
*
MULTIPLY WRK-END-HOUR BY CNS-MINUTES-PER-HOUR
GIVING WRK-END-MIN-TOTAL.
ADD WRK-END-MIN TO WRK-END-MIN-TOTAL.
*
*** 総分数算出
COMPUTE WRK-TOTAL-MIN =
WRK-END-MIN-TOTAL - WRK-START-MIN-TOTAL.
*
*** ランチ除外判定 (12:00-13:00 = 720-780分)
MOVE ZERO TO WRK-LUNCH-OVERLAP.
IF WRK-END-MIN-TOTAL > CNS-LUNCH-START-MIN
AND WRK-START-MIN-TOTAL < CNS-LUNCH-END-MIN
COMPUTE WRK-LUNCH-OVERLAP =
FUNCTION MIN(WRK-END-MIN-TOTAL,
CNS-LUNCH-END-MIN)
- FUNCTION MAX(WRK-START-MIN-TOTAL,
CNS-LUNCH-START-MIN)
END-IF.
*
*** SUBTRACT: ランチ時間除外
SUBTRACT WRK-LUNCH-OVERLAP
FROM WRK-TOTAL-MIN.
*
*** 時間(小数)に変換
COMPUTE WRK-LEAVE-HOURS = WRK-TOTAL-MIN
/ CNS-MINUTES-PER-HOUR.
*
*** SUB05TIM呼出(0.1h切上)
MOVE WRK-LEAVE-HOURS TO T01TIMHRS.
MOVE CNS-RND-MODE-UP TO T01TIMRRC.
CALL 'SUB05TIM' USING T01TIMPAR.
*
*** 丸め結果を退避
MOVE T01TIMOUT TO WRK-LEAVE-HOURS.
*
5000CALCLVSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(6.1) *
* サブモジュール名:パターンA(打刻+休暇)出力 *
* 処理概要 : 打刻情報+R03休暇時間を出力 *
*****************************************************************
6100PATTERNASOR SECTION.
*
PERFORM 7000W01OUTSOR.
*
*** 次R01読込(R02/R03は処理済み)
PERFORM 1100R01INNSOR.
*
6100PATTERNASOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(6.2) *
* サブプログラム名:パターンB(打刻のみ)出力 *
* 処理概要 : 打刻情報のみ出力(休暇=0) *
*****************************************************************
6200PATTERNSOR SECTION.
*
*** 休暇/欠勤はゼロのまま
PERFORM 7000W01OUTSOR.
*
*** 次R01/R02読込
PERFORM 1100R01INNSOR.
*
6200PATTERNSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(6.3) *
* サブプログラム名:パターンC(休暇のみ)出力 *
* 処理概要 : 打刻なし、R03休暇時間を出力(8h上限) *
*****************************************************************
6300PATTERNSOR SECTION.
*
*** 打刻なし
MOVE CNS-TIME-ZERO TO WRK-TIME-IN
WRK-TIME-OUT.
*
*** 休暇時間上限チェック(所定労働時間8h)
IF WRK-ANNUAL-H > CNS-DAILY-HOURS
MOVE CNS-DAILY-HOURS TO WRK-ANNUAL-H
END-IF.
IF WRK-PERSONAL-H > CNS-DAILY-HOURS
MOVE CNS-DAILY-HOURS TO WRK-PERSONAL-H
END-IF.
IF WRK-OFFICIAL-H > CNS-DAILY-HOURS
MOVE CNS-DAILY-HOURS TO WRK-OFFICIAL-H
END-IF.
IF WRK-SICK-H > CNS-DAILY-HOURS
MOVE CNS-DAILY-HOURS TO WRK-SICK-H
END-IF.
*
PERFORM 7000W01OUTSOR.
*
*** 次R01/R03読込
PERFORM 1100R01INNSOR.
*
6300PATTERNSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(6.4) *
* サブプログラム名:パターンD(欠勤)出力 *
* 処理概要 : 打刻なし、休暇なし、未申請欠勤=8.0h *
*****************************************************************
6400PATTERNSOR SECTION.
*
*** 打刻なし
MOVE CNS-TIME-ZERO TO WRK-TIME-IN
WRK-TIME-OUT.
*** 未申請欠勤=8.0h
MOVE CNS-DAILY-HOURS TO WRK-ABSENT-H.
*
PERFORM 7000W01OUTSOR.
*
*** 次R01読込(R02/R03は次R01次第)
PERFORM 1100R01INNSOR.
*
6400PATTERNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(7.0) *
* サブモジュール名:DAILY-RECORD出力 *
* 処理概要 : W01(DAILY-RECORD)に編集出力 *
*****************************************************************
7000W01OUTSOR SECTION.
*
MOVE SWEMP-ID TO SDEMP-ID.
MOVE SWDATE TO SDDATE.
MOVE WRK-TIME-IN TO SDTIME-IN.
MOVE WRK-TIME-OUT TO SDTIME-OUT.
MOVE WRK-ANNUAL-H TO SDANNUAL-H.
MOVE WRK-PERSONAL-H TO SDPERSONAL-H.
MOVE WRK-OFFICIAL-H TO SDOFFICIAL-H.
MOVE WRK-SICK-H TO SDSICK-H.
MOVE WRK-ABSENT-H TO SDABSENT-H.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
7000W01OUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
R02INNFIL
R03INNFIL
W01OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN07R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN07R02' TO M00UMKDATS22-01.
MOVE CUN-R02INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN07R03' TO M00UMKDATS22-01.
MOVE CUN-R03INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN07W01' 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.9) *
* サブプログラム名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.