[USflag] The American Programmer [USflag]


Home
Books on Mainframe Programming
Mainframe Manuals and Tutorials
System Abend codes, Sqlcodes, VSAM/QSAM codes
Everything about the IBM AS/400 Midrange Computer - iSeries
Everything about CICS
Cobol programs, manuals, books
  Sample Cobol code: The Simple, Single File COBOL Program
  Sample Cobol code: The Simple, Single File Report COBOL Program with Record Count or Final Totals
  Sample Cobol code: The Simple, Single File Report COBOL Program with Record Count or Final Totals
  Sample Cobol code: The Sequence Check COBOL Program
  Sample Cobol code: The Record Selection COBOL Program
  Sample Cobol code: The Edit or Validate COBOL Program
  Sample Cobol code: The The One Level Subtotal (Control Break) COBOL Program
  Sample Cobol code: The Three Level Subtotal (Control Break) COBOL Program
  Sample Cobol code: The Sequential File, Batch Update COBOL Program
  Sample Cobol code: The COBOL Sort
  Sample Cobol code: The CASE Structure: COBOL EVALUATE
  Sample Cobol code: Direct Subscripting in COBOL
  Sample Cobol code: The Sequential, or Serial Search in COBOL
  Sample Cobol code: The Binary Search in COBOL
  Sample Cobol code: Loading a Table from a Sequential File in a COBOL program
  Sample Cobol code: The VSAM File Read Sequentially in a COBOL program
  Sample Cobol code: The VSAM KSDS, Read Randomly in a COBOL program
  Sample Cobol code: The VSAM File, Read Randomly in a COBOL program
  Sample Cobol code: VSAM Initial Load in a COBOL program
  Sample Cobol code: VSAM File Maintenance (Add, Change, Delete) in a COBOL program
  Sample Cobol code: VSAM Read Sequentially, with START, in a COBOL program
  Sample Cobol code: Creating a Variable Format File in a COBOL program
  Sample Cobol code: Reading a Variable Format File in a COBOL program
  Sample Cobol code: Creating a Variable Format File with Occurs Depending On in a COBOL program
  Sample Cobol code: COBOL Reading a Variable Format File with Occurs Depending On, in a COBOL program
  Sample Cobol code: COBOL The Table Load with Occurs Depending On
  Sample Cobol/DB2 code: Singleton Select
  Manuals on the COBOL programming language.
  Books on Cobol
  Abend Codes from Cobol programs
Everything about DB2 and SQL
Everything about IMS
Everything about Java and JavaScript
Everything about JCL and JES
Everything about REXX
Everything about zOS, VSAM, Tivoli, Assembler
Everything about TSO, ISPF, Spufi
Site Map and Site Search

           Home   > COBOL   > The Sequential File, Batch Update Program

The Sequential File, Batch Update COBOL Program


9. The Sequential File, Batch Update Program

FILEUPD1.
It reads two files, a Master File and a Transaction File. It matches records by comparing a significant field, such as account number. A code on the Transaction Record tells it whether to Add, Change or Delete Master File records. An output file is produced that contains the added, changed and unchanged Master File records.

Credit card file maintenance: approved customers now can carry plastic money as they are added to the huge cardholder file (Add transactions.) Some souls will have their wallets/pocketbooks lightened a bit, since they are being dropped from the file and have to turn in their credit cards (Delete transactions.) Those who have kept within their credit limit and have paid on time will see their credit limit raised to 3 times the size of the national debt of Mauritania! (Change transactions.)

Itís one program that processes Adds, Deletes and Changes. It is usually done in Batch mode (not done on a terminal while someone waits, and waits....) Batch mode in the IBM mainframe world means that the job was submitted through JCL and runs when it runs. The results will be ready by morning (unless the programmer forgot something critical in the program...)

Most batch file update programs are designed to use transaction codes on the transaction file. If a transaction file does not come with transaction codes, I consider that to be a design flaw, because it eliminates the logic checking that is possible with transaction codes: ďIf this is a match, what am I doing with an Add transaction?Ē

