94400d50d4
作为子目录纳入系统,与核心测试管道协同 Co-Authored-By: Claude <noreply@anthropic.com>
926 lines
32 KiB
COBOL
926 lines
32 KiB
COBOL
*> ============================================================
|
|
*> 16-matching-2stage-1-1 : 二级请求书核对 (2-Stage Invoice Rec)
|
|
*> Input : FILE-A (file-a.dat: 请求书), FILE-B (file-b.dat: 支付), FILE-C (file-c.dat: 参照)
|
|
*> Output: FINAL-OUT (final.dat: 二级核对结果)
|
|
*> error.dat (一级/二级未匹配记录)
|
|
*> audit-report.txt (审计报告: 处理统计)
|
|
*> Coverage: AM-N001, AM-A001, AM-R001
|
|
*> stage-level control totals, inter-stage reconciliation,
|
|
*> stage timing measurement, audit trail
|
|
*> ============================================================
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. Match2Stage.
|
|
|
|
ENVIRONMENT DIVISION.
|
|
INPUT-OUTPUT SECTION.
|
|
FILE-CONTROL.
|
|
*> Stage 1 files
|
|
SELECT FILE-A ASSIGN TO 'file-a.dat'
|
|
ORGANIZATION IS SEQUENTIAL
|
|
ACCESS MODE IS SEQUENTIAL
|
|
FILE STATUS IS WS-A-STATUS.
|
|
SELECT FILE-B ASSIGN TO 'file-b.dat'
|
|
ORGANIZATION IS SEQUENTIAL
|
|
ACCESS MODE IS SEQUENTIAL
|
|
FILE STATUS IS WS-B-STATUS.
|
|
SELECT TEMP-FILE ASSIGN TO 'temp.dat'
|
|
ORGANIZATION IS SEQUENTIAL
|
|
FILE STATUS IS WS-TEMP-STATUS.
|
|
*> Stage 2 files
|
|
SELECT FILE-C ASSIGN TO 'file-c.dat'
|
|
ORGANIZATION IS SEQUENTIAL
|
|
ACCESS MODE IS SEQUENTIAL
|
|
FILE STATUS IS WS-C-STATUS.
|
|
SELECT FINAL-OUT ASSIGN TO 'final.dat'
|
|
ORGANIZATION IS SEQUENTIAL
|
|
FILE STATUS IS WS-FINAL-STATUS.
|
|
SELECT FILE-ERR ASSIGN TO 'error.dat'
|
|
ORGANIZATION IS SEQUENTIAL
|
|
FILE STATUS IS WS-ERR-STATUS.
|
|
SELECT AUDIT-FILE ASSIGN TO 'audit-report.txt'
|
|
ORGANIZATION IS LINE SEQUENTIAL
|
|
FILE STATUS IS WS-AUDIT-STATUS.
|
|
|
|
DATA DIVISION.
|
|
FILE SECTION.
|
|
FD FILE-A.
|
|
01 A-REC.
|
|
COPY "STD-REC.cpy".
|
|
FD FILE-B.
|
|
01 B-REC.
|
|
COPY "STD-REC.cpy".
|
|
FD TEMP-FILE.
|
|
01 TEMP-REC.
|
|
COPY "STD-REC.cpy".
|
|
FD FILE-C.
|
|
01 C-REC.
|
|
COPY "STD-REC.cpy".
|
|
FD FINAL-OUT.
|
|
01 FINAL-REC.
|
|
COPY "STD-REC.cpy".
|
|
FD FILE-ERR.
|
|
01 ERR-REC.
|
|
05 ERR-STAGE PIC X(10).
|
|
05 ERR-KEY PIC X(10).
|
|
05 ERR-AMOUNT PIC 9(10).
|
|
05 ERR-FILLER PIC X(50).
|
|
FD AUDIT-FILE.
|
|
01 AUDIT-REC PIC X(120).
|
|
|
|
WORKING-STORAGE SECTION.
|
|
01 WS-TELECOM-REC.
|
|
COPY "telecom/TEL-INVOICE.cpy".
|
|
|
|
*> File status
|
|
01 WS-A-STATUS PIC X(02).
|
|
01 WS-B-STATUS PIC X(02).
|
|
01 WS-TEMP-STATUS PIC X(02).
|
|
01 WS-C-STATUS PIC X(02).
|
|
01 WS-FINAL-STATUS PIC X(02).
|
|
01 WS-ERR-STATUS PIC X(02).
|
|
01 WS-AUDIT-STATUS PIC X(02).
|
|
|
|
*> EOF flags
|
|
01 WS-EOF-A PIC X(01) VALUE 'N'.
|
|
88 WS-EOF-A-YES VALUE 'Y' FALSE 'N'.
|
|
01 WS-EOF-B PIC X(01) VALUE 'N'.
|
|
88 WS-EOF-B-YES VALUE 'Y' FALSE 'N'.
|
|
01 WS-EOF-TEMP PIC X(01) VALUE 'N'.
|
|
88 WS-EOF-TEMP-YES VALUE 'Y' FALSE 'N'.
|
|
01 WS-EOF-C PIC X(01) VALUE 'N'.
|
|
88 WS-EOF-C-YES VALUE 'Y' FALSE 'N'.
|
|
|
|
*> Key variables
|
|
01 WS-KEY-A PIC X(10).
|
|
01 WS-KEY-B PIC X(10).
|
|
01 WS-KEY-TEMP PIC X(10).
|
|
01 WS-KEY-C PIC X(10).
|
|
01 WS-PREV-KEY-A PIC X(10).
|
|
01 WS-PREV-KEY-B PIC X(10).
|
|
|
|
*> Counters
|
|
01 WS-STAGE1-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-STAGE2-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-A-READ-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-B-READ-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-C-READ-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-UNMATCH-A PIC 9(05) VALUE ZERO.
|
|
01 WS-UNMATCH-B PIC 9(05) VALUE ZERO.
|
|
01 WS-UNMATCH-TEMP PIC 9(05) VALUE ZERO.
|
|
01 WS-UNMATCH-C PIC 9(05) VALUE ZERO.
|
|
01 WS-WARN-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-FATAL-COUNT PIC 9(05) VALUE ZERO.
|
|
01 WS-SEQ-ERR-COUNT PIC 9(05) VALUE ZERO.
|
|
|
|
*> Hash totals
|
|
01 WS-HASH-TOTALS.
|
|
05 WS-HASH-A-INPUT PIC 9(15) VALUE ZERO.
|
|
05 WS-HASH-B-INPUT PIC 9(15) VALUE ZERO.
|
|
05 WS-HASH-TEMP PIC 9(15) VALUE ZERO.
|
|
05 WS-HASH-C-INPUT PIC 9(15) VALUE ZERO.
|
|
05 WS-HASH-FINAL PIC 9(15) VALUE ZERO.
|
|
05 WS-HASH-ERR PIC 9(15) VALUE ZERO.
|
|
05 WS-HASH-DIFF PIC S9(15) VALUE ZERO.
|
|
|
|
*> Stage timing
|
|
01 WS-STAGE1-START PIC 9(08).
|
|
01 WS-STAGE1-END PIC 9(08).
|
|
01 WS-STAGE2-START PIC 9(08).
|
|
01 WS-STAGE2-END PIC 9(08).
|
|
01 WS-TOTAL-ELAPSED PIC 9(08).
|
|
|
|
*> Date and timestamp areas
|
|
01 WS-PROC-DATE PIC 9(08).
|
|
01 WS-PROC-TIME PIC 9(08).
|
|
01 WS-TS-DATE PIC X(08).
|
|
01 WS-TS-TIME PIC X(08).
|
|
|
|
*> Amount areas
|
|
01 WS-AMT-A PIC 9(10).
|
|
01 WS-AMT-B PIC 9(10).
|
|
01 WS-AMT-TEMP PIC 9(10).
|
|
01 WS-AMT-C PIC 9(10).
|
|
01 WS-AMT-FINAL PIC 9(10).
|
|
|
|
*> Error message areas
|
|
01 WS-ERR-MSG PIC X(60).
|
|
01 WS-ERR-DETAIL PIC X(80).
|
|
|
|
*> Program phase
|
|
01 WS-PGM-PHASE PIC X(20).
|
|
|
|
PROCEDURE DIVISION.
|
|
|
|
*> ============================================================
|
|
*> MAIN SECTION
|
|
*> ============================================================
|
|
MAIN SECTION.
|
|
MB-PROCESS.
|
|
PERFORM 1000-INITIALIZE
|
|
|
|
*> ============================================
|
|
*> STAGE 1: Match FILE-A with FILE-B -> TEMP-FILE
|
|
*> (Original stage 1 logic preserved)
|
|
*> ============================================
|
|
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE1-START
|
|
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
|
|
"] 16-MATCHING: Stage 1 starting..."
|
|
|
|
PERFORM 2100-OPEN-STAGE1-FILES
|
|
|
|
*> Read first records from both files (original)
|
|
READ FILE-A
|
|
AT END SET WS-EOF-A-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-A-READ-COUNT
|
|
MOVE STD-KEY OF A-REC TO WS-KEY-A
|
|
MOVE STD-KEY OF A-REC TO WS-PREV-KEY-A
|
|
END-READ.
|
|
READ FILE-B
|
|
AT END SET WS-EOF-B-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-B-READ-COUNT
|
|
MOVE STD-KEY OF B-REC TO WS-KEY-B
|
|
MOVE STD-KEY OF B-REC TO WS-PREV-KEY-B
|
|
END-READ.
|
|
|
|
*> Stage 1: 1:1 merge/match loop (original algorithm)
|
|
PERFORM UNTIL WS-EOF-A-YES OR WS-EOF-B-YES
|
|
IF WS-KEY-A < WS-KEY-B
|
|
*> A record unmatched, skip it
|
|
ADD 1 TO WS-UNMATCH-A
|
|
PERFORM 5300-WRITE-ERR-UNMATCH-A
|
|
READ FILE-A
|
|
AT END SET WS-EOF-A-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-A-READ-COUNT
|
|
MOVE STD-KEY OF A-REC TO WS-KEY-A
|
|
PERFORM 4200-CHECK-SEQ-A
|
|
MOVE STD-KEY OF A-REC TO WS-PREV-KEY-A
|
|
END-READ
|
|
ELSE IF WS-KEY-A > WS-KEY-B
|
|
*> B record unmatched, skip it
|
|
ADD 1 TO WS-UNMATCH-B
|
|
PERFORM 5400-WRITE-ERR-UNMATCH-B
|
|
READ FILE-B
|
|
AT END SET WS-EOF-B-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-B-READ-COUNT
|
|
MOVE STD-KEY OF B-REC TO WS-KEY-B
|
|
PERFORM 4300-CHECK-SEQ-B
|
|
MOVE STD-KEY OF B-REC TO WS-PREV-KEY-B
|
|
END-READ
|
|
ELSE
|
|
*> Keys equal: match found, write A-side to temp, advance both
|
|
MOVE A-REC TO TEMP-REC
|
|
WRITE TEMP-REC
|
|
ADD 1 TO WS-STAGE1-COUNT
|
|
PERFORM 5110-ACCUMULATE-TEMP
|
|
READ FILE-A
|
|
AT END SET WS-EOF-A-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-A-READ-COUNT
|
|
MOVE STD-KEY OF A-REC TO WS-KEY-A
|
|
PERFORM 4200-CHECK-SEQ-A
|
|
MOVE STD-KEY OF A-REC TO WS-PREV-KEY-A
|
|
END-READ
|
|
READ FILE-B
|
|
AT END SET WS-EOF-B-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-B-READ-COUNT
|
|
MOVE STD-KEY OF B-REC TO WS-KEY-B
|
|
PERFORM 4300-CHECK-SEQ-B
|
|
MOVE STD-KEY OF B-REC TO WS-PREV-KEY-B
|
|
END-READ
|
|
END-IF
|
|
END-PERFORM.
|
|
|
|
*> Drain remaining A records
|
|
PERFORM UNTIL WS-EOF-A-YES
|
|
ADD 1 TO WS-UNMATCH-A
|
|
PERFORM 5300-WRITE-ERR-UNMATCH-A
|
|
READ FILE-A
|
|
AT END SET WS-EOF-A-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-A-READ-COUNT
|
|
MOVE STD-KEY OF A-REC TO WS-KEY-A
|
|
END-READ
|
|
END-PERFORM
|
|
|
|
*> Drain remaining B records
|
|
PERFORM UNTIL WS-EOF-B-YES
|
|
ADD 1 TO WS-UNMATCH-B
|
|
PERFORM 5400-WRITE-ERR-UNMATCH-B
|
|
READ FILE-B
|
|
AT END SET WS-EOF-B-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-B-READ-COUNT
|
|
MOVE STD-KEY OF B-REC TO WS-KEY-B
|
|
END-READ
|
|
END-PERFORM
|
|
|
|
CLOSE FILE-A.
|
|
CLOSE FILE-B.
|
|
CLOSE TEMP-FILE.
|
|
|
|
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE1-END
|
|
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
|
|
"] Stage 1 complete: " WS-STAGE1-COUNT
|
|
" matched records, " WS-UNMATCH-A
|
|
" A-unmatched, " WS-UNMATCH-B " B-unmatched"
|
|
|
|
*> ==================================================
|
|
*> STAGE 2: Match TEMP-FILE with FILE-C -> FINAL-OUT
|
|
*> (Original stage 2 logic preserved)
|
|
*> ==================================================
|
|
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE2-START
|
|
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
|
|
"] 16-MATCHING: Stage 2 starting..."
|
|
|
|
PERFORM 2200-OPEN-STAGE2-FILES
|
|
|
|
*> Read first records
|
|
READ TEMP-FILE
|
|
AT END SET WS-EOF-TEMP-YES TO TRUE
|
|
NOT AT END
|
|
MOVE STD-KEY OF TEMP-REC TO WS-KEY-TEMP
|
|
END-READ.
|
|
READ FILE-C
|
|
AT END SET WS-EOF-C-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-C-READ-COUNT
|
|
MOVE STD-KEY OF C-REC TO WS-KEY-C
|
|
END-READ.
|
|
|
|
*> Stage 2: 1:1 merge/match loop (original algorithm)
|
|
PERFORM UNTIL WS-EOF-TEMP-YES OR WS-EOF-C-YES
|
|
IF WS-KEY-TEMP < WS-KEY-C
|
|
*> Temp record unmatched, skip it
|
|
ADD 1 TO WS-UNMATCH-TEMP
|
|
PERFORM 5500-WRITE-ERR-UNMATCH-TEMP
|
|
READ TEMP-FILE
|
|
AT END SET WS-EOF-TEMP-YES TO TRUE
|
|
NOT AT END
|
|
MOVE STD-KEY OF TEMP-REC TO WS-KEY-TEMP
|
|
END-READ
|
|
ELSE IF WS-KEY-TEMP > WS-KEY-C
|
|
*> C record unmatched, skip it
|
|
ADD 1 TO WS-UNMATCH-C
|
|
PERFORM 5600-WRITE-ERR-UNMATCH-C
|
|
READ FILE-C
|
|
AT END SET WS-EOF-C-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-C-READ-COUNT
|
|
MOVE STD-KEY OF C-REC TO WS-KEY-C
|
|
END-READ
|
|
ELSE
|
|
*> Keys equal: match found, write temp-side to final, advance both
|
|
MOVE TEMP-REC TO FINAL-REC
|
|
WRITE FINAL-REC
|
|
ADD 1 TO WS-STAGE2-COUNT
|
|
PERFORM 5120-ACCUMULATE-FINAL
|
|
READ TEMP-FILE
|
|
AT END SET WS-EOF-TEMP-YES TO TRUE
|
|
NOT AT END
|
|
MOVE STD-KEY OF TEMP-REC TO WS-KEY-TEMP
|
|
END-READ
|
|
READ FILE-C
|
|
AT END SET WS-EOF-C-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-C-READ-COUNT
|
|
MOVE STD-KEY OF C-REC TO WS-KEY-C
|
|
END-READ
|
|
END-IF
|
|
END-PERFORM.
|
|
|
|
*> Drain remaining temp records
|
|
PERFORM UNTIL WS-EOF-TEMP-YES
|
|
ADD 1 TO WS-UNMATCH-TEMP
|
|
PERFORM 5500-WRITE-ERR-UNMATCH-TEMP
|
|
READ TEMP-FILE
|
|
AT END SET WS-EOF-TEMP-YES TO TRUE
|
|
NOT AT END
|
|
MOVE STD-KEY OF TEMP-REC TO WS-KEY-TEMP
|
|
END-READ
|
|
END-PERFORM
|
|
|
|
*> Drain remaining C records
|
|
PERFORM UNTIL WS-EOF-C-YES
|
|
ADD 1 TO WS-UNMATCH-C
|
|
PERFORM 5600-WRITE-ERR-UNMATCH-C
|
|
READ FILE-C
|
|
AT END SET WS-EOF-C-YES TO TRUE
|
|
NOT AT END
|
|
ADD 1 TO WS-C-READ-COUNT
|
|
MOVE STD-KEY OF C-REC TO WS-KEY-C
|
|
END-READ
|
|
END-PERFORM
|
|
|
|
CLOSE TEMP-FILE.
|
|
CLOSE FILE-C.
|
|
CLOSE FINAL-OUT.
|
|
CLOSE FILE-ERR.
|
|
|
|
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE2-END
|
|
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
|
|
"] Stage 2 complete: " WS-STAGE2-COUNT
|
|
" final matched records"
|
|
|
|
*> Write audit and finalize
|
|
PERFORM 7000-AUDIT-TRAIL
|
|
PERFORM 8000-FINALIZE
|
|
|
|
DISPLAY '16-matching-2stage-1-1: PASS'.
|
|
STOP RUN.
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 1000-INITIALIZE
|
|
*> ============================================================
|
|
1000-INITIALIZE.
|
|
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-PROC-DATE
|
|
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-PROC-TIME
|
|
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-TS-DATE
|
|
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-TS-TIME
|
|
|
|
DISPLAY "============================================"
|
|
DISPLAY "16-MATCHING-2STAGE-1-1 2-Stage Invoice Rec"
|
|
DISPLAY "Version V2.00"
|
|
DISPLAY "Run date: " WS-PROC-DATE " " WS-PROC-TIME
|
|
DISPLAY "============================================"
|
|
|
|
INITIALIZE WS-STAGE1-COUNT
|
|
INITIALIZE WS-STAGE2-COUNT
|
|
INITIALIZE WS-A-READ-COUNT
|
|
INITIALIZE WS-B-READ-COUNT
|
|
INITIALIZE WS-C-READ-COUNT
|
|
INITIALIZE WS-UNMATCH-A
|
|
INITIALIZE WS-UNMATCH-B
|
|
INITIALIZE WS-UNMATCH-TEMP
|
|
INITIALIZE WS-UNMATCH-C
|
|
INITIALIZE WS-HASH-TOTALS
|
|
INITIALIZE WS-WARN-COUNT
|
|
INITIALIZE WS-FATAL-COUNT
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 2100-OPEN-STAGE1-FILES
|
|
*> ============================================================
|
|
2100-OPEN-STAGE1-FILES.
|
|
MOVE '2100-OPEN-STAGE1' TO WS-PGM-PHASE
|
|
|
|
OPEN INPUT FILE-A.
|
|
IF WS-A-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot open file-a.dat, status "
|
|
WS-A-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
OPEN INPUT FILE-B.
|
|
IF WS-B-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot open file-b.dat, status "
|
|
WS-B-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
OPEN OUTPUT TEMP-FILE.
|
|
IF WS-TEMP-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot open temp.dat, status "
|
|
WS-TEMP-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
OPEN OUTPUT FILE-ERR.
|
|
IF WS-ERR-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot open error.dat, status "
|
|
WS-ERR-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
PERFORM 7010-WRITE-AUDIT-HEADER
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 2200-OPEN-STAGE2-FILES
|
|
*> ============================================================
|
|
2200-OPEN-STAGE2-FILES.
|
|
MOVE '2200-OPEN-STAGE2' TO WS-PGM-PHASE
|
|
|
|
OPEN INPUT TEMP-FILE.
|
|
IF WS-TEMP-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot reopen temp.dat, status "
|
|
WS-TEMP-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
OPEN INPUT FILE-C.
|
|
IF WS-C-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot open file-c.dat, status "
|
|
WS-C-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
OPEN OUTPUT FINAL-OUT.
|
|
IF WS-FINAL-STATUS NOT = '00'
|
|
STRING "FATAL: Cannot open final.dat, status "
|
|
WS-FINAL-STATUS INTO WS-ERR-MSG
|
|
END-STRING
|
|
PERFORM 6000-FATAL-ERROR
|
|
END-IF.
|
|
|
|
OPEN OUTPUT AUDIT-FILE.
|
|
IF WS-AUDIT-STATUS NOT = '00'
|
|
DISPLAY "WARNING: Cannot open audit-report.txt, "
|
|
"status " WS-AUDIT-STATUS
|
|
ADD 1 TO WS-WARN-COUNT
|
|
END-IF.
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 4200-CHECK-SEQ-A — Check A key sequence
|
|
*> ============================================================
|
|
4200-CHECK-SEQ-A.
|
|
IF STD-KEY OF A-REC < WS-PREV-KEY-A
|
|
ADD 1 TO WS-SEQ-ERR-COUNT
|
|
ADD 1 TO WS-WARN-COUNT
|
|
DISPLAY "WARNING: A-file seq violation: "
|
|
WS-PREV-KEY-A " > " STD-KEY OF A-REC
|
|
END-IF
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 4300-CHECK-SEQ-B — Check B key sequence
|
|
*> ============================================================
|
|
4300-CHECK-SEQ-B.
|
|
IF STD-KEY OF B-REC < WS-PREV-KEY-B
|
|
ADD 1 TO WS-SEQ-ERR-COUNT
|
|
ADD 1 TO WS-WARN-COUNT
|
|
DISPLAY "WARNING: B-file seq violation: "
|
|
WS-PREV-KEY-B " > " STD-KEY OF B-REC
|
|
END-IF
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 5110-ACCUMULATE-TEMP — Accumulate temp hash
|
|
*> ============================================================
|
|
5110-ACCUMULATE-TEMP.
|
|
MOVE STD-DATA-3 OF A-REC TO WS-AMT-A
|
|
ADD WS-AMT-A TO WS-HASH-A-INPUT
|
|
MOVE STD-DATA-3 OF TEMP-REC TO WS-AMT-TEMP
|
|
ADD WS-AMT-TEMP TO WS-HASH-TEMP
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 5120-ACCUMULATE-FINAL — Accumulate final hash
|
|
*> ============================================================
|
|
5120-ACCUMULATE-FINAL.
|
|
MOVE STD-DATA-3 OF FINAL-REC TO WS-AMT-FINAL
|
|
ADD WS-AMT-FINAL TO WS-HASH-FINAL
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 5300-WRITE-ERR-UNMATCH-A
|
|
*> ============================================================
|
|
5300-WRITE-ERR-UNMATCH-A.
|
|
MOVE 'STG1-A-UNM' TO ERR-STAGE
|
|
MOVE STD-KEY OF A-REC TO ERR-KEY
|
|
MOVE STD-DATA-3 OF A-REC TO WS-AMT-A
|
|
MOVE WS-AMT-A TO ERR-AMOUNT
|
|
WRITE ERR-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 5400-WRITE-ERR-UNMATCH-B
|
|
*> ============================================================
|
|
5400-WRITE-ERR-UNMATCH-B.
|
|
MOVE 'STG1-B-UNM' TO ERR-STAGE
|
|
MOVE STD-KEY OF B-REC TO ERR-KEY
|
|
MOVE STD-DATA-3 OF B-REC TO WS-AMT-B
|
|
MOVE WS-AMT-B TO ERR-AMOUNT
|
|
WRITE ERR-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 5500-WRITE-ERR-UNMATCH-TEMP
|
|
*> ============================================================
|
|
5500-WRITE-ERR-UNMATCH-TEMP.
|
|
MOVE 'STG2-TMP-U' TO ERR-STAGE
|
|
MOVE STD-KEY OF TEMP-REC TO ERR-KEY
|
|
MOVE STD-DATA-3 OF TEMP-REC TO WS-AMT-TEMP
|
|
MOVE WS-AMT-TEMP TO ERR-AMOUNT
|
|
WRITE ERR-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 5600-WRITE-ERR-UNMATCH-C
|
|
*> ============================================================
|
|
5600-WRITE-ERR-UNMATCH-C.
|
|
MOVE 'STG2-C-UNM' TO ERR-STAGE
|
|
MOVE STD-KEY OF C-REC TO ERR-KEY
|
|
MOVE STD-DATA-3 OF C-REC TO WS-AMT-C
|
|
MOVE WS-AMT-C TO ERR-AMOUNT
|
|
WRITE ERR-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 6000-FATAL-ERROR
|
|
*> ============================================================
|
|
6000-FATAL-ERROR.
|
|
ADD 1 TO WS-FATAL-COUNT
|
|
DISPLAY "FATAL [" WS-TS-DATE " " WS-TS-TIME "] "
|
|
WS-ERR-MSG
|
|
MOVE 16 TO RETURN-CODE
|
|
STOP RUN
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7000-AUDIT-TRAIL
|
|
*> ============================================================
|
|
7000-AUDIT-TRAIL.
|
|
MOVE '7000-AUDIT-TRAIL' TO WS-PGM-PHASE
|
|
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
|
|
"] 16-MATCHING: Writing audit report..."
|
|
|
|
PERFORM 7020-WRITE-AUDIT-SUMMARY
|
|
PERFORM 7030-WRITE-HASH-DETAIL
|
|
PERFORM 7040-WRITE-STAGE-RECONCIL
|
|
PERFORM 7050-WRITE-TIMING-REPORT
|
|
PERFORM 7060-WRITE-AUDIT-FOOTER
|
|
|
|
CLOSE AUDIT-FILE
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7010-WRITE-AUDIT-HEADER
|
|
*> ============================================================
|
|
7010-WRITE-AUDIT-HEADER.
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "================================================"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "16-MATCHING-2STAGE-1-1 AUDIT REPORT"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "Program Version: V2.00"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "Run Date: " WS-PROC-DATE " Time: " WS-PROC-TIME
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "================================================"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7020-WRITE-AUDIT-SUMMARY
|
|
*> ============================================================
|
|
7020-WRITE-AUDIT-SUMMARY.
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "RECORD COUNT SUMMARY:"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "STAGE 1 (A x B):"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " A-file records read : " WS-A-READ-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " B-file records read : " WS-B-READ-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage1 matched (temp) : " WS-STAGE1-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Unmatched A records : " WS-UNMATCH-A
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Unmatched B records : " WS-UNMATCH-B
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "STAGE 2 (TEMP x C):"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " C-file records read : " WS-C-READ-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage2 matched (final) : " WS-STAGE2-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Unmatched temp records : " WS-UNMATCH-TEMP
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Unmatched C records : " WS-UNMATCH-C
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7030-WRITE-HASH-DETAIL
|
|
*> ============================================================
|
|
7030-WRITE-HASH-DETAIL.
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " "
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "HASH TOTAL RECONCILIATION:"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " A-file input hash : " WS-HASH-A-INPUT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " B-file input hash : " WS-HASH-B-INPUT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Temp hash (s1 match): " WS-HASH-TEMP
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " C-file input hash : " WS-HASH-C-INPUT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Final output hash : " WS-HASH-FINAL
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7040-WRITE-STAGE-RECONCIL — Inter-stage reconciliation
|
|
*> ============================================================
|
|
7040-WRITE-STAGE-RECONCIL.
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " "
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "INTER-STAGE RECONCILIATION:"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage1 temp records : " WS-STAGE1-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage2 final records : " WS-STAGE2-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
IF WS-STAGE1-COUNT = WS-STAGE2-COUNT
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage count: VERIFIED (1:1 pass-through)"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
ELSE
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " ** STAGE COUNT MISMATCH ** S1="
|
|
WS-STAGE1-COUNT " S2=" WS-STAGE2-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
END-IF
|
|
|
|
ADD WS-HASH-FINAL TO WS-HASH-ERR
|
|
GIVING WS-HASH-DIFF
|
|
SUBTRACT WS-HASH-TEMP FROM WS-HASH-DIFF
|
|
IF WS-HASH-DIFF = 0
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage hash: VERIFIED (final+err=temp)"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
ELSE
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " ** STAGE HASH MISMATCH ** Diff: "
|
|
WS-HASH-DIFF INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
END-IF
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7050-WRITE-TIMING-REPORT
|
|
*> ============================================================
|
|
7050-WRITE-TIMING-REPORT.
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " "
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "STAGE TIMING (HHMMSS format):"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage 1 start : " WS-STAGE1-START
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage 1 end : " WS-STAGE1-END
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage 2 start : " WS-STAGE2-START
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Stage 2 end : " WS-STAGE2-END
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " Sequence errors: " WS-SEQ-ERR-COUNT
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 7060-WRITE-AUDIT-FOOTER
|
|
*> ============================================================
|
|
7060-WRITE-AUDIT-FOOTER.
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING " "
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "================================================"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "END OF AUDIT REPORT"
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
|
|
MOVE SPACES TO AUDIT-REC
|
|
STRING "Generated: " WS-PROC-DATE " " WS-PROC-TIME
|
|
INTO AUDIT-REC
|
|
END-STRING
|
|
WRITE AUDIT-REC
|
|
.
|
|
|
|
*> ============================================================
|
|
*> 8000-FINALIZE
|
|
*> ============================================================
|
|
8000-FINALIZE.
|
|
DISPLAY "============================================"
|
|
DISPLAY "16-MATCHING-2STAGE-1-1 Processing Summary"
|
|
DISPLAY "============================================"
|
|
DISPLAY "STAGE 1: A=" WS-A-READ-COUNT
|
|
" B=" WS-B-READ-COUNT
|
|
DISPLAY " Matched=" WS-STAGE1-COUNT
|
|
" Unmatch-A=" WS-UNMATCH-A
|
|
" Unmatch-B=" WS-UNMATCH-B
|
|
DISPLAY "STAGE 2: C=" WS-C-READ-COUNT
|
|
DISPLAY " Matched=" WS-STAGE2-COUNT
|
|
" Unmatch-Temp=" WS-UNMATCH-TEMP
|
|
" Unmatch-C=" WS-UNMATCH-C
|
|
DISPLAY "--------------------------------------------"
|
|
DISPLAY "Sequence violations : " WS-SEQ-ERR-COUNT
|
|
DISPLAY "Warnings : " WS-WARN-COUNT
|
|
DISPLAY "Fatal errors : " WS-FATAL-COUNT
|
|
DISPLAY "Stage 1 count=" WS-STAGE1-COUNT
|
|
" Stage 2 count=" WS-STAGE2-COUNT
|
|
IF WS-STAGE1-COUNT = WS-STAGE2-COUNT
|
|
DISPLAY "Stage counts: VERIFIED"
|
|
ELSE
|
|
DISPLAY "STAGE COUNT MISMATCH!"
|
|
END-IF
|
|
DISPLAY "============================================"
|
|
.
|
|
|
|
END PROGRAM Match2Stage.
|