Files
cobol-java-v3/benchmark-programs/16-matching-2stage-1-1/main-16-matching-2stage-1-1.cbl
T
NB-076 94400d50d4 feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 09:53:21 +08:00

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.