All batch file update programs of this type assume that both the transaction file and the old, input master file are sorted in the same manner, on the same field or fields. If the files are not sorted this way, the program wonít work!

The program reads the two input files: the transaction file and the old master file. It compares the key fields (sometimes called control fields) of the two files. The comparison can come out one of three ways:

The transaction key equals the master key.
In this case the program will apply the transaction to the master. This may be a change transaction or a delete transaction. It may not be an add transaction.

The transaction key is greater than the master key.
The program will write out the master record - there are no more transactions that apply to this master record.

The transaction key is less than the master key.
The transaction record did not find a corresponding master master record. This should happen with an add transaction.

The model program is a real Marvel. It can handle multiple transactions for the same key. It can even handle an Add, followed by a Change, then a Delete all for the same key. This will work only if the transaction file is sorted by the key, and within the key, sorted by the transaction code. Luckily Add sorts before Change which sorts before Delete.

I give you this model program for many reasons. First, because it works. This is not a trivial thing! This type of program can be a real bear. It can consume many hours before it does everything correctly. Second, because it is easier to rip code out of this program than to put it in. If you have a transaction file without Delete transactions, tear out the code for deleting. (If I were you, Iíd leave it in, but commented out. Users can change their minds...) Third, because you donít have to rip things out if you donít need them. They will simply sit there in the program and never do anything. For example, if you never have multiple transactions for the same key, the program will still work perfectly, although there will be parts of the program that acquire cobwebs.

Here is the program FILEUPD1:

Compliments of Gabe Gargiulo, author of several recent books on programming and modern languages, available at Amazon.com.



