feat: add benchmark-programs — 58 telecom COBOL test programs

作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
NB-076
2026-06-25 09:53:21 +08:00
parent 50f9f0f52f
commit 94400d50d4
278 changed files with 44125 additions and 0 deletions
@@ -0,0 +1,844 @@
>>SOURCE FORMAT IS FREE
*> ============================================================
*> 28-sysin : SYSIN批量参数 (Batch SYSIN)
*> Input : SYSIN (PARAM=VALUE形式の参数卡片)
*> Output: REPORT-FILE (sysin-report.txt: 参数设定结果)
*> AUDIT-FILE (sysin-audit.dat: 参数审计报告)
*> Coverage: SY-N001~N003, SY-A001~A003, SY-R001
*> Extensions: SECTION structure, dependency validation, bounds
*> checking, error accumulation, override detection, audit,
*> parameter loading report, default logging with status,
*> batch control totals, FILE STATUS per I/O, timestamp trace
*> ============================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. Main28Sysin.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SYSIN-FILE ASSIGN TO "SYSIN"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS SYSIN-STATUS.
SELECT REPORT-FILE ASSIGN TO "sysin-report.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-RPT-STATUS.
SELECT AUDIT-FILE ASSIGN TO "sysin-audit.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-AUDIT-STATUS.
DATA DIVISION.
FILE SECTION.
FD SYSIN-FILE.
01 SYSIN-RECORD PIC X(80).
FD REPORT-FILE.
01 REPORT-LINE PIC X(80).
FD AUDIT-FILE.
01 AUDIT-LINE PIC X(80).
WORKING-STORAGE SECTION.
*> Copybook
01 WS-TELECOM-REC.
COPY "telecom/TEL-BILLING.cpy".
*> File status
01 SYSIN-STATUS PIC XX.
88 SYSIN-EOF VALUE "10".
01 WS-RPT-STATUS PIC XX.
01 WS-AUDIT-STATUS PIC XX.
*> Timestamp
01 WS-CUR-DATE PIC X(08).
01 WS-CUR-TIME PIC X(06).
01 WS-TIMESTAMP PIC X(20).
*> Parameter defaults
01 WS-PARAMS.
05 WS-SORT-KEY PIC X(10) VALUE "ASC".
05 WS-OUTPUT-FMT PIC X(10) VALUE "SUMMARY".
05 WS-MAX-RECORDS PIC 9(05) VALUE 50.
05 WS-REPORT-TYPE PIC X(10) VALUE "STANDARD".
05 WS-VERBOSE PIC X(01) VALUE "N".
05 WS-DEBUG-MODE PIC X(01) VALUE "N".
*> Batch control totals
01 WS-CARD-COUNT PIC 9(05) VALUE 0.
01 WS-ERROR-COUNT PIC 9(05) VALUE 0.
01 WS-WARN-COUNT PIC 9(05) VALUE 0.
01 WS-OVERRIDE-COUNT PIC 9(05) VALUE 0.
01 WS-PARAM-SET-CNT PIC 9(05) VALUE 0.
01 WS-DEFAULT-APP-CNT PIC 9(05) VALUE 0.
01 WS-SKIPPED-COUNT PIC 9(05) VALUE 0.
*> Override / set flags
01 WS-SORT-KEY-SET PIC X(01) VALUE 'N'.
01 WS-OUTPUT-FMT-SET PIC X(01) VALUE 'N'.
01 WS-MAX-REC-SET PIC X(01) VALUE 'N'.
01 WS-RPT-TYPE-SET PIC X(01) VALUE 'N'.
01 WS-VERBOSE-SET PIC X(01) VALUE 'N'.
01 WS-DEBUG-SET PIC X(01) VALUE 'N'.
*> Card buffer and parse area
01 WS-CARD-BUFFER.
05 WS-CARD-TEXT PIC X(80).
05 WS-CARD-LEN PIC 9(02).
01 WS-PARSE-AREA.
05 WS-EQUALS-POS PIC 9(02).
05 WS-PARAM-NAME PIC X(20).
05 WS-PARAM-VALUE PIC X(40).
01 WS-PARAM-TRIM PIC X(20).
*> Per-card validation result
01 WS-VALID-OK PIC X(01).
01 WS-VALID-STATUS PIC X(15).
*> Error accumulation table
01 WS-ERROR-MAX PIC 9(03) VALUE 100.
01 WS-ERROR-TABLE.
05 WS-ERR-ENTRY OCCURS 100 TIMES.
10 WS-ERR-TEXT PIC X(60).
01 WS-ERR-IDX PIC 9(03) VALUE 0.
*> Report lines
01 WS-PARAM-LINE.
05 FILLER PIC X(10) VALUE " ".
05 PL-NAME PIC X(20).
05 FILLER PIC X(03) VALUE " = ".
05 PL-VALUE PIC X(40).
05 FILLER PIC X(10) VALUE SPACES.
05 PL-STATUS PIC X(10).
01 WS-LOADING-LINE.
05 FILLER PIC X(02) VALUE " ".
05 WS-LL-CARD PIC Z(04)9.
05 FILLER PIC X(02) VALUE ": ".
05 WS-LL-NAME PIC X(20).
05 FILLER PIC X(03) VALUE " = ".
05 WS-LL-VALUE PIC X(40).
05 FILLER PIC X(02) VALUE " ".
05 WS-LL-STATUS PIC X(15).
*> Working fields
01 WS-TEMP-LINE PIC X(80).
01 WS-RPT-COUNT PIC Z(9)9.
01 IDX PIC 9(02).
01 WS-CHAR PIC X(01).
01 WS-NUM-VAL PIC 9(05).
*> ============================================================
PROCEDURE DIVISION.
MAIN.
PERFORM 1000-INIT
PERFORM 2000-OPEN-FILES
PERFORM 3000-READ-INPUT
PERFORM 4000-REPORT
PERFORM 5000-AUDIT
PERFORM 9000-EXIT
STOP RUN.
*> ============================================================
*> 1000-INIT — initialise state, log defaults
*> ============================================================
1000-INIT SECTION.
1000-START.
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME
DELIMITED BY SIZE INTO WS-TIMESTAMP
DISPLAY '*** Main28Sysin START at ' WS-TIMESTAMP
DISPLAY '[' WS-TIMESTAMP '] Defaults: SORT-KEY='
WS-SORT-KEY ', OUTPUT-FMT=' WS-OUTPUT-FMT
', MAX-RECORDS=' WS-MAX-RECORDS
DISPLAY ' REPORT-TYPE=' WS-REPORT-TYPE
', VERBOSE=' WS-VERBOSE ', DEBUG-MODE=' WS-DEBUG-MODE
MOVE 6 TO WS-DEFAULT-APP-CNT
EXIT.
*> ============================================================
*> 2000-OPEN-FILES — open files, write headers, check status
*> ============================================================
2000-OPEN-FILES SECTION.
2000-START.
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME INTO WS-TIMESTAMP
DISPLAY '[' WS-TIMESTAMP '] Opening files'
*> REPORT-FILE
OPEN OUTPUT REPORT-FILE
IF WS-RPT-STATUS NOT = "00"
DISPLAY '[' WS-TIMESTAMP
'] FATAL: REPORT-FILE open status='
WS-RPT-STATUS
MOVE 1 TO RETURN-CODE STOP RUN
END-IF
DISPLAY '[' WS-TIMESTAMP '] REPORT-FILE opened, status='
WS-RPT-STATUS
MOVE "SYSIN Parameter Test Report" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WR ERR ' WS-RPT-STATUS
END-IF
MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WR ERR ' WS-RPT-STATUS
END-IF
*> AUDIT-FILE
OPEN OUTPUT AUDIT-FILE
IF WS-AUDIT-STATUS NOT = "00"
DISPLAY '[' WS-TIMESTAMP
'] FATAL: AUDIT-FILE open status='
WS-AUDIT-STATUS
MOVE 1 TO RETURN-CODE STOP RUN
END-IF
DISPLAY '[' WS-TIMESTAMP '] AUDIT-FILE opened, status='
WS-AUDIT-STATUS
MOVE 'SYSIN Audit Report' TO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00"
DISPLAY 'AUD WR ERR ' WS-AUDIT-STATUS
END-IF
STRING 'Run: ' WS-TIMESTAMP INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00"
DISPLAY 'AUD WR ERR ' WS-AUDIT-STATUS
END-IF
MOVE SPACES TO AUDIT-LINE WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00"
DISPLAY 'AUD WR ERR ' WS-AUDIT-STATUS
END-IF
*> SYSIN-FILE
OPEN INPUT SYSIN-FILE
IF SYSIN-STATUS NOT = "00"
DISPLAY '[' WS-TIMESTAMP
'] SYSIN open failed, status=' SYSIN-STATUS
MOVE " SYSIN open failed - using defaults"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WR ERR ' WS-RPT-STATUS
END-IF
STRING 'OPEN FAILED status=' SYSIN-STATUS
INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00"
DISPLAY 'AUD WR ERR ' WS-AUDIT-STATUS
END-IF
ELSE
DISPLAY '[' WS-TIMESTAMP
'] SYSIN opened successfully'
END-IF
EXIT.
*> ============================================================
*> 3000-READ-INPUT — read SYSIN cards, call validate/process
*> ============================================================
3000-READ-INPUT SECTION.
3000-START.
IF SYSIN-STATUS NOT = "00" EXIT SECTION END-IF
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME INTO WS-TIMESTAMP
*> Write loading report header
MOVE "=== Parameter Loading Report ===" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WR ERR ' WS-RPT-STATUS
END-IF
MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WR ERR ' WS-RPT-STATUS
END-IF
*> Read loop
PERFORM UNTIL SYSIN-EOF
READ SYSIN-FILE INTO SYSIN-RECORD
AT END SET SYSIN-EOF TO TRUE
NOT AT END
ADD 1 TO WS-CARD-COUNT
MOVE SYSIN-RECORD TO WS-CARD-TEXT
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME
INTO WS-TIMESTAMP
DISPLAY '[' WS-TIMESTAMP '] Card '
WS-CARD-COUNT ': '
FUNCTION TRIM(WS-CARD-TEXT)
PERFORM 3100-VALIDATE-RECORD
IF WS-VALID-OK = 'Y'
PERFORM 3200-PROCESS-RECORD
END-IF
PERFORM 3300-WRITE-OUTPUT
END-READ
IF SYSIN-STATUS NOT = "00" AND NOT = "10"
DISPLAY '[' WS-TIMESTAMP
'] READ ERROR: SYSIN status='
SYSIN-STATUS
END-IF
END-PERFORM
DISPLAY '[' WS-TIMESTAMP
'] Total cards read: ' WS-CARD-COUNT
CLOSE SYSIN-FILE
IF SYSIN-STATUS NOT = "00" AND NOT = "10"
DISPLAY '[' WS-TIMESTAMP
'] CLOSE SYSIN status=' SYSIN-STATUS
END-IF
EXIT.
*> ============================================================
*> 3100-VALIDATE-RECORD — parse card, bounds, dependencies
*> ============================================================
3100-VALIDATE-RECORD SECTION.
3100-START.
MOVE 'Y' TO WS-VALID-OK
MOVE 'ACCEPTED' TO WS-VALID-STATUS
MOVE FUNCTION TRIM(WS-CARD-TEXT) TO WS-CARD-BUFFER
*> Skip empty / comment
IF WS-CARD-BUFFER = SPACES OR WS-CARD-BUFFER = ""
DISPLAY " (empty line, skipped)"
ADD 1 TO WS-SKIPPED-COUNT
MOVE 'N' TO WS-VALID-OK MOVE 'SKIPPED' TO WS-VALID-STATUS
EXIT SECTION
END-IF
MOVE WS-CARD-BUFFER(1:1) TO WS-CHAR
IF WS-CHAR = "*" OR WS-CHAR = "#"
DISPLAY " (comment, skipped)"
ADD 1 TO WS-SKIPPED-COUNT
MOVE 'N' TO WS-VALID-OK MOVE 'SKIPPED' TO WS-VALID-STATUS
EXIT SECTION
END-IF
*> Find '='
MOVE 0 TO WS-EQUALS-POS
PERFORM VARYING IDX FROM 1 BY 1
UNTIL IDX > 80 OR WS-EQUALS-POS > 0
IF WS-CARD-BUFFER(IDX:1) = "="
MOVE IDX TO WS-EQUALS-POS
END-IF
END-PERFORM
IF WS-EQUALS-POS = 0
DISPLAY " ERROR: No '=' found in card"
ADD 1 TO WS-ERROR-COUNT
MOVE " ERROR (no '='): " TO WS-TEMP-LINE
STRING WS-TEMP-LINE FUNCTION TRIM(WS-CARD-BUFFER)
DELIMITED BY SIZE INTO WS-TEMP-LINE
MOVE WS-TEMP-LINE TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WR ERR ' WS-RPT-STATUS
END-IF
MOVE 'N' TO WS-VALID-OK MOVE 'ERROR' TO WS-VALID-STATUS
PERFORM 6000-ERROR-HANDLE
EXIT SECTION
END-IF
*> Extract NAME, VALUE
MOVE WS-CARD-BUFFER(1:WS-EQUALS-POS - 1) TO WS-PARAM-NAME
COMPUTE IDX = WS-EQUALS-POS + 1
MOVE WS-CARD-BUFFER(IDX:) TO WS-PARAM-VALUE
MOVE FUNCTION UPPER-CASE(
FUNCTION TRIM(WS-PARAM-NAME)) TO WS-PARAM-NAME
MOVE FUNCTION TRIM(WS-PARAM-VALUE) TO WS-PARAM-VALUE
DISPLAY " NAME='" FUNCTION TRIM(WS-PARAM-NAME)
"' VALUE='" FUNCTION TRIM(WS-PARAM-VALUE)"'"
*> Bounds checking
EVALUATE WS-PARAM-NAME
WHEN "SORT-KEY"
IF WS-PARAM-VALUE NOT = "ASC" AND
WS-PARAM-VALUE NOT = "DESC"
ADD 1 TO WS-ERROR-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'SORT-KEY invalid, must be ASC or DESC'
TO WS-TEMP-LINE
MOVE " ERROR: SORT-KEY must be ASC or DESC"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
WHEN "OUTPUT-FMT"
IF WS-PARAM-VALUE NOT = "SUMMARY" AND
WS-PARAM-VALUE NOT = "DETAIL" AND
WS-PARAM-VALUE NOT = "RAW"
ADD 1 TO WS-ERROR-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'OUTPUT-FMT invalid, must be SUMMARY, DETAIL, or RAW' TO WS-TEMP-LINE
MOVE " ERROR: OUTPUT-FMT must be SUMMARY, DETAIL, or RAW" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
WHEN "MAX-RECORDS"
MOVE WS-PARAM-VALUE TO WS-NUM-VAL
IF WS-NUM-VAL < 1 OR WS-NUM-VAL > 99999
ADD 1 TO WS-ERROR-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'REJECTED' TO WS-VALID-STATUS
STRING 'MAX-RECORDS out of range (1-99999): '
FUNCTION TRIM(WS-PARAM-VALUE)
INTO WS-TEMP-LINE
MOVE " ERROR: MAX-RECORDS range 1-99999"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
WHEN "REPORT-TYPE"
IF WS-PARAM-VALUE NOT = "STANDARD" AND
WS-PARAM-VALUE NOT = "CUSTOM" AND
WS-PARAM-VALUE NOT = "BRIEF"
ADD 1 TO WS-ERROR-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'REPORT-TYPE invalid, must be STANDARD, CUSTOM, or BRIEF' TO WS-TEMP-LINE
MOVE " ERROR: REPORT-TYPE must be STANDARD, CUSTOM, or BRIEF" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
WHEN "VERBOSE"
IF WS-PARAM-VALUE NOT = "Y" AND
WS-PARAM-VALUE NOT = "N"
ADD 1 TO WS-ERROR-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'VERBOSE must be Y or N'
TO WS-TEMP-LINE
MOVE " ERROR: VERBOSE must be Y or N"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
WHEN "DEBUG-MODE"
IF WS-PARAM-VALUE NOT = "Y" AND
WS-PARAM-VALUE NOT = "N"
ADD 1 TO WS-ERROR-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'DEBUG-MODE must be Y or N'
TO WS-TEMP-LINE
MOVE " ERROR: DEBUG-MODE must be Y or N"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
WHEN OTHER
ADD 1 TO WS-WARN-COUNT
MOVE 'N' TO WS-VALID-OK
MOVE 'WARNING' TO WS-VALID-STATUS
STRING 'Unknown parameter: '
FUNCTION TRIM(WS-PARAM-NAME)
INTO WS-TEMP-LINE
MOVE " WARNING: Unknown parameter" TO REPORT-LINE
STRING REPORT-LINE ' '
FUNCTION TRIM(WS-PARAM-NAME) INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
PERFORM 6000-ERROR-HANDLE
END-EVALUATE.
*> Dependency validation
IF WS-PARAM-NAME = "OUTPUT-FMT"
AND WS-PARAM-VALUE = "DETAIL"
AND WS-REPORT-TYPE = "SUMMARY"
ADD 1 TO WS-WARN-COUNT
MOVE 'N' TO WS-VALID-OK MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'Dependency: OUTPUT-FMT=DETAIL conflicts with REPORT-TYPE=SUMMARY' TO WS-TEMP-LINE
MOVE " WARNING: OUTPUT-FMT=DETAIL conflicts with REPORT-TYPE=SUMMARY" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
IF WS-PARAM-NAME = "REPORT-TYPE"
AND WS-PARAM-VALUE = "SUMMARY"
AND WS-OUTPUT-FMT = "DETAIL"
ADD 1 TO WS-WARN-COUNT
MOVE 'N' TO WS-VALID-OK MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'Dependency: REPORT-TYPE=SUMMARY conflicts with OUTPUT-FMT=DETAIL' TO WS-TEMP-LINE
MOVE " WARNING: REPORT-TYPE=SUMMARY conflicts with OUTPUT-FMT=DETAIL" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
IF WS-PARAM-NAME = "VERBOSE" AND WS-PARAM-VALUE = "Y"
AND WS-DEBUG-MODE = "Y"
ADD 1 TO WS-WARN-COUNT
MOVE 'N' TO WS-VALID-OK MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'Dependency: VERBOSE=Y conflicts with DEBUG-MODE=Y'
TO WS-TEMP-LINE
MOVE " WARNING: VERBOSE=Y conflicts with DEBUG-MODE=Y"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
IF WS-PARAM-NAME = "DEBUG-MODE" AND WS-PARAM-VALUE = "Y"
AND WS-VERBOSE = "Y"
ADD 1 TO WS-WARN-COUNT
MOVE 'N' TO WS-VALID-OK MOVE 'REJECTED' TO WS-VALID-STATUS
MOVE 'Dependency: DEBUG-MODE=Y conflicts with VERBOSE=Y'
TO WS-TEMP-LINE
MOVE " WARNING: DEBUG-MODE=Y conflicts with VERBOSE=Y"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
PERFORM 6000-ERROR-HANDLE
END-IF
EXIT.
*> ============================================================
*> 3200-PROCESS-RECORD — apply parameter, detect override
*> ============================================================
3200-PROCESS-RECORD SECTION.
3200-START.
MOVE 'ACCEPTED' TO WS-VALID-STATUS
EVALUATE WS-PARAM-NAME
WHEN "SORT-KEY"
IF WS-SORT-KEY-SET = 'Y'
ADD 1 TO WS-OVERRIDE-COUNT
MOVE 'OVERRIDE' TO WS-VALID-STATUS
STRING 'OVERRIDE: SORT-KEY was ' WS-SORT-KEY
' now ' WS-PARAM-VALUE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
END-IF
MOVE WS-PARAM-VALUE TO WS-SORT-KEY
MOVE 'Y' TO WS-SORT-KEY-SET ADD 1 TO WS-PARAM-SET-CNT
WHEN "OUTPUT-FMT"
IF WS-OUTPUT-FMT-SET = 'Y'
ADD 1 TO WS-OVERRIDE-COUNT
MOVE 'OVERRIDE' TO WS-VALID-STATUS
STRING 'OVERRIDE: OUTPUT-FMT was ' WS-OUTPUT-FMT
' now ' WS-PARAM-VALUE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
END-IF
MOVE WS-PARAM-VALUE TO WS-OUTPUT-FMT
MOVE 'Y' TO WS-OUTPUT-FMT-SET ADD 1 TO WS-PARAM-SET-CNT
WHEN "MAX-RECORDS"
IF WS-MAX-REC-SET = 'Y'
ADD 1 TO WS-OVERRIDE-COUNT
MOVE 'OVERRIDE' TO WS-VALID-STATUS
STRING 'OVERRIDE: MAX-RECORDS was ' WS-MAX-RECORDS
' now ' WS-PARAM-VALUE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
END-IF
MOVE WS-PARAM-VALUE TO WS-MAX-RECORDS
MOVE 'Y' TO WS-MAX-REC-SET ADD 1 TO WS-PARAM-SET-CNT
WHEN "REPORT-TYPE"
IF WS-RPT-TYPE-SET = 'Y'
ADD 1 TO WS-OVERRIDE-COUNT
MOVE 'OVERRIDE' TO WS-VALID-STATUS
STRING 'OVERRIDE: REPORT-TYPE was ' WS-REPORT-TYPE
' now ' WS-PARAM-VALUE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
END-IF
MOVE WS-PARAM-VALUE TO WS-REPORT-TYPE
MOVE 'Y' TO WS-RPT-TYPE-SET ADD 1 TO WS-PARAM-SET-CNT
WHEN "VERBOSE"
IF WS-VERBOSE-SET = 'Y'
ADD 1 TO WS-OVERRIDE-COUNT
MOVE 'OVERRIDE' TO WS-VALID-STATUS
STRING 'OVERRIDE: VERBOSE was ' WS-VERBOSE
' now ' WS-PARAM-VALUE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
END-IF
MOVE WS-PARAM-VALUE(1:1) TO WS-VERBOSE
MOVE 'Y' TO WS-VERBOSE-SET ADD 1 TO WS-PARAM-SET-CNT
WHEN "DEBUG-MODE"
IF WS-DEBUG-SET = 'Y'
ADD 1 TO WS-OVERRIDE-COUNT
MOVE 'OVERRIDE' TO WS-VALID-STATUS
STRING 'OVERRIDE: DEBUG-MODE was ' WS-DEBUG-MODE
' now ' WS-PARAM-VALUE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
END-IF
MOVE WS-PARAM-VALUE(1:1) TO WS-DEBUG-MODE
MOVE 'Y' TO WS-DEBUG-SET ADD 1 TO WS-PARAM-SET-CNT
END-EVALUATE
IF WS-VALID-STATUS = 'OVERRIDE'
DISPLAY '[' WS-TIMESTAMP '] OVERRIDE: '
FUNCTION TRIM(WS-PARAM-NAME)
END-IF
EXIT.
*> ============================================================
*> 3300-WRITE-OUTPUT — write card loading line to report
*> ============================================================
3300-WRITE-OUTPUT SECTION.
3300-START.
MOVE WS-CARD-COUNT TO WS-LL-CARD
MOVE WS-PARAM-NAME TO WS-LL-NAME
MOVE WS-PARAM-VALUE TO WS-LL-VALUE
MOVE WS-VALID-STATUS TO WS-LL-STATUS
MOVE WS-LOADING-LINE TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
EXIT.
*> ============================================================
*> 4000-REPORT — final values, defaults, totals, errors
*> ============================================================
4000-REPORT SECTION.
4000-START.
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME INTO WS-TIMESTAMP
DISPLAY '[' WS-TIMESTAMP '] Generating parameter report'
DISPLAY " "
DISPLAY "=== Final Parameter Values ==="
MOVE "=== Final Parameter Values ===" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE SPACES TO PL-STATUS
MOVE "SORT-KEY" TO PL-NAME MOVE WS-SORT-KEY TO PL-VALUE
IF WS-SORT-KEY-SET = 'Y' MOVE "(from SYSIN)" TO PL-STATUS
ELSE MOVE "(default)" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "OUTPUT-FMT" TO PL-NAME MOVE WS-OUTPUT-FMT TO PL-VALUE
IF WS-OUTPUT-FMT-SET = 'Y' MOVE "(from SYSIN)" TO PL-STATUS
ELSE MOVE "(default)" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "MAX-RECORDS" TO PL-NAME MOVE WS-MAX-RECORDS TO PL-VALUE
IF WS-MAX-REC-SET = 'Y' MOVE "(from SYSIN)" TO PL-STATUS
ELSE MOVE "(default)" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "REPORT-TYPE" TO PL-NAME MOVE WS-REPORT-TYPE TO PL-VALUE
IF WS-RPT-TYPE-SET = 'Y' MOVE "(from SYSIN)" TO PL-STATUS
ELSE MOVE "(default)" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "VERBOSE" TO PL-NAME MOVE WS-VERBOSE TO PL-VALUE
IF WS-VERBOSE-SET = 'Y' MOVE "(from SYSIN)" TO PL-STATUS
ELSE MOVE "(default)" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "DEBUG-MODE" TO PL-NAME MOVE WS-DEBUG-MODE TO PL-VALUE
IF WS-DEBUG-SET = 'Y' MOVE "(from SYSIN)" TO PL-STATUS
ELSE MOVE "(default)" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
*> Batch control totals
MOVE WS-CARD-COUNT TO WS-RPT-COUNT
STRING "Cards read: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE WS-PARAM-SET-CNT TO WS-RPT-COUNT
STRING "Params set: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE WS-ERROR-COUNT TO WS-RPT-COUNT
STRING "Errors: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE WS-WARN-COUNT TO WS-RPT-COUNT
STRING "Warnings: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE WS-OVERRIDE-COUNT TO WS-RPT-COUNT
STRING "Overrides: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE WS-DEFAULT-APP-CNT TO WS-RPT-COUNT
STRING "Defaults used: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE WS-SKIPPED-COUNT TO WS-RPT-COUNT
STRING "Skipped cards: " WS-RPT-COUNT INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
*> Default Value Summary
MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE "=== Default Value Summary ===" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE SPACES TO PL-STATUS
MOVE "SORT-KEY" TO PL-NAME MOVE WS-SORT-KEY TO PL-VALUE
IF WS-SORT-KEY-SET = 'Y' MOVE "overridden" TO PL-STATUS
ELSE MOVE "default" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "OUTPUT-FMT" TO PL-NAME MOVE WS-OUTPUT-FMT TO PL-VALUE
IF WS-OUTPUT-FMT-SET = 'Y' MOVE "overridden" TO PL-STATUS
ELSE MOVE "default" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "MAX-RECORDS" TO PL-NAME MOVE WS-MAX-RECORDS TO PL-VALUE
IF WS-MAX-REC-SET = 'Y' MOVE "overridden" TO PL-STATUS
ELSE MOVE "default" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "REPORT-TYPE" TO PL-NAME MOVE WS-REPORT-TYPE TO PL-VALUE
IF WS-RPT-TYPE-SET = 'Y' MOVE "overridden" TO PL-STATUS
ELSE MOVE "default" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "VERBOSE" TO PL-NAME MOVE WS-VERBOSE TO PL-VALUE
IF WS-VERBOSE-SET = 'Y' MOVE "overridden" TO PL-STATUS
ELSE MOVE "default" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
MOVE "DEBUG-MODE" TO PL-NAME MOVE WS-DEBUG-MODE TO PL-VALUE
IF WS-DEBUG-SET = 'Y' MOVE "overridden" TO PL-STATUS
ELSE MOVE "default" TO PL-STATUS
PERFORM 4900-REPORT-PARAM
*> Final dependency check (post-batch)
MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE "=== Final Dependency Check ===" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
IF WS-OUTPUT-FMT = "DETAIL" AND WS-REPORT-TYPE = "SUMMARY"
MOVE " WARNING: OUTPUT-FMT=DETAIL and REPORT-TYPE=SUMMARY conflict" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
END-IF
IF WS-VERBOSE = "Y" AND WS-DEBUG-MODE = "Y"
MOVE " WARNING: VERBOSE=Y and DEBUG-MODE=Y conflict"
TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
END-IF
*> Accumulated errors
IF WS-ERR-IDX > 0
MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
MOVE "=== Accumulated Errors ===" TO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > WS-ERR-IDX
MOVE SPACES TO REPORT-LINE
STRING " " WS-ERR-TEXT(IDX) INTO REPORT-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00" DISPLAY 'RPT WERR ' WS-RPT-STATUS END-IF
END-PERFORM
END-IF
EXIT.
4900-REPORT-PARAM.
STRING " " FUNCTION TRIM(PL-NAME) " = "
FUNCTION TRIM(PL-VALUE)
" " FUNCTION TRIM(PL-STATUS)
DELIMITED BY SIZE INTO REPORT-LINE
DISPLAY WS-PARAM-LINE
WRITE REPORT-LINE
IF WS-RPT-STATUS NOT = "00"
DISPLAY 'RPT WERR ' WS-RPT-STATUS
END-IF
.
*> ============================================================
*> 5000-AUDIT — write audit file with counts and timestamps
*> ============================================================
5000-AUDIT SECTION.
5000-START.
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME INTO WS-TIMESTAMP
DISPLAY '[' WS-TIMESTAMP '] Writing audit report'
MOVE SPACES TO AUDIT-LINE
MOVE '=== Parameter Audit Summary ===' TO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE WS-CARD-COUNT TO WS-RPT-COUNT
STRING 'Cards read: ' WS-RPT-COUNT INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE WS-PARAM-SET-CNT TO WS-RPT-COUNT
STRING 'Params applied: ' WS-RPT-COUNT INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE WS-ERROR-COUNT TO WS-RPT-COUNT
STRING 'Errors: ' WS-RPT-COUNT INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE WS-WARN-COUNT TO WS-RPT-COUNT
STRING 'Warnings: ' WS-RPT-COUNT INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE WS-OVERRIDE-COUNT TO WS-RPT-COUNT
STRING 'Overrides: ' WS-RPT-COUNT INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE WS-DEFAULT-APP-CNT TO WS-RPT-COUNT
STRING 'Defaults applied:' WS-RPT-COUNT INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
STRING 'Batch date: ' WS-CUR-DATE INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
STRING 'Batch time: ' WS-CUR-TIME INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING 'Audit end: ' WS-CUR-DATE '-' WS-CUR-TIME
INTO AUDIT-LINE
WRITE AUDIT-LINE
IF WS-AUDIT-STATUS NOT = "00" DISPLAY 'AUD WERR ' WS-AUDIT-STATUS END-IF
CLOSE AUDIT-FILE
IF WS-AUDIT-STATUS NOT = "00"
DISPLAY '[' WS-TIMESTAMP '] CLOSE ERROR: AUDIT status='
WS-AUDIT-STATUS
END-IF
EXIT.
*> ============================================================
*> 6000-ERROR-HANDLE — accumulate one error into table
*> ============================================================
6000-ERROR-HANDLE SECTION.
6000-START.
ADD 1 TO WS-ERR-IDX
IF WS-ERR-IDX <= WS-ERROR-MAX
MOVE WS-TEMP-LINE TO WS-ERR-TEXT(WS-ERR-IDX)
ELSE
DISPLAY '[' WS-TIMESTAMP
'] WARNING: Error table full'
END-IF
EXIT.
*> ============================================================
*> 9000-EXIT — close report, display final summary
*> ============================================================
9000-EXIT SECTION.
9000-START.
MOVE FUNCTION CURRENT-DATE (1:8) TO WS-CUR-DATE
MOVE FUNCTION CURRENT-DATE (9:6) TO WS-CUR-TIME
STRING WS-CUR-DATE '-' WS-CUR-TIME INTO WS-TIMESTAMP
CLOSE REPORT-FILE
IF WS-RPT-STATUS NOT = "00"
DISPLAY '[' WS-TIMESTAMP
'] CLOSE ERROR: REPORT-FILE status='
WS-RPT-STATUS
END-IF
DISPLAY '*** Main28Sysin: Completed at ' WS-TIMESTAMP
DISPLAY ' Cards=' WS-CARD-COUNT
' Params set=' WS-PARAM-SET-CNT
' Errors=' WS-ERROR-COUNT
DISPLAY ' Warnings=' WS-WARN-COUNT
' Overrides=' WS-OVERRIDE-COUNT
' Defaults=' WS-DEFAULT-APP-CNT
DISPLAY ' Reports: sysin-report.txt, sysin-audit.dat'
EXIT.