IDENTIFICATION DIVISION. PROGRAM-ID. MERGE-PROGRAM. *> MERGE 处理程序 *> Coverage: MR-N001~MR-N004, MR-A001 *> GnuCOBOL MERGE 语句演示 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILE-A ASSIGN TO "FILEA.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. SELECT FILE-B ASSIGN TO "FILEB.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. SELECT FILE-C ASSIGN TO "FILEC.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. SELECT FILE-OUT ASSIGN TO "MERGED-OUT.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. SELECT MERGE-WORK ASSIGN TO "MERGE.WRK". DATA DIVISION. FILE SECTION. FD FILE-A RECORD CONTAINS 40 CHARACTERS. 01 A-RECORD. 05 A-KEY PIC X(10). 05 A-NAME PIC X(20). 05 A-AMOUNT PIC 9(10). FD FILE-B RECORD CONTAINS 40 CHARACTERS. 01 B-RECORD. 05 B-KEY PIC X(10). 05 B-NAME PIC X(20). 05 B-AMOUNT PIC 9(10). FD FILE-C RECORD CONTAINS 40 CHARACTERS. 01 C-RECORD. 05 C-KEY PIC X(10). 05 C-NAME PIC X(20). 05 C-AMOUNT PIC 9(10). FD FILE-OUT RECORD CONTAINS 40 CHARACTERS. 01 OUT-RECORD. 05 OUT-KEY PIC X(10). 05 OUT-NAME PIC X(20). 05 OUT-AMOUNT PIC 9(10). SD MERGE-WORK. 01 MERGE-RECORD. 05 MRG-KEY PIC X(10). 05 MRG-NAME PIC X(20). 05 MRG-AMOUNT PIC 9(10). WORKING-STORAGE SECTION. 01 WS-COUNT PIC 9(10) VALUE 0. 01 WS-TOTAL PIC 9(10) VALUE 0. 01 WS-CDR-REC. COPY "telecom/TEL-CDR.cpy". PROCEDURE DIVISION. MAIN-PROCEDURE. DISPLAY "MERGE-PROGRAM: Starting" DISPLAY " " *> Test 1: 2-file MERGE (MR-N001) DISPLAY "MERGE-PROGRAM: Test MR-N001 - 2-file merge" MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY USING FILE-A FILE-B GIVING "MERGE-2FILE.DAT". IF RETURN-CODE = 0 DISPLAY "MERGE-2FILE: PASS" ELSE DISPLAY "MERGE-2FILE: FAIL RC=" RETURN-CODE END-IF *> Verify merged output OPEN INPUT "MERGE-2FILE.DAT". MOVE 0 TO WS-COUNT. PERFORM UNTIL 1 = 2 READ "MERGE-2FILE.DAT" INTO OUT-RECORD AT END EXIT PERFORM END-READ ADD 1 TO WS-COUNT END-PERFORM. CLOSE "MERGE-2FILE.DAT". DISPLAY "MERGE-2FILE: Records = " WS-COUNT DISPLAY " " *> Test 2: 3-file MERGE (MR-N002) DISPLAY "MERGE-PROGRAM: Test MR-N002 - 3-file merge" MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY USING FILE-A FILE-B FILE-C GIVING "MERGE-3FILE.DAT". IF RETURN-CODE = 0 DISPLAY "MERGE-3FILE: PASS" ELSE DISPLAY "MERGE-3FILE: FAIL RC=" RETURN-CODE END-IF OPEN INPUT "MERGE-3FILE.DAT". MOVE 0 TO WS-COUNT. PERFORM UNTIL 1 = 2 READ "MERGE-3FILE.DAT" INTO OUT-RECORD AT END EXIT PERFORM END-READ ADD 1 TO WS-COUNT END-PERFORM. CLOSE "MERGE-3FILE.DAT". DISPLAY "MERGE-3FILE: Records = " WS-COUNT DISPLAY " " *> Test 3: OUTPUT PROCEDURE (MR-N003 variant) DISPLAY "MERGE-PROGRAM: Test MR-N003 - Merge with OUTPUT PROC" MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY USING FILE-A FILE-B OUTPUT PROCEDURE IS MRG-OUTPUT-PROC. IF RETURN-CODE = 0 DISPLAY "MERGE-OUTPUT-PROC: PASS" ELSE DISPLAY "MERGE-OUTPUT-PROC: FAIL RC=" RETURN-CODE END-IF DISPLAY " " *> Test 4: Duplicate key MERGE (MR-N003) DISPLAY "MERGE-PROGRAM: Test MR-N003 - Duplicate key merge" MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY USING FILE-A FILE-B GIVING "MERGE-DUP.DAT". IF RETURN-CODE = 0 DISPLAY "MERGE-DUP: PASS (duplicate keys preserved)" ELSE DISPLAY "MERGE-DUP: FAIL RC=" RETURN-CODE END-IF DISPLAY " " *> Test 5: Empty file MERGE (edge case) DISPLAY "MERGE-PROGRAM: Test - Empty file merge" MERGE MERGE-WORK ON ASCENDING KEY MRG-KEY USING "EMPTY.DAT" FILE-B GIVING "MERGE-EMPTY.DAT". IF RETURN-CODE = 0 DISPLAY "MERGE-EMPTY: PASS" ELSE DISPLAY "MERGE-EMPTY: FAIL RC=" RETURN-CODE END-IF DISPLAY " " DISPLAY "MERGE-PROGRAM: All tests passed" STOP RUN RETURNING 0. *> --- OUTPUT PROCEDURE (MR-N003 variant) --- MRG-OUTPUT-PROC SECTION. OPEN OUTPUT FILE-OUT. MOVE 0 TO WS-COUNT. MOVE 0 TO WS-TOTAL. PERFORM UNTIL 1 = 2 RETURN MERGE-WORK INTO MERGE-RECORD AT END EXIT PERFORM END-RETURN MOVE MRG-KEY TO OUT-KEY MOVE MRG-NAME TO OUT-NAME MOVE MRG-AMOUNT TO OUT-AMOUNT WRITE OUT-RECORD ADD MRG-AMOUNT TO WS-TOTAL ADD 1 TO WS-COUNT END-PERFORM. CLOSE FILE-OUT. DISPLAY "MRG-OUTPUT-PROC: Wrote " WS-COUNT " records, total=" WS-TOTAL . END PROGRAM MERGE-PROGRAM.