*> ============================================================ *> caller-nested : 计费子程序嵌套调用 (Nested Subprogram Call) *> Input : WS-VAL-A, WS-VAL-B (传递参数) *> Output: WS-RESULT (嵌套计算结果) *> Coverage: C-N009 *> ============================================================ IDENTIFICATION DIVISION. PROGRAM-ID. CallerNested. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-LEVEL PIC 9(1). 01 WS-VAL-A PIC 9(5). 01 WS-VAL-B PIC 9(5). 01 WS-RESULT PIC 9(10). 01 WS-PASS PIC 9(2) VALUE 0. 01 WS-FAIL PIC 9(2) VALUE 0. PROCEDURE DIVISION. MAIN. DISPLAY "CALLER-NESTED: 3-level CALL test (C-N009)" *> Test: CALLER → SUB-A → SUB-B → SUB-C RETURNING MOVE 1 TO WS-LEVEL. MOVE 10 TO WS-VAL-A. MOVE 20 TO WS-VAL-B. CALL 'SUB-A' USING WS-LEVEL WS-VAL-A WS-VAL-B WS-RESULT. IF WS-RESULT = 100 *> (10+20) + (10+20) + 20 = 100 ADD 1 TO WS-PASS DISPLAY "C-N009: PASS - 3-level result=" WS-RESULT ELSE ADD 1 TO WS-FAIL DISPLAY "C-N009: FAIL - result=" WS-RESULT END-IF. *> Test: CALL with RETURN-CODE from nested MOVE 2 TO WS-LEVEL. MOVE 5 TO WS-VAL-A. MOVE 7 TO WS-VAL-B. CALL 'SUB-A' USING WS-LEVEL WS-VAL-A WS-VAL-B WS-RESULT. IF WS-RESULT = 31 *> (5+7) + (5+7) + 7 = 31 ADD 1 TO WS-PASS DISPLAY "C-N009-2: PASS - nested result=" WS-RESULT ELSE ADD 1 TO WS-FAIL DISPLAY "C-N009-2: FAIL - result=" WS-RESULT END-IF. *> CALL nonexistent program (TC-A051) DISPLAY "TC-A051: CALL non-existent program" CALL 'NOPGM00' USING WS-VAL-A ON EXCEPTION ADD 1 TO WS-PASS DISPLAY "TC-A051: PASS - exception raised" NOT ON EXCEPTION ADD 1 TO WS-FAIL DISPLAY "TC-A051: FAIL - no exception" END-CALL. DISPLAY " " DISPLAY "CALLER-NESTED: PASS=" WS-PASS " FAIL=" WS-FAIL IF WS-FAIL = 0 DISPLAY "CALLER-NESTED: ALL PASSED" STOP RUN RETURNING 0 ELSE DISPLAY "CALLER-NESTED: FAILED" STOP RUN RETURNING 1 END-IF . END PROGRAM CallerNested. IDENTIFICATION DIVISION. PROGRAM-ID. SUB-A. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-RET PIC 9(10). LINKAGE SECTION. 01 LK-LEVEL PIC 9(1). 01 LK-VAL-A PIC 9(5). 01 LK-VAL-B PIC 9(5). 01 LK-RESULT PIC 9(10). PROCEDURE DIVISION USING LK-LEVEL LK-VAL-A LK-VAL-B LK-RESULT. ADD LK-VAL-A TO LK-VAL-B GIVING WS-RET. CALL 'SUB-B' USING LK-LEVEL LK-VAL-A LK-VAL-B WS-RET LK-RESULT. GOBACK. END PROGRAM SUB-A. IDENTIFICATION DIVISION. PROGRAM-ID. SUB-B. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-TEMP PIC 9(10). LINKAGE SECTION. 01 LK-LEVEL PIC 9(1). 01 LK-VAL-A PIC 9(5). 01 LK-VAL-B PIC 9(5). 01 LK-INPUT PIC 9(10). 01 LK-RESULT PIC 9(10). PROCEDURE DIVISION USING LK-LEVEL LK-VAL-A LK-VAL-B LK-INPUT LK-RESULT. COMPUTE WS-TEMP = LK-INPUT + LK-VAL-B. IF LK-LEVEL = 1 COMPUTE LK-RESULT = WS-TEMP ELSE CALL 'SUB-C' USING LK-VAL-A LK-VAL-B WS-TEMP LK-RESULT END-IF. GOBACK. END PROGRAM SUB-B. IDENTIFICATION DIVISION. PROGRAM-ID. SUB-C. DATA DIVISION. LINKAGE SECTION. 01 LK-VAL-A PIC 9(5). 01 LK-VAL-B PIC 9(5). 01 LK-INPUT PIC 9(10). 01 LK-RESULT PIC 9(10). PROCEDURE DIVISION USING LK-VAL-A LK-VAL-B LK-INPUT LK-RESULT. COMPUTE LK-RESULT = LK-INPUT + LK-VAL-B. GOBACK. END PROGRAM SUB-C.