feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,700 @@
|
||||
*> 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
|
||||
.
|
||||
Reference in New Issue
Block a user