[USflag] The American Programmer [USflag]
Home Programming Books for Computer Professionals Privacy Terms
           Home   > Programming   > COBOL Book   > COBOL program chapter 9 The Sequential File, Batch Update Program

The Sequential File, Batch Update Program


Top of Page

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:



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.

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 and will be used only to communicate with you about your order.
[Books Computer]

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

[link page]