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. SELECT W01OUTFIL ASSIGN TO KIN01W01. SELECT W02OUTFIL ASSIGN TO KIN01W02. * 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 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. * *** #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.