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