CBIMPORT
Source: cbl/CBIMPORT.cbl
Type: Batch program
Purpose
CBIMPORT is a batch COBOL program that imports customer data from a "branch migration" export file into the CardDemo application's normalized file structure. It reads a single multi-record-type input file and splits its contents into separate flat files for customers, accounts, card-cross-references, transactions, and cards, based on a record-type code found in each input record. Records with an unrecognized type are logged to a separate error file rather than causing the job to fail.
How it works
Processing is driven by 0000-MAIN-PROCESSING, which calls four stages in sequence: 1000-INITIALIZE, 2000-PROCESS-EXPORT-FILE, 3000-VALIDATE-IMPORT, and 4000-FINALIZE, then ends the program with GOBACK.
-
Initialization (1000-INITIALIZE) — Displays a start message, derives an import date/time stamp from FUNCTION CURRENT-DATE, and calls 1100-OPEN-FILES to open the input file and all six output files.
-
Main read loop (2000-PROCESS-EXPORT-FILE) — Reads the first export record via 2100-READ-EXPORT-RECORD, then loops (PERFORM UNTIL WS-EXPORT-EOF) reading and dispatching each record until end-of-file, incrementing WS-TOTAL-RECORDS-READ for each record read.
-
Record dispatch (2200-PROCESS-RECORD-BY-TYPE) — Examines EXPORT-REC-TYPE and routes to one of six paragraphs based on a single-character code:
-
'C' → 2300-PROCESS-CUSTOMER-RECORD
-
'A' → 2400-PROCESS-ACCOUNT-RECORD
-
'X' → 2500-PROCESS-XREF-RECORD
-
'T' → 2600-PROCESS-TRAN-RECORD
-
'D' → 2650-PROCESS-CARD-RECORD
-
anything else → 2700-PROCESS-UNKNOWN-RECORD
-
Per-type mapping paragraphs (2300/2400/2500/2600/2650) — Each INITIALIZEs its target record, moves individual fields from the EXPORT-RECORD layout (from copybook CVEXPORT) into the corresponding output record layout (customer, account, xref, transaction, or card), WRITEs the record, checks the file status, and increments a per-type counter (e.g., WS-CUSTOMER-RECORDS-IMPORTED).
-
Unknown records (2700-PROCESS-UNKNOWN-RECORD → 2750-WRITE-ERROR) — Increments WS-UNKNOWN-RECORD-TYPE-COUNT, builds an error record (timestamp, record type, sequence number, fixed message text) and writes it to the error file via 2750-WRITE-ERROR, which also increments WS-ERROR-RECORDS-WRITTEN.
-
Validation (3000-VALIDATE-IMPORT) — Currently just displays two static messages ("Import validation completed" / "No validation errors detected"); it does not perform any actual data validation despite the paragraph name and the header comment's claim of "checksum" validation.
-
Finalize (4000-FINALIZE) — Closes all seven files and displays a summary of statistics: total records read, and counts imported/written per record type/error.
Inputs & outputs
Copybooks used: CVACT01Y, CVACT02Y, CVACT03Y, CVCUS01Y, CVEXPORT, CVTRA05Y. No CICS commands or SQL tables are used — this is a pure batch, file-to-file program (executed as job step CBIMPORT.STEP01).
Things to know
-
No SQL/CICS involvement — this program only reads/writes flat files; there is no database interaction to model when modernizing.
-
Aggressive error handling (fail-fast) — Any file-open failure, any read error (other than EOF), or any write failure on the customer, account, xref, transaction, or card outputs immediately triggers 9999-ABEND-PROGRAM, which calls CEE3ABD (a LE abend routine) and terminates the job. There is no retry or partial-recovery logic — a single bad write anywhere aborts the whole import.
-
Inconsistent error handling for the error file itself — Unlike the other outputs, a failure writing to ERROR-OUTPUT in 2750-WRITE-ERROR is only displayed, not abended; the program continues processing.
-
"Validation" is a no-op — 3000-VALIDATE-IMPORT only prints static "success" messages; despite the program header's stated business goal of "Validate data integrity using checksums," no actual checksum or integrity validation logic exists in the code as extracted. Documentation/business expectations may be out of sync with the actual implementation.
-
Unknown record types are tolerated, not fatal — Any record whose type code isn't C/A/X/T/D is logged to the error file with a fixed message ("Unknown record type encountered") and processing continues; these are not counted as failures for abend purposes.
-
Hard-coded layout assumptions — Field-level mapping between EXPORT-RECORD (from CVEXPORT) and each target record is done via direct one-to-one MOVE statements; any mismatch in copybook definitions between the export layout and target layouts would silently truncate/misalign data rather than raise an error.
-
EXPORT-INPUT is declared INDEXED with a key but read sequentially — the SELECT clause specifies ORGANIZATION IS INDEXED with RECORD KEY IS EXPORT-SEQUENCE-NUM, yet the access mode is SEQUENTIAL and processing simply reads until EOF; this is unusual for a plain import file and worth confirming with the team whether indexed access was intended elsewhere.
-
Statistics are display-only — Counts (records read, per-type imported, errors, unknown types) are only written to DISPLAY (job log) output at the end of the run; there's no separate report file or return code differentiation based on these counts.
-
No non-zero return code logic observed — Aside from the abend path, the program does not appear to set an explicit RETURN-CODE for partial success/failure scenarios like unknown records or error-file write failures; downstream job steps relying on condition codes should be reviewed against actual runtime behavior.
Files
| Logical file | DD name |
|---|---|
| EXPORT-INPUT | EXPFILE |
| CUSTOMER-OUTPUT | CUSTOUT |
| ACCOUNT-OUTPUT | ACCTOUT |
| XREF-OUTPUT | XREFOUT |
| TRANSACTION-OUTPUT | TRNXOUT |
| CARD-OUTPUT | CARDOUT |
| ERROR-OUTPUT | ERROUT |
Copybooks
CVACT01Y, CVACT02Y, CVACT03Y, CVCUS01Y, CVEXPORT, CVTRA05Y
Calls
CEE3ABD
Executed by
CBIMPORT.STEP01
Paragraph flow
flowchart TD
0000_MAIN_PROCESSING["0000-MAIN-PROCESSING"]
1000_INITIALIZE["1000-INITIALIZE"]
1100_OPEN_FILES["1100-OPEN-FILES"]
2000_PROCESS_EXPORT_FILE["2000-PROCESS-EXPORT-FILE"]
2100_READ_EXPORT_RECORD["2100-READ-EXPORT-RECORD"]
2200_PROCESS_RECORD_BY_TYPE["2200-PROCESS-RECORD-BY-TYPE"]
2300_PROCESS_CUSTOMER_RECORD["2300-PROCESS-CUSTOMER-RECORD"]
2400_PROCESS_ACCOUNT_RECORD["2400-PROCESS-ACCOUNT-RECORD"]
2500_PROCESS_XREF_RECORD["2500-PROCESS-XREF-RECORD"]
2600_PROCESS_TRAN_RECORD["2600-PROCESS-TRAN-RECORD"]
2650_PROCESS_CARD_RECORD["2650-PROCESS-CARD-RECORD"]
2700_PROCESS_UNKNOWN_RECORD["2700-PROCESS-UNKNOWN-RECORD"]
2750_WRITE_ERROR["2750-WRITE-ERROR"]
3000_VALIDATE_IMPORT["3000-VALIDATE-IMPORT"]
4000_FINALIZE["4000-FINALIZE"]
9999_ABEND_PROGRAM["9999-ABEND-PROGRAM"]
0000_MAIN_PROCESSING --> 1000_INITIALIZE
0000_MAIN_PROCESSING --> 2000_PROCESS_EXPORT_FILE
0000_MAIN_PROCESSING --> 3000_VALIDATE_IMPORT
0000_MAIN_PROCESSING --> 4000_FINALIZE
1000_INITIALIZE --> 1100_OPEN_FILES
1100_OPEN_FILES --> 9999_ABEND_PROGRAM
2000_PROCESS_EXPORT_FILE --> 2100_READ_EXPORT_RECORD
2000_PROCESS_EXPORT_FILE --> 2200_PROCESS_RECORD_BY_TYPE
2100_READ_EXPORT_RECORD --> 9999_ABEND_PROGRAM
2200_PROCESS_RECORD_BY_TYPE --> 2300_PROCESS_CUSTOMER_RECORD
2200_PROCESS_RECORD_BY_TYPE --> 2400_PROCESS_ACCOUNT_RECORD
2200_PROCESS_RECORD_BY_TYPE --> 2500_PROCESS_XREF_RECORD
2200_PROCESS_RECORD_BY_TYPE --> 2600_PROCESS_TRAN_RECORD
2200_PROCESS_RECORD_BY_TYPE --> 2650_PROCESS_CARD_RECORD
2200_PROCESS_RECORD_BY_TYPE --> 2700_PROCESS_UNKNOWN_RECORD
2300_PROCESS_CUSTOMER_RECORD --> 9999_ABEND_PROGRAM
2400_PROCESS_ACCOUNT_RECORD --> 9999_ABEND_PROGRAM
2500_PROCESS_XREF_RECORD --> 9999_ABEND_PROGRAM
2600_PROCESS_TRAN_RECORD --> 9999_ABEND_PROGRAM
2650_PROCESS_CARD_RECORD --> 9999_ABEND_PROGRAM
2700_PROCESS_UNKNOWN_RECORD --> 2750_WRITE_ERROR
Paragraphs
| Paragraph | Line | Performs |
|---|---|---|
| 0000-MAIN-PROCESSING | 165 | 1000-INITIALIZE, 2000-PROCESS-EXPORT-FILE, 3000-VALIDATE-IMPORT, 4000-FINALIZE |
| 1000-INITIALIZE | 174 | 1100-OPEN-FILES |
| 1100-OPEN-FILES | 196 | 9999-ABEND-PROGRAM, 9999-ABEND-PROGRAM, 9999-ABEND-PROGRAM, 9999-ABEND-PROGRAM, 9999-ABEND-PROGRAM, 9999-ABEND-PROGRAM |
| 2000-PROCESS-EXPORT-FILE | 248 | 2100-READ-EXPORT-RECORD, 2200-PROCESS-RECORD-BY-TYPE, 2100-READ-EXPORT-RECORD |
| 2100-READ-EXPORT-RECORD | 259 | 9999-ABEND-PROGRAM |
| 2200-PROCESS-RECORD-BY-TYPE | 270 | 2300-PROCESS-CUSTOMER-RECORD, 2400-PROCESS-ACCOUNT-RECORD, 2500-PROCESS-XREF-RECORD, 2600-PROCESS-TRAN-RECORD, 2650-PROCESS-CARD-RECORD, 2700-PROCESS-UNKNOWN-RECORD |
| 2300-PROCESS-CUSTOMER-RECORD | 288 | 9999-ABEND-PROGRAM |
| 2400-PROCESS-ACCOUNT-RECORD | 323 | 9999-ABEND-PROGRAM |
| 2500-PROCESS-XREF-RECORD | 352 | 9999-ABEND-PROGRAM |
| 2600-PROCESS-TRAN-RECORD | 372 | 9999-ABEND-PROGRAM |
| 2650-PROCESS-CARD-RECORD | 402 | 9999-ABEND-PROGRAM |
| 2700-PROCESS-UNKNOWN-RECORD | 425 | 2750-WRITE-ERROR |
| 2750-WRITE-ERROR | 437 | |
| 3000-VALIDATE-IMPORT | 449 | |
| 4000-FINALIZE | 455 | |
| 9999-ABEND-PROGRAM | 481 |