Files
cobol-java-v3/benchmark-programs/17-matching-2stage-N-1/main-17-matching-2stage-N-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

962 lines
34 KiB
COBOL

*> ============================================================
*> 17-matching-2stage-N-1 : 线路→请求书二级 (2-Stage Line→Bill)
*> Input : FILE-MASTER (master.dat: N条线路), FILE-DETAIL (detail.dat: 请求书)
*> FILE-FINAL (final-ref.dat: 对照请求书)
*> Output: FINAL-OUT (final.dat: 二级集计结果)
*> error.dat (未匹配记录)
*> audit-report.txt (审计报告: 处理统计)
*> Coverage: AM-N002, AM-A001, AM-R001
*> stage-level control totals, inter-stage reconciliation,
*> stage timing measurement, N:1 accumulation validation
*> ============================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. Matching2StageN1.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE-MASTER ASSIGN TO "master.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-MASTER-STATUS.
SELECT FILE-DETAIL ASSIGN TO "detail.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-DETAIL-STATUS.
SELECT TEMP-FILE ASSIGN TO "temp.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-TEMP-STATUS.
SELECT FILE-FINAL ASSIGN TO "final-ref.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-FINAL-REF-STATUS.
SELECT FINAL-OUT ASSIGN TO "final.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-FINAL-OUT-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-MASTER.
01 MASTER-REC.
COPY "STD-REC.cpy".
FD FILE-DETAIL.
01 DETAIL-REC.
COPY "STD-REC.cpy".
FD TEMP-FILE.
01 TEMP-REC.
COPY "STD-REC.cpy".
FD FILE-FINAL.
01 FINAL-REF-REC.
COPY "STD-REC.cpy".
FD FINAL-OUT.
01 OUT-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-GROUP PIC X(10).
05 ERR-FILLER PIC X(40).
FD AUDIT-FILE.
01 AUDIT-REC PIC X(120).
WORKING-STORAGE SECTION.
01 WS-TELECOM-REC.
COPY "telecom/TEL-BILLING.cpy".
*> File status fields
01 WS-MASTER-STATUS PIC X(02).
01 WS-DETAIL-STATUS PIC X(02).
01 WS-TEMP-STATUS PIC X(02).
01 WS-FINAL-REF-STATUS PIC X(02).
01 WS-FINAL-OUT-STATUS PIC X(02).
01 WS-ERR-STATUS PIC X(02).
01 WS-AUDIT-STATUS PIC X(02).
*> EOF and status flags
01 WS-FLAGS.
05 WS-MASTER-EOF PIC X VALUE 'N'.
88 WS-MASTER-END VALUE 'Y' FALSE 'N'.
05 WS-DETAIL-EOF PIC X VALUE 'N'.
88 WS-DETAIL-END VALUE 'Y' FALSE 'N'.
05 WS-TEMP-EOF PIC X VALUE 'N'.
88 WS-TEMP-END VALUE 'Y' FALSE 'N'.
05 WS-FINAL-EOF PIC X VALUE 'N'.
88 WS-FINAL-END VALUE 'Y' FALSE 'N'.
*> Key areas
01 WS-KEYS.
05 WS-MASTER-KEY PIC X(10).
05 WS-DETAIL-KEY PIC X(10).
05 WS-TEMP-KEY PIC X(10).
05 WS-FINAL-KEY PIC X(10).
05 WS-GROUP-KEY PIC X(10).
05 WS-PREV-MAST-KEY PIC X(10).
*> Counter accumulators
01 WS-COUNTERS.
05 WS-STAGE1-CNT PIC 9(05) VALUE 0.
05 WS-STAGE2-CNT PIC 9(05) VALUE 0.
05 WS-MAST-READ-CNT PIC 9(05) VALUE 0.
05 WS-DETL-READ-CNT PIC 9(05) VALUE 0.
05 WS-TEMP-READ-CNT PIC 9(05) VALUE 0.
05 WS-FINAL-READ-CNT PIC 9(05) VALUE 0.
05 WS-UNMATCH-MAST PIC 9(05) VALUE 0.
05 WS-UNMATCH-DETL PIC 9(05) VALUE 0.
05 WS-UNMATCH-TEMP PIC 9(05) VALUE 0.
05 WS-UNMATCH-FINAL PIC 9(05) VALUE 0.
05 WS-WARN-COUNT PIC 9(05) VALUE 0.
05 WS-FATAL-COUNT PIC 9(05) VALUE 0.
05 WS-SEQ-ERR-COUNT PIC 9(05) VALUE 0.
05 WS-MAST-GROUP-CNT PIC 9(05) VALUE 0.
05 WS-TEMP-GROUP-CNT PIC 9(05) VALUE 0.
*> Hash totals for batch control
01 WS-HASH-TOTALS.
05 WS-HASH-MAST-IN PIC 9(15) VALUE 0.
05 WS-HASH-DETL-IN PIC 9(15) VALUE 0.
05 WS-HASH-TEMP-OUT PIC 9(15) VALUE 0.
05 WS-HASH-FINAL-REF-IN PIC 9(15) VALUE 0.
05 WS-HASH-FINAL-OUT PIC 9(15) VALUE 0.
05 WS-HASH-ERR PIC 9(15) VALUE 0.
05 WS-HASH-DIFF PIC S9(15) VALUE 0.
*> 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).
*> 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-MAST PIC 9(10).
01 WS-AMT-DETL PIC 9(10).
01 WS-AMT-TEMP PIC 9(10).
01 WS-AMT-FINAL PIC 9(10).
*> Group accumulation validation
01 WS-GROUP-ACCUM.
05 WS-GROUP-MAST-CNT PIC 9(05) VALUE 0.
05 WS-GROUP-MAST-HASH PIC 9(15) VALUE 0.
05 WS-GROUP-TEMP-CNT PIC 9(05) VALUE 0.
05 WS-GROUP-TEMP-HASH PIC 9(15) VALUE 0.
*> 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.
MB-PROCESS.
PERFORM 1000-INITIALIZE
*> ============================================
*> STAGE 1: N:1 matching
*> FILE-MASTER x FILE-DETAIL -> TEMP-FILE
*> (Original algorithm preserved)
*> ============================================
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE1-START
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
"] 17-MATCHING: Stage 1 N:1 starting..."
PERFORM 2100-OPEN-STAGE1-FILES
PERFORM 3100-READ-MASTER
PERFORM 3200-READ-DETAIL
PERFORM UNTIL WS-MASTER-END OR WS-DETAIL-END
MOVE WS-MASTER-KEY TO WS-GROUP-KEY
ADD 1 TO WS-MAST-GROUP-CNT
IF WS-MASTER-KEY = WS-DETAIL-KEY
*> Match found - write ALL master records in group to temp
PERFORM 3400-WRITE-MASTER-GROUP
PERFORM 3200-READ-DETAIL
ELSE IF WS-MASTER-KEY < WS-DETAIL-KEY
*> Master group has no matching detail - skip it
PERFORM 3500-SKIP-MASTER-GROUP
ELSE
*> Detail key ahead of master - skip unmatched detail
ADD 1 TO WS-UNMATCH-DETL
PERFORM 5400-WRITE-ERR-DETL-UNMATCH
PERFORM 3200-READ-DETAIL
END-IF
END-PERFORM.
*> Drain remaining masters and details
PERFORM UNTIL WS-MASTER-END
ADD 1 TO WS-UNMATCH-MAST
PERFORM 5300-WRITE-ERR-MAST-UNMATCH
PERFORM 3100-READ-MASTER
END-PERFORM
PERFORM UNTIL WS-DETAIL-END
ADD 1 TO WS-UNMATCH-DETL
PERFORM 5400-WRITE-ERR-DETL-UNMATCH
PERFORM 3200-READ-DETAIL
END-PERFORM
CLOSE FILE-MASTER FILE-DETAIL TEMP-FILE.
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE1-END
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
"] Stage 1 complete: " WS-STAGE1-CNT
" temp records, " WS-UNMATCH-MAST " master-unm, "
WS-UNMATCH-DETL " detail-unm"
*> ============================================
*> STAGE 2: N:1 matching
*> TEMP-FILE x FILE-FINAL -> FINAL-OUT
*> (Original algorithm preserved)
*> ============================================
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE2-START
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
"] 17-MATCHING: Stage 2 N:1 starting..."
PERFORM 2200-OPEN-STAGE2-FILES
PERFORM 3600-READ-TEMP
PERFORM 3700-READ-FINAL
PERFORM UNTIL WS-TEMP-END OR WS-FINAL-END
MOVE WS-TEMP-KEY TO WS-GROUP-KEY
ADD 1 TO WS-TEMP-GROUP-CNT
IF WS-TEMP-KEY = WS-FINAL-KEY
*> Match found - write ALL temp records in group to final
PERFORM 3800-WRITE-TEMP-GROUP
PERFORM 3700-READ-FINAL
ELSE IF WS-TEMP-KEY < WS-FINAL-KEY
*> Temp group has no matching final - skip it
PERFORM 3900-SKIP-TEMP-GROUP
ELSE
*> Final key ahead - skip unmatched final
ADD 1 TO WS-UNMATCH-FINAL
PERFORM 5600-WRITE-ERR-FINAL-UNMATCH
PERFORM 3700-READ-FINAL
END-IF
END-PERFORM.
*> Drain remaining temp and final records
PERFORM UNTIL WS-TEMP-END
ADD 1 TO WS-UNMATCH-TEMP
PERFORM 5500-WRITE-ERR-TEMP-UNMATCH
PERFORM 3600-READ-TEMP
END-PERFORM
PERFORM UNTIL WS-FINAL-END
ADD 1 TO WS-UNMATCH-FINAL
PERFORM 5600-WRITE-ERR-FINAL-UNMATCH
PERFORM 3700-READ-FINAL
END-PERFORM
CLOSE TEMP-FILE FILE-FINAL FINAL-OUT FILE-ERR.
MOVE FUNCTION CURRENT-DATE (9:8) TO WS-STAGE2-END
DISPLAY "[" WS-TS-DATE " " WS-TS-TIME
"] Stage 2 complete: " WS-STAGE2-CNT
" final records"
*> Write audit and finalize
PERFORM 7000-AUDIT-TRAIL
PERFORM 8000-FINALIZE
DISPLAY "17-matching-2stage-N-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 "17-MATCHING-2STAGE-N-1 2-Stage Line-to-Bill"
DISPLAY "Version V2.00"
DISPLAY "Run date: " WS-PROC-DATE " " WS-PROC-TIME
DISPLAY "============================================"
INITIALIZE WS-COUNTERS
INITIALIZE WS-HASH-TOTALS
INITIALIZE WS-GROUP-ACCUM
.
*> ============================================================
*> 2100-OPEN-STAGE1-FILES
*> ============================================================
2100-OPEN-STAGE1-FILES.
MOVE '2100-OPEN-STAGE1' TO WS-PGM-PHASE
OPEN INPUT FILE-MASTER
IF WS-MASTER-STATUS NOT = '00'
STRING "FATAL: Cannot open master.dat, status "
WS-MASTER-STATUS INTO WS-ERR-MSG
END-STRING
PERFORM 6000-FATAL-ERROR
END-IF
OPEN INPUT FILE-DETAIL
IF WS-DETAIL-STATUS NOT = '00'
STRING "FATAL: Cannot open detail.dat, status "
WS-DETAIL-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-FINAL
IF WS-FINAL-REF-STATUS NOT = '00'
STRING "FATAL: Cannot open final-ref.dat, status "
WS-FINAL-REF-STATUS INTO WS-ERR-MSG
END-STRING
PERFORM 6000-FATAL-ERROR
END-IF
OPEN OUTPUT FINAL-OUT
IF WS-FINAL-OUT-STATUS NOT = '00'
STRING "FATAL: Cannot open final.dat, status "
WS-FINAL-OUT-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
.
*> ============================================================
*> 3100-READ-MASTER — Read master with status (original helper)
*> ============================================================
3100-READ-MASTER.
READ FILE-MASTER
AT END MOVE 'Y' TO WS-MASTER-EOF
NOT AT END
ADD 1 TO WS-MAST-READ-CNT
MOVE STD-KEY OF MASTER-REC TO WS-MASTER-KEY
PERFORM 4000-VALIDATE-MASTER
PERFORM 4100-CHECK-MAST-SEQ
MOVE STD-KEY OF MASTER-REC TO WS-PREV-MAST-KEY
END-READ
.
*> ============================================================
*> 3200-READ-DETAIL — Read detail (original helper)
*> ============================================================
3200-READ-DETAIL.
READ FILE-DETAIL
AT END MOVE 'Y' TO WS-DETAIL-EOF
NOT AT END
ADD 1 TO WS-DETL-READ-CNT
MOVE STD-KEY OF DETAIL-REC TO WS-DETAIL-KEY
PERFORM 4200-VALIDATE-DETAIL
END-READ
.
*> ============================================================
*> 3400-WRITE-MASTER-GROUP — Write matched master group (original)
*> ============================================================
3400-WRITE-MASTER-GROUP.
MOVE ZERO TO WS-GROUP-MAST-CNT
MOVE ZERO TO WS-GROUP-MAST-HASH
PERFORM UNTIL WS-MASTER-END
OR WS-MASTER-KEY NOT = WS-GROUP-KEY
MOVE MASTER-REC TO TEMP-REC
WRITE TEMP-REC
ADD 1 TO WS-STAGE1-CNT
ADD 1 TO WS-GROUP-MAST-CNT
MOVE STD-DATA-3 OF MASTER-REC TO WS-AMT-MAST
ADD WS-AMT-MAST TO WS-HASH-TEMP-OUT
ADD WS-AMT-MAST TO WS-GROUP-MAST-HASH
PERFORM 3100-READ-MASTER
END-PERFORM
*> Validate N:1 group accumulation
IF WS-GROUP-MAST-CNT > 1
ADD 1 TO WS-MAST-GROUP-CNT
END-IF
.
*> ============================================================
*> 3500-SKIP-MASTER-GROUP — Skip unmatched master group (original)
*> ============================================================
3500-SKIP-MASTER-GROUP.
PERFORM UNTIL WS-MASTER-END
OR WS-MASTER-KEY NOT = WS-GROUP-KEY
ADD 1 TO WS-UNMATCH-MAST
PERFORM 5300-WRITE-ERR-MAST-UNMATCH
PERFORM 3100-READ-MASTER
END-PERFORM
.
*> ============================================================
*> 3600-READ-TEMP — Read temp (original helper)
*> ============================================================
3600-READ-TEMP.
READ TEMP-FILE
AT END MOVE 'Y' TO WS-TEMP-EOF
NOT AT END
ADD 1 TO WS-TEMP-READ-CNT
MOVE STD-KEY OF TEMP-REC TO WS-TEMP-KEY
END-READ
.
*> ============================================================
*> 3700-READ-FINAL — Read final-ref (original helper)
*> ============================================================
3700-READ-FINAL.
READ FILE-FINAL
AT END MOVE 'Y' TO WS-FINAL-EOF
NOT AT END
ADD 1 TO WS-FINAL-READ-CNT
MOVE STD-KEY OF FINAL-REF-REC TO WS-FINAL-KEY
END-READ
.
*> ============================================================
*> 3800-WRITE-TEMP-GROUP — Write temp group to final (original)
*> ============================================================
3800-WRITE-TEMP-GROUP.
MOVE ZERO TO WS-GROUP-TEMP-CNT
MOVE ZERO TO WS-GROUP-TEMP-HASH
PERFORM UNTIL WS-TEMP-END
OR WS-TEMP-KEY NOT = WS-GROUP-KEY
MOVE TEMP-REC TO OUT-REC
WRITE OUT-REC
ADD 1 TO WS-STAGE2-CNT
ADD 1 TO WS-GROUP-TEMP-CNT
MOVE STD-DATA-3 OF TEMP-REC TO WS-AMT-TEMP
ADD WS-AMT-TEMP TO WS-HASH-FINAL-OUT
ADD WS-AMT-TEMP TO WS-GROUP-TEMP-HASH
PERFORM 3600-READ-TEMP
END-PERFORM
*> Validate N:1 group accumulation
IF WS-GROUP-TEMP-CNT > 1
ADD 1 TO WS-TEMP-GROUP-CNT
END-IF
.
*> ============================================================
*> 3900-SKIP-TEMP-GROUP — Skip temp group (original)
*> ============================================================
3900-SKIP-TEMP-GROUP.
PERFORM UNTIL WS-TEMP-END
OR WS-TEMP-KEY NOT = WS-GROUP-KEY
ADD 1 TO WS-UNMATCH-TEMP
PERFORM 5500-WRITE-ERR-TEMP-UNMATCH
PERFORM 3600-READ-TEMP
END-PERFORM
.
*> ============================================================
*> 4000-VALIDATE-MASTER — Validate master record
*> ============================================================
4000-VALIDATE-MASTER.
*> Accumulate input hash total
MOVE STD-DATA-3 OF MASTER-REC TO WS-AMT-MAST
ADD WS-AMT-MAST TO WS-HASH-MAST-IN
.
*> ============================================================
*> 4100-CHECK-MAST-SEQ — Check master sequence
*> ============================================================
4100-CHECK-MAST-SEQ.
IF STD-KEY OF MASTER-REC < WS-PREV-MAST-KEY
ADD 1 TO WS-SEQ-ERR-COUNT
ADD 1 TO WS-WARN-COUNT
DISPLAY "WARNING: Master seq violation: "
WS-PREV-MAST-KEY " > " STD-KEY OF MASTER-REC
END-IF
.
*> ============================================================
*> 4200-VALIDATE-DETAIL — Validate detail record
*> ============================================================
4200-VALIDATE-DETAIL.
*> Accumulate input hash total
MOVE STD-DATA-3 OF DETAIL-REC TO WS-AMT-DETL
ADD WS-AMT-DETL TO WS-HASH-DETL-IN
.
*> ============================================================
*> 5300-WRITE-ERR-MAST-UNMATCH
*> ============================================================
5300-WRITE-ERR-MAST-UNMATCH.
MOVE 'STG1-MAST' TO ERR-STAGE
MOVE STD-KEY OF MASTER-REC TO ERR-KEY
MOVE STD-DATA-3 OF MASTER-REC TO WS-AMT-MAST
MOVE WS-AMT-MAST TO ERR-AMOUNT
MOVE WS-GROUP-KEY TO ERR-GROUP
WRITE ERR-REC
.
*> ============================================================
*> 5400-WRITE-ERR-DETL-UNMATCH
*> ============================================================
5400-WRITE-ERR-DETL-UNMATCH.
MOVE 'STG1-DETL' TO ERR-STAGE
MOVE STD-KEY OF DETAIL-REC TO ERR-KEY
MOVE STD-DATA-3 OF DETAIL-REC TO WS-AMT-DETL
MOVE WS-AMT-DETL TO ERR-AMOUNT
MOVE STD-KEY OF DETAIL-REC TO ERR-GROUP
WRITE ERR-REC
.
*> ============================================================
*> 5500-WRITE-ERR-TEMP-UNMATCH
*> ============================================================
5500-WRITE-ERR-TEMP-UNMATCH.
MOVE 'STG2-TEMP' 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
MOVE WS-GROUP-KEY TO ERR-GROUP
WRITE ERR-REC
.
*> ============================================================
*> 5600-WRITE-ERR-FINAL-UNMATCH
*> ============================================================
5600-WRITE-ERR-FINAL-UNMATCH.
MOVE 'STG2-FINAL' TO ERR-STAGE
MOVE STD-KEY OF FINAL-REF-REC TO ERR-KEY
MOVE STD-DATA-3 OF FINAL-REF-REC TO WS-AMT-FINAL
MOVE WS-AMT-FINAL TO ERR-AMOUNT
MOVE STD-KEY OF FINAL-REF-REC TO ERR-GROUP
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
"] 17-MATCHING: Writing audit report..."
PERFORM 7020-WRITE-AUDIT-SUMMARY
PERFORM 7030-WRITE-HASH-DETAIL
PERFORM 7040-WRITE-STAGE-RECONCIL
PERFORM 7050-WRITE-TIMING
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 "17-MATCHING-2STAGE-N-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 (N:1 Master x Detail -> Temp):"
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Master records read : " WS-MAST-READ-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Detail records read : " WS-DETL-READ-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Temp records written : " WS-STAGE1-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Unmatched master : " WS-UNMATCH-MAST
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Unmatched detail : " WS-UNMATCH-DETL
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING "STAGE 2 (N:1 Temp x FinalRef -> Final):"
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Temp records read : " WS-TEMP-READ-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Final-ref records read: " WS-FINAL-READ-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Final records written : " WS-STAGE2-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Unmatched temp : " WS-UNMATCH-TEMP
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Unmatched final-ref : " WS-UNMATCH-FINAL
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Master groups (N>1) : " WS-MAST-GROUP-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Temp groups (N>1) : " WS-TEMP-GROUP-CNT
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 " Stage1 master input : " WS-HASH-MAST-IN
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Stage1 temp output : " WS-HASH-TEMP-OUT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Stage2 final output : " WS-HASH-FINAL-OUT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Error hash : " WS-HASH-ERR
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
ADD WS-HASH-TEMP-OUT TO WS-HASH-ERR
GIVING WS-HASH-DIFF
SUBTRACT WS-HASH-MAST-IN FROM WS-HASH-DIFF
IF WS-HASH-DIFF = 0
MOVE SPACES TO AUDIT-REC
STRING " Stage1 hash: VERIFIED (temp+err=master)"
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
ELSE
MOVE SPACES TO AUDIT-REC
STRING " ** S1 HASH MISMATCH ** Diff: "
WS-HASH-DIFF INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
END-IF
.
*> ============================================================
*> 7040-WRITE-STAGE-RECONCIL
*> ============================================================
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 (N:1 pass-through):"
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Stage1 temp recs : " WS-STAGE1-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
MOVE SPACES TO AUDIT-REC
STRING " Stage2 final recs: " WS-STAGE2-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
IF WS-STAGE1-CNT = WS-STAGE2-CNT
MOVE SPACES TO AUDIT-REC
STRING " Stage count: VERIFIED (N:1 pass-through)"
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
ELSE
MOVE SPACES TO AUDIT-REC
STRING " ** STAGE COUNT MISMATCH ** S1="
WS-STAGE1-CNT " S2=" WS-STAGE2-CNT
INTO AUDIT-REC
END-STRING
WRITE AUDIT-REC
END-IF
ADD WS-HASH-FINAL-OUT TO WS-HASH-ERR
GIVING WS-HASH-DIFF
SUBTRACT WS-HASH-TEMP-OUT 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
*> ============================================================
7050-WRITE-TIMING.
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 errs: " 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 "17-MATCHING-2STAGE-N-1 Processing Summary"
DISPLAY "============================================"
DISPLAY "STAGE 1: Master=" WS-MAST-READ-CNT
" Detail=" WS-DETL-READ-CNT
DISPLAY " Temp records=" WS-STAGE1-CNT
" Unmatched M=" WS-UNMATCH-MAST
" Unmatched D=" WS-UNMATCH-DETL
DISPLAY "STAGE 2: Temp=" WS-TEMP-READ-CNT
" Final-Ref=" WS-FINAL-READ-CNT
DISPLAY " Final records=" WS-STAGE2-CNT
" Unmatched T=" WS-UNMATCH-TEMP
" Unmatched F=" WS-UNMATCH-FINAL
DISPLAY "--------------------------------------------"
DISPLAY "Master groups (N>1) : " WS-MAST-GROUP-CNT
DISPLAY "Temp groups (N>1) : " WS-TEMP-GROUP-CNT
DISPLAY "Seq violations : " WS-SEQ-ERR-COUNT
DISPLAY "Warnings : " WS-WARN-COUNT
DISPLAY "Fatal errors : " WS-FATAL-COUNT
DISPLAY "Stage1 cnt=" WS-STAGE1-CNT
" Stage2 cnt=" WS-STAGE2-CNT
IF WS-STAGE1-CNT = WS-STAGE2-CNT
DISPLAY "Stage counts: VERIFIED (N:1 pass-through)"
ELSE
DISPLAY "STAGE COUNT MISMATCH!"
END-IF
DISPLAY "============================================"
.
END PROGRAM Matching2StageN1.