*> ============================================================ *> main-validation-withdup : 重复CDR检测 (Duplicate CDR) *> Input : FILE-IN (INPUT.DAT: 排序済KEY付CDR) *> Output: FILE-PASS (PASS.DAT: 非重複) *> Coverage: VF-N003, VF-N004, VF-R001 *> ============================================================ IDENTIFICATION DIVISION. PROGRAM-ID. VALIDATE-DUP. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILE-IN ASSIGN TO "INPUT.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS WS-FS. SELECT FILE-PASS ASSIGN TO "PASS.DAT" ORGANIZATION IS SEQUENTIAL. SELECT FILE-ERR ASSIGN TO "ERR.DAT" ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD FILE-IN RECORD CONTAINS 40 CHARACTERS. 01 IN-REC. 05 IN-KEY PIC X(10). 05 IN-VALUE PIC 9(10). 05 IN-DATA PIC X(20). FD FILE-PASS RECORD CONTAINS 40 CHARACTERS. 01 PASS-REC PIC X(40). FD FILE-ERR RECORD CONTAINS 60 CHARACTERS. 01 ERR-REC. 05 ERR-KEY PIC X(10). 05 ERR-VALUE PIC 9(10). 05 ERR-MSG PIC X(40). WORKING-STORAGE SECTION. 01 WS-FS PIC X(2). 01 WS-EOF PIC X(1) VALUE 'N'. 88 WS-EOF-Y VALUE 'Y' FALSE 'N'. 01 WS-PREV-KEY PIC X(10). 01 WS-FIRST PIC X(1) VALUE 'Y'. 88 WS-FIRST-Y VALUE 'Y' FALSE 'N'. 01 WS-READ-COUNT PIC 9(10). 01 WS-PASS-COUNT PIC 9(10). 01 WS-DUP-COUNT PIC 9(10). 01 WS-TELECOM-REC. COPY "telecom/TEL-BILLING.cpy". PROCEDURE DIVISION. MAIN. DISPLAY "VALIDATE-DUP: Starting validation with dup detection" OPEN INPUT FILE-IN. IF WS-FS NOT = "00" DISPLAY "OPEN FAIL: " WS-FS STOP RUN RETURNING 1 END-IF. OPEN OUTPUT FILE-PASS FILE-ERR. PERFORM UNTIL WS-EOF-Y READ FILE-IN INTO IN-REC AT END SET WS-EOF-Y TO TRUE NOT AT END ADD 1 TO WS-READ-COUNT IF WS-FIRST-Y MOVE IN-KEY TO WS-PREV-KEY MOVE 'N' TO WS-FIRST PERFORM WRITE-PASS ELSE IF IN-KEY = WS-PREV-KEY PERFORM WRITE-DUP ELSE MOVE IN-KEY TO WS-PREV-KEY PERFORM WRITE-PASS END-IF END-IF END-READ END-PERFORM. CLOSE FILE-IN FILE-PASS FILE-ERR. DISPLAY "VALIDATE-DUP: READ=" WS-READ-COUNT " PASS=" WS-PASS-COUNT " DUP=" WS-DUP-COUNT IF WS-READ-COUNT = WS-PASS-COUNT + WS-DUP-COUNT DISPLAY "VALIDATE-DUP: PASS (R001 count match)" STOP RUN RETURNING 0 ELSE DISPLAY "VALIDATE-DUP: FAIL - count mismatch" STOP RUN RETURNING 1 END-IF . WRITE-PASS. ADD 1 TO WS-PASS-COUNT. MOVE IN-REC TO PASS-REC. WRITE PASS-REC. DISPLAY "PASS: " IN-KEY " (first occurrence)" . WRITE-DUP. ADD 1 TO WS-DUP-COUNT. MOVE IN-KEY TO ERR-KEY. MOVE IN-VALUE TO ERR-VALUE. STRING "DUPLICATE KEY DETECTED - previous key was " WS-PREV-KEY DELIMITED BY SIZE INTO ERR-MSG END-STRING. WRITE ERR-REC. DISPLAY "DUP: " IN-KEY " (duplicate, rejected)" . END PROGRAM VALIDATE-DUP.