*> main-05-branch-if.cbl : 料金阶梯判定 v2 (IF Rate Determination) *> STANDARD BILLING - Expanded. 8 TIER outputs: *> A(0-60) B(61-300) C(301-900) D(901-1800) E(1801-3600) *> F(3601-7200) G(>7200) ERR(invalid) *> Coverage: B-N001~N005, B-N010, B-R001 IDENTIFICATION DIVISION. PROGRAM-ID. BranchIf. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILE-IN ASSIGN TO "FILE-IN.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-IN. SELECT FILE-OUT-A ASSIGN TO "FILE-OUT-A.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-A. SELECT FILE-OUT-B ASSIGN TO "FILE-OUT-B.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-B. SELECT FILE-OUT-C ASSIGN TO "FILE-OUT-C.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-C. SELECT FILE-OUT-D ASSIGN TO "FILE-OUT-D.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-D. SELECT FILE-OUT-E ASSIGN TO "FILE-OUT-E.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-E. SELECT FILE-OUT-F ASSIGN TO "FILE-OUT-F.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-F. SELECT FILE-OUT-G ASSIGN TO "FILE-OUT-G.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-G. SELECT FILE-OUT-ERR ASSIGN TO "FILE-OUT-ERR.DAT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-OUT-ERR. SELECT FILE-AUDIT ASSIGN TO "audit-report.txt" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS FS-AUDIT. DATA DIVISION. FILE SECTION. FD FILE-IN. 01 FILE-IN-REC. 05 IN-KEY PIC X(10). 05 IN-DATA1 PIC X(20). 05 IN-DATA2 PIC 9(10). FD FILE-OUT-A. 01 FILE-OUT-A-REC. 05 OUT-A-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-A-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-A-DATA2 PIC 9(10). FD FILE-OUT-B. 01 FILE-OUT-B-REC. 05 OUT-B-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-B-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-B-DATA2 PIC 9(10). FD FILE-OUT-C. 01 FILE-OUT-C-REC. 05 OUT-C-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-C-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-C-DATA2 PIC 9(10). FD FILE-OUT-D. 01 FILE-OUT-D-REC. 05 OUT-D-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-D-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-D-DATA2 PIC 9(10). FD FILE-OUT-E. 01 FILE-OUT-E-REC. 05 OUT-E-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-E-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-E-DATA2 PIC 9(10). FD FILE-OUT-F. 01 FILE-OUT-F-REC. 05 OUT-F-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-F-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-F-DATA2 PIC 9(10). FD FILE-OUT-G. 01 FILE-OUT-G-REC. 05 OUT-G-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-G-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-G-DATA2 PIC 9(10). FD FILE-OUT-ERR. 01 FILE-OUT-ERR-REC. 05 OUT-ERR-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 OUT-ERR-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 OUT-ERR-DATA2 PIC 9(10). FD FILE-AUDIT. 01 FILE-AUDIT-REC PIC X(80). WORKING-STORAGE SECTION. 01 WS-TELECOM-REC. COPY "telecom/TEL-BILLING.cpy". 01 FS-IN PIC X(2). 01 FS-OUT-A PIC X(2). 01 FS-OUT-B PIC X(2). 01 FS-OUT-C PIC X(2). 01 FS-OUT-D PIC X(2). 01 FS-OUT-E PIC X(2). 01 FS-OUT-F PIC X(2). 01 FS-OUT-G PIC X(2). 01 FS-OUT-ERR PIC X(2). 01 FS-AUDIT PIC X(2). 01 WS-STATUS. 05 WS-EOF-FLAG PIC X VALUE 'N'. 88 WS-EOF VALUE 'Y' FALSE 'N'. 01 WS-COUNTERS. 05 WS-COUNT-A PIC 9(5) VALUE 0. 05 WS-COUNT-B PIC 9(5) VALUE 0. 05 WS-COUNT-C PIC 9(5) VALUE 0. 01 WS-TIER-COUNTERS. 05 WS-TIER-1-CNT PIC 9(5) VALUE 0. 05 WS-TIER-2-CNT PIC 9(5) VALUE 0. 05 WS-TIER-3-CNT PIC 9(5) VALUE 0. 05 WS-COUNT-D PIC 9(5) VALUE 0. 05 WS-COUNT-E PIC 9(5) VALUE 0. 05 WS-COUNT-F PIC 9(5) VALUE 0. 05 WS-COUNT-G PIC 9(5) VALUE 0. 05 WS-COUNT-ERR PIC 9(5) VALUE 0. 01 WS-HASH-TOTALS. 05 WS-HASH-IN PIC 9(12) VALUE 0. 05 WS-HASH-OUT-A PIC 9(12) VALUE 0. 05 WS-HASH-OUT-B PIC 9(12) VALUE 0. 05 WS-HASH-OUT-C PIC 9(12) VALUE 0. 05 WS-HASH-OUT-D PIC 9(12) VALUE 0. 05 WS-HASH-OUT-E PIC 9(12) VALUE 0. 05 WS-HASH-OUT-F PIC 9(12) VALUE 0. 05 WS-HASH-OUT-G PIC 9(12) VALUE 0. 05 WS-HASH-OUT-ERR PIC 9(12) VALUE 0. 01 WS-BATCH-TOTALS. 05 WS-RECORDS-READ PIC 9(5) VALUE 0. 05 WS-RECORDS-WRITTEN PIC 9(5) VALUE 0. 05 WS-ERROR-COUNT PIC 9(5) VALUE 0. 05 WS-WARN-COUNT PIC 9(5) VALUE 0. 01 WS-DATE-TIME. 05 WS-DATE PIC X(10). 05 WS-TIME PIC X(10). 01 WS-TIMESTAMP PIC X(20). 01 WS-DATA2-NUM PIC 9(10). 01 WS-DISPLAY-LINE. 05 WS-DISP-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 WS-DISP-DATA1 PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 WS-DISP-DATA2 PIC 9(10). 05 FILLER PIC X VALUE SPACE. 05 WS-DISP-BRANCH PIC X(10). 01 WS-TARIFF-RULES. 05 WS-PEAK-FLAG PIC X VALUE 'N'. 88 WS-PEAK VALUE 'Y' FALSE 'N'. 05 WS-WEEKEND-FLAG PIC X VALUE 'N'. 88 WS-WEEKEND VALUE 'Y' FALSE 'N'. 05 WS-ROAM-FLAG PIC X VALUE 'N'. 88 WS-ROAMING VALUE 'Y' FALSE 'N'. 05 WS-RATE-TYPE PIC X(10). 05 WS-CALC-AMT PIC 9(9)V99. 05 WS-MIN-CHARGE PIC 9(5)V99 VALUE 10.00. 05 WS-CAP-AMOUNT PIC 9(9)V99 VALUE 99999.99. 05 WS-FALLBACK-RATE PIC 9(5)V99 VALUE 1.50. 01 WS-AUDIT-LINE. 05 AU-TIMESTAMP PIC X(20). 05 FILLER PIC X VALUE SPACE. 05 AU-TIER PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 AU-KEY PIC X(10). 05 FILLER PIC X VALUE SPACE. 05 AU-AMOUNT PIC Z(9)9. 05 FILLER PIC X VALUE SPACE. 05 AU-STATUS PIC X(10). 01 WS-SEVERITY PIC X(10). 01 WS-ERROR-MSG PIC X(60). PROCEDURE DIVISION. *> ============================================================ *> 1000-INIT-SECTION: Initialize all counters *> ============================================================ 1000-INIT-SECTION. 1000-INIT. MOVE 0 TO WS-COUNT-A WS-COUNT-B WS-COUNT-C MOVE 0 TO WS-TIER-1-CNT WS-TIER-2-CNT WS-TIER-3-CNT MOVE 0 TO WS-COUNT-D WS-COUNT-E WS-COUNT-F MOVE 0 TO WS-COUNT-G WS-COUNT-ERR MOVE 0 TO WS-RECORDS-READ WS-RECORDS-WRITTEN MOVE 0 TO WS-ERROR-COUNT WS-WARN-COUNT MOVE 0 TO WS-HASH-IN WS-HASH-OUT-A WS-HASH-OUT-B MOVE 0 TO WS-HASH-OUT-C WS-HASH-OUT-D WS-HASH-OUT-E MOVE 0 TO WS-HASH-OUT-F WS-HASH-OUT-G WS-HASH-OUT-ERR MOVE 'N' TO WS-EOF-FLAG WS-PEAK-FLAG MOVE 'N' TO WS-WEEKEND-FLAG WS-ROAM-FLAG MOVE FUNCTION CURRENT-DATE (1:10) TO WS-DATE MOVE FUNCTION CURRENT-DATE (12:8) TO WS-TIME STRING WS-DATE ' ' WS-TIME INTO WS-TIMESTAMP DISPLAY 'Timestamp: ' WS-TIMESTAMP DISPLAY '== TELECOM BILLING - BranchIf v2.0 ==' . *> ============================================================ *> 2000-OPEN-FILES-SECTION: Open all files, check status *> ============================================================ 2000-OPEN-FILES-SECTION. 2000-OPEN-FILES. OPEN INPUT FILE-IN IF FS-IN NOT = '00' MOVE 'FATAL' TO WS-SEVERITY STRING 'Open FILE-IN failed FS=' FS-IN INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION STOP RUN END-IF OPEN OUTPUT FILE-OUT-A FILE-OUT-B FILE-OUT-C FILE-OUT-D FILE-OUT-E FILE-OUT-F FILE-OUT-G FILE-OUT-ERR IF FS-OUT-A NOT = '00' OR FS-OUT-B NOT = '00' OR FS-OUT-C NOT = '00' OR FS-OUT-D NOT = '00' OR FS-OUT-E NOT = '00' OR FS-OUT-F NOT = '00' OR FS-OUT-G NOT = '00' OR FS-OUT-ERR NOT = '00' MOVE 'FATAL' TO WS-SEVERITY STRING 'Open output files failed' INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION STOP RUN END-IF OPEN OUTPUT FILE-AUDIT IF FS-AUDIT NOT = '00' DISPLAY '[WARN] Audit open FS=' FS-AUDIT END-IF DISPLAY 'All files opened OK.' . 3000-PROCESS-SECTION. 3000-PROCESS. DISPLAY 'Processing...' PERFORM UNTIL WS-EOF PERFORM 3100-READ-INPUT-SECTION IF NOT WS-EOF PERFORM 3200-VALIDATE-SECTION PERFORM 3300-APPLY-RULES-SECTION END-IF END-PERFORM . 3100-READ-INPUT-SECTION. 3100-READ-INPUT. READ FILE-IN INTO FILE-IN-REC AT END SET WS-EOF TO TRUE NOT AT END ADD 1 TO WS-RECORDS-READ ADD IN-DATA2 TO WS-HASH-IN IF FS-IN NOT = '00' MOVE 'WARNING' TO WS-SEVERITY STRING 'Read FS=' FS-IN INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF END-READ . *> ============================================================ *> 3200-VALIDATE-SECTION: Validate and classify business rules *> ============================================================ 3200-VALIDATE-SECTION. 3200-VALIDATE. MOVE IN-DATA2 TO WS-DATA2-NUM IF IN-DATA1 (1:4) = 'PEAK' MOVE 'Y' TO WS-PEAK-FLAG MOVE 'PEAK' TO WS-RATE-TYPE ELSE IF IN-DATA1 (1:4) = 'OFFP' MOVE 'N' TO WS-PEAK-FLAG MOVE 'OFF-PEAK' TO WS-RATE-TYPE ELSE IF IN-DATA1 (1:4) = 'WKND' MOVE 'Y' TO WS-WEEKEND-FLAG MOVE 'WEEKEND' TO WS-RATE-TYPE ELSE IF IN-DATA1 (1:4) = 'ROAM' MOVE 'Y' TO WS-ROAM-FLAG MOVE 'ROAMING' TO WS-RATE-TYPE ELSE MOVE 'STANDARD' TO WS-RATE-TYPE END-IF END-IF END-IF END-IF . *> ============================================================ *> 3300-APPLY-RULES-SECTION: Calls original PROCESS-RECORD, *> then adds new 8-way tariff tiers and validation checks *> ============================================================ 3300-APPLY-RULES-SECTION. 3300-APPLY-RULES. PERFORM PROCESS-RECORD *> NEW 8-way tariff tier IF/ELSE IF chain IF WS-DATA2-NUM <= 0 MOVE 'ERR' TO WS-DISP-BRANCH DISPLAY ' [TIER-8] Invalid <= 0' ADD 1 TO WS-ERROR-COUNT PERFORM ROUTE-TO-ERR ELSE IF WS-DATA2-NUM <= 60 MOVE 'A' TO WS-DISP-BRANCH DISPLAY ' [TIER-1] Free tier 0-60' PERFORM ROUTE-TO-TIER-A ELSE IF WS-DATA2-NUM <= 300 MOVE 'B' TO WS-DISP-BRANCH DISPLAY ' [TIER-2] Basic 61-300' PERFORM ROUTE-TO-TIER-B ELSE IF WS-DATA2-NUM <= 900 MOVE 'C' TO WS-DISP-BRANCH DISPLAY ' [TIER-3] Standard 301-900' PERFORM ROUTE-TO-TIER-C ELSE IF WS-DATA2-NUM <= 1800 MOVE 'D' TO WS-DISP-BRANCH DISPLAY ' [TIER-4] High vol 901-1800' PERFORM ROUTE-TO-D ELSE IF WS-DATA2-NUM <= 3600 MOVE 'E' TO WS-DISP-BRANCH DISPLAY ' [TIER-5] Premium 1801-3600' PERFORM ROUTE-TO-E ELSE IF WS-DATA2-NUM <= 7200 MOVE 'F' TO WS-DISP-BRANCH DISPLAY ' [TIER-6] Business 3601-7200' PERFORM ROUTE-TO-F ELSE MOVE 'G' TO WS-DISP-BRANCH DISPLAY ' [TIER-7] Enterprise >7200' PERFORM ROUTE-TO-G END-IF *> ELSE IF for 8+ DATA1 prefix check conditions IF IN-DATA1 (1:2) = 'SP' DISPLAY ' [8-WAY] SPECIAL' ELSE IF IN-DATA1 (1:2) = 'HI' DISPLAY ' [8-WAY] HIGH' ELSE IF IN-DATA1 (1:2) = 'LO' DISPLAY ' [8-WAY] LOW' ELSE IF IN-DATA1 (1:2) = 'ME' DISPLAY ' [8-WAY] MEDIUM' ELSE IF IN-DATA1 (1:2) = 'UR' DISPLAY ' [8-WAY] URGENT' ELSE IF IN-DATA1 (1:2) = 'RO' DISPLAY ' [8-WAY] ROAM' ELSE IF IN-DATA1 (1:2) = 'PE' DISPLAY ' [8-WAY] PEAK' ELSE DISPLAY ' [8-WAY] Unmapped' END-IF *> Nested IFs for rate lookup validation IF WS-ROAM-FLAG = 'Y' IF WS-RATE-TYPE = 'ROAMING' MOVE 2.50 TO WS-CALC-AMT DISPLAY ' [RATE] Roaming: 2.50' ELSE MOVE 1.00 TO WS-CALC-AMT DISPLAY ' [RATE] Off-peak roam: 1.00' END-IF ELSE MOVE 0.50 TO WS-CALC-AMT DISPLAY ' [RATE] Standard: 0.50' END-IF *> Minimum charge check IF WS-CALC-AMT < WS-MIN-CHARGE MOVE WS-MIN-CHARGE TO WS-CALC-AMT DISPLAY ' [MIN-CHG] Min applied: ' WS-MIN-CHARGE ADD 1 TO WS-WARN-COUNT END-IF *> Cap check IF WS-CALC-AMT > WS-CAP-AMOUNT MOVE WS-CAP-AMOUNT TO WS-CALC-AMT DISPLAY ' [CAP] Cap applied: ' WS-CAP-AMOUNT ADD 1 TO WS-WARN-COUNT END-IF *> Fallback default rate for unmapped IF WS-CALC-AMT = 0 MOVE WS-FALLBACK-RATE TO WS-CALC-AMT DISPLAY ' [FALLBACK] Default rate' END-IF *> Error logging for unmapped cases IF WS-DISP-BRANCH = 'ERR' MOVE 'ERROR' TO WS-SEVERITY STRING 'Unmapped duration ' WS-DATA2-NUM INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF . *> ============================================================ *> 3400-WRITE-OUTPUT-SECTION: Output routing (via ROUTE sections) *> ============================================================ 3400-WRITE-OUTPUT-SECTION. 3400-WRITE-OUTPUT. CONTINUE. . *> ============================================================ *> 4000-REPORT-SECTION: Summary display *> ============================================================ 4000-REPORT-SECTION. 4000-REPORT. DISPLAY ' ' DISPLAY '=== RESULTS ===' DISPLAY 'A (1-60): ' WS-COUNT-A '+' WS-TIER-1-CNT DISPLAY 'B (61-300): ' WS-COUNT-B '+' WS-TIER-2-CNT DISPLAY 'C (301-900): ' WS-COUNT-C '+' WS-TIER-3-CNT DISPLAY 'D (TIER-4 901-1800): ' WS-COUNT-D DISPLAY 'E (TIER-5 1801-3600): ' WS-COUNT-E DISPLAY 'F (TIER-6 3601-7200): ' WS-COUNT-F DISPLAY 'G (TIER-7 >7200): ' WS-COUNT-G DISPLAY 'ERR (Invalid): ' WS-COUNT-ERR DISPLAY 'Batch: Read=' WS-RECORDS-READ ' Written=' WS-RECORDS-WRITTEN ' Err=' WS-ERROR-COUNT ' Warn=' WS-WARN-COUNT DISPLAY 'Hash: IN=' WS-HASH-IN ' A=' WS-HASH-OUT-A ' B=' WS-HASH-OUT-B ' C=' WS-HASH-OUT-C DISPLAY 'Hash: D=' WS-HASH-OUT-D ' E=' WS-HASH-OUT-E ' F=' WS-HASH-OUT-F ' G=' WS-HASH-OUT-G ' ERR=' WS-HASH-OUT-ERR . *> ============================================================ *> 5000-AUDIT-SECTION: Audit log to audit-report.txt *> ============================================================ 5000-AUDIT-SECTION. AUDIT-START. MOVE WS-TIMESTAMP TO AU-TIMESTAMP MOVE 'START' TO AU-TIER MOVE 'PROGRAM' TO AU-KEY MOVE 0 TO AU-AMOUNT MOVE 'OK' TO AU-STATUS WRITE FILE-AUDIT-REC FROM WS-AUDIT-LINE IF FS-AUDIT NOT = '00' DISPLAY '[WARN] Audit write FS=' FS-AUDIT END-IF . AUDIT-FINISH. MOVE WS-TIMESTAMP TO AU-TIMESTAMP MOVE 'END' TO AU-TIER MOVE 'PROGRAM' TO AU-KEY MOVE WS-RECORDS-READ TO AU-AMOUNT STRING 'REC=' WS-RECORDS-READ ' ERR=' WS-ERROR-COUNT INTO AU-STATUS WRITE FILE-AUDIT-REC FROM WS-AUDIT-LINE IF FS-AUDIT NOT = '00' DISPLAY '[WARN] Audit write FS=' FS-AUDIT END-IF . *> ============================================================ *> 6000-ERROR-HANDLE-SECTION: Handle errors by severity *> ============================================================ 6000-ERROR-HANDLE-SECTION. 6000-ERROR-HANDLE. DISPLAY '[' WS-TIMESTAMP '] [' WS-SEVERITY '] ' WS-ERROR-MSG IF WS-SEVERITY = 'FATAL' PERFORM 9000-EXIT-SECTION STOP RUN ELSE IF WS-SEVERITY = 'ERROR' ADD 1 TO WS-ERROR-COUNT ELSE IF WS-SEVERITY = 'WARNING' ADD 1 TO WS-WARN-COUNT END-IF END-IF END-IF . *> ============================================================ *> 9000-EXIT-SECTION: Close files and terminate *> ============================================================ 9000-EXIT-SECTION. 9000-EXIT. MOVE FUNCTION CURRENT-DATE (1:10) TO WS-DATE MOVE FUNCTION CURRENT-DATE (12:8) TO WS-TIME STRING WS-DATE ' ' WS-TIME INTO WS-TIMESTAMP PERFORM 4000-REPORT-SECTION PERFORM 5000-AUDIT-SECTION THRU AUDIT-FINISH CLOSE FILE-IN FILE-OUT-A FILE-OUT-B FILE-OUT-C FILE-OUT-D FILE-OUT-E FILE-OUT-F FILE-OUT-G FILE-OUT-ERR FILE-AUDIT DISPLAY '[' WS-TIMESTAMP '] BranchIf COMPLETED' . *> ============================================================ *> MAIN SECTION (enhanced entry point) *> ============================================================ MAIN SECTION. MAIN-PROCEDURE. PERFORM 1000-INIT-SECTION PERFORM 2000-OPEN-FILES-SECTION PERFORM 5000-AUDIT-SECTION THRU AUDIT-START PERFORM 3000-PROCESS-SECTION PERFORM 9000-EXIT-SECTION STOP RUN. *> ============================================================ *> ORIGINAL PROCESS-RECORD SECTION (PRESERVED AS-IS) *> ============================================================ PROCESS-RECORD SECTION. * PROCESS-RECORD-PROC. MOVE IN-DATA2 TO WS-DATA2-NUM IF WS-DATA2-NUM < 1000 MOVE "A" TO WS-DISP-BRANCH PERFORM ROUTE-TO-A ELSE IF WS-DATA2-NUM <= 5000 MOVE "B" TO WS-DISP-BRANCH PERFORM ROUTE-TO-B ELSE MOVE "C" TO WS-DISP-BRANCH PERFORM ROUTE-TO-C END-IF END-IF MOVE IN-KEY TO WS-DISP-KEY MOVE IN-DATA1 TO WS-DISP-DATA1 MOVE IN-DATA2 TO WS-DISP-DATA2 DISPLAY " -> " WS-DISP-KEY " / " WS-DISP-DATA1 " / " WS-DISP-DATA2 " => FILE-OUT-" WS-DISP-BRANCH IF IN-DATA1 (1:7) = 'SPECIAL' DISPLAY " [2-way ELSE] DATA1 starts with SPECIAL" ELSE DISPLAY " [2-way ELSE] DATA1 not start with SPECIAL" END-IF IF IN-KEY = 'A' DISPLAY " [88-LEVEL] Key is A (88-level name)" END-IF IF (WS-DATA2-NUM < 500 OR WS-DATA2-NUM > 9000) AND WS-DATA2-NUM NOT = 0 DISPLAY " [AND/OR] Compound condition met" END-IF IF WS-DATA2-NUM > 100 IF WS-DATA2-NUM < 9000 IF IN-KEY (1:1) = 'A' DISPLAY " [NESTED] 3-level: DATA2(100,9000)" END-IF END-IF END-IF . *> ============================================================ *> ORIGINAL ROUTE-TO-A (PRESERVED AS-IS) *> ============================================================ ROUTE-TO-A SECTION. ROUTE-TO-A-PROC. MOVE IN-KEY TO OUT-A-KEY MOVE IN-DATA1 TO OUT-A-DATA1 MOVE IN-DATA2 TO OUT-A-DATA2 WRITE FILE-OUT-A-REC ADD 1 TO WS-COUNT-A . *> ============================================================ *> ORIGINAL ROUTE-TO-B (PRESERVED AS-IS) *> ============================================================ ROUTE-TO-B SECTION. ROUTE-TO-B-PROC. MOVE IN-KEY TO OUT-B-KEY MOVE IN-DATA1 TO OUT-B-DATA1 MOVE IN-DATA2 TO OUT-B-DATA2 WRITE FILE-OUT-B-REC ADD 1 TO WS-COUNT-B . *> ============================================================ *> ORIGINAL ROUTE-TO-C (PRESERVED AS-IS) *> ============================================================ ROUTE-TO-C SECTION. ROUTE-TO-C-PROC. MOVE IN-KEY TO OUT-C-KEY MOVE IN-DATA1 TO OUT-C-DATA1 MOVE IN-DATA2 TO OUT-C-DATA2 WRITE FILE-OUT-C-REC ADD 1 TO WS-COUNT-C . *> ============================================================ *> NEW ROUTE-TO-TIER-A (TIER-1 0-60s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-TIER-A SECTION. ROUTE-TO-TIER-A-PROC. MOVE IN-KEY TO OUT-A-KEY MOVE IN-DATA1 TO OUT-A-DATA1 MOVE IN-DATA2 TO OUT-A-DATA2 WRITE FILE-OUT-A-REC IF FS-OUT-A NOT = '00' MOVE 'ERROR' TO WS-SEVERITY STRING 'Write A FS=' FS-OUT-A INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-TIER-1-CNT ADD WS-DATA2-NUM TO WS-HASH-OUT-A ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-TIER-B (TIER-2 61-300s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-TIER-B SECTION. ROUTE-TO-TIER-B-PROC. MOVE IN-KEY TO OUT-B-KEY MOVE IN-DATA1 TO OUT-B-DATA1 MOVE IN-DATA2 TO OUT-B-DATA2 WRITE FILE-OUT-B-REC IF FS-OUT-B NOT = '00' MOVE 'ERROR' TO WS-SEVERITY STRING 'Write B FS=' FS-OUT-B INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-TIER-2-CNT ADD WS-DATA2-NUM TO WS-HASH-OUT-B ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-TIER-C (TIER-3 301-900s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-TIER-C SECTION. ROUTE-TO-TIER-C-PROC. MOVE IN-KEY TO OUT-C-KEY MOVE IN-DATA1 TO OUT-C-DATA1 MOVE IN-DATA2 TO OUT-C-DATA2 WRITE FILE-OUT-C-REC IF FS-OUT-C NOT = '00' MOVE 'ERROR' TO WS-SEVERITY STRING 'Write C FS=' FS-OUT-C INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-TIER-3-CNT ADD WS-DATA2-NUM TO WS-HASH-OUT-C ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-D (TIER-4 901-1800s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-D SECTION. ROUTE-TO-D-PROC. MOVE IN-KEY TO OUT-D-KEY MOVE IN-DATA1 TO OUT-D-DATA1 MOVE IN-DATA2 TO OUT-D-DATA2 WRITE FILE-OUT-D-REC IF FS-OUT-D NOT = '00' MOVE 'FATAL' TO WS-SEVERITY STRING 'Write D FS=' FS-OUT-D INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-COUNT-D ADD WS-DATA2-NUM TO WS-HASH-OUT-D ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-E (TIER-5 1801-3600s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-E SECTION. ROUTE-TO-E-PROC. MOVE IN-KEY TO OUT-E-KEY MOVE IN-DATA1 TO OUT-E-DATA1 MOVE IN-DATA2 TO OUT-E-DATA2 WRITE FILE-OUT-E-REC IF FS-OUT-E NOT = '00' MOVE 'FATAL' TO WS-SEVERITY STRING 'Write E FS=' FS-OUT-E INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-COUNT-E ADD WS-DATA2-NUM TO WS-HASH-OUT-E ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-F (TIER-6 3601-7200s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-F SECTION. ROUTE-TO-F-PROC. MOVE IN-KEY TO OUT-F-KEY MOVE IN-DATA1 TO OUT-F-DATA1 MOVE IN-DATA2 TO OUT-F-DATA2 WRITE FILE-OUT-F-REC IF FS-OUT-F NOT = '00' MOVE 'FATAL' TO WS-SEVERITY STRING 'Write F FS=' FS-OUT-F INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-COUNT-F ADD WS-DATA2-NUM TO WS-HASH-OUT-F ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-G (TIER-7 >7200s, FILE STATUS + hash) *> ============================================================ ROUTE-TO-G SECTION. ROUTE-TO-G-PROC. MOVE IN-KEY TO OUT-G-KEY MOVE IN-DATA1 TO OUT-G-DATA1 MOVE IN-DATA2 TO OUT-G-DATA2 WRITE FILE-OUT-G-REC IF FS-OUT-G NOT = '00' MOVE 'FATAL' TO WS-SEVERITY STRING 'Write G FS=' FS-OUT-G INTO WS-ERROR-MSG PERFORM 6000-ERROR-HANDLE-SECTION END-IF ADD 1 TO WS-COUNT-G ADD WS-DATA2-NUM TO WS-HASH-OUT-G ADD 1 TO WS-RECORDS-WRITTEN . *> ============================================================ *> NEW ROUTE-TO-ERR (TIER-8 invalid, FILE STATUS + hash) *> ============================================================ ROUTE-TO-ERR SECTION. ROUTE-TO-ERR-PROC. MOVE IN-KEY TO OUT-ERR-KEY MOVE IN-DATA1 TO OUT-ERR-DATA1 MOVE IN-DATA2 TO OUT-ERR-DATA2 WRITE FILE-OUT-ERR-REC IF FS-OUT-ERR NOT = '00' DISPLAY '[ERROR] Write ERR FS=' FS-OUT-ERR END-IF ADD 1 TO WS-COUNT-ERR ADD WS-DATA2-NUM TO WS-HASH-OUT-ERR ADD 1 TO WS-RECORDS-WRITTEN .