>>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.