94400d50d4
作为子目录纳入系统,与核心测试管道协同 Co-Authored-By: Claude <noreply@anthropic.com>
962 lines
34 KiB
COBOL
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.
|