Add KIN08DBU (勤怠DB更新処理) and KIN09CSV (CSV出力処理)

This commit is contained in:
qiuqiuqiu
2026-06-28 21:13:47 +08:00
parent 02166e56a5
commit f7199f81fd
7 changed files with 1721 additions and 0 deletions
+693
View File
@@ -0,0 +1,693 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN08DBU.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN08DBU *
* プログラム名 : 勤怠DB更新処理 *
* 作成日 : 2026-06-28 *
* 処理概要 : DAILY-RECORDを読込み、DAILY_RECORDSにINSERT、*
* 社員別月次集計後MONTHLY_ABSENCEにUPSERT、 *
* 集計結果をABSENCE_SUMMARYファイルに出力する。*
* SYSIN制御カード(T/P/M)をGO TO DEPENDING ON *
* で分岐処理する。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-28 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT R01INNFIL ASSIGN TO "KIN08R01".
SELECT SYSINFILE ASSIGN TO "KIN08S01".
SELECT W01OUTFIL ASSIGN TO "KIN08W01".
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* R01 (DAILY-RECORD) 200B FB *
*****************************************************************
FD R01INNFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 R01INNREC.
COPY KIN07REC REPLACING ==(A)== BY ==R01==.
*
*****************************************************************
* SYSIN 80B FB *
*****************************************************************
FD SYSINFILE
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 SYSINREC PIC X(080).
*
*****************************************************************
* W01 (ABSENCE-SUMMARY) 80B FB *
*****************************************************************
FD W01OUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 W01OUTREC.
COPY KIN08REC REPLACING ==(A)== BY ==W01==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN08DBU'.
03 CNS-MSGSTR PIC 9(003) VALUE 001.
03 CNS-MSGFIN PIC 9(003) VALUE 002.
03 CNS-MSGSUBEEK PIC 9(003) VALUE 005.
03 CNS-MSGIINKES PIC 9(003) VALUE 006.
03 CNS-MSGOUTKES PIC 9(003) VALUE 007.
03 CNS-MSGKEYINF PIC 9(003) VALUE 033.
03 CNS-KN0002 PIC 9(001) VALUE 2.
03 CNS-ABD999 PIC 9(003) VALUE 999.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-R01INN PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXINS PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXUPD PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-DBXDEL PIC S9(009) COMP-3
VALUE ZERO.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** EOF判定
03 WRK-R01EOF PIC X(001).
88 WRK-R01-EOF VALUE '1'.
03 WRK-SYSIN-EOF PIC X(001).
88 WRK-SYSIN-EOF-Y VALUE '1'.
*** SYSINカード種別
03 WRK-CARD-TYPE PIC X(001).
03 WRK-DISP-IDX PIC 9(001).
*** SYSIN解析値
03 WRK-YEAR-MONTH PIC X(006).
03 WRK-MODE-VALUE PIC X(010).
88 RESET-MODE VALUE 'RESET'.
88 NORMAL-MODE VALUE 'NORMAL'.
03 WRK-PERIOD-FOUND PIC X(001).
88 WRK-PERIOD-OK VALUE '1'.
03 WRK-ALL-TARGETS PIC X(001).
88 WRK-ALL-EMP VALUE '1'.
*** SYSIN解析作業変数
03 WS-PARM-NAME PIC X(020).
03 WS-PARM-VALUE PIC X(020).
*** SQLホスト変数
03 HV-EMP-ID PIC X(008).
03 HV-TARGET-DATE PIC X(008).
03 HV-TIME-IN PIC X(004).
03 HV-TIME-OUT PIC X(004).
03 HV-ANNUAL-H PIC 9(004)V9(001).
03 HV-PERSONAL-H PIC 9(004)V9(001).
03 HV-OFFICIAL-H PIC 9(004)V9(001).
03 HV-SICK-H PIC 9(004)V9(001).
03 HV-ABSENT-H PIC 9(004)V9(001).
03 HV-YEAR-MONTH PIC X(006).
03 HV-CNT PIC 9(009).
*** SYSINレコード退避
03 WS-SYSIN-REC PIC X(080).
*** 日付→年月抽出
03 WRK-DATE-STR PIC X(008).
*** INSPECT TALLYING用
03 WS-ZERO-CNT PIC 9(002).
*** 集計テーブル索引
03 WS-AGG-IDX PIC 9(003).
03 WS-FOUND-IDX PIC 9(003).
*** SQLCODE表示用
03 WRK-SQLCODE-DISP PIC +9(009).
*
*****************************************************************
* 集計テーブル(社員別月次集計) *
*****************************************************************
01 AGGREGATION-TABLE.
03 AGG-ENTRIES OCCURS 100 TIMES.
05 AGG-EMP-ID PIC X(008).
05 AGG-YEAR-MONTH PIC X(006).
05 AGG-ANNUAL-H PIC 9(004)V9(001).
05 AGG-PERSONAL-H PIC 9(004)V9(001).
05 AGG-OFFICIAL-H PIC 9(004)V9(001).
05 AGG-SICK-H PIC 9(004)V9(001).
05 AGG-ABSENT-H PIC 9(004)V9(001).
03 AGG-COUNT PIC 9(003).
*
*****************************************************************
* 対象社員テーブル(Tカード指定用) *
*****************************************************************
01 TARGET-TABLE.
03 TARGET-EMP OCCURS 100 TIMES
PIC X(008).
03 TARGET-COUNT PIC 9(003).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** メッセージ編集出力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) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ出力・SYSIN読込・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
AGGREGATION-TABLE.
SET NORMAL-MODE TO TRUE.
SET WRK-ALL-EMP TO TRUE.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/kin.db'
END-EXEC.
*
*** SYSINファイルOPEN+読込ループ
OPEN INPUT SYSINFILE.
MOVE '0' TO WRK-SYSIN-EOF.
PERFORM 1199-SYSIN-LOOP
THRU 1199-SYSIN-EXIT
UNTIL WRK-SYSIN-EOF-Y.
CLOSE SYSINFILE.
*
*** 必須パラメータ未設定チェック
IF NOT WRK-PERIOD-OK
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** 入出力ファイルOPEN
OPEN INPUT R01INNFIL
OUTPUT W01OUTFIL.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:SYSIN読込制御 *
* 処理概要 : SYSINを1行読込み、カード種別でGO TO分岐 *
*****************************************************************
1199-SYSIN-LOOP SECTION.
*
READ SYSINFILE INTO WS-SYSIN-REC
AT END
SET WRK-SYSIN-EOF-Y TO TRUE
NOT AT END
CONTINUE
END-READ.
*
IF NOT WRK-SYSIN-EOF-Y
MOVE WS-SYSIN-REC(1:1) TO WRK-CARD-TYPE
MOVE 0 TO WRK-DISP-IDX
IF WRK-CARD-TYPE = 'T'
MOVE 1 TO WRK-DISP-IDX
END-IF
IF WRK-CARD-TYPE = 'P'
MOVE 2 TO WRK-DISP-IDX
END-IF
IF WRK-CARD-TYPE = 'M'
MOVE 3 TO WRK-DISP-IDX
END-IF
IF WRK-DISP-IDX > 0
GO TO 1110-TARGETSOR
1120-PERIODSOR
1130-MODESOR
DEPENDING ON WRK-DISP-IDX
ELSE
IF WRK-CARD-TYPE = '*'
DISPLAY 'COMMENT: ' WS-SYSIN-REC
ELSE
DISPLAY 'WARNING: Unknown card type ['
WRK-CARD-TYPE ']'
END-IF
END-IF
END-IF.
*
GO TO 1199-SYSIN-EXIT.
*
1110-TARGETSOR.
*** Tカード: 対象社員一覧
INITIALIZE TARGET-TABLE.
UNSTRING WS-SYSIN-REC(3:78)
DELIMITED BY ','
INTO TARGET-EMP(1)
TARGET-EMP(2)
TARGET-EMP(3)
TARGET-EMP(4)
TARGET-EMP(5)
TARGET-EMP(6)
TARGET-EMP(7)
TARGET-EMP(8)
TARGET-EMP(9)
TARGET-EMP(10)
TALLYING IN TARGET-COUNT
END-UNSTRING.
DISPLAY 'TARGET: ' TARGET-COUNT ' employees'.
MOVE 0 TO WRK-ALL-TARGETS.
GO TO 1199-SYSIN-EXIT.
*
1120-PERIODSOR.
*** Pカード: 処理対象年月
UNSTRING WS-SYSIN-REC(3:78)
DELIMITED BY '='
INTO WS-PARM-NAME
WS-PARM-VALUE
END-UNSTRING.
MOVE WS-PARM-VALUE(1:6) TO WRK-YEAR-MONTH.
MOVE '1' TO WRK-PERIOD-FOUND.
DISPLAY 'PERIOD: ' WRK-YEAR-MONTH.
GO TO 1199-SYSIN-EXIT.
*
1130-MODESOR.
*** Mカード: モード指定
MOVE WS-SYSIN-REC(3:78) TO WRK-MODE-VALUE.
INSPECT WRK-MODE-VALUE
REPLACING ALL 'MODE=' BY SPACES.
IF FUNCTION TRIM(WRK-MODE-VALUE) = 'RESET'
SET RESET-MODE TO TRUE
ELSE
SET NORMAL-MODE TO TRUE
END-IF.
DISPLAY 'MODE: ' FUNCTION TRIM(WRK-MODE-VALUE).
GO TO 1199-SYSIN-EXIT.
*
1199-SYSIN-EXIT.
EXIT.
*
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理 *
* 処理概要 : DAILY-RECORD読込→INSERT→集計 *
*****************************************************************
2000MAJSOR SECTION.
*
*** R01(DAILY-RECORD)読込
READ R01INNFIL
AT END
MOVE '1' TO WRK-R01EOF
NOT AT END
ADD 1 TO CUN-R01INN
END-READ.
*
IF WRK-R01-EOF
EXIT SECTION
END-IF.
*
*** 社員番号有効性チェック(INSPECT TALLYING)
MOVE ZERO TO WS-ZERO-CNT.
INSPECT R01EMP-ID TALLYING WS-ZERO-CNT
FOR LEADING '0'.
IF R01EMP-ID = SPACE
OR R01EMP-ID = LOW-VALUES
DISPLAY 'WARNING: Empty EMP-ID record '
CUN-R01INN
EXIT SECTION
END-IF.
*
*** ホスト変数設定
MOVE R01EMP-ID TO HV-EMP-ID.
MOVE R01DATE TO HV-TARGET-DATE.
MOVE R01TIME-IN TO HV-TIME-IN.
MOVE R01TIME-OUT TO HV-TIME-OUT.
MOVE R01ANNUAL-H TO HV-ANNUAL-H.
MOVE R01PERSONAL-H TO HV-PERSONAL-H.
MOVE R01OFFICIAL-H TO HV-OFFICIAL-H.
MOVE R01SICK-H TO HV-SICK-H.
MOVE R01ABSENT-H TO HV-ABSENT-H.
*
*** DAILY_RECORDS INSERT
EXEC SQL
INSERT INTO DAILY_RECORDS
(EMP_ID, TARGET_DATE, TIME_IN, TIME_OUT,
ANNUAL_LEAVE_H, PERSONAL_LEAVE_H,
OFFICIAL_LEAVE_H, SICK_LEAVE_H,
UNAPPROVED_ABSENT_H, UPDATED_AT)
VALUES
(:HV-EMP-ID, :HV-TARGET-DATE,
:HV-TIME-IN, :HV-TIME-OUT,
:HV-ANNUAL-H, :HV-PERSONAL-H,
:HV-OFFICIAL-H, :HV-SICK-H,
:HV-ABSENT-H, CURRENT_TIMESTAMP)
END-EXEC.
*
IF SQLCODE NOT = 0
DISPLAY 'WARNING: INSERT failed SQLCODE='
SQLCODE ' EMP=' HV-EMP-ID
' DATE=' HV-TARGET-DATE
PERFORM 9100DBERRSOR
ELSE
ADD 1 TO CUN-DBXINS
END-IF.
*
*** 対象社員フィルタリング(Tカード指定時)
IF NOT WRK-ALL-EMP
MOVE ZERO TO WS-FOUND-IDX
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
UNTIL WS-AGG-IDX > TARGET-COUNT
IF TARGET-EMP(WS-AGG-IDX) = HV-EMP-ID
MOVE WS-AGG-IDX TO WS-FOUND-IDX
EXIT PERFORM
END-IF
END-PERFORM
IF WS-FOUND-IDX = 0
EXIT SECTION
END-IF
END-IF.
*
*** 年月抽出(YYYYMMDD→YYYYMM)
MOVE HV-TARGET-DATE TO WRK-DATE-STR.
MOVE WRK-DATE-STR(1:6) TO HV-YEAR-MONTH.
*
*** 集計テーブルに加算(線形探索)
MOVE ZERO TO WS-FOUND-IDX.
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
UNTIL WS-AGG-IDX > AGG-COUNT
IF AGG-EMP-ID(WS-AGG-IDX) = HV-EMP-ID
AND AGG-YEAR-MONTH(WS-AGG-IDX) = HV-YEAR-MONTH
MOVE WS-AGG-IDX TO WS-FOUND-IDX
EXIT PERFORM
END-IF
END-PERFORM.
*
IF WS-FOUND-IDX > 0
COMPUTE AGG-ANNUAL-H(WS-FOUND-IDX)
ROUNDED =
AGG-ANNUAL-H(WS-FOUND-IDX) + HV-ANNUAL-H
ON SIZE ERROR
DISPLAY 'WARNING: Annual-H overflow '
HV-EMP-ID
MOVE ZERO TO
AGG-ANNUAL-H(WS-FOUND-IDX)
END-COMPUTE
ADD HV-PERSONAL-H TO
AGG-PERSONAL-H(WS-FOUND-IDX)
ADD HV-OFFICIAL-H TO
AGG-OFFICIAL-H(WS-FOUND-IDX)
ADD HV-SICK-H TO
AGG-SICK-H(WS-FOUND-IDX)
ADD HV-ABSENT-H TO
AGG-ABSENT-H(WS-FOUND-IDX)
ELSE
IF AGG-COUNT < 100
ADD 1 TO AGG-COUNT
MOVE HV-EMP-ID TO
AGG-EMP-ID(AGG-COUNT)
MOVE HV-YEAR-MONTH TO
AGG-YEAR-MONTH(AGG-COUNT)
MOVE HV-ANNUAL-H TO
AGG-ANNUAL-H(AGG-COUNT)
MOVE HV-PERSONAL-H TO
AGG-PERSONAL-H(AGG-COUNT)
MOVE HV-OFFICIAL-H TO
AGG-OFFICIAL-H(AGG-COUNT)
MOVE HV-SICK-H TO
AGG-SICK-H(AGG-COUNT)
MOVE HV-ABSENT-H TO
AGG-ABSENT-H(AGG-COUNT)
ELSE
DISPLAY 'WARNING: Agg table full '
HV-EMP-ID
END-IF
END-IF.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : RESET→DELETE、UPSERT、ファイル出力、COMMIT *
*****************************************************************
3000STPSOR SECTION.
*
*** MODE=RESET: 既存レコード削除
IF RESET-MODE
EXEC SQL
DELETE FROM MONTHLY_ABSENCE
WHERE YEAR_MONTH = :WRK-YEAR-MONTH
END-EXEC
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
ELSE
ADD 1 TO CUN-DBXDEL
END-IF
END-IF.
*
*** 集計結果→MONTHLY_ABSENCE UPSERT
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
UNTIL WS-AGG-IDX > AGG-COUNT
MOVE AGG-EMP-ID(WS-AGG-IDX)
TO HV-EMP-ID
MOVE AGG-YEAR-MONTH(WS-AGG-IDX)
TO HV-YEAR-MONTH
MOVE AGG-ANNUAL-H(WS-AGG-IDX)
TO HV-ANNUAL-H
MOVE AGG-PERSONAL-H(WS-AGG-IDX)
TO HV-PERSONAL-H
MOVE AGG-OFFICIAL-H(WS-AGG-IDX)
TO HV-OFFICIAL-H
MOVE AGG-SICK-H(WS-AGG-IDX)
TO HV-SICK-H
MOVE AGG-ABSENT-H(WS-AGG-IDX)
TO HV-ABSENT-H
*
EXEC SQL
SELECT COUNT(*) INTO :HV-CNT
FROM MONTHLY_ABSENCE
WHERE EMP_ID = :HV-EMP-ID
AND YEAR_MONTH = :HV-YEAR-MONTH
END-EXEC
*
IF SQLCODE = 0
IF HV-CNT > 0
EXEC SQL
UPDATE MONTHLY_ABSENCE SET
ANNUAL_LEAVE_H =
:HV-ANNUAL-H
, PERSONAL_LEAVE_H =
:HV-PERSONAL-H
, OFFICIAL_LEAVE_H =
:HV-OFFICIAL-H
, SICK_LEAVE_H =
:HV-SICK-H
, UNAPPROVED_ABSENT_H =
:HV-ABSENT-H
, UPDATED_AT =
CURRENT_TIMESTAMP
WHERE EMP_ID = :HV-EMP-ID
AND YEAR_MONTH =
:HV-YEAR-MONTH
END-EXEC
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
ELSE
ADD 1 TO CUN-DBXUPD
END-IF
ELSE
EXEC SQL
INSERT INTO MONTHLY_ABSENCE
(EMP_ID, YEAR_MONTH,
ANNUAL_LEAVE_H,
PERSONAL_LEAVE_H,
OFFICIAL_LEAVE_H,
SICK_LEAVE_H,
UNAPPROVED_ABSENT_H,
UPDATED_AT)
VALUES
(:HV-EMP-ID,
:HV-YEAR-MONTH,
:HV-ANNUAL-H,
:HV-PERSONAL-H,
:HV-OFFICIAL-H,
:HV-SICK-H,
:HV-ABSENT-H,
CURRENT_TIMESTAMP)
END-EXEC
IF SQLCODE NOT = 0
PERFORM 9100DBERRSOR
ELSE
ADD 1 TO CUN-DBXINS
END-IF
END-IF
ELSE
DISPLAY 'WARNING: SELECT COUNT failed '
HV-EMP-ID
END-IF
END-PERFORM.
*
*** ABSENCE_SUMMARYファイル出力
PERFORM VARYING WS-AGG-IDX FROM 1 BY 1
UNTIL WS-AGG-IDX > AGG-COUNT
INITIALIZE W01OUTREC
MOVE AGG-EMP-ID(WS-AGG-IDX)
TO W01EMP-ID
MOVE AGG-YEAR-MONTH(WS-AGG-IDX)
TO W01YEAR-MONTH
MOVE AGG-ANNUAL-H(WS-AGG-IDX)
TO W01ANNUAL-LEAVE-H
MOVE AGG-PERSONAL-H(WS-AGG-IDX)
TO W01PERSONAL-LEAVE-H
MOVE AGG-OFFICIAL-H(WS-AGG-IDX)
TO W01OFFICIAL-LEAVE-H
MOVE AGG-SICK-H(WS-AGG-IDX)
TO W01SICK-LEAVE-H
MOVE AGG-ABSENT-H(WS-AGG-IDX)
TO W01ABSENT-H
WRITE W01OUTREC
ADD 1 TO CUN-W01OUT
END-PERFORM.
*
*** COMMIT
EXEC SQL
COMMIT WORK
END-EXEC.
*
*** 入出力ファイルCLOSE
CLOSE R01INNFIL
W01OUTFIL.
*
*** 件数メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'KIN08R01' TO M00UMKDATS22-01.
MOVE CUN-R01INN TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'INS' TO M00UMKDATS22-01.
MOVE CUN-DBXINS TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGIINKES TO M00MSGCOD.
MOVE 'UPD' TO M00UMKDATS22-01.
MOVE CUN-DBXUPD TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
IF CUN-DBXDEL > 0
INITIALIZE M00MHOPAR
MOVE CNS-MSGOUTKES TO M00MSGCOD
MOVE 'DEL' TO M00UMKDATS22-01
MOVE CUN-DBXDEL TO M00UMKDATS22-02
PERFORM 4000MSGOUTSOR
END-IF.
*
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN08W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(4.0) *
* サブプログラム名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(9.1) *
* サブプログラム名:DBエラー処理 *
* 処理概要 : ROLLBACKDISPLAYABEND *
*****************************************************************
9100DBERRSOR SECTION.
*
MOVE SQLCODE TO WRK-SQLCODE-DISP.
DISPLAY 'SQL ERROR: ' WRK-SQLCODE-DISP
' PGM=KIN08DBU'.
EXEC SQL
ROLLBACK WORK
END-EXEC.
PERFORM 9999ABDSOR.
*
9100DBERRSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(9.9) *
* サブプログラム名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.
+608
View File
@@ -0,0 +1,608 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. KIN09CSV.
*****************************************************************
* システム名 : 勤怠休暇管理システム *
* プログラムID : KIN09CSV *
* プログラム名 : 勤怠CSV出力処理 *
* 作成日 : 2026-06-28 *
* 処理概要 : DAILY_RECORDSをDBからSELECTし、STRING WITH *
* POINTERでCSV行を編集、WRITE AFTER ADVANCING *
* (PAGE/2LINES/1LINE)で出力する。 *
* INSPECT REPLACINGでCSV危険文字をサニタイズ。*
* MODE=FULL/SHORTで出力範囲を制御。 *
*****************************************************************
* 更新履歴 *
*---------------------------------------------------------------*
* 更新日付 担当者 更新内容 *
*---------------------------------------------------------------*
* 26-06-28 @@@ 新規作成 *
* *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZSERIES.
OBJECT-COMPUTER. IBM-ZSERIES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CSVOUTFIL ASSIGN TO KIN09W01.
*
DATA DIVISION.
FILE SECTION.
*
*****************************************************************
* W01 (CSV-OUTPUT) 200B FB *
*****************************************************************
FD CSVOUTFIL
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0
RECORDING MODE IS F.
01 CSVOUTREC.
COPY KIN09REC REPLACING ==(A)== BY ==OUT==.
*
WORKING-STORAGE SECTION.
*
*****************************************************************
* SQLCA *
*****************************************************************
EXEC SQL INCLUDE SQLCA END-EXEC.
*
*****************************************************************
* コンスタント領域 *
*****************************************************************
01 CNSARA.
03 CNS-PRGIDX PIC X(008) VALUE 'KIN09CSV'.
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.
*
*****************************************************************
* カウンタ領域 *
*****************************************************************
01 CUNARA.
03 CUN-W01OUT PIC S9(009) COMP-3
VALUE ZERO.
*
*****************************************************************
* 作業領域 *
*****************************************************************
01 WRKARA.
*** 日付範囲
03 WS-YEARMONTH PIC X(006).
03 WS-DATE-FROM PIC X(008).
03 WS-DATE-TO PIC X(008).
*** モード
03 WS-MODE PIC X(005).
88 MODE-FULL VALUE 'FULL'.
88 MODE-SHORT VALUE 'SHORT'.
*** PARM解析
03 WS-CMDLINE PIC X(200).
03 WS-COMMA-CNT PIC 9(002).
03 WS-PARM1 PIC X(100).
03 WS-PARM2 PIC X(100).
03 WS-KEY1 PIC X(020).
03 WS-VALUE1 PIC X(080).
03 WS-KEY2 PIC X(020).
03 WS-VALUE2 PIC X(080).
*** ホスト変数
03 HV-EMP-ID PIC X(008).
03 HV-TARGET-DATE PIC X(008).
03 HV-TIME-IN PIC X(004).
03 HV-TIME-OUT PIC X(004).
03 HV-ANNUAL-H PIC 9(004)V9(001).
03 HV-PERSONAL-H PIC 9(004)V9(001).
03 HV-OFFICIAL-H PIC 9(004)V9(001).
03 HV-SICK-H PIC 9(004)V9(001).
03 HV-ABSENT-H PIC 9(004)V9(001).
03 HV-MTH-EMP-ID PIC X(008).
03 HV-MTH-YEAR-MONTH PIC X(006).
03 HV-MTH-ANNUAL-H PIC 9(004)V9(001).
03 HV-MTH-PERSONAL-H PIC 9(004)V9(001).
03 HV-MTH-OFFICIAL-H PIC 9(004)V9(001).
03 HV-MTH-SICK-H PIC 9(004)V9(001).
03 HV-MTH-ABSENT-H PIC 9(004)V9(001).
*** CSV編集
03 WS-CSV-LINE PIC X(200).
03 WS-PTR PIC 9(003).
03 WS-SAFE-FIELD PIC X(080).
03 WS-LEAVE-TYPE PIC X(002).
*** CSV時間編集(Z(3)9.9→"xxx.x"形式)
03 WS-EDIT-ANNUAL PIC Z(3)9.9.
03 WS-EDIT-PERSONAL PIC Z(3)9.9.
03 WS-EDIT-OFFICIAL PIC Z(3)9.9.
03 WS-EDIT-SICK PIC Z(3)9.9.
03 WS-EDIT-ABSENT PIC Z(3)9.9.
03 WS-EDIT-MTH-ANNUAL PIC Z(3)9.9.
03 WS-EDIT-MTH-PERSONAL PIC Z(3)9.9.
03 WS-EDIT-MTH-OFFICIAL PIC Z(3)9.9.
03 WS-EDIT-MTH-SICK PIC Z(3)9.9.
03 WS-EDIT-MTH-ABSENT PIC Z(3)9.9.
*** 行数カウンタ(ヘッダー再出力用)
03 WS-LINE-COUNT PIC 9(004).
*** FETCH EOF
03 WS-DAILY-EOF PIC X(001).
88 WS-DAILY-EOF-Y VALUE '1'.
03 WS-CNT PIC 9(009).
*** SQLCODE表示
03 WRK-SQLCODE-DISP PIC +9(009).
*
*****************************************************************
* サブプログラム連絡領域 *
*****************************************************************
*** メッセージ編集出力SR用
COPY ZANMSGAC.
*** ABEND処理SR用
COPY ZANENDAC.
*
PROCEDURE DIVISION.
*****************************************************************
* サブモジュールNO: (0.0) *
* サブモジュール名: 制御処理 *
* 処理概要 : メインコントロール処理 *
*****************************************************************
0000MAJCOLSOR SECTION.
*
*** 初期処理
PERFORM 1000ITTSOR.
*
*** 主処理
PERFORM 2000MAJSOR
UNTIL WS-DAILY-EOF-Y.
*
*** MODE=SHORT時追加処理
IF MODE-SHORT
PERFORM 2500-SHORT-MODE
END-IF.
*
*** 終了処理
PERFORM 3000STPSOR.
*
0000MAJCOLSOR-EXT.
GOBACK.
*****************************************************************
* サブモジュールNO: (1.0) *
* サブモジュール名: 初期処理 *
* 処理概要 : 開始メッセージ・PARM解析・DB接続・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.
*
*** PARM解析(ACCEPT FROM COMMAND-LINE)
PERFORM 1100PARMSOR.
*
*** ワークエリア初期化
INITIALIZE WRKARA.
*
*** DB接続
EXEC SQL
CONNECT TO 'data/kin.db'
END-EXEC.
*
*** 出力ファイルOPEN
OPEN OUTPUT CSVOUTFIL.
*
*** ヘッダー行書出(PAGE)
MOVE '社員番号,日付,出勤時刻'
TO WS-CSV-LINE(1:28)
MOVE ',退勤時刻,休暇種別,年休時間'
TO WS-CSV-LINE(29:28)
MOVE ',事假時間,因公特批假時間'
TO WS-CSV-LINE(57:24)
MOVE ',病欠時間,未申請欠勤時間'
TO WS-CSV-LINE(81:24)
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING PAGE.
ADD 1 TO CUN-W01OUT.
MOVE ZERO TO WS-LINE-COUNT.
*
*** CURSOR OPEN + 初回FETCH
PERFORM 1200-DAILY-OPEN.
*
1000ITTSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.1) *
* サブモジュール名:PARM解析 *
* 処理概要 : コマンドライン引数を解析 *
*****************************************************************
1100PARMSOR SECTION.
*
ACCEPT WS-CMDLINE FROM COMMAND-LINE.
*
*** カンマ区切り数チェック
MOVE ZERO TO WS-COMMA-CNT.
INSPECT WS-CMDLINE TALLYING WS-COMMA-CNT
FOR ALL ','.
*
IF WS-COMMA-CNT < 1
DISPLAY 'WARNING: Missing MODE, using FULL'
END-IF.
*
*** UNSTRINGでPARM分解
UNSTRING WS-CMDLINE
DELIMITED BY ','
INTO WS-PARM1
WS-PARM2
END-UNSTRING.
*
UNSTRING WS-PARM1
DELIMITED BY '='
INTO WS-KEY1
WS-VALUE1
END-UNSTRING.
*
UNSTRING WS-PARM2
DELIMITED BY '='
INTO WS-KEY2
WS-VALUE2
END-UNSTRING.
*
*** YEARMONTH設定
IF WS-KEY1 = 'YEARMONTH'
MOVE WS-VALUE1(1:6) TO WS-YEARMONTH
ELSE
IF WS-KEY2 = 'YEARMONTH'
MOVE WS-VALUE2(1:6) TO WS-YEARMONTH
END-IF
END-IF.
*
*** 必須チェック
IF WS-YEARMONTH = SPACE
MOVE CNS-ABD999 TO E01ABDCOD
CALL 'SUB03END' USING E01ABDPAR
END-IF.
*
*** 日付範囲設定(YYYYMM01〜YYYYMM31)
MOVE WS-YEARMONTH TO WS-DATE-FROM(1:6).
MOVE '01' TO WS-DATE-FROM(7:2).
MOVE WS-YEARMONTH TO WS-DATE-TO(1:6).
MOVE '31' TO WS-DATE-TO(7:2).
*
*** MODE設定
MOVE 'FULL' TO WS-MODE.
IF WS-KEY1 = 'MODE'
MOVE WS-VALUE1(1:5) TO WS-MODE
ELSE
IF WS-KEY2 = 'MODE'
MOVE WS-VALUE2(1:5) TO WS-MODE
END-IF
END-IF.
*
1100PARMSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(1.2) *
* サブモジュール名:DAILY_RECORDS CURSOR OPEN + 初回FETCH *
* 処理概要 : 該当月の全レコードをSELECT *
*****************************************************************
1200-DAILY-OPEN SECTION.
*
EXEC SQL
DECLARE C_DAILY CURSOR FOR
SELECT EMP_ID, TARGET_DATE,
TIME_IN, TIME_OUT,
ANNUAL_LEAVE_H, PERSONAL_LEAVE_H,
OFFICIAL_LEAVE_H, SICK_LEAVE_H,
UNAPPROVED_ABSENT_H
FROM DAILY_RECORDS
WHERE TARGET_DATE >= :WS-DATE-FROM
AND TARGET_DATE <= :WS-DATE-TO
ORDER BY EMP_ID, TARGET_DATE
END-EXEC.
*
EXEC SQL
OPEN C_DAILY
END-EXEC.
*
EXEC SQL
FETCH C_DAILY
INTO :HV-EMP-ID,
:HV-TARGET-DATE,
:HV-TIME-IN,
:HV-TIME-OUT,
:HV-ANNUAL-H,
:HV-PERSONAL-H,
:HV-OFFICIAL-H,
:HV-SICK-H,
:HV-ABSENT-H
END-EXEC.
*
IF SQLCODE NOT = 0
MOVE '1' TO WS-DAILY-EOF
END-IF.
*
1200-DAILY-OPEN-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.0) *
* サブモジュール名:主処理(CSV行出力) *
* 処理概要 : DAILY_RECORDS→CSV行編集→WRITE *
*****************************************************************
2000MAJSOR SECTION.
*
*** 休暇種別判定(99=なし)
MOVE '99' TO WS-LEAVE-TYPE.
IF HV-ANNUAL-H > 0
MOVE '01' TO WS-LEAVE-TYPE
ELSE
IF HV-PERSONAL-H > 0
MOVE '02' TO WS-LEAVE-TYPE
ELSE
IF HV-OFFICIAL-H > 0
MOVE '03' TO WS-LEAVE-TYPE
ELSE
IF HV-SICK-H > 0
MOVE '04' TO WS-LEAVE-TYPE
END-IF
END-IF
END-IF
END-IF.
*
*** CSV危険文字サニタイズ(INSPECT REPLACING)
MOVE HV-EMP-ID TO WS-SAFE-FIELD.
INSPECT WS-SAFE-FIELD
REPLACING ALL ',' BY ';'
ALL X"0D" BY SPACE
ALL X"0A" BY SPACE.
MOVE WS-SAFE-FIELD TO HV-EMP-ID.
*
*** 時間編集(小数点付き表示に変換)
MOVE HV-ANNUAL-H TO WS-EDIT-ANNUAL.
MOVE HV-PERSONAL-H TO WS-EDIT-PERSONAL.
MOVE HV-OFFICIAL-H TO WS-EDIT-OFFICIAL.
MOVE HV-SICK-H TO WS-EDIT-SICK.
MOVE HV-ABSENT-H TO WS-EDIT-ABSENT.
*** CSV行編集(STRING WITH POINTER)
MOVE 1 TO WS-PTR.
STRING
HV-EMP-ID DELIMITED BY SIZE
',' DELIMITED BY SIZE
HV-TARGET-DATE DELIMITED BY SIZE
',' DELIMITED BY SIZE
HV-TIME-IN DELIMITED BY SIZE
',' DELIMITED BY SIZE
HV-TIME-OUT DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-LEAVE-TYPE DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-ANNUAL DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-PERSONAL DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-OFFICIAL DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-SICK DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-ABSENT DELIMITED BY SIZE
INTO WS-CSV-LINE
WITH POINTER WS-PTR
END-STRING.
*
*** 100行ごとにヘッダー再出力
ADD 1 TO WS-LINE-COUNT.
IF WS-LINE-COUNT > 100
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 2 LINES
MOVE '社員番号,日付,出勤時刻'
TO WS-CSV-LINE(1:28)
MOVE ',退勤時刻,休暇種別,年休時間'
TO WS-CSV-LINE(29:28)
MOVE ',事假時間,因公特批假時間'
TO WS-CSV-LINE(57:24)
MOVE ',病欠時間,未申請欠勤時間'
TO WS-CSV-LINE(81:24)
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE
ADD 1 TO CUN-W01OUT
MOVE ZERO TO WS-LINE-COUNT
END-IF.
*
*** データ行出力
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE.
ADD 1 TO CUN-W01OUT.
*
*** 次FETCH
EXEC SQL
FETCH C_DAILY
INTO :HV-EMP-ID,
:HV-TARGET-DATE,
:HV-TIME-IN,
:HV-TIME-OUT,
:HV-ANNUAL-H,
:HV-PERSONAL-H,
:HV-OFFICIAL-H,
:HV-SICK-H,
:HV-ABSENT-H
END-EXEC.
*
IF SQLCODE NOT = 0
MOVE '1' TO WS-DAILY-EOF
END-IF.
*
2000MAJSOR-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(2.5) *
* サブモジュール名:MODE=SHORT集計行出力 *
* 処理概要 : MONTHLY_ABSENCEをSELECTしてCSVに追加 *
*****************************************************************
2500-SHORT-MODE SECTION.
*
*** セクション区切り
MOVE SPACE TO WS-CSV-LINE.
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 2 LINES.
*
*** 集計行ヘッダー
MOVE '社員番号,年月,年休計,事假計'
TO WS-CSV-LINE(1:24)
MOVE ',因公特批假計,病欠計,未申請欠勤計'
TO WS-CSV-LINE(25:32)
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE.
ADD 1 TO CUN-W01OUT.
*
*** MONTHLY_ABSENCE CURSOR
EXEC SQL
DECLARE C_MONTHLY CURSOR FOR
SELECT EMP_ID, YEAR_MONTH,
ANNUAL_LEAVE_H, PERSONAL_LEAVE_H,
OFFICIAL_LEAVE_H, SICK_LEAVE_H,
UNAPPROVED_ABSENT_H
FROM MONTHLY_ABSENCE
WHERE YEAR_MONTH = :WS-YEARMONTH
ORDER BY EMP_ID
END-EXEC.
*
EXEC SQL
OPEN C_MONTHLY
END-EXEC.
*
EXEC SQL
FETCH C_MONTHLY
INTO :HV-MTH-EMP-ID,
:HV-MTH-YEAR-MONTH,
:HV-MTH-ANNUAL-H,
:HV-MTH-PERSONAL-H,
:HV-MTH-OFFICIAL-H,
:HV-MTH-SICK-H,
:HV-MTH-ABSENT-H
END-EXEC.
*
PERFORM UNTIL SQLCODE NOT = 0
MOVE HV-MTH-ANNUAL-H TO WS-EDIT-MTH-ANNUAL
MOVE HV-MTH-PERSONAL-H TO WS-EDIT-MTH-PERSONAL
MOVE HV-MTH-OFFICIAL-H TO WS-EDIT-MTH-OFFICIAL
MOVE HV-MTH-SICK-H TO WS-EDIT-MTH-SICK
MOVE HV-MTH-ABSENT-H TO WS-EDIT-MTH-ABSENT
MOVE 1 TO WS-PTR
STRING
HV-MTH-EMP-ID DELIMITED BY SIZE
',' DELIMITED BY SIZE
HV-MTH-YEAR-MONTH DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-MTH-ANNUAL
DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-MTH-PERSONAL
DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-MTH-OFFICIAL
DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-MTH-SICK DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-EDIT-MTH-ABSENT
DELIMITED BY SIZE
INTO WS-CSV-LINE
WITH POINTER WS-PTR
END-STRING
WRITE CSVOUTREC FROM WS-CSV-LINE
AFTER ADVANCING 1 LINE
ADD 1 TO CUN-W01OUT
EXEC SQL
FETCH C_MONTHLY
INTO :HV-MTH-EMP-ID,
:HV-MTH-YEAR-MONTH,
:HV-MTH-ANNUAL-H,
:HV-MTH-PERSONAL-H,
:HV-MTH-OFFICIAL-H,
:HV-MTH-SICK-H,
:HV-MTH-ABSENT-H
END-EXEC
END-PERFORM.
*
EXEC SQL
CLOSE C_MONTHLY
END-EXEC.
*
2500-SHORT-MODE-EXT.
EXIT.
*****************************************************************
* サブモジュールNO:(3.0) *
* サブモジュール名:終了処理 *
* 処理概要 : CURSOR CLOSE・ファイルCLOSE・件数出力 *
*****************************************************************
3000STPSOR SECTION.
*
*** CURSOR CLOSE
EXEC SQL
CLOSE C_DAILY
END-EXEC.
*
*** 出力ファイルCLOSE
CLOSE CSVOUTFIL.
*
*** 出力件数メッセージ
INITIALIZE M00MHOPAR.
MOVE CNS-MSGOUTKES TO M00MSGCOD.
MOVE 'KIN09W01' TO M00UMKDATS22-01.
MOVE CUN-W01OUT TO M00UMKDATS22-02.
PERFORM 4000MSGOUTSOR.
*
*** 終了メッセージ出力
INITIALIZE M00MHOPAR.
MOVE CNS-MSGFIN TO M00MSGCOD.
PERFORM 4000MSGOUTSOR.
*
3000STPSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(4.0) *
* サブプログラム名:メッセージ編集出力処理 *
* 処理概要 : メッセージ編集出力サブPGM呼出 *
*****************************************************************
4000MSGOUTSOR SECTION.
*
MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1).
MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1).
MOVE CNS-PRGIDX TO M00UMKDATS22-05.
CALL 'SUB02MSG' USING M00MHOPAR.
*
4000MSGOUTSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(9.1) *
* サブプログラム名:DBエラー処理 *
* 処理概要 : ROLLBACKDISPLAYABEND *
*****************************************************************
9100DBERRSOR SECTION.
*
MOVE SQLCODE TO WRK-SQLCODE-DISP.
DISPLAY 'SQL ERROR: ' WRK-SQLCODE-DISP
' PGM=KIN09CSV'.
EXEC SQL
ROLLBACK WORK
END-EXEC.
PERFORM 9999ABDSOR.
*
9100DBERRSOR-EXT.
EXIT.
*****************************************************************
* サブプログラムNO:(9.9) *
* サブプログラム名:ABEND処理 *
* 処理概要 : ABENDサブPGM呼出 *
*****************************************************************
9999ABDSOR SECTION.
*
MOVE CNS-ABD999 TO E01ABDCOD.
CALL 'SUB03END' USING E01ABDPAR.
*
9999ABDSOR-EXT.
EXIT.