Subsystem A KIN04-07追加、KIN02UPD/KIN03EXP更新(APPLICATION_ID対応+br_get_colバグ修正)、テスト済み全シナリオPASS

This commit is contained in:
qiuqiuqiu
2026-06-28 16:04:36 +08:00
parent 3379941b44
commit 5d595c79b6
24 changed files with 2928 additions and 98 deletions
+111 -94
View File
@@ -1,22 +1,22 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN02UPD.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN02UPD *
* プログラム名 : 休暇申請DB更新処理 *
* 作成日 : 2026-06-17 *
* 処理概要 : WORK-LEAVEの各レコードをDB2テーブル *
* LEAVE_RECORDSに反映する。 *
* ステータスに応じて新規登録(INSERT)、 *
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN02UPD *
* プログラム名 : 休暇申請DB更新処理 *
* 作成日 : 2026-06-17 *
* 処理概要 : WORK-LEAVEの各レコードをDB2テーブル *
* LEAVE_RECORDSに反映する。 *
* ステータスに応じて新規登録(INSERT)、 *
* 変更(DELETE+INSERT)、取消(DELETE)を行う。 *
* *
* *
*****************************************************************
* 更新履歴 *
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-17 @@@ 新規作成 *
* *
* 26-06-17 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
@@ -32,7 +32,7 @@
FILE SECTION.
*
*****************************************************************
* R01 (WORK-LEAVE) 80B FB *
* R01 (WORK-LEAVE) 80B FB *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
@@ -43,7 +43,7 @@
*
*
*****************************************************************
* W01 (ERROR-LOG) 200B VB *
* W01 (ERROR-LOG) 200B VB *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
@@ -55,12 +55,12 @@
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN02UPD'.
@@ -74,7 +74,7 @@
03 CNS-KN0002 PIC 9(001) VALUE 2.
*
*****************************************************************
* カウンタ領域 *
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
@@ -89,15 +89,16 @@
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
* 作業領域 *
*****************************************************************
01 WRKARA.
*** 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-APPL-ID PIC 9(009).
03 WS-NEXT-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).
@@ -111,7 +112,7 @@
03 WRK-ERR-DETAIL PIC X(198).
*
*****************************************************************
* サブプログラム連絡領域 *
* サブプログラム連絡領域 *
*****************************************************************
*** メッセージ編集出力SR用
COPY ZANMSGAC.
@@ -120,9 +121,9 @@
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
@@ -139,9 +140,9 @@
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・各種初期化処理 *
*****************************************************************
1000ITTSOR SECTION.
*
@@ -164,19 +165,30 @@
EXEC SQL CONNECT TO 'data/kin.db' END-EXEC.
*
*** R01ファイルOPEN
OPEN INPUT R01INNFIL.
OPEN INPUT R01INNFIL.
*** W01ファイルOPEN
OPEN OUTPUT W01OUTFIL.
*
OPEN OUTPUT W01OUTFIL.
*** 最大APPLICATION_ID取得(新規ID生成用)
MOVE ZERO TO WS-NEXT-APPL-ID.
EXEC SQL
SELECT COALESCE(MAX(APPLICATION_ID), 0) + 1
FROM LEAVE_RECORDS
INTO :WS-NEXT-APPL-ID
END-EXEC.
IF SQLCODE NOT = 0
MOVE ZERO TO WS-NEXT-APPL-ID
END-IF.
*** R01を初回読込
PERFORM 1100R01INNSOR.
PERFORM 1100R01INNSOR.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : WORK-LEAVE読込 *
* サブモジュールNO:(1.1) *
* サブモジュール名:R01読込処理 *
* 処理概要 : WORK-LEAVE読込 *
*****************************************************************
1100R01INNSOR SECTION.
*
@@ -190,9 +202,9 @@
1100R01INNSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : R01WORK-LEAVE)→DB更新処理 *
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : R01WORK-LEAVE)→DB更新処理 *
*****************************************************************
2000MAJSOR SECTION.
*
@@ -205,9 +217,9 @@
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名:レコード判定処理 *
* 処理概要 : ステータス判定→各DB更新処理分岐 *
* サブモジュールNO:(2.1) *
* サブモジュール名:レコード判定処理 *
* 処理概要 : ステータス判定→各DB更新処理分岐 *
*****************************************************************
2100PROCSOR SECTION.
*
@@ -236,36 +248,39 @@
2100PROCSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.1) *
* サブモジュール名:INSERT処理(新規登録) *
* 処理概要 : LEAVE_RECORDSに新規レコード追加 *
* サブモジュールNO:(2.1.1) *
* サブモジュール名:INSERT処理(新規登録) *
* 処理概要 : LEAVE_RECORDSに新規レコード追加 *
*****************************************************************
2110INSERTSOR SECTION.
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.
EXEC SQL
INSERT INTO LEAVE_RECORDS
(APPLICATION_ID,
EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME,
END_DATE, END_TIME,
STATUS)
VALUES
(:WS-NEXT-APPL-ID,
: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.
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO CUN-DBXINS.
ADD 1 TO WS-NEXT-APPL-ID.
ADD 1 TO CUN-DBXINS.
*
2110INSERTSOR-EXT.
EXIT.
2110INSERTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.2) *
* サブモジュール名:UPDATE処理(変更) *
* サブモジュールNO:(2.1.2) *
* サブモジュール名:UPDATE処理(変更) *
* 処理概要 : DELETE(旧レコード)→INSERT(新レコード) *
*****************************************************************
2120UPDATESOR SECTION.
@@ -279,31 +294,33 @@
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.
EXEC SQL
INSERT INTO LEAVE_RECORDS
(APPLICATION_ID,
EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME,
END_DATE, END_TIME,
STATUS)
VALUES
(:WS-APPL-ID,
: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.
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO CUN-DBXUPD.
ADD 1 TO CUN-DBXUPD.
*
2120UPDATESOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1.3) *
* サブモジュール名:DELETE処理(取消) *
* 処理概要 : APPL-ID一致レコードをDELETE *
* サブモジュールNO:(2.1.3) *
* サブモジュール名:DELETE処理(取消) *
* 処理概要 : APPL-ID一致レコードをDELETE *
*****************************************************************
2130DELETESOR SECTION.
*
@@ -321,9 +338,9 @@
2130DELETESOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : COMMIT・ファイルクローズ・件数出力 *
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : COMMIT・ファイルクローズ・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
@@ -375,9 +392,9 @@
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(4.0) *
* サブモジュール名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
* サブモジュールNO:(4.0) *
* サブモジュール名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
@@ -389,8 +406,8 @@
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.1) *
* サブモジュール名:DBエラー処理 *
* サブモジュールNO:(9.1) *
* サブモジュール名:DBエラー処理 *
* 処理概要 : SQLエラー→ROLLBACK+メッセージ出力+ABEND *
*****************************************************************
9100DBERRSOR SECTION.
@@ -426,9 +443,9 @@
9100DBERRSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(9.9) *
* サブモジュール名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
* サブモジュールNO:(9.9) *
* サブモジュール名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
+13 -4
View File
@@ -1,4 +1,4 @@
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN03EXP.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
@@ -24,7 +24,8 @@
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT W01OUTFIL ASSIGN TO "KIN02W01.DAT".
SELECT W01OUTFIL ASSIGN TO "KIN02W01.DAT"
FILE STATUS IS WS-W01-STATUS.
*
DATA DIVISION.
FILE SECTION.
@@ -85,7 +86,9 @@
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
01 WRKARA.
*** ファイルステータス
03 WS-W01-STATUS PIC X(002).
*** EOF判定
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
@@ -191,7 +194,13 @@
PERFORM 1200HDINNSOR.
*
*** 出力ファイルOPEN
OPEN OUTPUT W01OUTFIL.
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.
+472
View File
@@ -0,0 +1,472 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN04CHK.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN04CHK *
* プログラム名 : 打刻項目チェック処理 *
* 作成日 : 2026-06-19 *
* 処理概要 : CSV形式の打刻データファイルを読み込み、 *
* IF多重ネスト(句)で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.
SELECT W01OUTFIL ASSIGN TO KIN04W01.
SELECT W02OUTFIL ASSIGN TO KIN04W02.
*
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 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.
*
*** 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多重ネスト(句)で4段階チェック *
*****************************************************************
2000MAJSOR SECTION.
*
*** CSV分解
PERFORM 2010CSVSOR.
*
*** 社員番号チェック
PERFORM 2021EMPIDSOR.
*
*** 項目チェック(IF多重ネスト 句)
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多重ネスト 句) *
* 処理概要 : フィールド数→社員番号→日付→時刻→時刻順の *
* 4段階ネストチェックを句で記述 *
*****************************************************************
2020VALIDATESOR SECTION.
*
*** IF多重ネスト 句 (4段階)
*** 第1段階: フィールド数 + 社員番号必須
IF WRK-COMMA-CNT = CNS-FIELD-COUNT-6
AND WRK-EMPID-IS-OK
*** 第2段階: 日付チェック(SUB04CHK)
INITIALIZE C01CHKPAR
MOVE WRK-CSV-DATE TO C01CHKDAT
MOVE 'DATE' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
*** 第3段階: 出勤時刻チェック(SUB04CHK)
INITIALIZE C01CHKPAR
MOVE WRK-CSV-TIME-IN TO C01CHKDAT
MOVE 'TIME' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
*** 第3段階: 退勤時刻チェック(SUB04CHK)
INITIALIZE C01CHKPAR
MOVE WRK-CSV-TIME-OUT
TO C01CHKDAT
MOVE 'TIME' TO C01CHKTYP
CALL 'SUB04CHK' USING C01CHKPAR
IF C01CHKRRC = ZERO
*** 第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
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.
+488
View File
@@ -0,0 +1,488 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN05MAT.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN05MAT *
* プログラム名 : 打刻休暇照合処理 *
* 作成日 : 2026-06-20 *
* 処理概要 : EDITED-PUNCH(打刻側,R01)とLEAVE-DAILY *
* (休暇側,R02)を社員番号+日付キーで照合し、 *
* 1:Nマッチング結果をKIN-LEAVEに出力。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-20 @@@ 新規作成 *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO KIN04W01
FILE STATUS IS WS-R01-STATUS.
SELECT R02INNFIL ASSIGN TO KIN02W01
FILE STATUS IS WS-R02-STATUS.
SELECT W01OUTFIL ASSIGN TO KIN05W01
FILE STATUS IS WS-W01-STATUS.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* ##R01## EDITED-PUNCH *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY KIN04REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* ##R02## LEAVE-DAILY *
*****************************************************************
FD R02INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R02OUTREC.
COPY KIN02REC REPLACING ==(A)== BY ==R02==.
*
*****************************************************************
* ##W01## KIN-LEAVE *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY KIN03REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN05MAT'.
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-NO-LEAVE PIC X(002) VALUE '99'.
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-R02INN 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-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-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-BEST-TYPE PIC X(002).
03 WRK-BEST-STR-TIME PIC 9(004).
03 WRK-BEST-END-TIME PIC 9(004).
03 WRK-BEST-APPL-ID PIC 9(009).
03 WRK-BEST-FOUND PIC X(001).
88 WRK-BEST-IS-FOUND VALUE '1'.
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** メッセージ編集出力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.
*** BEST領域初期化(R01のみ出力時に使用)
MOVE CNS-NO-LEAVE TO WRK-BEST-TYPE.
MOVE ZERO TO WRK-BEST-STR-TIME
WRK-BEST-END-TIME
WRK-BEST-APPL-ID.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
R02INNFIL
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-W01-STATUS NOT = '00'
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** R01/R02を読み込み
PERFORM 1100R01INNSOR.
PERFORM 1200R02INNSOR.
*
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:(1.2) *
* サブモジュール名:R02読込処理 *
* 処理概要 : レコード読込・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:(2.0) *
* サブモジュール名: 主処理(マッチング制御) *
* 処理概要 : EVALUATE TRUEで3分岐マッチング制御 *
*****************************************************************
2000MAJSOR SECTION.
*
*** R01キー設定
MOVE R01EMP-ID TO WRK-R01K-EMP-ID.
MOVE R01WORK-DATE TO WRK-R01K-DATE.
*
*** R02キー設定(有効な場合)
IF NOT WRK-R02-EOF
MOVE R02EMP-ID TO WRK-R02K-EMP-ID
MOVE R02DATE TO WRK-R02K-DATE
END-IF.
*
*** EVALUATE TRUE マッチング3分岐
EVALUATE TRUE
WHEN WRK-R02-EOF
PERFORM 2100R01ONLYSOR
PERFORM 1100R01INNSOR
WHEN WRK-R01KEY < WRK-R02KEY
PERFORM 2100R01ONLYSOR
PERFORM 1100R01INNSOR
WHEN WRK-R01KEY = WRK-R02KEY
PERFORM 2020MATCHSOR
PERFORM 1100R01INNSOR
WHEN WRK-R01KEY > WRK-R02KEY
PERFORM 2200R02ONLYSOR
PERFORM 1200R02INNSOR
END-EVALUATE.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名: マッチング処理(N:1ループ) *
* 処理概要 : 一致キーの全R02を読込み、最適休暇を選定 *
*****************************************************************
2020MATCHSOR SECTION.
*
*** 選定領域初期化
MOVE '0' TO WRK-BEST-FOUND.
MOVE CNS-NO-LEAVE TO WRK-BEST-TYPE.
MOVE ZERO TO WRK-BEST-STR-TIME
WRK-BEST-END-TIME
WRK-BEST-APPL-ID.
*
*** N:1ループ 一致するR02を全件処理
PERFORM UNTIL WRK-R02-EOF
OR WRK-R01KEY < WRK-R02KEY
OR WRK-R01KEY > WRK-R02KEY
*
*** ベスト選定
IF NOT WRK-BEST-IS-FOUND
MOVE '1' TO WRK-BEST-FOUND
MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
ELSE
PERFORM 2030PRIOSOR
END-IF
*
*** R02次読込
PERFORM 1200R02INNSOR
*
*** R02キー再設定(有効な場合)
IF NOT WRK-R02-EOF
MOVE R02EMP-ID TO WRK-R02K-EMP-ID
MOVE R02DATE TO WRK-R02K-DATE
END-IF
END-PERFORM.
*
*** KIN-LEAVE出力
PERFORM 2100R01ONLYSOR.
*
2020MATCHSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.3) *
* サブモジュール名: 優先順位判定 *
* 処理概要 : 現在のR02レコードとベストを比較し、 *
* より優先度の高いものを保持 *
*****************************************************************
2030PRIOSOR SECTION.
*
*** 優先順位: 01 > 02 > 03 > 04
*** 同種別はAPPL-IDの小さい方を採用
EVALUATE TRUE
WHEN R02LEAVE-TYPE = CNS-LEAVE-01
IF WRK-BEST-TYPE NOT = CNS-LEAVE-01
MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
ELSE IF R02APPL-ID < WRK-BEST-APPL-ID
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
WHEN R02LEAVE-TYPE = CNS-LEAVE-02
IF WRK-BEST-TYPE = CNS-LEAVE-01
CONTINUE
ELSE IF WRK-BEST-TYPE = CNS-LEAVE-02
IF R02APPL-ID < WRK-BEST-APPL-ID
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
ELSE
MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
WHEN R02LEAVE-TYPE = CNS-LEAVE-03
IF WRK-BEST-TYPE = CNS-LEAVE-01
CONTINUE
ELSE IF WRK-BEST-TYPE = CNS-LEAVE-02
CONTINUE
ELSE IF WRK-BEST-TYPE = CNS-LEAVE-03
IF R02APPL-ID < WRK-BEST-APPL-ID
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
ELSE
MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
WHEN R02LEAVE-TYPE = CNS-LEAVE-04
IF WRK-BEST-TYPE = CNS-LEAVE-01
CONTINUE
ELSE IF WRK-BEST-TYPE = CNS-LEAVE-02
CONTINUE
ELSE IF WRK-BEST-TYPE = CNS-LEAVE-03
CONTINUE
ELSE IF WRK-BEST-TYPE = CNS-LEAVE-04
IF R02APPL-ID < WRK-BEST-APPL-ID
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
ELSE
MOVE R02LEAVE-TYPE TO WRK-BEST-TYPE
MOVE R02START-TIME TO WRK-BEST-STR-TIME
MOVE R02END-TIME TO WRK-BEST-END-TIME
MOVE R02APPL-ID TO WRK-BEST-APPL-ID
END-IF
WHEN OTHER
CONTINUE
END-EVALUATE.
*
2030PRIOSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.1) *
* サブモジュール名: R01のみ出力 *
* 処理概要 : 打刻のみ(休暇なし)またはマッチ結果を出力 *
*****************************************************************
2100R01ONLYSOR SECTION.
*
*** KIN-LEAVEレコード編集
INITIALIZE W01OUTREC.
*** 打刻情報(1-80B)
MOVE R01EMP-ID TO W01EMP-ID.
MOVE R01WORK-DATE TO W01WORK-DATE.
MOVE R01STR-TIME TO W01STR-TIME.
MOVE R01END-TIME TO W01END-TIME.
MOVE R01DEPT-ID TO W01DEPT-ID.
MOVE R01TERMINAL TO W01TERMINAL.
*** 休暇情報(81-160B)
MOVE WRK-BEST-TYPE TO W01LEAVE-TYPE.
MOVE WRK-BEST-STR-TIME TO W01LEAVE-STR-TIME.
MOVE WRK-BEST-END-TIME TO W01LEAVE-END-TIME.
MOVE ZERO TO W01LEAVE-HOURS.
MOVE WRK-BEST-APPL-ID TO W01APPLICATION-ID.
*
WRITE W01OUTREC.
ADD 1 TO CUN-W01OUT.
*
2100R01ONLYSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.2) *
* サブモジュール名: R02のみスキップ *
* 処理概要 : 該当打刻のない休暇レコードはスキップ *
*****************************************************************
2200R02ONLYSOR SECTION.
*
*** R02のみは出力なし(スキップ)
CONTINUE.
*
2200R02ONLYSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルクローズ・件数と終了メッセージ出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
R02INNFIL
W01OUTFIL.
*
*** 入出力ファイル件数出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN04W01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN02W01' TO M00UMKDATS22-01.
MOVE CUN-R02INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN05W01' 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.
*****************************************************************
+437
View File
@@ -0,0 +1,437 @@
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".
*
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.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
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.
* 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で追加変数生成)
EXEC SQL
CONNECT TO 'data/kin.db'
END-EXEC.
*
* 休日データ読込(bridge直接→EXEC SQL変換回避)
PERFORM 1200HOLIDAYSOR.
*
* 出力ファイルOPEN
OPEN OUTPUT OUTRECFIL.
*
* 社員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(カーソル)
EXEC SQL
DECLARE C_HOL CURSOR FOR
SELECT HOLIDAY_DATE
FROM HOLIDAY_CALENDAR
ORDER BY HOLIDAY_DATE
END-EXEC.
*
EXEC SQL
OPEN C_HOL
END-EXEC.
*
EXEC SQL
FETCH C_HOL INTO :HV-HOLIDAY-DATE
END-EXEC.
*
* 休日テーブルに全件読込
PERFORM UNTIL SQLCODE NOT = 0
IF HOLIDAY-COUNT < 50
ADD 1 TO HOLIDAY-COUNT
MOVE HV-HOLIDAY-DATE TO
HOLIDAY-DATE-ENT(HOLIDAY-COUNT)
END-IF
EXEC SQL
FETCH C_HOL INTO :HV-HOLIDAY-DATE
END-EXEC
END-PERFORM.
*
EXEC SQL
CLOSE C_HOL
END-EXEC.
*
1200HOLIDAYSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.3) *
* サブモジュール名: 社員CURSOR OPEN *
* 処理概要 : EMP_MASTERから在籍社員一覧を取得 *
*****************************************************************
1300EMPOPNSOR SECTION.
*
EXEC SQL
DECLARE C_EMP CURSOR FOR
SELECT EMP_ID
FROM EMP_MASTER
WHERE STATUS = '1'
ORDER BY EMP_ID
END-EXEC.
*
EXEC SQL
OPEN C_EMP
END-EXEC.
*
EXEC SQL
FETCH C_EMP 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(カーソル)
EXEC SQL
FETCH C_EMP INTO :HV-EMP-ID
END-EXEC.
*
IF SQLCODE = 0
CONTINUE
ELSE
MOVE '1' TO WRK-EMP-EOF
END-IF.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名: 終了処理 *
* 処理概要 : ファイルCLOSE・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
* カーソルCLOSE
EXEC SQL
CLOSE C_EMP
END-EXEC.
*
* 出力ファイル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.
+608
View File
@@ -0,0 +1,608 @@
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.
SELECT R02INNFIL ASSIGN TO KIN07R02.
SELECT R03INNFIL ASSIGN TO KIN07R03.
SELECT W01OUTFIL ASSIGN TO KIN07W01.
*
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 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.
*
*** 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.