000200 IDENTIFICATION DIVISION.
000300* File update. Works fine. Don't mess with it.
000400* this is a good way to do it.  Use this as a model.
000500* transaction codes used.  Multiple trans allowed for same account
000600 PROGRAM-ID. FILEUPD1.
000700 ENVIRONMENT DIVISION.
000800 CONFIGURATION SECTION.
000900 INPUT-OUTPUT SECTION.
001000 FILE-CONTROL.
001100     SELECT TRANS-FILE  ASSIGN TRANSFIL.
001500     SELECT OLD-MASTER  ASSIGN OLDMAST.
001900     SELECT NEW-MASTER  ASSIGN NEWMAST.
002400 DATA DIVISION.
002500 FILE SECTION.
002600*
002700 FD  TRANS-FILE
002800     RECORDING MODE IS F
003100     RECORD CONTAINS  80 CHARACTERS.
003200 01  TRANS-RECORD.
003300      05  TR-ACCT-NO           PIC X(5).
003400      05  FILLER               PIC X(5).
003500      05  TR-AMOUNT            PIC 9(5).
003600      05  FILLER               PIC X(5).
003700      05  TR-CUST-NAME         PIC X(10).
003800      05  TR-TRANS-CODE        PIC X(1).
003900          88  ADD-TRANS    VALUE 'A'.
004000          88  CHANGE-TRANS VALUE 'C'.
004100          88  DELETE-TRANS VALUE 'D'.
004200      05  FILLER               PIC X(44).
004300*
004400 FD  OLD-MASTER
004500     RECORDING MODE IS F
004800     RECORD CONTAINS  80 CHARACTERS.
004900*
005000 01  OLD-MASTER-RECORD.
005100      05  OM-ACCT-NO           PIC X(05).
005200      05  FILLER               PIC X(05).
005300      05  OM-AMOUNT            PIC 9(05).
005400      05  FILLER               PIC X(05).
005500      05  OM-CUST-NAME         PIC X(10).
005600      05  FILLER               PIC X(50).
005700*
005800 FD  NEW-MASTER
005900     RECORDING MODE IS F
006200     RECORD CONTAINS  80 CHARACTERS.
006300*
006400 01  NEW-MASTER-RECORD.
006500      05  NM-ACCT-NO           PIC X(05).
006600      05  FILLER               PIC X(05).
006700      05  NM-AMOUNT            PIC 9(05).
006800      05  FILLER               PIC X(05).
006900      05  NM-CUST-NAME         PIC X(10).
007000      05  FILLER               PIC X(50).
007100*
007200 WORKING-STORAGE SECTION.
007300 01  SWITCHES.
007400     05  MASTER-EOF                  PIC X  VALUE 'N'.
007700*
007800     05  TRANS-EOF                   PIC X  VALUE 'N'.
008100*
008200     05  SW-FINISHED-WITH-DATA       PIC X  VALUE 'N'.
008300         88  FINISHED-WITH-DATA             VALUE 'Y'.
008400         88  NOT-FINISHED-WITH-DATA         VALUE 'N'.
008500*
008600     05  SW-FIRST-TIME               PIC X  VALUE 'Y'.
008700         88  IT-IS-FIRST-TIME               VALUE 'Y'.
008800*
008900     05  SW-VALID-DELETE             PIC X  VALUE 'N'.
009000         88  VALID-DELETE                   VALUE 'Y'.
009100*
009200     05  SW-VALID-ADD                 PIC X VALUE 'N'.
009300         88  VALID-ADD                      VALUE 'Y'.
009400*
009500 01  NEW-MASTER-WORK-AREA.
009600     05  WORK-NM-ACCT-NO      PIC X(05).
009700     05  FILLER               PIC X(05).
009800     05  WORK-NM-AMOUNT       PIC 9(05).
009900     05  FILLER               PIC X(05).
010000     05  WORK-NM-CUST-NAME    PIC X(10).
010100     05  FILLER               PIC X(50).
010200*
010300 PROCEDURE DIVISION.
010400*
010500     PERFORM INITIALIZATION
010600     PERFORM PROCESS-BOTH-FILES
010700        UNTIL MASTER-EOF = 'Y'
010800        AND   TRANS-EOF  = 'Y'
010900     IF FINISHED-WITH-DATA
011000     THEN
011100        PERFORM WRITE-NEW-MASTER
011200     END-IF
011300     PERFORM TERMINATION
011400     GOBACK.
011500*
011600 INITIALIZATION.
011700     OPEN INPUT TRANS-FILE
011800                 OLD-MASTER
011900     OPEN OUTPUT NEW-MASTER
012000     MOVE SPACES TO NEW-MASTER-WORK-AREA
012100     MOVE 'N' TO  MASTER-EOF
012200     MOVE 'N' TO TRANS-EOF
012300     MOVE 'N' TO SW-FINISHED-WITH-DATA
012400     MOVE 'Y' TO SW-FIRST-TIME
012500     MOVE 'N'  TO SW-VALID-DELETE
012600     MOVE 'N' TO SW-VALID-ADD
012700     PERFORM GET-NEW-MASTER-DATA.
012800*
012900 PROCESS-BOTH-FILES.
013000     PERFORM WRITE-NEW-MASTER
013100     PERFORM GET-NEW-MASTER-DATA.
013200*
013300 WRITE-NEW-MASTER.
013400*    MOVE FIELDS OF WORK AREA MASTER TO NEW MASTER RECORD
013500     MOVE SPACES           TO NEW-MASTER-RECORD
013600     MOVE WORK-NM-ACCT-NO  TO NM-ACCT-NO
013700     MOVE WORK-NM-AMOUNT   TO NM-AMOUNT
013800     WRITE NEW-MASTER-RECORD.
013900*
014000 GET-NEW-MASTER-DATA.
014100     MOVE 'N' TO SW-FINISHED-WITH-DATA
014200     IF IT-IS-FIRST-TIME
014300     THEN
014400        PERFORM READ-TRANS
014500        PERFORM READ-MASTER
014600        MOVE 'N' TO SW-FIRST-TIME
014700      END-IF
014800     PERFORM COMPARE-ACCT-NO
014900        UNTIL FINISHED-WITH-DATA
015000        OR    (MASTER-EOF = 'Y'
015100               AND TRANS-EOF = 'Y').
015200*
015300 COMPARE-ACCT-NO.
015400     MOVE 'N'  TO SW-VALID-DELETE
015500     MOVE 'N'  TO SW-VALID-ADD
015600     IF MASTER-EOF IS NOT EQUAL TO 'Y'
015700     AND TRANS-EOF IS NOT EQUAL TO 'Y'
015800     THEN
015900        PERFORM MORE-RECORDS-IN-BOTH
016000     ELSE
016100        PERFORM ONE-FILE-IS-AT-END
016200     END-IF.
016300*
016400 MORE-RECORDS-IN-BOTH.
016500     IF TR-ACCT-NO IS EQUAL TO  OM-ACCT-NO
016600     THEN
016700        PERFORM TR-EQUAL-OM
016800     ELSE
016900     IF TR-ACCT-NO IS GREATER THAN OM-ACCT-NO
017000     THEN
017100        PERFORM TR-GREATER-THAN-OM
017200     ELSE
017300     IF TR-ACCT-NO IS LESS THAN OM-ACCT-NO
017400     THEN
017500        PERFORM TR-LESS-THAN-OM
017600     END-IF.
017700*
017800 ONE-FILE-IS-AT-END.
017900     IF MASTER-EOF IS EQUAL TO 'Y'
018000     THEN
018100        PERFORM ADD-THIS-TRANS-IF-POSSIBLE
018200        IF VALID-ADD
018300        THEN
018400           MOVE 'Y' TO SW-FINISHED-WITH-DATA
018500           PERFORM READ-TRANS
018600        ELSE
018700           PERFORM READ-TRANS
018800        END-IF
018900     ELSE
019000*       THERE ARE MORE MSTR RECORDS
019100        PERFORM JUST-MOVE-OM-TO-WORK
019200        MOVE 'Y' TO SW-FINISHED-WITH-DATA
019300        PERFORM READ-MASTER
019400     END-IF.
019500*
019600 TR-EQUAL-OM.
019700     PERFORM APPLY-TRANSACTION
019800     IF VALID-DELETE
019900     THEN
020000        PERFORM READ-MASTER
020100        PERFORM READ-TRANS
020200     ELSE
020300        PERFORM READ-TRANS
020400     END-IF.
020500*
020600 APPLY-TRANSACTION.
020700     IF CHANGE-TRANS
020800     THEN
020900        PERFORM PROCESS-CHANGE-TRANS
021000     ELSE
021100     IF DELETE-TRANS
021200     THEN
021300        MOVE 'Y' TO SW-VALID-DELETE
021400     ELSE
021500     IF ADD-TRANS
021600     THEN
021700        DISPLAY 'ALREADY ON FILE, CANNOT ADD THIS TRANSACTION'
021710        DISPLAY TRANS-RECORD
021720        DISPLAY SPACES
021800     END-IF.
021900*
022000 TR-LESS-THAN-OM.
022100     PERFORM ADD-THIS-TRANS-IF-POSSIBLE
022200     IF VALID-ADD
022300     THEN
022400        MOVE 'Y' TO SW-FINISHED-WITH-DATA
022500        PERFORM READ-TRANS
022600     ELSE
022700        PERFORM READ-TRANS
022800     END-IF.
022900*
023000 ADD-THIS-TRANS-IF-POSSIBLE.
023100     IF ADD-TRANS
023200     THEN
023300        MOVE TR-ACCT-NO   TO WORK-NM-ACCT-NO
023400        MOVE TR-AMOUNT    TO WORK-NM-AMOUNT
023500        MOVE TR-CUST-NAME TO WORK-NM-CUST-NAME
023600        MOVE 'Y'    TO SW-VALID-ADD
023700     ELSE
023800        DISPLAY 'NO MATCH, CANNOT CHANGE/DELETE'
023810        DISPLAY TRANS-RECORD
023820        DISPLAY SPACES
023900     END-IF.
024000*
024100 TR-GREATER-THAN-OM.
024200     PERFORM JUST-MOVE-OM-TO-WORK
024300     MOVE 'Y' TO SW-FINISHED-WITH-DATA
024400     PERFORM READ-MASTER.
024500*
024600 JUST-MOVE-OM-TO-WORK.
024700     MOVE OM-ACCT-NO   TO WORK-NM-ACCT-NO
024800     MOVE OM-AMOUNT    TO WORK-NM-AMOUNT
024900     MOVE OM-CUST-NAME TO WORK-NM-CUST-NAME.
025000*
025100 PROCESS-CHANGE-TRANS.
025200     IF TR-CUST-NAME IS NOT EQUAL TO SPACES
025300     THEN
025400        MOVE TR-CUST-NAME TO OM-CUST-NAME
025500     END-IF
025600     ADD TR-AMOUNT TO OM-AMOUNT.
025700 READ-MASTER.
025800     READ OLD-MASTER
025900         AT END MOVE 'Y' TO MASTER-EOF
026000      END-READ.
026200 READ-TRANS.
026300     READ TRANS-FILE
026400         AT END MOVE 'Y' TO TRANS-EOF
026500      END-READ.
026700 TERMINATION.
026800     CLOSE TRANS-FILE
026900           OLD-MASTER
027000           NEW-MASTER.

