*> ============================================================ *> 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.