diff --git a/bin/KIN01INP.exe b/bin/KIN01INP.exe new file mode 100644 index 0000000..51740ca Binary files /dev/null and b/bin/KIN01INP.exe differ diff --git a/bin/KIN02UPD.exe b/bin/KIN02UPD.exe new file mode 100644 index 0000000..3c29c5d Binary files /dev/null and b/bin/KIN02UPD.exe differ diff --git a/bin/KIN03EXP.exe b/bin/KIN03EXP.exe new file mode 100644 index 0000000..9b634ab Binary files /dev/null and b/bin/KIN03EXP.exe differ diff --git a/bin/KIN04CHK.exe b/bin/KIN04CHK.exe new file mode 100644 index 0000000..1a10981 Binary files /dev/null and b/bin/KIN04CHK.exe differ diff --git a/bin/KIN06CLD.exe b/bin/KIN06CLD.exe new file mode 100644 index 0000000..1d324c8 Binary files /dev/null and b/bin/KIN06CLD.exe differ diff --git a/bin/KIN07DAI.exe b/bin/KIN07DAI.exe new file mode 100644 index 0000000..00db8ce Binary files /dev/null and b/bin/KIN07DAI.exe differ diff --git a/src/KIN01INP.cbl b/src/KIN01INP.cbl new file mode 100644 index 0000000..4331765 --- /dev/null +++ b/src/KIN01INP.cbl @@ -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. diff --git a/src/KIN02UPD.cbl b/src/KIN02UPD.cbl new file mode 100644 index 0000000..5463048 --- /dev/null +++ b/src/KIN02UPD.cbl @@ -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) * + * サブモジュール名:主処理 * + * 処理概要 : R01(WORK-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. diff --git a/src/KIN03EXP.cbl b/src/KIN03EXP.cbl new file mode 100644 index 0000000..7ea3d14 --- /dev/null +++ b/src/KIN03EXP.cbl @@ -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. diff --git a/src/KIN04CHK.cbl b/src/KIN04CHK.cbl new file mode 100644 index 0000000..1301120 --- /dev/null +++ b/src/KIN04CHK.cbl @@ -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. diff --git a/src/KIN06CLD.cbl b/src/KIN06CLD.cbl new file mode 100644 index 0000000..5b34860 --- /dev/null +++ b/src/KIN06CLD.cbl @@ -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. diff --git a/src/KIN07DAI.cbl b/src/KIN07DAI.cbl new file mode 100644 index 0000000..9abc59b --- /dev/null +++ b/src/KIN07DAI.cbl @@ -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.