Compliments of Gabe Gargiulo, author of several recent books on programming and modern languages, available at Amazon.com.
Here is the input transaction data file TRANSFIL: (the next two lines are a column ruler) 1 2 3 4 5 6 123456789.123456789.123456789.123456789.123456789.123456789.12345678 ACCT0 00100 GRUMPY CHANGE TRANSFIL ACCT1 00100 SNEAZZY ADD TRANSFIL ACCT1 00100 RUDOLPH CHANGE TRANSFIL ACCT1 00100 DELETE TRANSFIL ACCT2 00100 BLITZEN CHANGE TRANSFIL ACCT4 00100 THUMPER ADD TRANSFIL ACCT5 00100 DELETE TRANSFIL ACCT7 00100 MR ED ADD TRANSFIL ACCT8 00100 DONNER CHANGE TRANSFIL ACCT8 00100 WIMPY CHANGE TRANSFIL ACCT9 00100 TOTO CHANGE TRANSFIL Here is the old master data file OLDMAST: (the next two lines are a column ruler) 1 2 3 4 5 6 123456789.123456789.123456789.123456789.123456789.123456789.12345678 ACCT0 00010 LOU OLDMAST ACCT1 00010 MOE OLDMAST ACCT2 00010 CURLY OLDMAST ACCT3 00010 HAPPY OLDMAST ACCT5 00010 LAUREL OLDMAST ACCT6 00010 HARDY OLDMAST ACCT8 00010 DUMBO OLDMAST ACCT9 00010 GEORGE OLDMAST Here is sample JCL: //STEP1 EXEC PGM=FILEUPD1 //STEPLIB DD DSN=your.executable.program.library.goes.here,DISP=SHR //*OF COURSE, THE NEXT LIBRARY NAME MAY BE DIFFERENT AT YOUR COMPANY //TRANSFIL DD DSN=userid.COBBOOK.DATA(TRANSFIL),DISP=SHR //OLDMAST DD DSN=userid.COBBOOK.DATA(OLDMAST),DISP=SHR //NEWMAST DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSUDUMP DD SYSOUT=*

Top of Page

Your email and other personal information will not be given to anyone
[Books Computer]

Home Books for Computer Professionals Privacy Terms |
Site Map and Site Search Programming Manuals and Tutorials The REXX Files Top of Page |