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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+10
View File
@@ -0,0 +1,10 @@
*
* 勤怠: 打刻編集レコード EDITED-PUNCH 80B
*
03 (A)EMP-ID PIC X(008).
03 (A)WORK-DATE PIC 9(008).
03 (A)STR-TIME PIC 9(004).
03 (A)END-TIME PIC 9(004).
03 (A)DEPT-ID PIC X(004).
03 (A)TERMINAL PIC X(006).
03 (A)FILLER PIC X(046).
+5
View File
@@ -0,0 +1,5 @@
*
* 勤怠: エラーログレコード KERR-LOG VB可変長
*
03 (A)ERR-CATEGORY PIC 9(002).
03 (A)ERR-DETAIL PIC X(198).
+7
View File
@@ -0,0 +1,7 @@
*
* 勤怠: 出勤日カレンダーレコード WORK-DAY-FILE 80B
*
03 (A)EMP-ID PIC X(008).
03 (A)DATE PIC 9(008).
03 (A)DAY-OF-WEEK PIC 9(001).
03 (A)FILLER PIC X(063).
+13
View File
@@ -0,0 +1,13 @@
*
* 勤怠: 日別勤怠計算レコード DAILY-RECORD 200B
*
03 (A)EMP-ID PIC 9(008).
03 (A)DATE PIC 9(008).
03 (A)TIME-IN PIC 9(004).
03 (A)TIME-OUT PIC 9(004).
03 (A)ANNUAL-H PIC 9(004)V9(001).
03 (A)PERSONAL-H PIC 9(004)V9(001).
03 (A)OFFICIAL-H PIC 9(004)V9(001).
03 (A)SICK-H PIC 9(004)V9(001).
03 (A)ABSENT-H PIC 9(004)V9(001).
03 (A)FILLER PIC X(151).
+22 -5
View File
@@ -97,6 +97,7 @@
88 WRK-R01-EOF VALUE '1'.
*** SQL用ホスト変数
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).
@@ -167,7 +168,18 @@
OPEN INPUT R01INNFIL.
*** W01ファイルOPEN
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.
*
@@ -244,12 +256,14 @@
*
EXEC SQL
INSERT INTO LEAVE_RECORDS
(EMP_ID, LEAVE_TYPE,
(APPLICATION_ID,
EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME,
END_DATE, END_TIME,
STATUS)
VALUES
(:WS-EMP-ID, :WS-LEAVE-TYPE,
(:WS-NEXT-APPL-ID,
:WS-EMP-ID, :WS-LEAVE-TYPE,
:WS-START-DATE, :WS-START-TIME,
:WS-END-DATE, :WS-END-TIME,
:WS-STATUS)
@@ -259,6 +273,7 @@
PERFORM 9100DBERRSOR
END-IF.
*
ADD 1 TO WS-NEXT-APPL-ID.
ADD 1 TO CUN-DBXINS.
*
2110INSERTSOR-EXT.
@@ -281,12 +296,14 @@
*
EXEC SQL
INSERT INTO LEAVE_RECORDS
(EMP_ID, LEAVE_TYPE,
(APPLICATION_ID,
EMP_ID, LEAVE_TYPE,
START_DATE, START_TIME,
END_DATE, END_TIME,
STATUS)
VALUES
(:WS-EMP-ID, :WS-LEAVE-TYPE,
(:WS-APPL-ID,
:WS-EMP-ID, :WS-LEAVE-TYPE,
:WS-START-DATE, :WS-START-TIME,
:WS-END-DATE, :WS-END-TIME,
:WS-STATUS)
+11 -2
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.
@@ -86,6 +87,8 @@
* 作業領域 *
*****************************************************************
01 WRKARA.
*** ファイルステータス
03 WS-W01-STATUS PIC X(002).
*** EOF判定
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
@@ -193,6 +196,12 @@
*** 出力ファイル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.
*
+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.
@@ -0,0 +1,50 @@
# KIN04CHK 使用資源一覧
## プログラム概要
- **プログラムID**: KIN04CHK
- **プログラム名**: 打刻項目チェック処理
- **処理概要**: CSV形式の打刻データファイルを読み込み、IF多重ネスト(THEN句)による項目チェックを行い、正常レコードをEDITED-PUNCHへ、異常レコードをERROR-LOGへ振り分ける。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| KIN04R01 | RAW-PUNCH | 順編成 | F (固定長) | 80B | なし(自前定義) |
| KIN04W01 | EDITED-PUNCH | 順編成 | F (固定長) | 80B | KIN04REC |
| KIN04W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | KIN05REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| KIN04REC | レコード定義(W01出力ファイル) | FILE SECTION / WORKING-STORAGE(WRITE FROM用) |
| KIN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION |
| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE |
| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| ZANCHKAC | 項目チェックサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB01DAT | 運用日付取得 | 1000ITTSOR |
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
| SUB04CHK | 日付/時刻/社員番号妥当性チェック | 2020VALIDATESOR |
## 使用DB2テーブル
なし(DB操作なし)
## 処理フロー
1. 初期処理(開始メッセージ→運用日付取得→OPEN→初回読込)
2. CSV分解(UNSTRINGで6項目に分解)
3. IF多重ネスト(THEN句)で4段階チェック
- フィールド数=6 AND 社員番号 NOT = SPACE
- SUB04CHK日付チェック
- SUB04CHK時刻チェック(出勤/退勤)
- 出勤時刻 < 退勤時刻
4. 正常→WRITE FROMでW01出力
5. 異常→W02出力(エラー区分='02')
6. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,43 @@
# KIN05MAT 使用資源一覧
## プログラム概要
- **プログラムID**: KIN05MAT
- **プログラム名**: 打刻休暇照合処理
- **処理概要**: EDITED-PUNCH(打刻側)とLEAVE-DAILY(休暇側)を社員番号+日付キーで照合し、1:Nマッチング結果をKIN-LEAVE160B)に出力する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| KIN04W01 | EDITED-PUNCH | 順編成 | F (固定長) | 80B | KIN04REC |
| KIN02W01 | LEAVE-DAILY | 順編成 | F (固定長) | 80B | KIN02REC |
| KIN05W01 | KIN-LEAVE | 順編成 | F (固定長) | 160B | KIN03REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| KIN04REC | R01入力レコード定義 | FILE SECTION |
| KIN02REC | R02入力レコード定義 | FILE SECTION |
| KIN03REC | W01出力レコード定義 | FILE SECTION |
| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
## 使用DB2テーブル
なし(ファイルマッチングのみ)
## 処理フロー
1. 初期処理(開始メッセージ→OPEN→R01/R02初回読込)
2. EVALUATE TRUE マッチング3分岐制御
- R01key < R02key OR R02-EOF:打刻のみ出力(LEAVE-TYPE='99'
- R01key = R02key:マッチング(N:1ループ)、休暇種別優先順位で選定
- R01key > R02keyR02のみスキップ
3. 終了処理(CLOSE→件数出力→終了メッセージ)
@@ -0,0 +1,45 @@
# KIN06CLD 使用資源一覧
## プログラム概要
- **プログラムID**: KIN06CLD
- **プログラム名**: 出勤日カレンダー生成処理
- **処理概要**: PARM指定年月の出勤日カレンダーを生成。在籍社員全員 × 当月全日をループし、休日判定を行って出勤日のみ出力。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 |
|------|---------------|------|-------------|-----------|--------|
| KIN06W01 | WORK-DAY-FILE | 順編成 | F (固定長) | 80B | KIN06REC |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| KIN06REC | OUTREC出力レコード定義 | FILE SECTION |
| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
> 注: DBブリッジ変数(WS-SQL-STR, SQLCODE, WS-COL-IDX, WS-COL-LEN)はCOPY句`DB-COMMON`ではなく、プリプロセッサ`convert-sql.mjs`によりWORKING-STORAGEに注入される。`cpy/DB-COMMON.cpy`は存在しない。
## 使用DBテーブル
| テーブル名 | 種別 | 操作 | 備考 |
|-----------|------|------|------|
| EMP_MASTER | 参照 | SELECT (CURSOR) | 在籍社員一覧(STATUS='1') |
| HOLIDAY_CALENDAR | 参照 | SELECT | 対象月の休日一覧 |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 1100PARMSOR (直接CALL、9999ABDSORセクション廃止) |
## 処理フロー
1. PARM解析(YEARMONTH取得)
2. DB接続 → 休日データ読込 → 社員CURSOR OPEN
3. 社員ループ(PERFORM UNTIL EOF
- 日付ループ(PERFORM VARYING 当月1日〜月末日)
- PERFORM VARYING 線形探索で休日判定 + 曜日判定(部分埋めテーブルのためSEARCH ALL不使用)
- 出勤日 → WRITE FROM出力
4. CURSOR CLOSE → DB切断 → 終了処理
@@ -0,0 +1,60 @@
# KIN07DAI 使用資源一覧
## プログラム概要
- **プログラムID**: KIN07DAI
- **プログラム名**: 日別勤怠計算処理
- **処理概要**: WORK-DAY-FILE(出勤日カレンダー)を主駆動とし、社員番号+日付キーでKIN-LEAVE(打刻+休暇)と照合。4パターン(A/B/C/D)のEVALUATE分岐で休暇時間計算を実行し、DAILY-RECORD200B)に出力する。
## 使用ファイル
| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | 定義参照先 |
|------|---------------|------|-------------|-----------|--------|-----------|
| KIN07R01 | WORK-DAY-FILE | 順編成 | F (固定長) | 80B | KIN06REC | COPY句定義書.md |
| KIN07R02 | KIN-LEAVE | 順編成 | F (固定長) | 160B | KIN03REC | COPY句定義書.md |
| KIN07R03 | LEAVE-DAILY | 順編成 | F (固定長) | 80B | KIN02REC | COPY句定義書.md |
| KIN07W01 | DAILY-RECORD | 順編成 | F (固定長) | 200B | KIN07REC | COPY句定義書.md |
## 使用COPY句
| COPY句 | 用途 | 使用箇所 |
|--------|------|---------|
| KIN06REC | R01入力レコード定義(WORK-DAY-REC | FILE SECTION |
| KIN03REC | R02入力レコード定義(KIN-LEAVE-REC | FILE SECTION |
| KIN02REC | R03入力レコード定義(LEAVE-DAILY-REC | FILE SECTION |
| KIN07REC | W01出力レコード定義(DAILY-REC | FILE SECTION |
| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE |
| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE |
| ZANTIMAC | 丸めサブPGM連絡領域 | WORKING-STORAGE |
## 使用サブプログラム
| サブPGM | 役割 | CALL箇所 |
|---------|------|---------|
| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR |
| SUB03END | ABEND処理 | 9999ABDSOR |
| SUB05TIM | 休暇時間丸め(0.1h切上) | 6100PATTERNASOR / 6300PATTERNSOR |
## 使用DB2テーブル
なし(ファイル処理のみ)
## 処理フロー
1. 初期処理(開始メッセージ→OPEN→R01/R02/R03初回読込)
2. メインループ:R01(主駆動)を基準にEVALUATEで4パターン分岐
- PATTERN-A (1): R01+R02+R03全てあり → 打刻+休暇時間計算
- PATTERN-B (2): R01+R02あり、R03なし → 打刻のみ(休暇=0)
- PATTERN-C (3): R01+R03あり、R02なし → 休暇時間計算(打刻=0000)
- PATTERN-D (4): R01のみ → 未申請欠勤=8.0h
3. 各パターン内でMULTIPLY/SUBTRACT/COMPUTE併用による時間計算、CALL SUB05TIM丸め
4. 終了処理(CLOSE→件数出力→終了メッセージ)
## 使用構文(特記事項)
| 構文 | 使用箇所 | 備考 |
|------|---------|------|
| EVALUATE | 5000PROCESS | 4パターン分岐(GO TO DEPENDING ONから変更) |
| MULTIPLY | 6100PATTERNASOR/6300PATTERNSOR | 時間→分変換 |
| SUBTRACT | 6100PATTERNASOR/6300PATTERNSOR | ランチ時間除外 |
| DIVIDE | 6100PATTERNASOR/6300PATTERNSOR | 分→時間変換 |
| COMPUTE | 6100PATTERNASOR/6300PATTERNSOR | 休暇時間端数処理 |
| CALL SUB05TIM | 6100PATTERNASOR/6300PATTERNSOR | 0.1h単位切上丸め |
+155
View File
@@ -0,0 +1,155 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN04CHK |
| 3 | プログラム名 | 打刻項目チェック処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 項目チェック(重複なし) |
| 6 | 機能概要 | CSV形式の打刻データファイルを読み込み、項目チェックを行い、正常レコードをEDITED-PUNCHへ、異常レコードをERROR-LOGへ振り分ける。 |
| 7 | | チェックはIF多重ネスト(THEN句)で4段階:社員番号必須→日付妥当性→時刻妥当性→出勤<退勤 |
| 8 | | 正常出力はWRITE FROMを使用する(新規カバレッジ) |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | KIN04R01(CSV) | ソート不要。CSV形式(カンマ区切り、6項目) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | RAW-PUNCH | R01 | KIN04R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 |
| 2 | EDITED-PUNCH | W01 | KIN04W01 | O | KIN04REC | FB | | 80 | PS | WRITE FROM使用 |
| 3 | ERROR-LOG | W02 | KIN04W02 | O | KIN05REC | VB | | 200 | PS | |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | RAW-PUNCH | なし | なし |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 3 | ABEND処理SUB | SUB03END | ZANENDAC |
| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン(R01:入力、W01/W02:出力)
1-6.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.CSVの分解(2010CSVSOR)
UNSTRINGでカンマ区切りのCSVを6項目に分解する。
(EMP-ID, DATE, TIME-IN, TIME-OUT, DEPT-ID, TERMINAL)
2.1.5.社員番号チェック(2021EMPIDSOR)
SUB04CHK('EMPID')により社員番号のフォーマットチェックを実施する。
SUB04CHKの復帰コードにより正常/異常を判定する。
2-2.IF多重ネストチェック(2020VALIDATESOR)
第1段階: フィールド数チェック + 社員番号チェック(2021EMPIDSOR)
IF フィールド数=6 THEN
2021EMPIDSORを実行
IF 社員番号正常 THEN
SUB04CHK('DATE')で日付チェック
IF 正常 THEN
SUB04CHK('TIME')で時刻チェック(出勤)
IF 正常 THEN
SUB04CHK('TIME')で時刻チェック(退勤)
IF 正常 THEN
IF 出勤時刻 < 退勤時刻 THEN
WRITE FROMでW01出力(2050NORMSOR)
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
ELSE
エラー区分='02'でW02出力(2090ERRORSOR)
END-IF
2021EMPIDSOR (社員番号チェック)
本Paragraphは2020VALIDATESORの第1段階(フィールド数OK時)に
PERFORMされる。
SUB04CHK('EMPID')により社員番号のフォーマットチェックを実施する。
復帰コード=ZEROなら正常、≠ZEROなら異常として呼び出し元に戻る。
2-3.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'KIN04R01'
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'KIN04W01'、'KIN04W02'
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/EDITED-PUNCH KIN04REC 80B FB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | WRK-CSV-EMP-ID | 社員番号 |
| 2 | WORK-DATE | WRK-CSV-DATE | YYYYMMDD |
| 3 | STR-TIME | WRK-CSV-TIME-IN | HHMM |
| 4 | END-TIME | WRK-CSV-TIME-OUT | HHMM |
| 5 | DEPT-ID | WRK-CSV-DEPT-ID | 部署ID |
| 6 | TERMINAL | WRK-CSV-TERMINAL | 端末ID |
| 7 | FILLER | SPACE | 46B |
### 出力ファイル2W02/ERROR-LOG KIN05REC 200B VB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | '02'固定 | 打刻エラー |
| 2 | ERR-DETAIL | STRING編集 | エラー内容(198B) |
+128
View File
@@ -0,0 +1,128 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN05MAT |
| 3 | プログラム名 | 打刻休暇照合処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:N) |
| 6 | 機能概要 | EDITED-PUNCH(打刻側、R01)とLEAVE-DAILY(休暇側、R02)を社員番号+日付キーで照合し、KIN-LEAVE(160B)に出力する。R01側が主駆動で、1件の打刻に対してN件の休暇レコードが存在しうる(1:N)。 |
| 7 | | マッチング制御はEVALUATE TRUEで3分岐:R01key<R02key(打刻のみ)、R01key=R02key(マッチ)、R01key>R02key(休暇のみスキップ)。 |
| 8 | | マッチ時は休暇種別優先順位(01>02>03>04)で最適な1件を選定し、KIN-LEAVEに出力する。 |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | KIN04W01(R01) | 社員番号+日付で昇順ソート済み(JCL SORT KINJ022 |
| 2 | KIN02W01(R02) | 社員番号+日付で昇順ソート済み(KIN03EXP出力保証) |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EDITED-PUNCH | R01 | KIN04W01 | I | KIN04REC | FB | | 80 | PS | 打刻側、主駆動 |
| 2 | LEAVE-DAILY | R02 | KIN02W01 | I | KIN02REC | FB | | 80 | PS | 休暇側、N件あり |
| 3 | KIN-LEAVE | W01 | KIN05W01 | O | KIN03REC | FB | | 160 | PS | 照合結果 |
### ファイルステータス
| ファイル | DD名 | ファイルステータス項目 |
|---------|------|---------------------|
| EDITED-PUNCH(R01) | KIN04W01 | WS-R01-STATUS |
| LEAVE-DAILY(R02) | KIN02W01 | WS-R02-STATUS |
| KIN-LEAVE(W01) | KIN05W01 | WS-W01-STATUS |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | EDITED-PUNCH | 社員番号(1-8B)+日付(9-16B) | 主キー(R01) |
| 2 | LEAVE-DAILY | 社員番号(1-8B)+日付(9-16B) | 従キー(R02)、N件あり |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
1-4.使用ファイルのオープン(R01/R02:入力、W01:出力)
1-4-1.OPENチェック
各ファイルのFILE STATUS(WS-R01-STATUS/WS-R02-STATUS/WS-W01-STATUS)を確認
ステータス≠00の場合、SUB03END(ZANENDAC)で異常終了
1-5.R01を読み込む。(1100R01INNSOR)(1回目)
1-6.R02を読み込む。(1200R02INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.R02キー設定
R02が有効な場合、R02レコードからWRK-R02KEYを設定。
2-2.EVALUATE TRUE マッチング制御
WHEN R01key < R02key OR R02-EOF:
打刻のみ(休暇なし)→ KIN-LEAVE出力(LEAVE-TYPE='99', HOURS=0)
R01を次へ読み込み
WHEN R01key = R02key:
マッチング処理実行(2020MATCHSOR)
R01を次へ読み込み
R02も次へ読み込み(N:1の場合はループ内で全R02処理)
WHEN R01key > R02key:
R02のみ(該当打刻なし)→ スキップ
R02を次へ読み込み
2-3.上記をR01終了まで繰り返す。
3.マッチング処理(2020MATCHSOR
R02がEOFになるか、キーが変わるまで、以下のループを実行:
3-1.現在のR02レコードから休暇種別・時刻・申請IDを取得
3-2.選定ロジック:
- 初回 → ベストとして保持
- 既にベストあり → 優先順位で比較(01>02>03>04)
- 同種別 → 申請IDの小さい方を採用
3-3.R02を次へ読み込み
3-4.キーが一致しなくなるかR02-EOFまで3-1〜3-3を繰り返す
3-5.ベストの休暇情報をKIN-LEAVEに出力
ベストがない場合は'99'として出力
4.終了処理(3000STPSOR
4-1.入出力ファイルのクローズ
4-2.入出力件数出力メッセージ出力
4-3.終了メッセージ出力
```
---
## 出力レコード定義
### 出力ファイル(W01/KIN-LEAVE KIN03REC 160B FB
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01EMP-ID | 打刻情報(1-80BはEDITED-PUNCHと同一) |
| 2 | WORK-DATE | R01WORK-DATE | |
| 3 | STR-TIME | R01STR-TIME | |
| 4 | END-TIME | R01END-TIME | |
| 5 | DEPT-ID | R01DEPT-ID | |
| 6 | TERMINAL | R01TERMINAL | |
| 7-13 | 休暇情報 | マッチ結果 | 81-160B |
| 7 | LEAVE-TYPE | 選定結果 | '01'〜'04' or '99' |
| 8 | LEAVE-STR-TIME | 選定したR02START-TIME | |
| 9 | LEAVE-END-TIME | 選定したR02END-TIME | |
| 10 | LEAVE-HOURS | ZERO | KIN07DAIで後に計算 |
| 11 | APPLICATION-ID | 選定したR02APPL-ID | 該当なしはZERO |
+116
View File
@@ -0,0 +1,116 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN06CLD |
| 3 | プログラム名 | 出勤日カレンダー生成処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | レイアウト編集のみ(GETPUT) |
| 6 | 機能概要 | PARMで指定された年月の出勤日カレンダーを生成する。在籍社員一覧をDBから取得し、各社員について当月1日〜月末日をPERFORM VARYINGでループ。休日判定(PERFORM VARYING線形探索 + 曜日判定)を行い、出勤日のみWORK-DAY-FILEに出力する。 |
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|----------------|------|
| 1 | EMP_MASTER | 在籍社員(STATUS='1')が登録済みであること |
| 2 | HOLIDAY_CALENDAR | 対象年月の休日が登録済みであること |
### PARM引数
コマンドラインで `YEARMONTH=YYYYMM` 形式で指定。必須。
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|
| 1 | WORK-DAY-FILE | OUTREC | KIN06W01 | O | KIN06REC | FB | | 80 | PS |
### 使用DBテーブル
| NO | テーブル名 | 処理内容 |
|----|-----------|---------|
| 1 | EMP_MASTER | SELECT EMP_ID WHERE STATUS='1' ORDER BY EMP_ID (CURSOR) |
| 2 | HOLIDAY_CALENDAR | SELECT HOLIDAY_DATE WHERE HOLIDAY_DATE LIKE 'YYYYMM%' → WORKING-STORAGE格納 |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.PARM解析(YEARMONTH=YYYYMM から対象年月を抽出)
必須チェック:PARMなし→ABEND
形式チェック:YEARMONTH= から始まること
値範囲:XXXX01〜XXXX12
月チェック(1-12): WRK-MONTH < 1 OR > 12 → ABEND(CALL SUB03END)
1-4.ワークエリア初期化
1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
1-6.休日データ読込(HOLIDAY_CALENDARから対象月の祝日をSELECT
テーブルに格納(PERFORM VARYING線形探索用)
【ガード】HOLIDAY-COUNTが50未満の場合のみADD+参照を行う(テーブル溢れ防止)
ループ条件で HOLIDAY-COUNT < 50 をチェック(HOLIDAY-COUNT PIC 9(2)対応)
1-7.出力ファイルOPEN
1-8.社員一覧取得(EMP_MASTER CURSOR OPEN→初回FETCH
2.主処理(2000MAJSOR)(社員EOFまで下記を繰り返す)
2-1.当月1日〜月末日をループ(PERFORM VARYING
2-1-1.日付文字列構築(YYYYMMDD
2-1-2.曜日計算(INTEGER-OF-DATE
- INTEGER-OF-DATE('YYYYMMDD') で通算日数を取得
- MOD(通算日数, 7) で曜日:0=日, 1=月, 2=火, …, 6=土
2-1-3.休日判定(PERFORM VARYING線形探索)
祝日テーブルを先頭から線形探索(部分埋めテーブル対応のためSEARCH ALL不使用)
2-1-4.曜日判定
土曜(0) または 日曜(6)→休日としてスキップ(CONTINUE)
2-1-5.出勤日 → WRITE FROMで出力(社員番号+日付+曜日)
2-2.次の社員をFETCH
3.終了処理(3000STPSOR
3-1.CURSOR CLOSE
3-2.DB切断
3-3.出力ファイルCLOSE
3-4.出力件数メッセージ出力
3-5.終了メッセージ出力
```
### 曜日計算
INTEGER-OF-DATE('YYYYMMDD') は1601-01-01からの通算日数を返す。
- 1601-01-01 = Monday → MOD(x,7)0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat
### 休日判定ロジック
1. HOLIDAY_CALENDARに日付が存在する → 休日(PERFORM VARYING線形探索)
2. 曜日が土曜(6)または日曜(0) → 休日
3. 上記以外 → 出勤日
---
## 出力レコード定義
### 出力ファイル(OUTREC/WORK-DAY-FILEKIN06REC 80B FB
| No | 項目名 | 設定元 | 属性 | 備考 |
|----|--------|--------|------|------|
| 1 | EMP-ID | 社員マスタのEMP_ID | X(8) | 社員番号 |
| 2 | DATE | ループ変数 | 9(8) | YYYYMMDD |
| 3 | DAY-OF-WEEK | 曜日計算結果 | 9(1) | 1=月…7=日 |
| 4 | FILLER | SPACE | X(63) | |
+167
View File
@@ -0,0 +1,167 @@
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN07DAI |
| 3 | プログラム名 | 日別勤怠計算処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(1:N) + EVALUATE 4パターン分岐 |
| 6 | 機能概要 | WORK-DAY-FILE(主駆動)とKIN-LEAVE/LEAVE-DAILYを社員番号+日付で照合し、 |
| 7 | | 4パターンに分岐して日別勤怠記録(DAILY-RECORD)を出力する。 |
| 8 | | パターンA: 打刻+休暇あり / B: 打刻のみ / C: 休暇のみ / D: 欠勤 |
| 9 | | 休暇時間はランチ除外+0.1h切上丸め。MULTIPLY/SUBTRACT時間計算。 |
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | R01(WORK-DAY-FILE) | 社員番号+日付の昇順でソートされていること |
| 2 | R02(KIN-LEAVE) | 社員番号+日付の昇順でソートされていること |
| 3 | R03(LEAVE-DAILY) | 社員番号+日付の昇順でソートされていること |
### 使用ファイル一覧
| NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|---------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | WORK-DAY-FILE | R01 | KIN07R01 | I | KIN06REC | FB | | 80 | PS | 出勤日カレンダー(COPY句定義書.md参照) |
| 2 | KIN-LEAVE | R02 | KIN07R02 | I | KIN03REC | FB | | 160 | PS | 打刻+休暇照合結果(COPY句定義書.md参照) |
| 3 | LEAVE-DAILY | R03 | KIN07R03 | I | KIN02REC | FB | | 80 | PS | 日別展開休暇(COPY句定義書.md参照) |
| 4 | DAILY-RECORD | W01 | KIN07W01 | O | KIN07REC | FB | | 200 | PS | 日別勤怠計算結果(COPY句定義書.md参照) |
| 5 | ERROR-LOG | W02 | KIN07E01 | O | KIN05REC | VB | | 200 | PS | エラーログ(COPY句定義書.md参照) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) |
| 2 | ファイルR02 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) |
| 3 | ファイルR03 | 社員番号>日付(昇順) | 社員番号+日付(マッチングキー) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力 | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理 | SUB03END | ZANENDAC |
| 3 | 時刻丸め計算(0.1h切上) | SUB05TIM | ZANTIMAC |
---
## 処理詳細
```
1.初期処理 (1000ITTSOR)
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化(INITIALIZE WRKARA
1-4.入出力ファイルOPEN
INPUT: R01INNFIL, R02INNFIL, R03INNFIL
OUTPUT: W01OUTFIL, W02OUTFIL
1-5.R01を読み込む。(1100R01INNSOR)(1回目)
1-6.R02を読み込む。(1200R02INNSOR)(1回目)
1-7.R03を読み込む。(1300R03INNSOR)(1回目)
2.主処理 (2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.キー比較:R01とR02/R03のキーを比較し、PATTERN-NUMを設定
【MULTIPLY使用】時間→分換算時にMULTIPLY文を使用
【SUBTRACT使用】ランチ除外時にSUBTRACT文を使用
2-2.パターン判定(EVALUATE)
EVALUATE PATTERN-NUM
WHEN 1 → PERFORM 6100PATTERNASOR (打刻+休暇)
WHEN 2 → PERFORM 6200PATTERNSOR (打刻のみ)
WHEN 3 → PERFORM 6300PATTERNSOR (休暇のみ)
WHEN 4 → PERFORM 6400PATTERNSOR (欠勤)
END-EVALUATE
2-3.【パターンA(6100PATTERNASOR)】:R01+R02+R03(打刻+休暇)
2-3-1.打刻情報設定:R02の出勤時刻/退勤時刻をDAILY-RECORDに設定
2-3-2.休暇時間計算:R03の開始時刻/終了時刻からランチ除外+丸め計算
MULTIPLY: WRK-START-HOUR × 60 GIVING WRK-START-MIN(時→分変換)
SUBTRACT: ランチ時間(60分)をWRK-START-MINから除外
2-3-3.SUB05TIM呼出(モード1:0.1h切上)
【CALL 'SUB05TIM'】
CALL 'SUB05TIM' USING T01TIMPAR
T01TIMHRS=WRK-LEAVE-HOURS, T01TIMRRC=1(0.1h切上モード)
T01TIMOUTをWRK-LEAVE-HOURSに退避
2-3-4.DAILY-RECORD出力
2-3-5.R01/R02/R03次読込
2-4.【パターンB(6200PATTERNSOR)】:R01+R02のみ(打刻のみ)
2-4-1.打刻情報設定:R02の出勤時刻/退勤時刻をDAILY-RECORDに設定
2-4-2.休暇時間=0, 欠勤=0
2-4-3.DAILY-RECORD出力
2-4-4.R01/R02次読込(R03はキー不一致のため読込済み)
2-5.【パターンC(6300PATTERNSOR)】:R01+R03のみ(休暇のみ)
2-5-1.打刻情報=0000
2-5-2.休暇時間計算:ランチ除外+丸め(所定労働時間8h上限)
MULTIPLY/SUBTRACT使用(パターンAと同様)
WRK-LEAVE-HOURS > 8.0 → 8.0に制限
2-5-3.SUB05TIM呼出(モード1:0.1h切上)
2-5-4.DAILY-RECORD出力
2-5-5.R01/R03次読込(R02はキー不一致のため読込済み)
2-6.【パターンD(6400PATTERNSOR)】:R01のみ(欠勤)
2-6-1.打刻情報=0000, 休暇=0
2-6-2.未申請欠勤=8.0h
2-6-3.DAILY-RECORD出力
2-6-4.R01次読込(R02/R03はキー不一致のため読込済み)
2-7.各パターンセクションはPERFORMで呼び出され、EXITで自動復帰
主処理ループ(2000MAJSOR)に戻り、次のR01レコードを処理する。
3.終了処理(3000STPSOR)
3-1.入出力ファイルのクローズ
3-2.入出力件数出力
【メッセージ編集】
メッセージ番号:6(入力件数)
PARM1:該当ファイルDD名
PARM2:該当ファイル件数
メッセージ番号:7(出力件数)
PARM1:該当ファイルDD名
PARM2:該当ファイル件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
4.メッセージ出力(4000MSGOUTSOR)
SUB02MSG呼出し
9.ABEND処理(9999ABDSOR)
SUB03END呼出し
```
---
## 出力レコード定義
### 出力ファイル1W01: DAILY-RECORD
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | SD-EMP-ID | SW-EMP-ID(R01) | 社員番号 |
| 2 | SD-DATE | SW-DATE(R01) | YYYYMMDD |
| 3 | SD-TIME-IN | SR-STR-TIME(R02) or '0000' | 出勤時刻(パターンC/Dは0000) |
| 4 | SD-TIME-OUT | SR-END-TIME(R02) or '0000' | 退勤時刻(パターンC/Dは0000) |
| 5 | SD-ANNUAL-H | R03(LEAVE-TYPE='01')より計算 | 年休使用時間(ランチ除外+丸め) |
| 6 | SD-PERSONAL-H | R03(LEAVE-TYPE='02')より計算 | 事假時間 |
| 7 | SD-OFFICIAL-H | R03(LEAVE-TYPE='03')より計算 | 因公特批假時間 |
| 8 | SD-SICK-H | R03(LEAVE-TYPE='04')より計算 | 病欠時間 |
| 9 | SD-ABSENT-H | パターンDのみ8.0固定 | 未申請欠勤時間 |
| 10 | SD-FILLER | SPACE | 予備領域 |
### 出力ファイル2W02: ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | WEERR-CATEGORY | '99'固定 | エラー区分(未使用だが予約) |
| 2 | WEERR-DETAIL | STRING編集 | エラー詳細(SUB05TIM異常時等) |