wiley-logo-sm.gif
> wiley.com

ADVANCED COBOL FOR STRUCTURED AND OBJECT-ORIENTED PROGRAMMING, THIRD EDITION

Gary DeWard Brown



SOURCE CODE FOR PROGRAMS IN THE BOOK


The programs listed here were extracted from the text of Advanced COBOL for Structured and Object-Oriented Programming. The SELECT statements have all been modified for the PC. To run on the mainframe, you must change the SELECT statements by removing the ORGANIZATION IS LINE SEQUENTIAL and adding the necessary JCL.


Chapter 1
INTRODUCTION

Simplest COBOL program. Page 5


This illustrates about as simple a COBOL program as can be written.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  HELLO.
       PROCEDURE DIVISION.
           DISPLAY "hello world."
           GOBACK
           .
       END PROGRAM HELLO.


Simple COBOL program. Page 5-6

This illustrates a simple COBOL program, but is more typical in that many of the required statements are coded.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  EINSTEIN.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "EINSTEIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  IN-FILE BLOCK CONTAINS 0 RECORDS.
       01  IN-REC.
           02  M                         PIC S9(10).
           02  C                         PIC S9(10).
       WORKING-STORAGE SECTION.
       01  E                             PIC S9(10) PACKED-DECIMAL.
       PROCEDURE DIVISION.
       BEGIN-PROGRAM.
           OPEN INPUT IN-FILE
           READ IN-FILE
           COMPUTE E = M * (C ** 2)
           CLOSE IN-FILE
           GOBACK
           .
       END PROGRAM EINSTEIN.
EINSTEIN.TXT:
00000100000000020000

0059">

Chapter 2
COBOL OVERVIEW


A complete COBOL program. Page 26-27


This program reads a file containing an employee name, birth date, and hire date. It computes the person's age and adds this to the record and writes it out.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  Empage.
      *****************************************************************
      * PROGRAM TO READ INPUT FILE, COMPUTE PERSON'S AGE, AND WRITE   *
      * OUTPUT FILE.                                                  *
      * IN:  In-File CONTAINS INPUT FILE.                             *
      * OUT: Out-File CONTAINS INPUT FILE RECORDS WITH AGE ADDED.     *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "OLDFILE.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Out-File ASSIGN TO "NEWFILE.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File BLOCK CONTAINS 0 RECORDS.
       01  In-Emp.
           02  In-Name                   PIC X(30).
           02  In-Birth-Date.
               03  In-Birth-Yr           PIC 99.
               03  In-Birth-Mo           PIC 99.
               03  In-Birth-Dy           PIC 99.
           02                            PIC X.
           02  In-Hire-Date.
               03  In-Hire-Yr            PIC 99.
               03  In-Hire-Mo            PIC 99.
               03  In-Hire-Dy            PIC 99.
       FD  Out-File BLOCK CONTAINS 0 RECORDS.
       01  Out-Emp.
           02  Out-Name                  PIC X(30).
           02  Out-Birth-Date.
               03  Out-Birth-Yr          PIC 99.
               03  Out-Birth-Mo          PIC 99.
               03  Out-Birth-Dy          PIC 99.
           02                            PIC X.
           02  Out-Hire-Date.
               03  Out-Hire-Yr           PIC 99.
               03  Out-Hire-Mo           PIC 99.
               03  Out-Hire-Dy           PIC 99.
           02  Hire-Age                  PIC 999.
       WORKING-STORAGE SECTION.
       01  EOF-In-File                   PIC X.
      *            EOF-In-File is end of file flag for In-File.
      *            "N" if no EOF.  "Y" for EOF.
       PROCEDURE DIVISION.
       A00-Begin.
           OPEN INPUT In-File, OUTPUT Out-File
           PERFORM WITH TEST AFTER UNTIL EOF-In-File = "Y"
              READ In-File
                 AT END MOVE "Y" TO EOF-In-File
                 NOT AT END
                    MOVE "N" TO EOF-In-File
                    MOVE In-Emp TO Out-Emp
                    COMPUTE Hire-Age = In-Hire-Yr - In-Birth-Yr
                    IF In-Hire-Mo < In-Birth-Mo
                       THEN COMPUTE Hire-Age = Hire-Age - 1
                    END-IF
                    IF In-Hire-Mo = In-Birth-Mo AND
                       In-Hire-Dy < In-Birth-Dy
                       THEN COMPUTE Hire-Age = Hire-Age - 1
                    END-IF
                    WRITE Out-Emp
              END-READ
           END-PERFORM
           CLOSE In-File, Out-File
           GOBACK
           .
       END PROGRAM Empage.
OLDFILE.TXT:
Able, John A.                 590201 950924
Baker, Harry M.               620511 950924
Cox, Mary T.                  730330 950924
Minow, Samuel T.              681221 950924
Smith, Joseph L.              641121 950924
Zach, Thomas W.               750913 950924

0059">

Chapter 3
GENERAL LANGUAGE RULES


Prototype COBOL program. Page 46-47


This illustrates the usual statements coded in a COBOL program and can be used as a template for writing COBOL programs.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  PROTO.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "PROTOIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Out-File ASSIGN TO "PROTOOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File
           BLOCK CONTAINS 0 RECORDS.
       01  In-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       FD  Out-File BLOCK CONTAINS 0 RECORDS.
       01  Out-Record                    PIC X(20).
       WORKING-STORAGE SECTION.
       01  In-EOF                        PIC X.
      *            Flag for end of file.  "Y", EOF.  "N", no EOF.
       01  Record-Count                  PIC S9(8).
      *          Record-Count counts the records read and written.
       PROCEDURE DIVISION.
       A00-Begin.
           OPEN INPUT In-File, OUTPUT Out-File
           MOVE "N" TO In-EOF
           MOVE ZEROS to Record-Count
           PERFORM A10-Copy-File WITH TEST AFTER UNTIL In-EOF = "Y"
           CLOSE In-File, Out-File
           DISPLAY "Records copied: ", Record-Count
           GOBACK
           .
      **** End of program execution.
       A10-Copy-File.
           READ In-File
              AT END MOVE "Y" TO In-EOF
                     DISPLAY "END OF FILE"
              NOT AT END
                     MOVE In-Record TO Out-Record
                     WRITE Out-Record
                     ADD 1 TO Record-Count
           END-READ
           .
      **** Exit
       END PROGRAM PROTO.
PROTOIN.TXT:
111111111111111AAAA
222222222222221AAAA
222222222222222AAAA
222222222222222DDDD
444444444444441BBBB
555555555555552CCCC

0059">

Chapter 8
STRUCTURED PROGRAMMING IN COBOL


Nonstructured COBOL program. Page 131-132


This program illustrated a typical nonstructured COBOL program. It reads a master file, applies some transactions, and writes out a new master file.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  NONSTRUCT.
      *****************************************************************
      * PROGRAM TO READ INPUT FILE, UPDATE IT FROM A TRANSACTIONS     *
      * FILE, AND WRITE AN OUTPUT FILE.                               *
      * IN:  In-File CONTAINS INPUT FILE.                             *
      *      Trans-File CONTAINS THE TRANSACTIONS FILE.               *
      * OUT: Out-File CONTAINS THE UPDATED OUTPUT FILE.               *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "NONSTIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Out-File ASSIGN TO "NONSTOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Trans-File ASSIGN TO "NONSTTR.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File
           BLOCK CONTAINS 0 RECORDS.
       01  In-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       FD  Out-File BLOCK CONTAINS 0 RECORDS.
       01  Out-Rec.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       FD  Trans-File BLOCK CONTAINS 0 RECORDS.
       01  Trans-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       WORKING-STORAGE SECTION.
       01  In-Rec.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       01  Trans-Rec.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       01  Out-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       01  In-EOF                        PIC X.
      *            Flag for end of file.  "Y", EOF.  "N", no EOF.
       01  Record-Count                  PIC S9(8).
      *          Record-Count counts the records read and written.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING NONSTRUCT PROGRAM."
           OPEN INPUT In-File Trans-File, OUTPUT Out-File
           MOVE LOW-VALUES TO Trans-Rec
           .
       A10-Read-Next.
           READ In-File INTO In-Rec
             AT END DISPLAY "EOF IN"
                    GO TO A70-Purge-Trans
           END-READ
           IF Trans-Rec = LOW-VALUES
              THEN GO TO A40-Read-Trans
           END-IF
           .
       A20-Check-For-Delete.
           IF Trans-Rec < In-Rec
              THEN DISPLAY "TRANSACTION IGNORED: ", Trans-Rec
                   GO TO A40-Read-Trans
           END-IF
           IF Trans-Rec = In-Rec
              THEN DISPLAY "DELETING: ", In-Rec
                   MOVE LOW-VALUES TO Trans-Rec
                   GO TO A10-Read-Next
           END-IF
           .
       A30-Write-Out.
           WRITE Out-Rec FROM In-Rec
           DISPLAY "WRITING: ", In-Rec
           GO TO A10-Read-Next
           .
       A40-Read-Trans.
           READ Trans-File INTO Trans-Rec
             AT END MOVE HIGH-VALUES TO Trans-Rec
                    DISPLAY "EOF TRANS"
                    GO TO A30-Write-Out
           END-READ
           GO TO A20-Check-For-Delete
           .
       A70-Purge-Trans.
           IF Trans-Rec = HIGH-VALUES
              THEN GO TO Z90-Stop-Run
           END-IF
           .
       A80-Skip-Trans.
           DISPLAY "TRANSACTION IGNORED: ", Trans-Rec
           READ Trans-File INTO In-Rec
             AT END GO TO Z90-Stop-Run
           END-READ
           GO TO A80-Skip-Trans
           .
       Z90-Stop-Run.
           DISPLAY "END OF PROGRAM"
           CLOSE In-File, Trans-File, Out-File
           GOBACK
           .
       END PROGRAM NONSTRUCT.
NONSTIN.TXT:
111111111111111AAAA
222222222222221AAAA
222222222222222AAAA
222222222222222DDDD
444444444444441BBBB
555555555555552CCCC
NONSTTR.TXT:
111111111111111BBBB
222222222222221AAAA
222222222222222AAAA
222222222222222EEEE
444444444444441BBBB
555555555555553CCCC

0059">

Structured COBOL Program. Page 139


This is the same program as the previous one, except it is written as a structured program.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  STRUCT.
      *****************************************************************
      * PROGRAM TO READ INPUT FILE, UPDATE IT FROM A TRANSACTIONS     *
      * FILE, AND WRITE AN OUTPUT FILE.                               *
      * IN:  In-File CONTAINS INPUT FILE.                             *
      *      Trans-File CONTAINS THE TRANSACTIONS FILE.               *
      * OUT: Out-File CONTAINS THE UPDATED OUTPUT FILE.               *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "NONSTIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Out-File ASSIGN TO "NONSTOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Trans-File ASSIGN TO "NONSTTR.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File
              BLOCK CONTAINS 0 RECORDS.
       01  In-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       FD  Out-File BLOCK CONTAINS 0 RECORDS.
       01  Out-Rec.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       FD  Trans-File BLOCK CONTAINS 0 RECORDS.
       01  Trans-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       WORKING-STORAGE SECTION.
       01  In-Rec.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       01  Trans-Rec.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       01  Out-Record.
           05  K                         PIC X(15).
           05  L.
               10  M                     PIC S9.
               10  N                     PIC X(4).
       01  In-EOF                        PIC X.
      *            Flag for end of file.  "Y", EOF.  "N", no EOF.
       01  Record-Count                  PIC S9(8).
      *          Record-Count counts the records read and written.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING STRUCT PROGRAM."
           OPEN INPUT In-File, Trans-File, OUTPUT Out-File
           MOVE LOW-VALUES TO In-Rec, Trans-Rec
           PERFORM A10-READ-In-File WITH TEST AFTER
                   UNTIL In-Rec = HIGH-VALUES
           DISPLAY "END OF PROGRAM"
           CLOSE In-File, Trans-File, Out-File
           GOBACK
           .
      **** Exit
       A10-Read-In-File.
           READ In-File INTO In-Rec
             AT END MOVE HIGH-VALUES TO In-Rec
           END-READ
           PERFORM WITH TEST BEFORE UNTIL Trans-Rec >= In-Rec
              IF Trans-Rec - LOW-VALUES
                 THEN READ Trans-File INTO Trans-Rec
                           AT END MOVE HIGH-VALUES TO Trans-Rec
                      END-READ
              END-IF
              IF Trans-Rec < In-Rec
                 THEN DISPLAY "TRANSACTION IGNORED:", Trans-Rec
                      MOVE LOW-VALU"ES TO Trans-Rec
              END-IF
           END-PERFORM
           EVALUATE TRUE
             WHEN In-Rec = HIGH-VALUES CONTINUE
             WHEN Trans-Rec = In-Rec DISPLAY "DELETING:", In-Rec
             WHEN OTHER
                  DISPLAY "WRITING: ", In-Rec
                  WRITE Out-Rec FROM In-Rec
           END-EVALUATE
           .
      **** Exit
       END PROGRAM STRUCT.
NONSTIN.TXT:
111111111111111AAAA
222222222222221AAAA
222222222222222AAAA
222222222222222DDDD
444444444444441BBBB
555555555555552CCCC
NONSTTR.TXT:
111111111111111BBBB
222222222222221AAAA
222222222222222AAAA
222222222222222EEEE
444444444444441BBBB
555555555555553CCCC

0059">

Chapter 13
TABLES


Program to determine minimum and maximum. Page 221


This is a simple program that illustrates tables by determining the minimum and maximum populations of the 50 states. The table size has been increased to 51 to include the District of Columbia. The population numbers are Bureau of Census estimates for 1997.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  MINMAX.
      *****************************************************************
      * PROGRAM TO READ FILE CONTAINING STATE NAMES AND POPULATIONS.  *
      * CALCULATES THE MINIMUM AND MAXIMUM POPULATIONS AND DISPLAYS   *
      * THEM.                                                         *
      * IN:  In-File CONTAINS INPUT FILE OF STATE NAMES, POPULATIONS. *
      * OUT: MINIMUM AND MAXIMUM POPULATIONS DISPLAYED.               *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "MINMAX.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File
              BLOCK CONTAINS 0 RECORDS.
       01  In-Record                     PIC X(31).
       WORKING-STORAGE SECTION.
       01  In-Rec.
           05  State-Name                PIC X(20).
           05  State-Pop                 PIC 9(11).
       01  In-EOF                        PIC X.
      *            Flag for end of file.  "Y", EOF.  "N", no EOF.
       01  States.
           05  No-States                 PIC S9(4) BINARY VALUE 51.
           05  Population                OCCURS 51 TIMES
                                         INDEXED BY Ix
                                         PIC S9(11) PACKED-DECIMAL.
        01  Population-Count             PIC S9(14) PACKED-DECIMAL.
        01  Max-No                       PIC S9(11) PACKED-DECIMAL.
        01  Min-No                       PIC S9(11) PACKED-DECIMAL.
      PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING MINMAX PROGRAM."
           OPEN INPUT In-File
           MOVE "N" TO IN-EOF
           SET IX TO 1
           PERFORM WITH TEST AFTER UNTIL In-EOF = "Y"
              READ In-File INTO In-Rec
                AT END MOVE "Y" TO In-EOF
                NOT AT END
                   IF Ix > No-States
                      THEN DISPLAY "Too many states, ",
                                   " States table overflow.  "
                                   "Killing job."
                           CLOSE In-File
                           GOBACK
                   END-IF
                   MOVE State-Pop TO Population(Ix)
                   SET Ix UP BY 1
              END-READ
           END-PERFORM
           CLOSE In-File
           MOVE ZERO TO Population-Count, Max-No
           MOVE 99999999999 TO Min-No
           PERFORM VARYING Ix FROM 1 BY 1 UNTIL Ix > No-States
             ADD Population(Ix) TO Population-Count
             IF Population(Ix) < Min-No
                THEN MOVE Population(Ix) TO Min-No
             END-IF
             IF Population(Ix) > Max-No
                THEN MOVE Population(Ix) TO Max-No
             END-IF
           END-PERFORM
           DISPLAY "Population total is: ", Population-Count
           DISPLAY "Minimum population is: ", Min-No 
           DISPLAY "Maximum population is: ", Max-No 
           GOBACK
           .
       END PROGRAM MINMAX.
MINMAX.TXT:
Alabama             00004319154
Alaska              00000609311
Arizona             00004554966
Arkansas            00002522819
California          00032268301
Colorado            00003892644
Connecticut         00003269858
Delaware            00000731581
District of Columbia00000528964
Florida             00014653945
Georgia             00007486242
Hawaii              00001186602
Idaho               00001210232
Illinois            00011895849
Indiana             00005864108
Iowa                00002852423
Kansas              00002594840
Kentucky            00003908124
Louisiana           00004351769
Maine               00001242051
Maryland            00005094289
Massachusetts       00006117520
Michigan            00009773892
Minnesota           00004685549
Mississippi         00002730501
Missouri            00005402058
Montana             00000878810
Nebraska            00001656870
Nevada              00001676809
New Hampshire       00001172709
New Jersey          00008052849
New Mexico          00001729751
New York            00018137226
North Carolina      00007425183
North Dakota        00000640883
Ohio                00011186331
Oklahoma            00003317091
Oregon              00003243487
Pennsylvania        00012019661
Rhode Island        00000987429
South Carolina      00003760181
South Dakota        00000737973
Tennessee           00005368198
Texas               00019439337
Utah                00002059148
Vermont             00000588978
Virginia            00006733996
Washington          00005610362
West Virginia       00001815787
Wisconsin           00005169677
Wyoming             00000479743

0059">

Program to initialize complex structure. Page 224-225.


This program shows how to write a procedure to initialize a complex structure.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  INITL.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Record-Out.
           05  Increments                OCCURS 600 TIMES
                                         INDEXED BY Ix.
               10  Increment-Value       PIC S9(3) PACKED-DECIMAL.
               10  Decrement-Value       PIC S9(3) PACKED-DECIMAL.
       01  Dec-No                        PIC S9(3) PACKED-DECIMAL.
       PROCEDURE DIVISION.
           DISPLAY "BEGINNING INITIAL PROGRAM."
           PERFORM B100-Initialize
           GOBACK
           .
       B100-Initialize.
           MOVE 600 TO Dec-No
           PERFORM VARYING Ix FROM 1 BY 1 UNTIL Ix > 600
             SET Decrement-Value(Ix) TO Ix
             MOVE Dec-No TO Decrement-Value(Ix)
             SUBTRACT 1 FROM Dec-No
           END-PERFORM
           .
      **** EXIT
       END PROGRAM INITL.

0059">

Program utilizing hash table. Page 243-246


This program illustrates how to write records into a hash table and retrieve them.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  HASH.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  SS-Table.
           05  SS-Name                   PIC X(25).
           05  SS-No                     PIC 9(9).
           05  SS-Div                    PIC S9(9) PACKED-DECIMAL
                                         VALUE 1499.
           05  SS-Max-Size               PIC S9(4) BINARY SYNC
                                         VALUE 1500.
           05  SS-Subscript              PIC S9(9) PACKED-DECIMAL.
           05  SS-Person                 OCCURS 1500 TIMES
                                         INDEXED BY Ip.
               10  SS-Person-No          PIC 9(9).
               10  SS-Person-Name        PIC X(25).
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING HASH PROGRAM."
      *    First zero out the SS-Person-No elements.
           PERFORM VARYING Ip FROM 1 BY 1 UNTIL Ip > SS-Max-Size
             MOVE ZEROS TO SS-Person-No(Ip)
           END-PERFORM
           MOVE "111111111" TO SS-No
           MOVE "John Doe" TO SS-Name
           PERFORM C10-Add-Name
           DISPLAY "Added John Doe at: ", SS-Subscript
           MOVE "222222222" TO SS-No
           MOVE "Harry Smith" TO SS-Name
           PERFORM C10-Add-Name
           DISPLAY "Added Harry Smith at: ", SS-Subscript
           MOVE "555555555" TO SS-No
           MOVE "Mary Clark" TO SS-Name
           PERFORM C10-Add-Name
           DISPLAY "Added Mary Clark at: ", SS-Subscript
           MOVE "222222222" TO SS-No
           PERFORM C20-Retrieve-Name
           DISPLAY "Found Harry Smith at: ", SS-Subscript
           GOBACK
           .
       C10-Add-Name.
      ************************************************************
      * PROCEDURE TO ADD ENTRIES TO Person TABLE.                *
      * IN:  SS-No contains Social Security number.              *
      *      SS-Name contains person's name.                     *
      * OUT: Ip points to where SS-No stored.                    *
      *      SS-No stored in SS-Person-No(Ip).                   *
      *      SS-Name stored in SS-Person-Name(Ip).               *
      ************************************************************
           COMPUTE SS-Subscript = FUNCTION REM(SS-No, SS-Div) + 1
           SET Ip TO SS-Subscript
           SEARCH SS-Person
             AT END
                SET Ip TO 1
                SEARCH SS-Person
                  WHEN Ip = SS-Subscript
                    DISPLAY
                        "ERROR - SS-Person TABLE FULL, RUN TERMINATED."
                    DISPLAY
               "INCREASE SS-Person- SS-Div, SS-Max-Size AND RECOMPILE."
                    GO TO Z90-Stop-Run
                  WHEN SS-Person-No(Ip) = ZEROS
                    MOVE SS-No TO SS-Person-No(Ip)
                    MOVE SS-Name TO SS-Person-Name(Ip)
                END-SEARCH
             WHEN SS-Person-No(Ip) = ZEROS
                MOVE SS-No TO SS-Person-No(Ip)
                MOVE SS-Name TO SS-Person-Name(Ip)
           END-SEARCH
           SET SS-Subscript TO Ip
           .
      **** Exit
       C20-Retrieve-Name.
      ************************************************************
      * PROCEDURE TO RETRIEVE A Person's NAME.                   *
      * IN:  SS-No contains Social Security number.              *
      * OUT: If found:                                           *
      *         SS-Subscript points to entry in table.           *
      *         SS-Name contains person's name.                  *
      *      Not found:                                          *
      *         SS-Subscript contains ZERO.                      *
      *         SS-Name contains SPACES.                         *
      ************************************************************
           COMPUTE SS-Subscript = FUNCTION REM(SS-No, SS-Div) + 1
           SET Ip TO SS-Subscript
           SEARCH SS-Person
             AT END
                SET Ip TO 1
                SEARCH SS-Person
                  WHEN Ip = SS-Subscript OR SS-Person-No(Ip) = ZERO
                     MOVE SPACES TO SS-Name
                     MOVE ZERO TO SS-Subscript
                  WHEN SS-No = SS-Person-No(Ip) 
                     MOVE SS-Person-Name(Ip) TO SS-Name
                     SET SS-Subscript TO Ip
                END-SEARCH
             WHEN SS-Person-No(Ip) = ZERO
                MOVE SPACES TO SS-Name
                MOVE ZERO TO SS-Subscript
             WHEN SS-No = SS-Person-No(Ip)
                MOVE SS-Person-Name(Ip) TO SS-Name
                SET SS-Subscript TO Ip
           END-SEARCH
           .
      **** Exit
       Z90-Stop-Run.
           DISPLAY "TERMINATING PROGRAM HASH."
           GOBACK
           .
       END PROGRAM HASH.

0059">

Program to read in a table. Page 246-247


This program illustrates how to read in a table into storage, checking for table overflow. The record length has been reduced from 1000 to 11 to make it easier to create data for the program with a text editor.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  READTBL.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT Pay-In ASSIGN TO "READTBL.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  Pay-In
              BLOCK CONTAINS 0 RECORDS.
       01  Pay-Record                    PIC X(11).
       WORKING-STORAGE SECTION.
       01  Old-Id                        PIC X(10).
      *                                    Old-Id checks the sort 
      *                                    order of Input-File.
      **** Employee file.  Record length = 11.
       01  Employee.
           05  Employee-Id               PIC X(10).
           05  FILLER                    PIC X(1).
      **** Table of employee IDs.
       01  ID-Record.
           05  ID-Max                    PIC S9(4) BINARY VALUE 1000.
      *                                    Maximum IDs in table.
           05  ID-No                     PIC S9(4) BINARY VALUE ZERO.
      *                                    Current size of table.
           05  ID-Table                  OCCURS 0 TO 1000 TIMES
                                         DEPENDING ON ID-No
                                         ASCENDING KEY IS ID-Id
                                         INDEXED BY Idx.
               10  ID-Id                 PIC X(10).
       PROCEDURE DIVISION.
       A00-Begin.
           OPEN INPUT Pay-In
           MOVE LOW-VALUES TO Employee-Id, Old-Id
           PERFORM B20-Store-Ids WITH TEST AFTER
                   UNTIL Employee-Id = HIGH-VALUES
           CLOSE Pay-In
           SEARCH ALL ID-Table
             AT END DISPLAY "ID Found."
             WHEN ID-Id(Idx) = "A23456789" DISPLAY "ID FOUND"
           END-SEARCH
           GOBACK
           .
       B20-Store-Ids.
      ************************************************************
      * PROCEDURE TO READ IDS AND STORE THEM IN THE TABLE.       *
      * IN:  Pay-In file open.                                   *
      *      ID-No points to last entry in table.                *
      *      Old-Id contains previous ID.                        *
      * OUT: Pay-In file open.  One record read.                 *
      *      ID-No increased by 1.                               *
      *      Employee-Id stored in Old-Id, ID-Id(ID-No).         *
      *      Employee-Id contains HIGH-VALUES if EOF.            *
      ************************************************************
           READ Pay-In INTO Employee
             AT END MOVE HIGH-VALUES TO Employee-Id
             NOT AT END
               IF Employee-Id < Old-Id
                  THEN DISPLAY
                    "ERROR - PAYROLL FILE NOT IN SORT, RUN TERMINATED."
                       DISPLAY "OLD ID: ", Old-Id, " CURRENT ID: ",
                               Employee-Id
                       GO TO Z90-Stop-Run
               END-IF
               MOVE Employee-Id TO Old-Id
               ADD 1 TO ID-No
               IF ID-No > ID-Max
                  THEN DISPLAY
                        "ERROR - ID-Table OVERFLOW, RUN TERMINATED."
                       DISPLAY "PAYROLL RECORD: ", Employee-Id
                       DISPLAY
                     "INCREASE ID-Max, ID-Table AND RECOMPILE PROGRAM."
                       GO TO Z90-Stop-Run
               END-IF
               MOVE Employee-Id TO ID-Id(ID-No)
           END-READ
           .
      **** Exit
       Z90-Stop-Run.
           DISPLAY "TERMINATING PROGRAM READTBL."
           GOBACK
           .
       END PROGRAM READTBL.
READTBL.TXT:
A00000000X
A11111111X
A22222222X
A23456789X
A23456799X
B00000000X
B12345678X

0059">

Chapter 15
SEQUENTIAL INPUT/OUTPUT


Program illustrating order of statements. Page 271-272


This program does nothing except to illustrate the order in which the various statements are coded.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  ORDR.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           ALPHABET An-Alphabet IS ASCII.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File 
                  ASSIGN TO INFILE.
           SELECT File-1
                  RESERVE 2 AREAS
                  ORGANIZATION IS SEQUENTIAL
                  ACCESS MODE IS SEQUENTIAL
                  LOCK MODE IS AUTOMATIC
                  PASSWORD IS A-Password
                  FILE STATUS IS A-Status
                  ASSIGN TO INFILE1
                  .
           SELECT File-2 ASSIGN TO INFILE2.
           SELECT Sort-1 ASSIGN TO SORT1.
           SELECT Sort-2 ASSIGN TO SORT1.
       I-O-CONTROL.
           SAME RECORD AREA FOR File-1, FILE-2, 
           SAME SORT AREA FOR Sort-1, Sort-2,
           RERUN ON File-2 EVERY 100 RECORDS
           APPLY WRITE ONLY ON File-2
           .
       DATA DIVISION.
       FILE SECTION.
       FD  In-File.
       01  Infile-Rec                    PIC X(10).
       FD  File-1
           EXTERNAL
           GLOBAL
           BLOCK CONTAINS 0 RECORDS
           RECORD CONTAINS 20 CHARACTERS
           LINAGE IS 60 LINES
           RECORDING MODE IS F
           CODE-SET IS An-Alphabet.
       01  File-1-Rec                    PIC X(10).
       FD  File-2.
       01  File-2-Rec                    PIC X(10).
       SD  Sort-1.
       01  Sort-In-1                     PIC X(10).
       SD  Sort-2.
       01  Sort-In-2                     PIC X(10).
       WORKING-STORAGE SECTION.
       01  A-Password                    PIC X(8).
       01  A-Status                      PIC X(2).
       LINKAGE SECTION.
       PROCEDURE DIVISION.
       DECLARATIVES.
       A-Section SECTION.
           USE AFTER ERROR PROCEDURE ON INPUT.
       A-Paragraph.
           MOVE SPACES TO A-Status
           .
       END DECLARATIVES.
       END PROGRAM ORDR.
Sequential copy program.  Page 288-289
This program illustrates copying a sequential file.
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  COPY-PROGRAM.
      *****************************************************************
      * PROGRAM TO COPY A FILE.                                       *
      * IN:  In-File CONTAINS INPUT FILE.                             *
      * OUT: Out-File IS A COPY OF THE INPUT FILE.                    *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "COPYIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Out-File ASSIGN TO "COPYOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File BLOCK CONTAINS 0 RECORDS.
       01  In-Rec                        PIC X(40).
      *    NOTE:  THE RECORD LENGTH HAS BEEN SHORTENED FROM 100 TO 40 CHARACTERS
      *    FOR THIS EXAMPLE FOR CONVENIENCE IN FITTING THE DATA INTO A LISTING.
       FD  Out-File BLOCK CONTAINS 0 RECORDS.
       01  Out-Rec                       PIC X(40).
       WORKING-STORAGE SECTION.
       01  In-Record                     PIC X(40).
       01  Record-Counts.
           05  In-File-No                PIC S9(9) BINARY VALUE 0.
           05  Out-File-No               PIC S9(9) BINARY VALUE 0.
       01  EOF-In-Flag                   PIC X.
              88  EOF-In                 VALUE "Y".
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING COPY PROGRAM"
           OPEN INPUT In-File OUTPUT Out-File
           MOVE "N" TO EOF-In-Flag
           PERFORM WITH TEST AFTER UNTIL EOF-In
             READ In-File INTO In-Record
               AT END SET EOF-In TO TRUE
               NOT AT END
                 ADD 1 TO In-File-No
                 WRITE Out-Rec FROM In-Record
                 ADD 1 TO Out-File-No
             END-READ
           END-PERFORM
           DISPLAY "In-File-No: ", In-File-No,
                   "  Out-File-No: ", Out-File-No
           CLOSE In-File, Out-File
           GOBACK
           .
       END PROGRAM COPY-PROGRAM.
COPYIN.TXT:
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111
1111111111111111111111111111111111111111

0059">

Sequential Update Program. Page 289-291


This program updates a sequential file. It reads a master file, applies transactions to it from a transactions file, and writes an output file.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  UPDT.
      *****************************************************************
      * PROGRAM TO READ INPUT FILE, UPDATE IT FROM A TRANSACTIONS     *
      * FILE, AND WRITE AN OUTPUT FILE.                               *
      * IN:  Master-In CONTAINS INPUT FILE.                           *
      *      Trans-In CONTAINS THE TRANSACTIONS FILE.                 *
      * OUT: Master-Out CONTAINS THE UPDATED OUTPUT FILE.             *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT Master-In ASSIGN TO "UPDAIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Master-Out ASSIGN TO "UPDAOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Trans-In ASSIGN TO "UPDATR.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  Master-In BLOCK CONTAINS 0 RECORDS.
       01  Master-In-Rec                 PIC X(10).
       FD  Master-Out BLOCK CONTAINS 0 RECORDS.
       01  Master-Out-Rec                PIC X(10).
       FD  Trans-In BLOCK CONTAINS 0 RECORDS.
       01  Trans-In-Rec                  PIC X(10).
       WORKING-STORAGE SECTION.
       01  Master-Rec.
           05  Master-Key                PIC X(10).
       01  Trans-Rec.
           05  Trans-Key                 PIC X(10).
       01  EOF-Master-Flag               PIC X.
              88  EOF-Master             VALUE "Y".
       01  EOF-Trans-Flag                PIC X.
              88  EOF-Trans              VALUE "Y".
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING UPDT PROGRAM."
           OPEN INPUT Master-In, Trans-In, OUTPUT Master-Out
           MOVE "N" TO EOF-Master-Flag, EOF-Trans-Flag
           MOVE LOW-VALUES TO Trans-Key
           PERFORM WITH TEST AFTER UNTIL EOF-Master
             READ Master-In INTO Master-Rec
               AT END SET EOF-Master TO TRUE
               NOT AT END
                  IF Trans-Key NOT = LOW-VALUES AND < Master-Key
                     THEN DISPLAY "NO MASTER FOR TRANS RECORD."
                          DISPLAY "Trans-Key: ", Trans-Key
                  END-IF
                  PERFORM A20-Read-Trans WITH TEST BEFORE
                          UNTIL Trans-Key >= Master-Key OR
                                EOF-Trans
                  IF (NOT EOF-Trans) AND Trans-Key = Master-Key
                     THEN DISPLAY "UPDATING MASTER: ", Master-Key
                          MOVE LOW-VALUES TO Trans-Key
                  END-IF
                  WRITE Master-Out-Rec FROM Master-Rec
             END-READ
           END-PERFORM
           .
      **** Exit
       A20-Read-Trans.
           READ Trans-In INTO Trans-Rec
             AT END SET EOF-Trans TO TRUE
             NOT AT END
                IF Trans-Key < Master-Key
                   THEN DISPLAY "NO MASTER FOR TRANS RECORD."
                        DISPLAY "Trans-Key: ", Trans-Key
                END-IF
           END-READ
           .
      **** Exit
       END PROGRAM UPDT.
UPDAIN.TXT:
1111111111
2222222222
3333333333
6666666666
7777777777
9999999999
UPDATR.TXT:
2222222222
4444444444
5555555555
9999999999

0059">

Program to update with REWRITE statement. Page 292-293


This program rewrites records in a sequential file.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  PROG-REWRITE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT Payroll-IO ASSIGN TO "REWIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  Payroll-IO BLOCK CONTAINS 0 RECORDS.
       01  Payroll-Record                PIC X(80).
       WORKING-STORAGE SECTION.
       01  Pay-Rec.
           05  Pay-Key                   PIC X(20).
           05  Pay-Type                  PIC X.
           05  Pay-Amt                   PIC S9(5)V99.
           05  Pay-Rest                  PIC X(52).
       01  EOF-Pay-Flag                  PIC X.
           88  EOF-Pay                   VALUE "Y".
       PROCEDURE DIVISION.
       A00-Begin.
           OPEN I-O Payroll-IO
           MOVE "N" TO EOF-Pay-Flag
           PERFORM WITH TEST AFTER UNTIL Pay-Key = HIGH-VALUES OR
                                         EOF-Pay
             READ Payroll-IO INTO Pay-Rec
               AT END SET EOF-Pay TO TRUE
               NOT AT END
                  IF Pay-Type = "A"
                     THEN MOVE ZERO TO Pay-Amt
                          REWRITE Payroll-Record FROM Pay-Rec
                  END-IF
             END-READ
           END-PERFORM
       END PROGRAM PROG-REWRITE.

0059">

Sequential file update example. Page 294-300


This program updates records in a sequential file. The master file is read, and transactions are applied to it, and the updated records are written into an output file.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  UPDATE-IT.
      *****************************************************************
      * PROGRAM TO READ INPUT FILE, UPDATE IT FROM A TRANSACTIONS     *
      * FILE, AND WRITE AN OUTPUT FILE.                               *
      * IN:  Old-Master CONTAINS INPUT FILE.                          *
      *      Trans-File CONTAINS THE TRANSACTIONS FILE.               *
      * OUT: New-Master CONTAINS THE UPDATED OUTPUT FILE.             *
      *****************************************************************
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT Old-Master ASSIGN TO "MASTER.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Trans-File ASSIGN TO "TRANS.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT New-Master ASSIGN TO "MSTROUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  Old-Master BLOCK CONTAINS 0 RECORDS.
       01  Old-Master-Record             PIC X(40).
*    NOTE:  THE RECORD LENGTH HAS BEEN SHORTENED FROM 100 TO 40 CHARACTERS
      *    FOR THIS EXAMPLE FOR CONVENIENCE IN FITTING THE DATA INTO A LISTING.
       FD  Trans-File BLOCK CONTAINS 0 RECORDS.
       01  Trans-Record                  PIC X(41).
       FD  New-Master BLOCK CONTAINS 0 RECORDS.
       01  New-Master-Record.
           05  New-Master-Key            PIC X(5).
           05  New-Master-Fields         PIC X(35).
       WORKING-STORAGE SECTION.
       01  Master-Rec.
           05  Master-Key                PIC X(5).
      *         LOW-VALUES: No record.   HIGH-VALUES: EOF.
               88  EOF-Master            VALUE HIGH-VALUES.
               88  No-Master-Rec         VALUE LOW-VALUES.
           05  Master-Fields             PIC X(35).
       01  Prev-Master-Key               PIC X(5).
       01  Trans-Rec.
           05  Trans-Key                 PIC X(5).
      *         LOW-VALUES: No record.   HIGH-VALUES: EOF.
               88  EOF-Trans             VALUE HIGH-VALUES.
               88  No-Trans-Rec          VALUE LOW-VALUES.
           05  Trans-Action              PIC X.
      *         I - Insert, D - Delete, U - Update.
           05  Trans-Fields              PIC X(35).
       01  Hold-Rec.
      *         Hold-Rec contains inserted Trans-Rec until written.
           05  Hold-Key                  PIC X(5).
      *         LOW-VALUES: Record deleted.  HIGH-VALUES: No record.
               88  EOF-Hold              VALUE HIGH-VALUES.
               88  No-Hold-Rec           VALUE LOW-VALUES.
           05  Hold-Fields               PIC X(35).
       01  Prev-Trans.
           05  Prev-Trans-Key            PIC X(5).
           05  Prev-Trans-Action         PIC X.
       01  Record-Counts.
           05  Old-Master-Count          PIC S9(9) BINARY VALUE 0.
           05  Trans-File-Count          PIC S9(9) BINARY VALUE 0.
           05  New-Master-Count          PIC S9(9) BINARY VALUE 0.
           05  Trans-Change-Count        PIC S9(9) BINARY VALUE 0.
           05  Trans-Add-Count           PIC S9(9) BINARY VALUE 0.
           05  Trans-Del-Count           PIC S9(9) BINARY VALUE 0.
           05  Trans-Error-Count         PIC S9(9) BINARY VALUE 0.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "START OF UPDATE PROGRAM"
           OPEN INPUT Old-Master, Trans-File, OUTPUT New-Master
           SET No-Master-Rec, No-Trans-Rec TO TRUE
           MOVE LOW-VALUES TO Trans-Action
           SET EOF-HOLD TO TRUE
           PERFORM A00-Read-Master WITH TEST AFTER
                   UNTIL EOF-Master AND EOF-Trans
           CLOSE Old-Master, Trans-File, New-Master
           DISPLAY "OLD MASTER RECORDS READ:    ", Old-Master-Count
           DISPLAY "TRANS RECORDS READ:         ", Trans-File-Count
           DISPLAY "NEW MASTER RECORDS WRITTEN: ", New-Master-Count
           DISPLAY "OLD MASTER RECORDS DELETED: ", Trans-Del-Count
           DISPLAY "OLD MASTER RECORDS CHANGED: ", Trans-Change-Count
           DISPLAY "NEW TRANSACTIONS ADDED:     ", Trans-Add-Count
           DISPLAY "TRANS ERROR COUNT:          ", Trans-Error-Count
           DISPLAY "END OF UPDATE PROGRAM EXECUTION"
           GOBACK
           .
       A00-Read-Master.
      ************************************************************
      *  PROCEDURE TO READ ALL MASTER RECORDS.                   *
      *  IN:  MASTER, TRANS, New-Master files open.              *
      *  OUT: MASTER and TRANS file records read.                *
      *      Master-Key, Trans-Key contain HIGH-VALUES when both *
      *       reach EOF.                                         *
      ************************************************************
      *                 Get a master record.
           PERFORM A10-Get-Next-Master WITH TEST BEFORE
                   UNTIL NOT No-Master-Rec
      *                 Process transactions up to the master record.
           PERFORM A30-Get-Next-Trans WITH TEST BEFORE
                   UNTIL NOT No-Trans-Rec
      *                 If you are holding a record less than the 
      *                 transaction record, write it out.
           IF NOT No-Hold-Rec AND NOT EOF-Hold AND Hold-Key < Trans-Key
              THEN MOVE Hold-Rec TO New-Master-Record
                   PERFORM A50-Write-Master
                   SET EOF-Hold TO TRUE
           END-IF
           EVALUATE TRUE
             WHEN EOF-Trans AND EOF-Master
      *                 EOF for both files.
                  CONTINUE
             WHEN Trans-Key < Master-Key AND
               EOF-Hold OR No-Hold-Rec
      *                 Apply transaction where it doesn't match a master
      *                 record.
                  PERFORM A60-Apply-Trans
                  SET No-Trans-Rec TO TRUE
             WHEN Trans-Key < Master-Key AND
                  NOT EOF-Hold AND NOT No-Hold-Rec
      *                 Apply transaction where you have a record held.
                  PERFORM A70-Apply-To-Hold
                  SET No-Trans-Rec TO TRUE
             WHEN Trans-Key = Master-Key
      *                 Apply transaction to master record.
                  PERFORM A80-Apply-To-Master
                  SET No-Trans-Rec TO TRUE
             WHEN Trans-Key > Master-Key AND No-Master-Rec
      *                 Delete master file record.
                  ADD 1 TO Trans-Del-Count
                  SET No-Trans-Rec TO TRUE
             WHEN Trans-Key > Master-Key AND
                  NOT No-Master-Rec
      *                 All transactions applied.  Write master record.
                  MOVE Master-Rec TO New-Master-Record
                  PERFORM A50-Write-Master
                  MOVE Master-Key TO Prev-Master-Key
                  SET No-Master-Rec TO TRUE
           END-EVALUATE
           .
      **** Exit
       A10-Get-Next-Master.
      ************************************************************
      *  PROCEDURE TO READ NEXT MASTER RECORD.                   *
      *  IN:  MASTER file open.                                  *
      *  OUT: Master-Rec contains record.                        *
      *       Master-Key contains HIGH-VALUES if EOF.            *
      ************************************************************
              READ Old-Master INTO Master-Rec
                AT END SET EOF-Master TO TRUE
                NOT AT END
                   ADD 1 TO Old-Master-Count
                   PERFORM A20-Validate-Master
              END-READ
              .
      **** Exit
       A20-Validate-Master.
      ************************************************************
      *  PROCEDURE TO VALIDATE MASTER RECORD.                    *
      *  IN:  Master-Rec contains record.                        *
      *  OUT: Master-Key set to LOW-VALUES if invalid.           *
      ************************************************************
           IF Master-Key < Prev-Master-Key
              THEN DISPLAY "ERROR--MASTER FILE NOT IN SEQUENCE:"
                   DISPLAY "Prev-Master-Key: ", Prev-Master-Key,
                           " Master-Key: ", Master-Key
                   GO TO Z90-Stop-Run
           END-IF
           IF Master-Key = Prev-Master-Key
              THEN DISPLAY "ERROR--DUPLICATE MASTER RECORDS:"
                   DISPLAY "Master-Key: ", Master-Key
                   ADD 1 TO Trans-Error-Count
                   SET No-Master-Rec TO TRUE
           END-IF
           .
      **** Exit
       A30-Get-Next-Trans.
      ************************************************************
      *  PROCEDURE TO READ NEXT TRANS RECORD.                    *
      *  IN:  TRANS file open.                                   *
      *  OUT: Trans-Rec contains record.                         *
      *       Trans-Key contains HIGH-VALUES if EOF.             *
      ************************************************************
              MOVE Trans-Key TO Prev-Trans-Key
              MOVE Trans-Action TO Prev-Trans-Action
              READ Trans-File INTO Trans-Rec
                AT END SET EOF-Trans TO TRUE
                NOT AT END
                   ADD 1 TO Trans-File-Count
                   PERFORM A40-Validate-Trans
              END-READ
              .
      **** Exit
       A40-Validate-Trans.
      ************************************************************
      *  PROCEDURE TO VALIDATE TRANS RECORD.                     *
      *  IN:  Trans-Rec contains record.                         *
      *  OUT: Trans-Key set to LOW-VALUES if invalid.            *
      ************************************************************
           EVALUATE TRUE
             WHEN Trans-Key < Prev-Trans-Key
                  DISPLAY "ERROR--TRANS FILE OUT OF SEQUENCE"
                  DISPLAY "OLD-Key: ", Prev-Trans-Key,
                          " New-Key: ", Trans-Key
                  GO TO Z90-Stop-Run
             WHEN Trans-Key = Prev-Trans-Key AND
                  Trans-Action < Prev-Trans-Action
                  DISPLAY "ERROR--TRANS ACTIONS OUT OF SEQUENCE"
                  DISPLAY "OLD Key: ", Prev-Trans-Key,
                          " OLD ACTION: ", Prev-Trans-Action,
                          " New KEY: ", Trans-Key,
                          " New ACTION: ", Trans-Action
                  GO TO Z90-Stop-Run
           END-EVALUATE
           IF Trans-Action = "I" OR "U" OR "D"
              THEN CONTINUE
              ELSE DISPLAY "ERROR--BAD TRANS ACTION.  KEY: ", Trans-Key,
                           " ACTION: ", Trans-Action
                   SET No-Trans-Rec TO TRUE
                   ADD 1 TO Trans-Error-Count
           END-IF
           .
      **** Exit
       A50-Write-Master.
      ************************************************************
      *  PROCEDURE TO WRITE NEW MASTER RECORD.                   *
      *  IN:  Record stored in New-Master-Record.                *
      *  OUT: New-Master-Record written.                         *
      ************************************************************
           ADD 1 TO New-Master-Count
           WRITE New-Master-Record
           .
      **** Exit
       A60-Apply-Trans.
      ************************************************************
      *  PROCEDURE TO APPLY TRANSACTION WHERE NO MASTER RECORD.   *
      *  IN:  Trans-Rec contains record.                          *
      *  OUT: Trans-Rec stored in Hold-Rec if insert.             *
      ************************************************************
              EVALUATE Trans-Action
                WHEN "D"
                     DISPLAY "ERROR--DELETE WITH NO MASTER RECORD"
                     DISPLAY "IGNORING Trans-Key: ", Trans-Key
                     ADD 1 TO Trans-Error-Count
                WHEN "I" PERFORM A90-Trans-Add
                WHEN "U"
                     DISPLAY "ERROR--UPDATE WITH NO MASTER RECORD"
                     DISPLAY "IGNORING Trans-Key: ", Trans-Key
                     ADD 1 TO Trans-Error-Count
              END-EVALUATE
              .
      **** Exit
       A70-Apply-To-Hold.
      ************************************************************
      *  PROCEDURE TO APPLY TRANS TO HOLD RECORD.                *
      *  IN:  Trans-Rec contains transaction.                    *
      *       Trans-Key = Hold-Key.                              *
      *       Hold-Rec contains previous TRANSACTION.            *
      *  OUT: Record applied to Hold-Rec.                        *
      *      Hold-Key set to HIGH-VALUES if Hold-Rec written.    *
      *                      LOW-VALUES if Hold-Rec deleted.     *
      ************************************************************
           EVALUATE TRUE
             WHEN Trans-Key > Hold-Key
                  MOVE Hold-Rec TO New-Master-Record
                  PERFORM A50-Write-Master
                  SET EOF-Hold TO TRUE
                  PERFORM A60-Apply-Trans
             WHEN Trans-Action = "D"
                  SET No-Hold-Rec TO TRUE
                  ADD 1 TO Trans-Del-Count
             WHEN Trans-Action = "I"
                  DISPLAY "ERROR--INSERTING WITH MASTER RECORD"
                  DISPLAY "IGNORING Trans-Key: ", Trans-Key
                  ADD 1 TO Trans-Error-Count
             WHEN Trans-Action = "U"
                  MOVE Trans-Fields TO Hold-Fields
                  ADD 1 TO Trans-Change-Count
           END-EVALUATE
           .
      **** Exit
       A80-Apply-To-Master.
      ************************************************************
      *  PROCEDURE TO APPLY TRANS TO MASTER RECORD.              *
      *  IN:  Trans-Rec contains transaction.                    *
      *         Trans-Key = Master-Key                           *
      *       Master-Rec contains master record.                 *
      *  OUT: RECORD applied to Master-Rec.                      *
      *       Master-Key set to LOW-VALUES if deleted.           *
      ************************************************************
           EVALUATE TRUE
             WHEN Trans-Action = "I" AND No-Master-Rec
                  PERFORM A90-Trans-Add
             WHEN Trans-Action = "I" AND NOT No-Master-Rec
                  DISPLAY "ERROR--Add WHEN MASTER PRESENT: ",
                          Trans-Key
                  ADD 1 TO Trans-Error-Count
              WHEN Trans-Action = "D" AND NOT No-Master-Rec
                   MOVE Master-Key TO Prev-Master-Key
                   SET No-Master-Rec TO TRUE
                   ADD 1 TO Trans-Del-Count
              WHEN Trans-Action = "D" AND No-Master-Rec
                   DISPLAY "ERROR-DELETING DELETED RECORD: ", Trans-Key
                   ADD 1 TO Trans-Error-Count
              WHEN Trans-Action = "U" AND NOT No-Master-Rec
                   ADD 1 TO Trans-Change-Count
                   MOVE Trans-Fields TO Master-Fields
              WHEN Trans-Action = "U" AND No-Master-Rec
                   DISPLAY "ERROR--CHANGING DELETED RECORD: ", Trans-Key
                   ADD 1 TO Trans-Error-Count
           END-EVALUATE
           .
      **** Exit
       A90-Trans-Add.
      ************************************************************
      *  PROCEDURE TO INSERT A Trans-Rec RECORD.                 *
      *  IN:  Trans-Rec contains transaction.                    *
      *  OUT: Hold-Rec contains transaction.                     *
      ************************************************************
           ADD 1 TO Trans-Add-Count
           MOVE Trans-Key TO Hold-Key
           MOVE Trans-Fields TO Hold-Fields
           .
      **** Exit
       Z90-Stop-Run.
      ************************************************************
      *  PROCEDURE TO TERMINATE RUN IF ERROR.                    *
      *  IN:  All files open.                                    *
      *  OUT: RETURN-CODE set to 16.                             *
      *       All files closed.                                  *
      ************************************************************
           DISPLAY "RUN TERMINATED FOR ERRORS."
           MOVE 16 TO RETURN-CODE
           CLOSE Old-Master, Trans-File, New-Master
           GOBACK
           .
       END PROGRAM UPDATE-IT.
MASTER.TXT:
AAAAA-----------------------------------
AAAAB-----------------------------------
AAAAC-----------------------------------
AAAAD-----------------------------------
AAAAE-----------------------------------
AAAAF-----------------------------------
AAAAG-----------------------------------
AAAAH-----------------------------------
AAAAI-----------------------------------
AAAAJ-----------------------------------
AAAAK-----------------------------------
AAAAL-----------------------------------
AAAAM-----------------------------------
AAAAN-----------------------------------
AAAAO-----------------------------------
AAAAP-----------------------------------
AAAAQ-----------------------------------
AAAAR-----------------------------------
AAAAS-----------------------------------
AAAAT-----------------------------------
AAAAU-----------------------------------
AAAAV-----------------------------------
AAAAW-----------------------------------
AAAAX-----------------------------------
AAAAY-----------------------------------
AAAAZ-----------------------------------
BBBAB-----------------------------------
BBBBB-----------------------------------
BBBCB-----------------------------------
BBBDB-----------------------------------
BBBEB-----------------------------------
BBBFB-----------------------------------
BBBGB-----------------------------------
BBBHB-----------------------------------
BBBIB-----------------------------------
BBBJB-----------------------------------
BBBKB-----------------------------------
BBBLB-----------------------------------
BBBMB-----------------------------------
BBBNB-----------------------------------
BBBOB-----------------------------------
BBBPB-----------------------------------
BBBQB-----------------------------------
BBBRB-----------------------------------
BBBSB-----------------------------------
BBBTB-----------------------------------
BBBUB-----------------------------------
BBBVB-----------------------------------
BBBWB-----------------------------------
BBBXB-----------------------------------
BBBYB-----------------------------------
BBBZB-----------------------------------
CCACC-----------------------------------
CCBCC-----------------------------------
CCCCC-----------------------------------
CCDCC-----------------------------------
CCECC-----------------------------------
CCFCC-----------------------------------
CCGCC-----------------------------------
CCHCC-----------------------------------
CCICC-----------------------------------
CCJCC-----------------------------------
CCKCC-----------------------------------
CCLCC-----------------------------------
CCMCC-----------------------------------
CCNCC-----------------------------------
CCOCC-----------------------------------
CCPCC-----------------------------------
CCQCC-----------------------------------
CCRCC-----------------------------------
CCSCC-----------------------------------
CCTCC-----------------------------------
CCUCC-----------------------------------
CCVCC-----------------------------------
CCWCC-----------------------------------
CCXCC-----------------------------------
CCYCC-----------------------------------
CCZCC-----------------------------------
DADDD-----------------------------------
DBDDD-----------------------------------
DCDDD-----------------------------------
DDDDD-----------------------------------
DEDDD-----------------------------------
DFDDD-----------------------------------
DGDDD-----------------------------------
DHDDD-----------------------------------
DIDDD-----------------------------------
DJDDD-----------------------------------
DKDDD-----------------------------------
DLDDD-----------------------------------
DMDDD-----------------------------------
DNDDD-----------------------------------
DODDD-----------------------------------
DPDDD-----------------------------------
DQDDD-----------------------------------
DRDDD-----------------------------------
DSDDD-----------------------------------
DTDDD-----------------------------------
DUDDD-----------------------------------
DVDDD-----------------------------------
TRANS.TXT:
AAAAAI+++++++++++++++++++++++++++++++++++
AAAABU+++++++++++++++++++++++++++++++++++
AAAACD+++++++++++++++++++++++++++++++++++
AAAAEI+++++++++++++++++++++++++++++++++++
DADDDD+++++++++++++++++++++++++++++++++++
DBDDDD+++++++++++++++++++++++++++++++++++
DCDDDD+++++++++++++++++++++++++++++++++++
DDDDDD+++++++++++++++++++++++++++++++++++
DEDDDD+++++++++++++++++++++++++++++++++++
ZAAAAI+++++++++++++++++++++++++++++++++++

0059">

Chapter 19
PROGRAM ORGANIZATION


Program showing main program divisions and their order. Page 378- 380


This program does nothing except to show the main program division and the order in which they must be coded.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  MAIN-PGM.
       AUTHOR.  John Doe.
       INSTALLATION.  Some Place.
       DATE-WRITTEN.  Today.
       DATE-COMPILED.  Today.
       SECURITY.  Not much.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER.  PC.
       OBJECT-COMPUTER.  PC.
       SPECIAL-NAMES.
           ALPHABET Vowels IS "A", "E", "I", "O", "U"
           SYMBOLIC CHARACTERS A-Dash IS 97
           CLASS Odd-Num IS "1", "3", "5", "7", "9" 
           CURRENCY SIGN IS "F"
           DECIMAL-POINT IS COMMA
           .
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO INFILE
                  RESERVE 2 AREAS
                  ORGANIZATION IS SEQUENTIAL
                  ACCESS IS SEQUENTIAL
                  LOCK MODE IS AUTOMATIC
                  PASSWORD IS A-Password
                  FILE STATUS IS A-Status
                  .
           SELECT File-1 ASSIGN TO INFILE1.
           SELECT File-2 ASSIGN TO INFILE2.
           SELECT Sort-1 ASSIGN TO SORT1.
           SELECT Sort-2 ASSIGN TO SORT1.
       I-O-CONTROL.
           SAME RECORD AREA FOR File-1, File-2, 
           SAME SORT AREA FOR Sort-1, Sort-2,
           RERUN ON File-2 EVERY 100 RECORDS
           APPLY WRITE ONLY ON File-2
           .
       DATA DIVISION.
       FILE SECTION.
       FD  In-File
           EXTERNAL
           GLOBAL
           BLOCK CONTAINS 0 RECORDS
           RECORD CONTAINS 20 CHARACTERS
           LINAGE IS 60 LINES
           RECORDING MODE IS F
           CODE-SET IS An-Alphabet
           .
       01  In-File-Rec                   PIC X(20).
       FD  File-1.
       01  File-1-Rec                    PIC X(10).
       FD  File-2.
       01  File-2-Rec                    PIC X(10).
       SD  Sort-1.
       01  Sort-In-1                     PIC X(10).
       SD  Sort-2.
       01  Sort-In-2                     PIC X(10).
       WORKING-STORAGE SECTION.
       01  A-Password                    PIC X(9).
       01  A-Status                      PIC X(2).
       LOCAL-STORAGE SECTION.
       LINKAGE SECTION.
       PROCEDURE DIVISION.
       DECLARATIVES.
       A-Section SECTION.
           USE AFTER ERROR PROCEDURE ON INPUT
           .
       A-Paragraph.
           DISPLAY "I'm here."
           .
       END DECLARATIVES.
       A00-Begin.
           DISPLAY "Hello world."
           .
       END PROGRAM MAIN-PGM.

0059">

Program showing usual statements needed. Page 380


This is a prototype program showing the statement usually coded in a COBOL program.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  USUAL.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "USUAL.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File 
           BLOCK CONTAINS 0 RECORDS.
       01  In-File-Rec                   PIC X(20).
       WORKING-STORAGE SECTION.
       01  In-Rec                        PIC X(20).
       PROCEDURE DIVISION.
       A00-Begin.
           GOBACK
           .
       END PROGRAM USUAL.

0059">

Program to accept PARM information. Page 385-386


This program illustrates how to code a program to accept OS/390 JCL PARM information.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  PARM-IN.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "PARM.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File 
           BLOCK CONTAINS 0 RECORDS.
       01  In-File-Rec                   PIC X(20).
       WORKING-STORAGE SECTION.
       01  In-Rec                        PIC X(20).
       01  EOF-In                        PIC X.
       01  The-Value                     PIC 99.
       01  In-Count                      PIC S9(4) BINARY VALUE 0.
      *                                    Counts the In-File records.
       LINKAGE SECTION.
       01  Parm.
           05  Parm-Length               PIC S9(4) BINARY SYNC.
           05  Parm-Value.
               10  Parm-Debug            PIC X.
      *                                   "Y" turns debugging on.
               10  Parm-Cutoff           PIC 9(5).
      *                                    Cutoff count
           05  FILLER                    PIC X(74).
       PROCEDURE DIVISION USING Parm.
       A00-Begin.
           IF Parm-Length = ZERO
              THEN MOVE "N" TO Parm-Debug
                   MOVE 99999 TO Parm-Cutoff
              ELSE DISPLAY "DEBUG FLAG: ", Parm-Debug
                   DISPLAY "INPUT RECORD CUTOFF: ", Parm-Cutoff
           END-IF
           READ In-File INTO In-Rec
              AT END MOVE "Y" TO EOF-In
              NOT AT END
                 ADD 1 TO In-Count
                 IF (Parm-Cutoff < 99999) AND
                    (In-Count = Parm-Cutoff)
                    THEN MOVE "Y" TO EOF-In
                 END-IF
           END-Read
           IF Parm-Debug = "Y"
                 THEN DISPLAY "The Value: ", The-Value
              END-IF
       END PROGRAM PARM-IN.

0059">

Program illustrating parameters used for debugging. Page 391-394


This program illustrates how to use OS/390 JCL PARM information for debugging.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TESTPGM.
      *****************************************************************
      * This program reads in a file and selects records with an      *
      * "X" in column 80.  The selected records are written into an   *
      * output file.  The program serves no purpose but to illustrate *
      * how a simple COBOL program might be written.                  *
      * RETURN-CODE is ZERO for normal run; 4 for bad PARM field.     *
      *****************************************************************
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER.  IBM-390 WITH DEBUGGING MODE.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT In-File ASSIGN TO "TSTIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Out-File ASSIGN TO "TSTOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  In-File BLOCK CONTAINS 0 RECORDS.
       01  In-File-Image                 PIC X(80).
       FD  Out-File BLOCK CONTAINS 0 RECORDS.
       01  Out-File-Image                PIC X(80).
       WORKING-STORAGE SECTION.
       01  In-File-Read                  PIC S9(4) BINARY VALUE ZERO.
       01  Out-File-Written              PIC S9(4) BINARY VALUE ZERO.
       01  In-File-EOF                   PIC X.
       01  File-Image.
      *                                    This is the line read in.
           05  FILLER                    PIC X(79).
      *                                    Columns 1 to 79 ignored.
           05  CC-80                     PIC X.
      *                                    Look for "X" in column 80.
       LINKAGE SECTION.
      ******************************************************************
      * The PARM field is set up to allow the program to be cut off    *
      * after some number of records has been read.  Code the          *
      * following on the EXEC statement to cut off early for debugging *
      * purposes, where nnnnn is the maximum number of records to      *
      * read.  Remember to code the leading zeros.  p is flag to       *
      * print input records read and output records written.  Code     *
      * "Y" to print, "N" to not print.                                *
      *                                                                *
      * // EXEC COB2UCLG,PARM.GO='nnnnnp'                              *
      *                                                                *
      * // EXEC COB2UCLG,PARM.GO='00100Y'   CUTOFF AFTER 100 RECORDS.  *
      *                                     PRINT RECORDS.             *
      ******************************************************************
       01  Parm.
           05  Parm-Length               PIC S9(4) BINARY SYNC.
           05  Parm-Field.
               10  Parm-Cutoff           PIC 9(5).
               10  Parm-Print            PIC X.
               10  FILLER                PIC X(94).
       PROCEDURE DIVISION USING Parm.
       DECLARATIVES.
       Debug-It SECTION.
      *         This provides a trace of the procedures invoked.
              USE FOR DEBUGGING ON ALL PROCEDURES.
       Debug-Procedures.
              DISPLAY DEBUG-LINE, DEBUG-NAME, DEBUG-CONTENTS.
       END DECLARATIVES.
       A00-Begin.
           DISPLAY "PROGRAM TEST EXECUTION BEGINS."
           PERFORM A10-Initialize
           MOVE "N" TO In-File-EOF
           PERFORM A20-Read-All-Records WITH TEST AFTER
                   UNTIL In-File-EOF = "Y"
           PERFORM A40-Terminate
           GOBACK
           .
       A10-Initialize.
      ************************************************************
      * PROCEDURE TO ADD INITIALIZE FOR RUN.                     *
      * IN: All files closed.                                    *
      *     PARM fields stored in LINKAGE SECTION.               *
      * OUT: Parm-Cutoff contains valid cutoff value.            *
      *      In-File opened for input.                           *
      *      Out-File opened for output.                         *
      ************************************************************
           IF Parm-Length NOT = 6
              THEN MOVE 99999 TO Parm-Cutoff
                   MOVE "N" TO Parm-Print
              ELSE IF Parm-Cutoff NOT NUMERIC
                      THEN DISPLAY "WARNING--BAD PARM RECORD COUNT: ",
                                   Parm-Cutoff
                           MOVE 4 TO RETURN-CODE
                           MOVE 99999 TO Parm-Print
                      ELSE DISPLAY "WILL CUTOFF AFTER ", Parm-Cutoff,
                                   "RECORDS READ FOR DEBUGGING"
                   END-IF
                   IF Parm-Print NOT = "Y" AND Parm-Print NOT = "N"
                      THEN DISPLAY 
                           "WARNING--INCORRECT PARM PRINT FLAG: ",
                                   Parm-Print
                           MOVE 4 TO RETURN-CODE
                           MOVE "N" TO Parm-Print
                      ELSE DISPLAY "PARM PRINT FLAG: ", Parm-Print
                   END-IF
           END-IF
           OPEN INPUT In-File, OUTPUT Out-File
           .
      **** Exit
       A20-Read-All-Records.
      *************************************************************
      * PROCEDURE TO READ ALL THE RECORDS IN In-File.             *
      * IN: In-File opened for input.                             *
      *     Out-File opened for output.                           *
      *     In-File-EOF contains "N".                             *
      * OUT: Records with X in column 80 written into Out-File.   *
      *      Out-File-Written bumped by 1 if record written.      *
      *************************************************************
           MOVE SPACE TO CC-80
           PERFORM A30-Select-A-Record WITH TEST AFTER
                   UNTIL (CC-80 = "X") OR (In-File-EOF = "Y")
           IF In-File-EOF NOT = "Y"
              THEN WRITE Out-File-Image FROM File-Image
                   ADD 1 TO Out-File-Written
                   IF Parm-Print = "Y"
                      THEN DISPLAY "Out-File: ", File-Image
                   END-IF
           END-IF
           .
      **** Exit
       A30-Select-A-Record.
      ************************************************************
      * PROCEDURE TO ADD ENTRIES TO PERSON TABLE.                *
      * IN: In-File opened for input.                            *
      *     In-File-EOF contains "N".                            *
      * OUT: In-File-EOF set to "Y" if EOF for In-File or        *
      *      Parm-Cutoff records read.                           *
      *      In-File bumped by 1 to count In-File record read.   *
      *      File-Image contains input record if no EOF.         *
      ************************************************************
           READ In-File INTO File-Image
             AT END MOVE "Y" TO In-File-EOF
             NOT AT END
                IF (Parm-Cutoff < 99999) AND
                   (In-File-Read = Parm-Cutoff)
                   THEN MOVE "Y" TO In-File-EOF
                        DISPLAY "CUTOFF FOR DEBUGGING."
                   ELSE ADD 1 TO In-File-Read
                        IF Parm-Print = "Y"
                           THEN DISPLAY "File-Image: ", File-Image
                        END-IF
                END-IF
           END-Read
           .
      **** Exit
       A40-Terminate.
      ************************************************************
      * PROCEDURE TO TERMINATE PROGRAM.                          *
      * IN:  In-File-Read contains count of In-File records read *
      *      Out-File-Written contains count of Out-File records *
      *      written.                                            *
      *      In-File and Out-File files open.                    *
      * OUT: End message and record counts displayed.            *
      *      In-File and Out-File files closed.                  *
      ************************************************************
           CLOSE In-File, Out-File
           DISPLAY "NORMAL COMPLETION OF PROGRAM TESTPGM."
           DISPLAY "RECORDS READ:    ", In-File-Read
           DISPLAY "RECORDS WRITTEN: ", Out-File-Written
           .
      **** Exit
       END PROGRAM TESTPGM.
TSTIN.TXT:
1111111111111111111111111111111111111111111111111111111111111111111111111111111X
22222222222222222222222222222222222222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444444444444444444444444444X
5555555555555555555555555555555555555555555555555555555555555555555555555555555X
66666666666666666666666666666666666666666666666666666666666666666666666666666666

0059">

Chapter 20
SUBPROGRAMS


Subprogram showing needed statements. Page 403-404


This illustrates the statement needed to code a subprogram.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  A-SUB.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Arg-1                         PIC X.
       01  Arg-2                         PIC X.
       01  Arg-3                         PIC X.
       PROCEDURE DIVISION USING Arg-1, Arg-2, Arg-3.
           DISPLAY "ENTERED SUBPROGRAM A-SUB"
           GOBACK.
       END PROGRAM A-SUB.

0059">

Program illustrating call to subprogram. Page 404


This program calls the TABLEPGM subprogram, supplying three arguments.


       IDENTIFICATION DIVISION.
       PROGRAM-ID. TESTPGM.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  A.
           05  Dd                        OCCURS 5 TIMES INDEXED BY Idd
                                         PIC X(20).
       01  B                             PIC S9(4) BINARY.
       01  C                             PIC X(20).
       PROCEDURE DIVISION.
       A00-Begin.
           MOVE 3 TO B
           MOVE SPACES TO C
           CALL "TABLEPGM" USING A, B, C
           GOBACK
           .
       END PROGRAM TESTPGM.

0059">

Subprogram example. Page 405.


This program illustrated a subprogram that has three arguments as input. It is called by the previous main program.


       IDENTIFICATION DIVISION.
       PROGRAM-ID. TABLEPGM.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  X.
           05  Xx                        PIC X(20) OCCURS 5 TIMES
                                         INDEXED BY Ixx.
       01  Y                             PIC S9(4) BINARY.
       01  Z                             PIC X(20).
       PROCEDURE DIVISION USING X, Y, Z.
       A00-Begin.
           PERFORM VARYING IXX FROM 1 BY 1 UNTIL Ixx > Y
              MOVE Z TO Xx(Ixx)
           END-PERFORM
           MOVE ZERO TO Y
           GOBACK
           .
       END PROGRAM TABLEPGM.

0059">

Chapter 21
FUNCTIONS


Program illustrating writing function. Page 430-431


This function converts minutes to seconds.


       IDENTIFICATION DIVISION.
       FUNCTION-ID.  Min-To-Sec.
      *****************************************************************
      * FUNCTION TO CONVERT MINUTES TO SECONDS.                       *
      * INVOKED:  Seconds - FUNCTION(Minute)                          *
      * IN:  Minutes contains minutes in PIC S9(9) BINARY.            *
      * OUT: Seconds contains seconds in PIC S9(9) BINARY.            *
      *****************************************************************
       DATA DIVISION
       LINKAGE SECTION.
       01  Min                           PIC S9(9) BINARY.
       01  Sec                           PIC S9(9) BINARY.
       PROCEDURE DIVISION USING Min RETURNING Sec.
       A00-Begin
           COMPUTE Sec = Min * 60
           EXIT FUNCTION
           .
       END FUNCTION Min-To-Sec.

0059">

Program illustrating use of function. Page 431


This program invokes the Min-To-Sec function to illustrate its use.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  Some-Program.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
           FUNCTION Min-To-Sec.
       WORKING-STORAGE SECTION.
       01  Minutes                       PIC S9(9).
       01  Seconds                       PIC S9(9).
       PROCEDURE DIVISION.
       A00-Begin.
           MOVE 32 TO Minutes
           COMPUTE Seconds = Min-To-Sec(Minutes)
           DISPLAY Seconds
           GOBACK
           .
       END PROGRAM Some-Program.

0059">

Chapter 22
ADVANCED CHARACTER MANIPULATION


Program illustrating character manipulation. Page 450-452 This program concatenates "MARY HAD A LITTLE LAMB." with "ITS FLEECE WAS WHITE AS SNOW."


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  CHAREXAMP.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Point-1                       PIC S9(4) BINARY.
       01  No-Moved                      PIC S9(4) BINARY.
       01  Point-3                       PIC S9(4) BINARY.
       01  Point-4                       PIC S9(4) BINARY.
       01  String-1                      PIC X(23) VALUE
                                         "MARY HAD A LITTLE LAMB.".
       01  String-2                      PIC X(29) VALUE
                                        "ITS FLEECE WAS WHITE AS SNOW.".
       01  String-3                      PIC X(55).
       01  String-4                      PIC X(55).
       01  String-5                      PIC X(55).
       PROCEDURE DIVISION.
       A00-Begin.
      ***************************************************************
      * See if String-1 contains "LAMB"                             *
      ***************************************************************
           MOVE ZERO TO Point-1
           INSPECT String-1 TALLYING Point-1 FOR ALL "LAMB"
      ***************************************************************
      *  Concatenate String-1 and String-2 into String-3.           *
      ***************************************************************
           MOVE SPACES TO String-3
           MOVE 1 TO Point-1
           STRING String-1 DELIMITED "." INTO String-3 POINTER Point-1
           STRING ".  " DELIMITED SIZE INTO String-3 POINTER Point-1
           STRING String-2 DELIMITED "." INTO String-3 POINTER Point-1
           STRING "." DELIMITED SIZE INTO String-3 POINTER Point-1
           DISPLAY String-3
      ***************************************************************
      *  FIND string "LITTLE LAMB" and move it to String-4.         *
      ***************************************************************
           MOVE SPACES TO String-4
           MOVE 1 TO Point-3
           STRING String-3 DELIMITED "LITTLE LAMB" INTO String-5
             POINTER Point-3
           IF Point-3 > 1
              THEN MOVE String-3(Point-3:FUNCTION LENGTH("LITTLE LAMB")) 
                        TO String-4
           END-IF
           DISPLAY String-4
      ***************************************************************
      *  Replace "LAMB" with "TOFU".                                *
      ***************************************************************
           INSPECT String-3 REPLACING ALL "LAMB" BY "TOFU"
           DISPLAY String-3
      ***************************************************************
      *  Replace "LITTLE" with "BIG" and store in String-4.         *
      ***************************************************************
           MOVE SPACES TO String-4
           MOVE 1 TO Point-3
           MOVE 1 TO Point-4
           PERFORM WITH TEST AFTER UNTIL Point-3 > LENGTH OF String-3
             UNSTRING String-3 DELIMITED "LITTLE" INTO String-5
               COUNT No-Moved
               POINTER Point-3
               ON OVERFLOW
                  MOVE String-5(1:No-Moved) TO 
                       String-4(Point-4:No-Moved)
                  ADD No-Moved TO Point-4
                  STRING "BIG" DELIMITED SIZE INTO String-4 
                         POINTER Point-4
                  END-STRING
               NOT ON OVERFLOW
                  IF No-Moved > ZERO THEN
                     MOVE String-5(1:No-Moved) TO 
                          String-4(Point-4:No-Moved)
                     ADD No-Moved TO Point-4
                  END-IF
             END-UNSTRING
           END-PERFORM
           DISPLAY String-4
           GOBACK
           .
       END PROGRAM CHAREXAMP.

0059">

Chapter 23
SORTING


Program sorting dates with two-digit years. Page 466-467


This program illustrates the use of both sort input and output procedures to sort dates. It uses the sliding window to convert the two-digit year to four digits for the sort.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  SORT-IT.
      *****************************************************************
      * PROGRAM TO SORT INPUT FILE, CONVERT TWO-DIGIT YEARS TO FOUR   *
      * DIGITS FOR THE SORT, AND WRITE THE SORTED OUTPUT FILE.        *
* IN:  File-I CONTAINS THE INPUT FILE.                          *
      * OUT: File-O CONTAINS THE SORTED INPUT FILE.                   *
      *****************************************************************
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT File-I ASSIGN TO "SORTIN.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT File-O ASSIGN TO "SORTOUT.TXT"
                  ORGANIZATION IS LINE SEQUENTIAL.
           SELECT Sort-File ASSIGN TO "SORTWK.TXT".
       DATA DIVISION.
       FILE SECTION.
       FD  File-I.
       01  File-I-Rec                    PIC X(66).
       FD  File-O.
       01  File-O-Rec                    PIC X(68).
       SD  Sort-File.
       01  Sort-Rec.
           05  Sort-Data                 PIC X(30).
           05  Sort-Date.
               10  Sort-Yr               PIC 9(4).
               10  Sort-Mo               PIC 99.
               10  Sort-Dy               PIC 99.
           05  Sort-More-Data            PIC X(30).
       WORKING-STORAGE SECTION.
       01  In-Rec.
           05  In-Data                   PIC X(30).
           05  In-Date.
               10  In-Yr                 PIC 99.
               10  In-Mo                 PIC 99.
               10  In-Dy                 PIC 99.
           05  In-More-Data              PIC X(30).
       01  EOF-In-Flag                   PIC X.
           88  EOF-In                    VALUE "Y".
       01  EOF-Sort-Flag                 PIC X.
           88  EOF-Sort                  VALUE "Y".
       01  N                             PIC S99 VALUE 2.
       01  Curr-Yr                       PIC 9(4).
       PROCEDURE DIVISION.
           SORT Sort-File
             ON ASCENDING KEY Sort-Date
             INPUT PROCEDURE IS B10-Get-Records
             OUTPUT PROCEDURE IS C10-Write-Records
           GOBACK
           .
       B10-Get-Records.
           MOVE "N" TO EOF-In-Flag
           OPEN INPUT File-I
           PERFORM UNTIL EOF-In
             READ File-I INTO In-Rec
               AT END SET EOF-In TO TRUE
               NOT AT END
                  MOVE In-Data TO Sort-Data
                     MOVE In-More-Data TO Sort-More-Data
                     MOVE FUNCTION CURRENT-DATE(1:4) TO Curr-Yr
                     MOVE In-Mo TO Sort-Mo
                     MOVE In-Dy TO Sort-Dy
                     COMPUTE Curr-Yr, Sort-Yr = Curr-Yr + N
                     MOVE "00" TO Sort-Yr(3:2)
                      IF In-Yr > Curr-Yr(3:2)
                         THEN COMPUTE Sort-Yr = In-Yr + Sort-Yr - 100
                         ELSE COMPUTE Sort-Yr = In-Yr + Sort-Yr
                      END-IF
                      RELEASE Sort-Rec
             END-READ
           END-PERFORM
           CLOSE File-I
           .
      **** EXIT
       C10-Write-Records.
           MOVE "N" TO EOF-Sort-Flag
           OPEN OUTPUT File-O
           PERFORM UNTIL EOF-Sort
             RETURN Sort-File
               AT END SET EOF-Sort TO TRUE
               NOT AT END
                      MOVE Sort-Data TO In-Data
                      MOVE Sort-More-Data TO In-More-Data
                      MOVE Sort-Yr(3:2) TO In-Yr
                      MOVE Sort-Mo TO In-Mo
                      MOVE Sort-Dy TO In-DY
                      WRITE File-O-Rec FROM In-Rec
             END-RETURN
           END-PERFORM
           CLOSE File-O
           .
      **** EXIT
       END PROGRAM SORT-IT.
SORTIN.TXT:
111111111111111111111111111111640228111111111111111111111111111111
222222222222222222222222222222660101222222222222222222222222222222
333333333333333333333333333333651231333333333333333333333333333333
444444444444444444444444444444671111444444444444444444444444444444
555555555555555555555555555555680606555555555555555555555555555555

0059">

Chapter 24
FULL-SCREEN I/O IN PC APPLICATIONS


Program illustrating full-screen I/O. Page 490-491


This program asks a person to enter their name and ID.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  FULLSCR.
      *****************************************************************
      * PROGRAM TO ASK PERSON TO ENTER THEIR NAME AND ID.             *
      * IN:  Nothing.                                                 *
      * OUT: The-Name CONTAINS THE NAME.                              *
      *      The-Id   CONTAINS THE Id.                                *
      *****************************************************************
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  The-Name                      PIC X(40).
       01  The-Id                        PIC X(6).
       SCREEN SECTION.
       01  Screen-1                      BLANK SCREEN 
                                         AUTO PROMPT REQUIRED
                                         BACKGROUND-COLOR 1
                                         FOREGROUND-COLOR 7.
           05  First-Line.
               10  LINE 5 COL 10         VALUE "Enter your name: "
                                         HIGHLIGHT.
               10  COL 30                PIC X(40) REVERSE-VIDEO
                                         TO The-Name.
           05  Second-Line.
               10  LINE 7 COL 10         VALUE "Enter your id: "
                                         HIGHLIGHT.
               10  COL 40                PIC X(6) REVERSE-VIDEO
                                         TO The-Id.
       PROCEDURE DIVISION.
           DISPLAY Screen-1
           ACCEPT Screen-1
           GOBACK
           .
       END PROGRAM FULLSCR.

0059">

Chapter 25
POINTER DATA AND CICS


Program illustrating subprogram using pointers. Page 495-497


This program illustrates how to obtain the address of an item and use the address to count blanks in the item.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TNOBLNK.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  A-Table.
           05  A-Tbl-V.
               10                        PIC X(10) VALUE "          ".
               10                        PIC X(10) VALUE "1111111111".
               10                        PIC X(10) VALUE " 111111111".
               10                        PIC X(10) VALUE "1  1111111".
               10                        PIC X(10) VALUE "11   11111".
               10                        PIC X(10) VALUE "111    111".
               10                        PIC X(10) VALUE "11111     ".
           05  A-Tbl REDEFINES A-Tbl-V OCCURS 7 TIMES PIC X(10).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  An-Address                    POINTER.
       01  An-Item                       PIC X(100).
       01  No-Blanks                     PIC 9(9) BINARY.
       01  Len-Item                      PIC 9(9) BINARY.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TNOBLNK PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "GETADD" USING BY REFERENCE An-Item, An-Address
              MOVE A-Tbl(Ix) TO An-Item
              MOVE 10 TO Len-Item
              CALL "NOBLANKS" USING BY CONTENT An-Address, Len-Item
                           BY REFERENCE No-Blanks
              DISPLAY "An-Item: ", An-Item, " Blanks: ", No-Blanks
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID. NOBLANKS.
      *****************************************************************
      * SUBPROGRAM TO COUNT NUMBER OF BLANKS IN AN ITEM.              *
      * CALL "NOBLANKS" USING BY CONTENT  A-Pointer, Len-Item,        *
      *                       BY REFERENCE Num-Blanks                 *
      * IN:  A-Pointer points to data item.          POINTER          *
      *      Len-Item contains length of data item.   PIC 9(9) BINARY *
      * OUT: Num-Blanks contains count of blanks in data item.        *
      *                                               PIC 9(9) BINARY *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Num-Item                      PIC S9(4) BINARY.
       LINKAGE SECTION.
       01  A-Pointer                     POINTER.
       01  Len-Item                      PIC 9(9) BINARY.
       01  Num-Blanks                    PIC 9(9) BINARY.
       01  The-Item                      PIC X(1).
       PROCEDURE DIVISION USING A-Pointer, Len-Item, Num-Blanks.
       A00-Begin.
           SET ADDRESS OF The-Item TO A-Pointer
           MOVE ZEROS TO Num-Blanks
           PERFORM VARYING Num-Item FROM 1 BY 1
                   UNTIL Num-Item > Len-Item
              IF The-Item(Num-Item:1) = SPACE
                 THEN ADD 1 TO Num-Blanks
              END-IF
           END-PERFORM
           EXIT PROGRAM.
       END PROGRAM NOBLANKS.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. GETADD.
      *****************************************************************
      * SUBPROGRAM TO OBTAIN THE ADDRESS OF AN ITEM.                  *
      * CALL "GETADD" USING BY REFERENCE A-Rec, A-Pointer             *
      * IN:  A-Rec is any data item:  DISPLAY, BINARY, PACKED, etc.   *
      * OUT: A-Pointer contains the address of A-Rec.  POINTER        *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  A-Rec                         PIC X(1).
       01  A-Pointer                     POINTER.
       PROCEDURE DIVISION USING A-Rec, A-Pointer.
       A00-Begin.
           SET A-Pointer TO ADDRESS OF A-Rec
           EXIT PROGRAM.
       END PROGRAM GETADD.
       END PROGRAM TNOBLNK.

0059">

Program illustrating using an address to store data in an item. Page 497


This program illustrates how to use an address to store data in an item.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  ADDR-USE.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  An-Address                    POINTER.
       01  Part-1.
           05  Part-A                    PIC X(4) VALUE "1234".
           05  Part-B                    PIC S9(4) BINARY VALUE 10.
           05  Part-C                    PIC S9(6) PACKED-DECIMAL 
                                         VALUE 20.
           05  Part-D                    PIC X(2) VALUE "YZ".
       01  P-Part-1.
           05  P-Part-A                  PIC X(4).
           05  P-Part-B                  PIC S9(4) BINARY.
           05  P-Part-C                  PIC S9(6) PACKED-DECIMAL.
           05  P-Part-D                  PIC X(2).
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING ADDR-USE PROGRAM."
           CALL "GETADD" USING BY REFERENCE Part-1, An-Address
           CALL "STOREADD" USING BY CONTENT An-Address, 
                FUNCTION LENGTH(Part-1), BY REFERENCE P-Part-1
           DISPLAY "P-Part-A: ", P-Part-A  
           DISPLAY "P-Part-B: ", P-Part-B  
           DISPLAY "P-Part-C: ", P-Part-C  
           DISPLAY "P-Part-D: ", P-Part-D  
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID. GETADD.
      *****************************************************************
      * SUBPROGRAM TO OBTAIN THE ADDRESS OF AN ITEM.                  *
      * CALL "GETADD" USING BY REFERENCE A-Rec, A-Pointer             *
      * IN:  A-Rec is any data item:  DISPLAY, BINARY, PACKED, etc.   *
      * OUT: A-Pointer contains the address of A-Rec.  POINTER        *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  A-Rec                         PIC X(1).
       01  A-Pointer                     POINTER.
       PROCEDURE DIVISION USING A-Rec, A-Pointer.
       A00-Begin.
           SET A-Pointer TO ADDRESS OF A-Rec
           EXIT PROGRAM.
       END PROGRAM GETADD.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. STOREADD.
      *****************************************************************
      * SUBPROGRAM TO STORE ITEM IN IDENTIFIER, GIVEN ITEM'S ADDRESS. *
      * CALL "STOREADD" USING BY CONTENT A-Pointer, Len-Item,         *
      *                       BY REFERENCE A-Rec                      *
      * IN:  A-Pointer contains address of item to store.    POINTER  *
      *      Len-Item contains the length of item.   PIC 9(9) BINARY  *
      * OUT: A-Rec contains the contents of item pointed to.          *
      *            Should be same PIC as data item, but data is       *
      *            moved to it without conversion regardless of its   *
      *            format.                                            *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Num-Item                      PIC 9(9) BINARY.
       LINKAGE SECTION.
       01  A-Rec                         PIC X(1).
       01  Len-Item                      PIC 9(9) BINARY.
       01  A-Pointer                     POINTER.
       01  The-Item                      PIC X(1).
       PROCEDURE DIVISION USING A-Pointer, Len-Item, A-Rec.
           SET ADDRESS OF The-Item TO A-Pointer
           PERFORM WITH TEST AFTER
                   VARYING Num-Item FROM 1 BY 1
                   UNTIL Num-Item > Len-Item
              MOVE The-Item(Num-Item:1) TO A-Rec(Num-Item:1)
           END-PERFORM
           EXIT PROGRAM.
       END PROGRAM STOREADD.
       END PROGRAM ADDR-USE.

0059">

Another program illustrating calling subprograms to store item, given its address. Page 498-499


This program also illustrates calls to GETADD and STOREADD.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  MORE-ADDR.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Rec-Table.
           05  Rec-1                     PIC X(10) VALUE "1111111111".
           05  Rec-2                     PIC X(10) VALUE "2222222222".
           05  Rec-3                     PIC X(10) VALUE "3333333333".
           05  Rec-4                     PIC X(10) VALUE "4444444444".
           05  Rec-5                     PIC X(10) VALUE "5555555555".
           05  Rec-No                    PIC S9(4) BINARY VALUE 5.
       01  REDEFINES Rec-Table.
           05  Rec-Item                  OCCURS 5 TIMES
                                         INDEXED BY Rec-X
                                         PIC X(10).
       01  Ptr-Table.
           05  Ptr-Entry                 OCCURS 10 TIMES
                                         INDEXED BY Ptr-X
                                         POINTER.
       01  Next-Rec                      PIC X(10).
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING MORE-ADDR PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Rec-X FROM 1 BY 1
                   UNTIL Rec-X > Rec-No
              SET Ptr-X TO Rec-X
              CALL "GETADD" USING BY REFERENCE Rec-Item(Rec-X),
                                               Ptr-Entry(Ptr-X)
           END-PERFORM
           SET Ptr-Entry(Rec-No + 1) TO NULLS
           MOVE SPACES TO Next-Rec
           PERFORM WITH TEST BEFORE VARYING Ptr-X FROM 1 BY 1
                    UNTIL Ptr-Entry(Ptr-X) = NULLS
               CALL "STOREADD" USING BY CONTENT   Ptr-Entry(Ptr-X),
                      FUNCTION LENGTH(Rec-1), BY REFERENCE Next-Rec
               DISPLAY "NEXT REC: ", Next-Rec
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID. GETADD.
      *****************************************************************
      * SUBPROGRAM TO OBTAIN THE ADDRESS OF AN ITEM.                  *
      * CALL "GETADD" USING BY REFERENCE A-Rec, A-Pointer             *
      * IN:  A-Rec is any data item:  DISPLAY, BINARY, PACKED, etc.   *
      * OUT: A-Pointer contains the address of A-Rec.  POINTER        *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  A-Rec                         PIC X(1).
       01  A-Pointer                     POINTER.
       PROCEDURE DIVISION USING A-Rec, A-Pointer.
       A00-Begin.
           SET A-Pointer TO ADDRESS OF A-Rec
           EXIT PROGRAM.
       END PROGRAM GETADD.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. STOREADD.
      *****************************************************************
      * SUBPROGRAM TO STORE ITEM IN IDENTIFIER, GIVEN ITEM'S ADDRESS. *
      * CALL "STOREADD" USING BY CONTENT A-Pointer, Len-Item,         *
      *                       BY REFERENCE A-Rec                      *
      * IN:  A-Pointer contains address of item to store.    POINTER  *
      *      Len-Item contains the length of item.   PIC 9(9) BINARY  *
      * OUT: A-Rec contains the contents of item pointed to.          *
      *            Should be same PIC as data item, but data is       *
      *            moved to it without conversion regardless of its   *
      *            format.                                            *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Num-Item                      PIC 9(9) BINARY.
       LINKAGE SECTION.
       01  A-Rec                         PIC X(1).
       01  Len-Item                      PIC 9(9) BINARY.
       01  A-Pointer                     POINTER.
       01  The-Item                      PIC X(1).
       PROCEDURE DIVISION USING A-Pointer, Len-Item, A-Rec.
           SET ADDRESS OF The-Item TO A-Pointer
           PERFORM WITH TEST AFTER
                   VARYING Num-Item FROM 1 BY 1
                   UNTIL Num-Item > Len-Item
              MOVE The-Item(Num-Item:1) TO A-Rec(Num-Item:1)
           END-PERFORM
           EXIT PROGRAM.
       END PROGRAM STOREADD.
       END PROGRAM MORE-ADDR.

0059">

Chapter 26
ALL ABOUT DATES


Program example, sliding window technique. Page 512


This program converts a two-digit year to four-digits using the sliding window technique.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TSLIDE.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(6) VALUE 000102.
               10                        PIC 9(6) VALUE 200304.
               10                        PIC 9(6) VALUE 300506.
               10                        PIC 9(6) VALUE 960708.
               10                        PIC 9(6) VALUE 970910.
               10                        PIC 9(6) VALUE 981112.
               10                        PIC 9(6) VALUE 991314.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(6).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  New-Date.
           05  New-Yr                    PIC 9(4).
           05  New-Mo                    PIC 99.
           05  New-Dy                    PIC 99.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TSLIDE PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "SLIDE-W" USING BY CONTENT Yr-Tbl(Ix)
                                   BY REFERENCE New-Date
              DISPLAY Yr-Tbl(Ix), ": ", New-Date
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  SLIDE-W.
      *****************************************************************
      * SUBPROGRAM TO CONVERT A TWO-DIGIT YEAR TO FOUR DIGITS, USING  *
      * THE SLIDING YEAR TECHNIQUE.                                   *
      * CALL "SLIDE-W" USING BY CONTENT Some-Date,                    *
      *                       BY REFERENCE New-Date                   *
      * IN:  Some-Date CONTAINS THE YEAR AS PIC 9(6) IN yymmdd FORM.  *
      * OUT: New-Date CONTAINS THE YEAR AS PIC 9(8) IN yyyymmdd FORM. *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  N                             PIC S99 VALUE 2.
       01  Curr-Yr                       PIC 9(4).
       LINKAGE SECTION.
       01  Some-Date.
           05  Yr                        PIC 99.
           05  Mo                        PIC 99.
           05  Dy                        PIC 99.
       01  New-Date.
           05  New-Yr                    PIC 9(4).
           05  New-Mo                    PIC 99.
           05  New-Dy                    PIC 99.
       PROCEDURE DIVISION USING Some-Date, New-Date.
       A00-Begin.
           MOVE FUNCTION CURRENT-DATE(1:4) TO Curr-Yr
           MOVE Mo TO New-Mo
           MOVE Dy TO New-Dy
           COMPUTE Curr-Yr, New-Yr = Curr-Yr + N
           MOVE "00" TO New-Yr(3:2)
           IF Yr > Curr-Yr(3:2)
              THEN COMPUTE New-Yr = Yr + New-Yr - 100
              ELSE COMPUTE New-Yr = Yr + New-Yr
           END-IF
           GOBACK
           .
       END PROGRAM SLIDE-W.
       END PROGRAM TSLIDE.

0059">

Program example, sliding window technique with packed decimal. Page 512


This subprogram also illustrates the sliding window technique, but with packed-decimal data.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TSLIDE2.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10  D1.
                   15                    PIC 9(2) VALUE 00
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 01
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 02
                                         PACKED-DECIMAL.
               10  D2.
                   15                    PIC 9(2) VALUE 20
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 03
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 04
                                         PACKED-DECIMAL.
               10  D3.
                   15                    PIC 9(2) VALUE 30
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 05
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 06
                                         PACKED-DECIMAL.
               10  D4.
                   15                    PIC 9(2) VALUE 96
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 07
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 08
                                         PACKED-DECIMAL.
               10  D5.
                   15                    PIC 9(2) VALUE 97
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 09
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 10
                                         PACKED-DECIMAL.
               10  D6.
                   15                    PIC 9(2) VALUE 98
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 11
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 12
                                         PACKED-DECIMAL.
               10  D7.
                   15                    PIC 9(2) VALUE 99
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 13
                                         PACKED-DECIMAL.
                   15                    PIC 9(2) VALUE 14
                                         PACKED-DECIMAL.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES.
               10  Yr-Table-Date.
                   15 Yr-Tbl-Yr          PIC 9(2) PACKED-DECIMAL.
                   15 Yr-Tbl-Mo          PIC 9(2) PACKED-DECIMAL.
                   15 Yr-Tbl-Dy          PIC 9(2) PACKED-DECIMAL.
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  New-Date.
           05  New-Yr                    PIC 9(4) PACKED-DECIMAL.
           05  New-Mo                    PIC 99 PACKED-DECIMAL.
           05  New-Dy                    PIC 99 PACKED-DECIMAL.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TSLIDE2 PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "SLIDE-W-2" USING BY CONTENT Yr-Tbl(Ix)
                                     BY REFERENCE New-Date
              DISPLAY Yr-Tbl-Yr(Ix), Yr-Tbl-Mo(Ix), Yr-Tbl-Dy(Ix), 
                      ": ", New-Yr, New-Mo, New-Dy
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  SLIDE-W-2.
      *****************************************************************
      * SUBPROGRAM TO CONVERT A TWO-DIGIT YEAR TO FOUR DIGITS, USING  *
      * THE SLIDING YEAR TECHNIQUE.                                   *
      * CALL "SLIDE-W" USING BY CONTENT Some-Date,                    *
      *                       BY REFERENCE New-Date                   *
      * IN:  Some-Date CONTAINS THE YEAR AS PIC 99 (yy), PIC 99 (mm), *
      *      PIC 99 (dd), all in PACKED-DECIMAL.                      *
      * OUT: New-Date CONTAINS THE YEAR AS PIC 9(4) (yy),             *
      *      PIC 99 (mm), PIC 99 (yy), all in PACKED-DECIMAL.         *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  N                             PIC S99 VALUE 2.
       01  Curr-Yr                       PIC 9(4).
       LINKAGE SECTION.
       01  Some-Date.
           05  Yr                        PIC 99 PACKED-DECIMAL.
           05  Mo                        PIC 99 PACKED-DECIMAL.
           05  Dy                        PIC 99 PACKED-DECIMAL.
       01  New-Date.
           05  New-Yr                    PIC 9(4) PACKED-DECIMAL.
           05  New-Mo                    PIC 99 PACKED-DECIMAL.
           05  New-Dy                    PIC 99 PACKED-DECIMAL.
       PROCEDURE DIVISION USING Some-Date, New-Date.
       A00-Begin.
           MOVE FUNCTION CURRENT-DATE(1:4) TO Curr-Yr
           MOVE Mo TO New-Mo
           MOVE Dy TO New-Dy
           COMPUTE Curr-Yr = Curr-Yr + N
           COMPUTE New-Yr = (FUNCTION INTEGER(Curr-Yr / 100)) * 100
           IF Yr > FUNCTION NUMVAL(Curr-Yr(3:2))
              THEN COMPUTE New-Yr = Yr + New-Yr - 100
              ELSE COMPUTE New-Yr = Yr + New-Yr
           END-IF
           GOBACK
           .
       END PROGRAM SLIDE-W-2.
       END PROGRAM TSLIDE2.

0059">

Program example, determining leap year. Page 515


This program illustrates a subprogram to determine whether a year is a leap year.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TLEAP.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(4) VALUE 1900.
               10                        PIC 9(4) VALUE 2000.
               10                        PIC 9(4) VALUE 3000.
               10                        PIC 9(4) VALUE 1999.
               10                        PIC 9(4) VALUE 1998.
               10                        PIC 9(4) VALUE 1997.
               10                        PIC 9(4) VALUE 1996.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(4).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  Leap-Flag                     PIC X.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TLEAP PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "LEAP-YR" USING BY CONTENT Yr-Tbl(Ix)
                                     BY REFERENCE Leap-Flag
              DISPLAY Yr-Tbl(Ix), ": ", Leap-Flag
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  LEAP-YR.
      *****************************************************************
      * SUBPROGRAM TO DETERMINE WHETHER A YEAR IS A LEAP YEAR.        *
      * CALL "LEAP-YEAR" USING BY CONTENT The-Year,                   *
      *                       BY REFERENCE Leap-Year                  *
      * IN:  The-Year is PIC 9(4) item containing four-digit year.    *
      * OUT: Leap-Year is PIC X item.  "N" returned if not leap year. *
      *                                "Y" returned if leap year.     *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  The-Year                      PIC 9(4).
       01  Leap-Year                     PIC X.
      *                                     "N"-Not a leap year.
      *                                     "Y"-Leap year.
       PROCEDURE DIVISION USING The-Year, Leap-Year.
           MOVE "N" TO Leap-Year
           IF FUNCTION REM(The-Year, 400) = ZERO
              THEN MOVE "Y" TO Leap-Year
              ELSE IF FUNCTION REM(The-Year, 4) = ZERO
                      AND NOT FUNCTION REM(The-Year, 100) = ZERO
                      THEN MOVE "Y" TO Leap-Year
                   END-IF
           END-IF
           GOBACK
           .
       END PROGRAM LEAP-YR.
       END PROGRAM TLEAP.

0059">

Program example, age calculation. Page 515


This program illustrates a subprogram to calculate the age, given a birth date.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TAGE.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19960228.
               10                        PIC 9(8) VALUE 19901221.
               10                        PIC 9(8) VALUE 19720101.
               10                        PIC 9(8) VALUE 19941231.
               10                        PIC 9(8) VALUE 19970101.
               10                        PIC 9(8) VALUE 19960606.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(8).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  Age                           PIC S9(4) BINARY.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TAGE PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "GET-AGE" USING BY CONTENT Yr-Tbl(Ix)
                                   BY REFERENCE Age
              DISPLAY Yr-Tbl(Ix), ": ", Age
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  GET-AGE.
      *****************************************************************
      * SUBPROGRAM TO COMPUTE A PERSON'S AGE GIVEN THE BIRTH DATE.    *
      * CALL "GET-AGE" USING BY CONTENT Birth-Date,                   *
      *                       BY REFERENCE Age                        *
      * IN:  Birth-date is year--PIC 9(4), month--PIC 9(2),           *
      *      day--PIC 9(2).                                           *
      * OUT: Age, PIC S9(4) BINARY.                                   *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       LINKAGE SECTION.
       01  Birth-Date.
           05  Bd-Yr                     PIC 9(4).
           05  Bd-Mo                     PIC 99.
           05  Bd-Dy                     PIC 99.
       01  Age                           PIC S9(4) BINARY.
       PROCEDURE DIVISION USING Birth-Date, Age.
       A00-Begin.
           MOVE FUNCTION CURRENT-DATE TO The-Current-Date
           IF Birth-Date(5:4) > The-Current-Date(5:4)
              THEN COMPUTE Age = Cd-Yr - Bd-Yr - 1
              ELSE COMPUTE Age = Cd-Yr - Bd-Yr
           END-IF
           GOBACK
           .
       END PROGRAM GET-AGE.
       END PROGRAM TAGE.

0059">

Program example, convert calendar date to Julian. Page 516


This subprogram illustrates how to convert a calendar date to a Julian date.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TTOJUL.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19960228.
               10                        PIC 9(8) VALUE 19901221.
               10                        PIC 9(8) VALUE 19720101.
               10                        PIC 9(8) VALUE 19981231.
               10                        PIC 9(8) VALUE 19970101.
               10                        PIC 9(8) VALUE 19960606.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(8).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  Julian-Date.
           05  Julian-Yr                 PIC 9(4).
           05  Julian-Dy                 PIC 9(3).
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TTOJUL PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "TO-JULIAN" USING BY CONTENT Yr-Tbl(Ix)
                                     BY REFERENCE Julian-Date
              DISPLAY Yr-Tbl(Ix), ": ", Julian-Date
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TO-JULIAN.
      *****************************************************************
      * SUBPROGRAM TO CONVERT A CALENDAR DATE TO JULIAN.              *
      * CALL "TO-JULIAN" USING BY CONTENT The-Current-Date,           *
      *                        BY REFERENCE Julian-Date               *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Julian-Date is the Julian date in year--PIC 9(4),        *
      *      Day of year--PIC 9(3).
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  Julian-Date.
           05  Julian-Yr                 PIC 9(4).
           05  Julian-Dy                 PIC 9(3).
       01  Julian-I-Date REDEFINES Julian-Date
                                         PIC 9(7).
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Current-I-Date REDEFINES The-Current-Date
                                         PIC 9(8).
       PROCEDURE DIVISION USING The-Current-Date, Julian-Date.
       A00-Begin.
           MOVE Cd-Yr TO Julian-Yr
           MOVE 1 TO Julian-Dy
           COMPUTE Julian-Dy =
                   FUNCTION INTEGER-OF-DATE(Current-I-date) -
                   FUNCTION INTEGER-OF-DAY(Julian-I-Date) + 1
           GOBACK
           .
       END PROGRAM TO-JULIAN.
       END PROGRAM TTOJUL.

0059">

Program example, convert Julian date to calendar. Page 516


This subprogram illustrates how to convert a Julian date to a calendar date.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TFROMJUL.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(7) VALUE 1996001.
               10                        PIC 9(7) VALUE 1996366.
               10                        PIC 9(7) VALUE 1996365.
               10                        PIC 9(7) VALUE 1972002.
               10                        PIC 9(7) VALUE 1998125.
               10                        PIC 9(7) VALUE 1997100.
               10                        PIC 9(7) VALUE 1996200.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(7).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TFROMJUL PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "FROM-JULIAN" USING BY CONTENT Yr-Tbl(Ix)
                                     BY REFERENCE The-Current-Date
              DISPLAY Yr-Tbl(Ix), ": ", The-Current-Date
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  FROM-JULIAN.
      *****************************************************************
      * SUBPROGRAM TO CONVERT A JULIAN DATE TO A CALENDAR DATE.       *
      * CALL "FROM-JULIAN" USING BY CONTENT Julian-Date,              *
      *                          BY REFERENCE The-Current-Date        *
      * IN:  Julian-Date is the Julian date in year--PIC 9(4),        *
      *      Day of year--PIC 9(3).
      * OUT: The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  Julian-Date.
           05  Julian-Yr                 PIC 9(4).
           05  Julian-Dy                 PIC 9(3).
       01  Julian-I-Date REDEFINES Julian-Date
                                         PIC 9(7).
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Current-I-Date REDEFINES The-Current-Date
                                         PIC 9(8).
       PROCEDURE DIVISION USING Julian-Date, The-Current-Date.
       A00-Begin.
           COMPUTE Current-I-Date = 
                   FUNCTION DATE-OF-INTEGER(
                   FUNCTION INTEGER-OF-DAY(Julian-I-Date))
           GOBACK
           .
       END PROGRAM FROM-JULIAN.
       END PROGRAM TFROMJUL.

0059">

Program example, calculate elapsed days. Page 516-517


This subprogram illustrates how to calculate elapsed days, given a start and end date.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TTWEEN.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19960228.
               10                        PIC 9(8) VALUE 19901221.
               10                        PIC 9(8) VALUE 19720101.
               10                        PIC 9(8) VALUE 19980228.
               10                        PIC 9(8) VALUE 19970101.
               10                        PIC 9(8) VALUE 19960606.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(8).
           05  Yr-Tbl-W.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19970228.
               10                        PIC 9(8) VALUE 19901231.
               10                        PIC 9(8) VALUE 19720201.
               10                        PIC 9(8) VALUE 19980302.
               10                        PIC 9(8) VALUE 19971201.
               10                        PIC 9(8) VALUE 19960706.
           05  Yr-Tbl-1 REDEFINES Yr-Tbl-W OCCURS 7 TIMES PIC 9(8).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  First-Date.
           05  F-Yr                      PIC 9(4).
           05  F-Mo                      PIC 99.
           05  F-Dy                      PIC 99.
       01  Last-Date.
           05  L-Yr                      PIC 9(4).
           05  L-Mo                      PIC 99.
           05  L-Dy                      PIC 99.
       01  No-Days                       PIC S9(9) BINARY.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TTWEEN PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "DAYS-TWEEN" USING BY CONTENT Yr-Tbl(Ix),
                                                 Yr-Tbl-1(Ix)
                                     BY REFERENCE No-Days
              DISPLAY Yr-Tbl(Ix), ", ", Yr-Tbl-1(Ix), ": ", No-Days
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  DAYS-TWEEN.
      *****************************************************************
      * SUBPROGRAM TO DETERMINE THE NUMBER OF DAYS BETWEEN TWO DATES. *
      * CALL "DAYS-TWEEN" USING BY CONTENT First-Date, Last-Date,     *
      *                         BY REFERENCE No-Days                  *
      * IN:  First-Date is the first date, year--PIC 9(4),            *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      *      Last-Date is the last date in the same format.           *
      * OUT: No-Days is the days between the two dates,               *
      *      PIC S9(9) BINARY.                                        *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  First-Date.
           05  F-Yr                      PIC 9(4).
           05  F-Mo                      PIC 99.
           05  F-Dy                      PIC 99.
       01  First-I-Date REDEFINES First-Date  PIC 9(8).
       01  Last-Date.
           05  L-Yr                      PIC 9(4).
           05  L-Mo                      PIC 99.
           05  L-Dy                      PIC 99.
       01  Last-I-Date REDEFINES Last-Date  PIC 9(8).
       01  No-Days                       PIC S9(9) BINARY.
       PROCEDURE DIVISION USING First-Date, Last-Date, No-Days.
       A00-Begin.
           COMPUTE No-Days = FUNCTION INTEGER-OF-DATE(Last-I-Date) -
                             FUNCTION INTEGER-OF-DATE(First-I-Date)
           GOBACK
           .
           END PROGRAM DAYS-TWEEN.
           END PROGRAM TTWEEN.

0059">

Program example, determine day of week. Page 517


This subprogram illustrates how to determine the day of week.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TDWK.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19960228.
               10                        PIC 9(8) VALUE 19901221.
               10                        PIC 9(8) VALUE 19720101.
               10                        PIC 9(8) VALUE 19981231.
               10                        PIC 9(8) VALUE 19970101.
               10                        PIC 9(8) VALUE 19960606.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(8).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  Dy-Of-Week                    PIC S9(8) BINARY.
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TDWK PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "DAY-WK" USING BY CONTENT Yr-Tbl(Ix)
                                  BY REFERENCE Dy-Of-Week
              DISPLAY Yr-Tbl(Ix), ": ", Dy-Of-Week
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  DAY-WK.
      *****************************************************************
      * SUBPROGRAM TO DETERMINE THE DAY OF THE WEEK OF A DATE.        *
      * CALL "DAY-WK" USING BY CONTENT The-Current-Date,              *
      *               BY REFERENCE Dy-Of-Week                         *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Dy-Of-Week is the day of week PIC S9(8) BINARY.          *
      *      1 is Monday, 2 is Tuesday, ..., 7 is Sunday.             *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Current-I-Date REDEFINES The-Current-Date  PIC 9(8).
       01  Dy-Of-Week                    PIC S9(8) BINARY.
       PROCEDURE DIVISION USING The-Current-Date, Dy-Of-Week.
       A00-Begin.
           COMPUTE Dy-Of-Week = 
                   FUNCTION REM(FUNCTION 
                            INTEGER-OF-DATE(Current-I-Date), 7)
           IF Dy-Of-Week = 0
              THEN COMPUTE Dy-Of-Week = 7
           END-IF
           GOBACK
           .
       END PROGRAM DAY-WK.
       END PROGRAM TDWK.

0059">

Program example, convert day of week to text. Page 517-518


This subprogram illustrates how to convert the day of the week to text form.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TTXT.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19960228.
               10                        PIC 9(8) VALUE 19901221.
               10                        PIC 9(8) VALUE 19720101.
               10                        PIC 9(8) VALUE 19981231.
               10                        PIC 9(8) VALUE 19970101.
               10                        PIC 9(8) VALUE 19960606.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(8).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  Dy-Of-Week                    PIC S9(8) BINARY.
       01  Txt-Dy-Of-Week                PIC X(9).
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TTXT PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "DAY-Wk" USING BY CONTENT Yr-Tbl(Ix)
                                  BY REFERENCE Dy-Of-Week
              DISPLAY Yr-Tbl(Ix), ": ", Dy-Of-Week
              CALL "Txt-Day" USING BY CONTENT Dy-Of-Week,
                                   BY REFERENCE Txt-Dy-Of-Week
              DISPLAY Dy-Of-Week, ": ", Txt-Dy-Of-Week
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  Txt-Day.
      *****************************************************************
      * SUBPROGRAM TO CONVERT THE DAY OF WEEK TO TEXT FORM.           *
      * CALL "Txt-Day" USING BY CONTENT Dy-Of-Week,                   *
      *                BY REFERENCE Txt-Dy-Of-Week                    *
      * IN:  Dy-Of-Week is the day of week PIC S9(8) BINARY.          *
      *      1 is Monday, 2 is Tuesday, ..., 7 is Sunday.             *
      * OUT: Txt-Dy-Of-Week PIC X(8) is the text may of week: Monday, *
      *      Tuesday, etc.                                            *
      *****************************************************************
      DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Dy-Table.
           05  Dy-Tbl-Values.
               10  Dy-Tbl-Mon            PIC X(9) VALUE "Monday".
               10  Dy-Tbl-Tue            PIC X(9) VALUE "Tuesday".
               10  Dy-Tbl-Wed            PIC X(9) VALUE "Wednesday".
               10  Dy-Tbl-Thu            PIC X(9) VALUE "Thursday".
               10  Dy-Tbl-Fri            PIC X(9) VALUE "Friday".
               10  Dy-Tbl-Sat            PIC X(9) VALUE "Saturday".
               10  Dy-Tbl-Sun            PIC X(9) VALUE "Sunday".
           05  Dy-Tbl REDEFINES Dy-Tbl-Values  OCCURS 7 TIMES PIC X(9).
       LINKAGE SECTION.
       01  Dy-Of-Week                    PIC S9(8) BINARY.
       01  Txt-Dy-Of-Week                PIC X(9).
       PROCEDURE DIVISION USING Dy-Of-Week, Txt-Dy-Of-Week.
       A00-Begin.                          
           MOVE Dy-Tbl(Dy-Of-Week) TO Txt-Dy-Of-Week
           GOBACK
           .
       END PROGRAM Txt-Day.
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  DAY-WK.
      *****************************************************************
      * SUBPROGRAM TO DETERMINE THE DAY OF THE WEEK OF A DATE.        *
      * CALL "DAY-WK" USING BY CONTENT The-Current-Date,              *
      *               BY REFERENCE Dy-Of-Week                         *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Dy-Of-Week is the day of week PIC S9(8) BINARY.          *
      *      1 is Monday, 2 is Tuesday, ..., 7 is Sunday.             *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Current-I-Date REDEFINES The-Current-Date  PIC 9(8).
       01  Dy-Of-Week                    PIC S9(8) BINARY.
       PROCEDURE DIVISION USING The-Current-Date, Dy-Of-Week.
       A00-Begin.
           COMPUTE Dy-Of-Week = 
                   FUNCTION REM(FUNCTION 
                            INTEGER-OF-DATE(Current-I-Date), 7)
           IF Dy-Of-Week = 0
              THEN COMPUTE Dy-Of-Week = 7
           END-IF
           GOBACK
           .
       END PROGRAM DAY-WK.
       END PROGRAM TTXT.

0059">

Program example, convert calendar date to text. Page 518-519


This subprogram illustrates how to convert a calendar date to text form.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  TDATE.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Yr-Table.
           05  Yr-Tbl-V.
               10                        PIC 9(8) VALUE 19960229.
               10                        PIC 9(8) VALUE 19960228.
               10                        PIC 9(8) VALUE 19901221.
               10                        PIC 9(8) VALUE 19720101.
               10                        PIC 9(8) VALUE 19981231.
               10                        PIC 9(8) VALUE 19970101.
               10                        PIC 9(8) VALUE 19960606.
           05  Yr-Tbl REDEFINES Yr-Tbl-V OCCURS 7 TIMES PIC 9(8).
       01  Ix                            PIC S9(4) BINARY.
       01  Max-Tbl                       PIC S9(4) BINARY VALUE 7.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION.
       A00-Begin.
           DISPLAY "BEGINNING TDATE PROGRAM."
           PERFORM WITH TEST BEFORE VARYING Ix FROM 1 BY 1
                   UNTIL Ix > Max-Tbl
              CALL "Txt-Date" USING BY CONTENT Yr-Tbl(Ix)
                              BY REFERENCE Formatted-Date
              DISPLAY Yr-Tbl(Ix), ": ", Formatted-Date
           END-PERFORM
           GOBACK
           .
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  Txt-Date.
      *****************************************************************
      * SUBPROGRAM TO CONVERT A CALENDAR DATE TO TEXT FORM.           *
      * CALL "Txt-Date" USING BY CONTENT The-Current-Date,            *
      *                 BY REFERENCE Formatted-Date                   *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted-Date is PIC X(30).  It contains the date in    *
      *      text form, such as "January 1, 2000.                     *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
                   05 Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES 
                                         PIC X(9).
       LINKAGE SECTION.
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING The-Current-Date, Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                   Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                   Cd-Yr DELIMITED SIZE
                   INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END PROGRAM TXT-DATE.
       END PROGRAM TDATE.

0059">

Chapter 27
DEMYSTIFYING OBJECT-ORIENTED COBOL


Program example, subprogram to convert date to text. Page 527




       IDENTIFICATION DIVISION.
       PROGRAM-ID. MoTextDate.
      *****************************************************************
      * SUBPROGRAM TO CONVERT A CALENDAR DATE TO TEXT FORM.           *
      * CALL "MoTextDate" USING BY CONTENT The-Current-Date,          *
      *                 BY REFERENCE Formatted-Date                   *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted-Date is PIC X(30).  It contains the date in    *
      *      text form, such as "January 1, 2000.                     *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES PIC X(9).
       LINKAGE SECTION.
       01  The-Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING The-Current-Date, Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END PROGRAM MoTextDate.

0059">

Program example, function to convert date to text. Page 527-528




       IDENTIFICATION DIVISION.
       FUNCTION-ID. MoTextDate.
      *****************************************************************
      * FUNCTION TO CONVERT A CALENDAR DATE TO TEXT FORM.             *
      * CALL:  Formatted-Date = FUNCTION MoTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "January 1, 2000.               *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES PIC X(9).
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END FUNCTION MoTextDate.
Program example, method to convert date to text.  Page 528
       IDENTIFICATION DIVISION.
       METHOD-ID. MoTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date - class :: MoTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "January 1, 2000.               *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES PIC X(9).
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD MoTextDate.

0059">

Program example, coding the class. Page 532




       CLASS-ID. The-Dates INHERITS Base.
       ENVIRONMENT DIVISION.
      *****************************************************************
      * CLASS TO OPERATE ON DATES.                                    *
      * DATA:  MoTable is table of 12 months in PIC X(9) format.      *
      * METHODS:  MoTextDate to convert yyyymmdd to form such as      *
      *                      January 1, 2000.
      *           DyTextDate to convert yyyymmdd to form such as      *
      *                      1 January 2000. 
      *****************************************************************
       CONFIGURATION SECTION.
       REPOSITORY.
           CLASS The-Dates AS "DATES".
       FACTORY.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES PIC X(9).
       PROCEDURE DIVISION.
       METHOD-ID. DyTextDate.
       DATA DIVISION.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date - class :: DyTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "1 January 2000.                *
      *****************************************************************
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Fmt-Dy DELIMITED ".",
                  " " DELIMITED SIZE,
                  Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD  DyTextDate.
       METHOD-ID. MoTextDate.
       DATA DIVISION.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date = class :: MoTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "January 1, 2000.               *
      *****************************************************************
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD MoTextDate.
       END FACTORY.
       END CLASS The-Dates

0059">

Program example, object-oriented driver program. Page 533.




       PROGRAM-ID. TESTDATE.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
           CLASS Base AS "BASE"
           CLASS The-Dates AS "DATES".
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Date-Storage                  PIC X(30).
       PROCEDURE DIVISION.
       A00-Begin.
           MOVE The-Dates :: "DyTextDate"("20030427") TO Date-Storage
           DISPLAY Date-Storage
           GOBACK
           .
       END PROGRAM TESTDATE.

0059">

Program example, creating an object. Page 535.




       CLASS-ID. The-Dates INHERITS Base.
       ENVIRONMENT DIVISION.
      *****************************************************************
      * CLASS TO OPERATE ON DATES.                                    *
      * DATA:  MoTable is table of 12 months in PIC X(9) format.      *
      * METHODS:  MoTextDate to convert yyyymmdd to form such as      *
      *                      January 1, 2000.
      *           DyTextDate to convert yyyymmdd to form such as      *
      *                      1 January 2000. 
      *****************************************************************
       CONFIGURATION SECTION.
       REPOSITORY.
           CLASS The-Dates AS "DATES".
       FACTORY.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES PIC X(9).
       PROCEDURE DIVISION.
       METHOD-ID. DyTextDate.
       DATA DIVISION.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date = class :: DyTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "1 January 2000.                *
      *****************************************************************
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Fmt-Dy DELIMITED ".",
                  " " DELIMITED SIZE,
                  Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD  DyTextDate.
       METHOD-ID. MoTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date = class :: MoTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "January 1, 2000.               *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD MoTextDate.
       OBJECT.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Date-Storage                  PIC X(30).
       PROCEDURE DIVISION.
       END OBJECT.
       END CLASS The-Dates.

0059">

Program example, main program to create an object. Page 536




       PROGRAM-ID. TESTDATE.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
           CLASS Base AS "BASE"
           CLASS The-Dates AS "DATES".
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Obj-Ptr                       OBJECT REFERENCE.
       PROCEDURE DIVISION.
       A00-Begin.
           INVOKE The-Dates "NEW" RETURNING Obj-Ptr
           GOBACK
           .
       END PROGRAM TESTDATE.

0059">

Program example, creating multiple objects. Page 538




       PROGRAM-ID. TESTDATE.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
           CLASS Base AS "BASE"
           The-Dates AS CLASS "DATES".
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Obj-Table.
           05  Obj-Ptr                   OCCURS 10 TIMES INDEXED BY Ix
                                         OBJECT REFERENCE.
       PROCEDURE DIVISION.
       A00-Begin.
           PERFORM WITH TEST AFTER VARYING Ix FROM 1 BY 1 UNTIL Ix = 10
              INVOKE The-Dates "NEW" RETURNING Obj-Ptr(Ix)
           END-PERFORM
           PERFORM WITH TEST AFTER VARYING Ix FROM 1 BY 1 UNTIL Ix = 10
              INVOKE Obj-Ptr(Ix) "StoreDate" USING "20030421"
           END-PERFORM
           PERFORM WITH TEST AFTER VARYING Ix FROM 1 BY 1 UNTIL Ix = 10
              INVOKE Obj-Ptr(Ix) "FINALIZE" RETURNING Obj-Ptr(Ix)
           END-PERFORM
           GOBACK
           .
       END PROGRAM TESTDATE.

0059">

Program example, class to get dates. Page 538-539




       CLASS-ID. The-Dates INHERITS Base.
       ENVIRONMENT DIVISION.
      *****************************************************************
      * CLASS TO OPERATE ON DATES.                                    *
      * DATA:  MoTable is table of 12 months in PIC X(9) format.      *
      * METHODS:  MoTextDate to convert yyyymmdd to form such as      *
      *                      January 1, 2000.
      *           DyTextDate to convert yyyymmdd to form such as      *
      *                      1 January 2000. 
      *****************************************************************
       CONFIGURATION SECTION.
       REPOSITORY.
           CLASS The-Dates AS "DATES".
       FACTORY.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V OCCURS 12 TIMES PIC X(9).
       PROCEDURE DIVISION.
       METHOD-ID. DyTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date = class :: DyTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "1 January 2000.                *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Fmt-Dy DELIMITED ".",
                  " " DELIMITED SIZE,
                  Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD  DyTextDate.
       METHOD-ID. MoTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Formatted-Date = class :: MoTextDate(The-Current-Date) *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "January 1, 2000.               *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK
           .
       END METHOD MoTextDate.
       END FACTORY.
       OBJECT.
      *****************************************************************
      * OBJECT TO REPRESENT AN INDIVIDUAL DATE.                       *
      * DATA:  Date-Storage is date as PIC X(30) item.                *
      * METHODS:  StoreDate to convert a date in form yyyymmdd to     *
      *                     text form (PIC X(30)) and return it.      *
      *           GetDate to retrieve an object Date-Storage.         *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Date-Storage                  PIC X(30).
       METHOD-ID. StoreDate.
      *****************************************************************
      * METHOD TO STORE A DATE IN A DATE OBJECT.                      *
      * CALL:  ptr :: "StoreDate"(Some-Date)                          *
      * IN:  Some-Date is PIC 9(8) and contains date as yyyymmdd.     *
      * OUT: Date is converted to text form and stored in             *
      *      Date-Storage for object as PIC X(30).                    *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  Some-Date                     PIC 9(8).
       PROCEDURE DIVISION USING Some-Date.
           MOVE The-Dates :: "MoTextDate"(Some-Date) TO Date-Storage
           GOBACK
           .
       END METHOD StoreDate.
       METHOD-ID. GetDate.
      *****************************************************************
      * METHOD TO RETRIEVE A DATE FROM AN OBJECT.                     *
      * CALL:  Some-Date = ptr :: "GetDate"(I)                        *
      * IN:  I is PIC S9(5) item containing subscript to              *
      *      The-Objects-Table.                                       *
      * OUT: Some-Date is the date in Date-Storage as PIC X(30).      *
      *****************************************************************
       LINKAGE SECTION.
       01  Some-Date                     PIC X(30).
       PROCEDURE DIVISION RETURNING Some-Date.
           MOVE Date-Storage TO Some-Date
           GOBACK
           .
       END METHOD GetDate.
       END OBJECT.
       END CLASS The-Dates.

0059">

Programming example, class program of application using objects. Page 546-549

This program is the class program for the application using objects. The program is written for Micro Focus COBOL.


      $set mfoo
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DATEPLAY.
      *****************************************************************
      * DRIVER PROGRAM TO DISPLAY DATES AND ALLOW USER AT TERMIAL TO  *
      * SELECT A DATE SO THAT IT IS DISPLAYED IN TEXT FORM.           *
      * IN:  Four dates in Date-Tbl-Values.                           *
      * USES: Bdates CLASS.                                           *
      *****************************************************************
      * ENVIRONMENT DIVISION.
      * CONFIGURATION SECTION.
       CLASS-CONTROL.
      *    CLASS BASE IS "BASE"
           BASE IS CLASS "BASE"
      *    CLASS BDates IS "BDATES.
           BDates IS CLASS "BDATES".
      *REPOSITORY.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Date-Tbl-Values.
           05  First-Date       PIC 9(8) VALUE 20030407.
           05  FILLER           PIC 9(8) VALUE 20011028.
           05  FILLER           PIC 9(8) VALUE 20060914.
           05  FILLER           PIC 9(8) VALUE 19990228.
       01  Date-Tbl REDEFINES   Date-Tbl-Values.
           05  Date-Tbl-Entry   OCCURS 4 TIMES INDEXED BY Dx
                                PIC 9(8).
       01  LRow                PIC 99 VALUE 5.
       01  LCol                PIC 99 VALUE 2.
       01  RRow                PIC 99.
       01  UCol                PIC 99.
       01  First-Ptr            OBJECT REFERENCE VALUE NULLS.
       01  Last-Ptr             OBJECT REFERENCE VALUE NULLS.
       01  Date-Ptr             OBJECT REFERENCE.
       PROCEDURE DIVISION.
           PERFORM WITH TEST AFTER VARYING Dx FROM 1 BY 1
                   UNTIL Dx = 4
             COMPUTE UCol = LCol + FUNCTION LENGTH(First-Date) - 1
             COMPUTE RRow = LRow - 1
             INVOKE BDates "NEW" RETURNING Date-Ptr
             IF First-Ptr = NULLS
                THEN SET First-Ptr TO Date-Ptr
             END-IF
             INVOKE Date-Ptr "CreateDate" USING Date-Tbl-Entry(Dx),
                    LRow, LCol, RRow, UCol, Last-Ptr
             SET Last-Ptr TO Date-Ptr
             COMPUTE LCol = LCol + FUNCTION LENGTH(First-Date) + 2
           END-PERFORM
           INVOKE BDates "UserPlay" USING First-Ptr
           INVOKE First-Ptr "DestroyAll" RETURNING First-Ptr
           GOBACK.
       END PROGRAM DATEPLAY.

0059">

Program example, class application using objects. Page 550-554


This program is written in Micro Focus COBOL.


      $set mfoo
       CLASS-ID.  BDates INHERITS BASE.
      *****************************************************************
      * CLASS TO OPERATE ON DATES.                                    *
      * DATA:  MoTable is table of 12 months in PIC X(9) format.      *
      *        The-Objects-Tbl stores next pointer and row, column    *
      *          positions of box around each date displayed.         *
      * METHODS:  MoTextDate to convert yyyymmdd to form such as      *
      *                      January 1, 2000.                         *
      *           DyTextDate to convert yyyymmdd to form such as      *
      *                      1 January 2000.                          *
      *           UserPlay to allow user to play with dates on screen.*
      *****************************************************************
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           CURSOR IS Csr-Loc
           CRT STATUS IS PF-Key.
      *REPOSITORY.
       OBJECT SECTION.
       CLASS-CONTROL.
      *    CLASS BDates IS "BDATES".
           BDates IS CLASS "BDATES".
      *FACTORY.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Csr-Loc                 PIC 9(6).
       01  Csr-Loc-Parts           REDEFINES Csr-Loc.
           05  Csr-Row             PIC 999.
           05  Csr-Col             PIC 999.
       01  PF-Key                  PIC 99X.
       01  Fmt-Dy                  PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-V.
               10  Mo-Tbl-Jan      PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb      PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar      PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr      PIC X(9) VALUE "April".
               10  Mo-Tbl-May      PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun      PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul      PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug      PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep      PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct      PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov      PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec      PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-V  OCCURS 12 TIMES PIC X(9).
       01  The-Objects-Table.
           05  Obj-Entries OCCURS 4 TIMES.
               10  S-Next-Ptr      OBJECT REFERENCE.
               10  S-The-Date      PIC 9(8).
               10  S-L-Row        PIC 99.
               10  S-L-Col        PIC 99.
               10  S-U-Row        PIC 99.
               10  S-R-Col        PIC 99.
       01  Formatted-Date         PIC X(30) VALUE SPACES.
       01  End-Message            PIC X(12) VALUE "PRESS TO END".
       SCREEN SECTION.
       01  Screen-1 BLANK SCREEN BACKGROUND-COLOR 1,
                                 FOREGROUND-COLOR 7.
           05  First-Line.
               10  LINE S-L-Row(1) COLUMN S-L-Col(1)
                   REVERSE-VIDEO   PIC 9(8) USING S-The-Date(1).
               10  LINE S-L-Row(2) COLUMN S-L-Col(2)
                   REVERSE-VIDEO   PIC 9(8) USING S-The-Date(2).
               10  LINE S-L-Row(3) COLUMN S-L-Col(3)
                   REVERSE-VIDEO   PIC 9(8) USING S-The-Date(3).
               10  LINE S-L-Row(4) COLUMN S-L-Col(4)
                   REVERSE-VIDEO   PIC 9(8) USING S-The-Date(4).
           05  Second-Line LINE 12 COLUMN 20 PIC X(12)
                   USING End-Message.
           05  Last-Line.
               10  LINE 24 COLUMN 1 REVERSE-VIDEO
                   PIC X(30) FROM Formatted-Date.
       PROCEDURE DIVISION.
       METHOD-ID. UserPlay.
      *****************************************************************
      * METHOD TO DISPLAY ALL DATES ON THE SCREEN AND LET THE USER    *
      * SELECT A DATE.  WHEN DATE IS SELECTED, IT IS DISPLAYED IN     *
      * TEXT FORM AND USER CAN SELECT ANOTHER DATE OR TERMINATE.      *
      * CALL:  class :: "UserPlay"(First-Ptr)                         *
      * IN:  First-Ptr is pointer to first date object.               *
      * OUT: Nothing.                                                 *
      *****************************************************************
       DATA DIVISION.
       01  I                       PIC S9(5).
       LINKAGE SECTION.
       01  A-Ptr           OBJECT REFERENCE.
       PROCEDURE DIVISION USING A-Ptr.
       A00-Begin.
           PERFORM WITH TEST AFTER VARYING I FROM 1 BY 1
                   UNTIL A-Ptr = NULLS
              INVOKE A-Ptr "GetDates" USING I RETURNING A-Ptr
           END-PERFORM
           PERFORM WITH TEST AFTER
                   UNTIL Csr-Row <= 12 AND Csr-COL >= 20 AND
                         Csr-Row >= 11 AND Csr-Col <= 32
              MOVE S-L-Row(1) TO Csr-Row
              MOVE S-L-Col(1) TO Csr-Col
              DISPLAY Screen-1
              ACCEPT Screen-1
              MOVE 1 TO I
              PERFORM WITH TEST BEFORE
                      UNTIL I = ZERO OR S-NEXT-PTR(I) = NULLS
                 IF Csr-Row <= S-L-Row(I) AND Csr-Col >= S-L-Col(I)
                    AND
                    Csr-Row >= S-U-Row(I) AND Csr-Col <= S-R-Col(I)
                    THEN INVOKE "MoTextDate" USING S-The-Date(I),
                              RETURNING Formatted-Date
                         MOVE ZERO TO I
                    ELSE ADD 1 TO I
                 END-IF
              END-PERFORM
           END-PERFORM
           GOBACK.
       END METHOD UserPlay.
       METHOD-ID. MoTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Fmt-Date = class :: MoTextDate(The-Current-Date)       *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Fmt-Date is formatted date in form PIC X(30).  The       *
      *      formatted date is in text form, such as "January 1, 2000.*
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr       PIC 9(4).
           05  Cd-Mo       PIC 99.
           05  Cd-Dy       PIC 99.
       01  Fmt-Date        PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                          RETURNING Fmt-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                         Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                         Cd-Yr DELIMITED SIZE INTO Fmt-Date
           END-STRING
           GOBACK.
       END METHOD MoTextDate.
       METHOD-ID.  DyTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  Fmt-Date = class :: DyTextDate(The-Current-Date)       *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Fmt-Date is formatted date in form PIC X(30).  The       *
      *      formatted date is in text form, such as "1 January 2000. *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr       PIC 9(4).
           05  Cd-Mo       PIC 99.
           05  Cd-Dy       PIC 99.
       01  Fmt-Date  PIC X(30).
       PROCEDURE DIVISION USING Current-Date,
                                RETURNING Fmt-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Fmt-Dy DELIMITED " ",
                     " " DELIMITED SIZE,
                  Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Fmt-Date
           END-STRING
           GOBACK.
       END METHOD DyTextDate.
      *END FACTORY.
       OBJECT.
      *DATA DIVISION.
      *WORKING-STORAGE SECTION.
       OBJECT-STORAGE SECTION.
       01  Date-Data.
           05  Date-Ptr    OBJECT REFERENCE.
           05  The-Date    PIC 9(8).
           05  L-Row      PIC 99.
           05  L-Col      PIC 99.
           05  U-Row      PIC 99.
           05  R-Col      PIC 99.
       PROCEDURE DIVISION.
       METHOD-ID.  CreateDate.
      *****************************************************************
      * METHOD TO CREATE A DATE OBJECT AND STORE DATA IN IT.          *
      * CALL:  ptr :: "CreateDate"(Date,LRow,LCol,URow,Rcol,          *
      *                            Last-Ptr)                          *
      * IN:  Date is PIC 9(8) item containing date as yyyymmdd        *
      *      LRow, LCol,URow,RCol, are screen row, column positions   *
      *      of box around date, in PIC 99 format.                    *
      *      Last-Ptr is pointer to last date object.                 *
      * OUT: Date object is created and linked to last date object    *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  T-Last-Ptr  OBJECT REFERENCE.
       01  T-The-Date  PIC 9(8).
       01  T-L-Row    PIC 99.
       01  T-L-Col    PIC 99.
       01  T-U-Row    PIC 99.
       01  T-R-Col    PIC 99.
       PROCEDURE DIVISION USING T-The-Date, T-L-Row, T-L-Col,
                                T-U-Row, T-R-Col, T-Last-Ptr.
       A00-Begin.
           MOVE T-L-Row TO L-Row
           MOVE T-L-Col TO L-Col
           MOVE T-U-Row TO U-Row
           MOVE T-R-Col TO R-Col
           MOVE T-The-Date TO The-Date
           SET Date-Ptr TO NULLS
           IF T-Last-Ptr NOT = NULL
              THEN INVOKE T-Last-Ptr "LinkDate" USING SELF
           END-IF
           GOBACK.
       END PROGRAM CreateDate.
       METHOD-ID. LinkDate.
       DATA DIVISION.
      *****************************************************************
      * METHOD TO LINK A NEW DATE OBJECT TO THE LAST DATE OBJECT.     *
      * CALL:  ptr :: "LinkDate"(SELF)                                *
      * IN:  Pointer to the object being linked.                      *
      * OUT: Date-Ptr is set to the address of the current object.    *
      *****************************************************************
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  A-Ptr                   OBJECT REFERENCE.
       PROCEDURE DIVISION USING A-Ptr.
       A00-Begin.
           Set Date-Ptr TO A-Ptr
           GOBACK.
       END METHOD LinkDate.
       METHOD-ID. GetDates.
      *****************************************************************
      * METHOD TO GET THE INFORMATION FROM THE CURRENT DATE OBJECT.   *
      * CALL:  A-Ptr = ptr :: "GetDates"(I)                           *
      * IN:  Index to The-Objects-Table as PIC S9(5).                 *
      * OUT: A-Ptr contains pointer to the current object.            *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  I           PIC S9(5).
       01  A-Ptr       OBJECT REFERENCE.
       PROCEDURE DIVISION USING I RETURNING A-Ptr.
       A00-Begin.
           SET S-Next-Ptr(I) TO Date-Ptr
           MOVE The-Date TO S-The-Date(I)
           MOVE L-Row TO S-L-Row(I)
           MOVE L-Col TO S-L-Col(I)
           MOVE U-Row TO S-U-Row(I)
           MOVE R-Col TO S-R-Col(I)
           SET A-Ptr TO Date-Ptr
           GOBACK.
       END METHOD GetDates.
       METHOD-ID. GetLCol.
      *****************************************************************
      * METHOD TO GET THE LEFT COLUMN POSITION OF THE DATE OBJECT.    *
      * CALL:  I = ptr :: "GetLCol"                                   *
      * IN:  Nothing.                                                 *
      * OUT: I is left column position of the current object as       *
      *      PIC 999.                                                 *
      * NOTE:  THIS METHOD IS NOT USED IN THE APPLICATION.            *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  I           PIC 999.
       PROCEDURE DIVISION RETURNING I.
       A00-Begin.
           MOVE L-Col TO I
           GOBACK.
       END METHOD GetLCol.
       METHOD-ID. DestroyAll.
      *****************************************************************
      * METHOD TO DESTROY ALL THE DATE OBJECTS IN THE LINKED LIST.    *
      * CALL:  Date-Ptr = ptr :: "DestroyAll"(First-Ptr)              *
      * IN:  First-Ptr is pointer to first object in linked list.     *
      * OUT: Date-Ptr contains First-Ptr pointer.                     *
      *****************************************************************
       DATA DIVISION.
       LINKAGE SECTION.
       01  A-Ptr       OBJECT REFERENCE.
       01  B-Ptr       OBJECT REFERENCE.
       PROCEDURE DIVISION USING A-Ptr RETURNING B-Ptr.
       A00-Begin.
           IF Date-Ptr NOT = NULLS
              THEN INVOKE Date-Ptr "DestroyAll" RETURNING Date-Ptr
           END-IF
           INVOKE A-Ptr "FINALIZE" RETURNING A-Ptr
           GOBACK.
       END METHOD DestroyAll.
       END OBJECT.
       END CLASS BDates.

0059">

For comparison, here is the equivalent of the previous object-oriented program written as a standard COBOL program.




       IDENTIFICATION DIVISION.
       PROGRAM-ID. TESTDATE.
      *****************************************************************
      * PROGRAM TO DISPLAY NUMERIC DATES AND THEN LET THE PERSON AT   *
      * THE TERMINAL SELECT A DATE FOR THE PROGRAM TO DISPLAY IN TEXT *
      * FORM.                                                         *
      * IN:  First-Date, Second-Date, and Third-Date contains the     *
      *      three dates to display.                                  *
      * OUT: The formatted date is displayed as PIC X(30) in the form *
      *      such as "January 1, 2000.                                *
      *****************************************************************
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           CURSOR IS Csr-Loc
           CRT STATUS IS PF-Key.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Csr-Loc GLOBAL                PIC 9(6).
       01  Csr-Loc-Parts REDEFINES Csr-Loc GLOBAL.
           05  Csr-Row                   PIC 999.
           05  Csr-Col                   PIC 999.
       01  PF-Key                        PIC 99X.
       01  First-Ptr                     PIC 99 GLOBAL.
       01  I                             PIC 99.
       01  The-Obj GLOBAL.
           05  Obj-Nos                   OCCURS 3 TIMES.
               10  Next-Ptr              PIC 99.
               10  The-Date              PIC 9(8).
               10  LL-Row                PIC 99.
               10  LL-Col                PIC 99.
               10  UR-Row                PIC 99.
               10  UR-Col                PIC 99.
       01  One                           PIC 99 VALUE 1.
       01  Two                           PIC 99 VALUE 2.
       01  Three                         PIC 99 VALUE 3.
       01  Four                          PIC 99 VALUE 4.
       01  Five                          PIC 99 VALUE 5.
       01  Ten                           PIC 99 VALUE 10.
       01  Twelve                        PIC 99 VALUE 12.
       01  Twenty                        PIC 99 VALUE 20.
       01  Twentytwo                     PIC 99 VALUE 22.
       01  Thirty                        PIC 99 VALUE 30.
       01  First-Date                    PIC 9(8) VALUE 20030407.
       01  Second-Date                   PIC 9(8) VALUE 20011028.
       01  Third-Date                    PIC 9(8) VALUE 20060914.
       01  J                             PIC 99.
       PROCEDURE DIVISION.
       A00-Begin.
           CALL "CreateDate" USING First-Date, 
                Five, Two, Four, Ten, 
                One, First-Ptr
           CALL "CreateDate" USING Second-Date, 
                                   Five, Twelve, Four, 
                Twenty, Two, I
           COMPUTE J = I - 1
           CALL "LinkDate" USING I, J
           CALL "CreateDate" USING Third-Date, 
                                   Five, Twentytwo, Four, 
                Thirty, Three, I
           COMPUTE J = I - 1
           CALL "LinkDate" USING I, J
           CALL "UserPlay"
           GOBACK.
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  CreateDate.
      *****************************************************************
      * SUBPROGRAM TO CREATE A NEW DATE TO STORE IN THE DATE TABLE.   *
      * CALL:  CreateDate USING First-Date, Upper-Row, Left-Col,      *
      *        Lower-Row, Right-Col, Idx, Date                        *
      * IN:  First-Date is date in the form yyyymmdd in PIC 9(8).     *
      *      Upper-Row, Left-Col, Lower-Row, Right-Col is row, column *
      *      positions of box around date in the form PIC 99.         *
      * OUT: The values are stored in the The-Obj table.              *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  T-Next-Ptr                    PIC 99.
       01  T-The-Date                    PIC 9(8).
       01  T-LL-Row                      PIC 99.
       01  T-LL-Col                      PIC 99.
       01  T-UR-Row                      PIC 99.
       01  T-UR-Col                      PIC 99.
       01  I                             PIC 99.
       PROCEDURE DIVISION USING T-The-Date,
             T-LL-Row, T-LL-Col, T-UR-Row, 
             T-UR-Col, I,
             T-Next-Ptr.
       A00-Begin.
           MOVE I TO T-Next-Ptr
           MOVE T-LL-Row TO LL-Row(I)
           MOVE T-LL-Col TO LL-Col(I)
           MOVE T-UR-Row TO UR-Row(I)
           MOVE T-UR-Col TO UR-Col(I)
           MOVE T-The-Date TO The-Date(I)
           MOVE ZEROS TO Next-Ptr(I)
           GOBACK.
       END PROGRAM CreateDate.
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  LinkDate.
      *****************************************************************
      * SUBPROGRAM TO LINK A NEW DATE TO THE LIST OF DATES.           *
      * CALL:  LinkDate USING A-Ptr, I                                *
      * IN:  A-Ptr is a subscript to the new date to link to the date *
      *      list.                                                    *
      *      I is a subscript to the last date in the date list.      *
      * OUT: The new date is linked to the end of the date list.      *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       LINKAGE SECTION.
       01  A-Ptr                         PIC 99.
       01  I                             PIC 99.
       PROCEDURE DIVISION USING A-Ptr, I.
       A00-Begin.
           MOVE A-Ptr TO Next-Ptr(I)
           GOBACK.
       END PROGRAM LinkDate.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. UserPlay.
      *****************************************************************
      * SUBPROGRAM TO LINK A NEW DATE TO THE LIST OF DATES.           *
      * CALL:  UserPlay                                               *
      * IN:  LL-Row(I) contains row at which to display line.         *
      *      I is a subscript to the last date in the date list.      *
      * OUT: The new date is linked to the end of the date list.      *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Formatted-Date                PIC X(30).
       01  End-Message                   PIC X(12) 
                                         VALUE "PRESS TO END".
       01  I                             PIC 99 BINARY.
       SCREEN SECTION.
       01  Screen-1     BLANK SCREEN 
                        BACKGROUND-COLOR 1 FOREGROUND-COLOR 7.
           05  First-Line.
               10  LINE LL-Row(1) COLUMN LL-Col(1) 
                   REVERSE-VIDEO PIC 9(8) USING The-Date(1).
               10  LINE LL-Row(2) COLUMN LL-Col(2) 
                   REVERSE-VIDEO PIC 9(8) USING The-Date(2).
               10  LINE LL-Row(3) COLUMN LL-Col(3) 
                   REVERSE-VIDEO PIC 9(8) USING The-Date(3).
           05  Second-Line LINE 12 COLUMN 20 
                   PIC X(12) USING End-Message.
           05  Last-Line.
               10  LINE 24 COLUMN 1 
                   REVERSE-VIDEO PIC X(30) FROM Formatted-Date.
       PROCEDURE DIVISION.
       A00-Begin.
           MOVE SPACES TO Formatted-Date
           PERFORM WITH TEST AFTER
                   UNTIL Csr-Row <= 12 AND Csr-Col >= 20 AND
                         Csr-Row >= 11 AND Csr-Col <= 32
              MOVE LL-Row(1) TO Csr-Row
              MOVE LL-Col(1) TO Csr-Col
              DISPLAY Screen-1
              ACCEPT Screen-1
              MOVE First-Ptr TO I
              PERFORM WITH TEST BEFORE UNTIL I = ZERO
                 IF Csr-Row <= LL-Row(I) AND Csr-Col >= LL-Col(I) AND
                    Csr-Row >= UR-Row(I) AND Csr-Col <= UR-Col(I)
                    THEN CALL "MoTextDate" USING The-Date(I), 
                              Formatted-Date
                         MOVE ZERO TO I
                    ELSE MOVE Next-Ptr(I) TO I
                 END-IF
              END-PERFORM
           END-PERFORM
           GOBACK.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. MoTextDate.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  class :: MoTextDate(The-Current-Date)                  *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "January 1, 2000.               *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-Values.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-Values OCCURS 12 TIMES
                                         PIC X(9).
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date, 
                   Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Fmt-Dy DELIMITED " ", ", " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK.
       END PROGRAM MoTextDate.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DyTextDate.
       DATA DIVISION.
      *****************************************************************
      * METHOD TO CONVERT A CALENDAR DATE TO TEXT FORM.               *
      * CALL:  class :: DyTextDate(The-Current-Date)                  *
      * IN:  The-Current-Date is the calendar date in year--PIC 9(4), *
      *      month--PIC 9(2), day--PIC 9(2).                          *
      * OUT: Formatted date in form PIC X(30).  The formatted date    *
      *      is in text form, such as "1 January 2000.                *
      *****************************************************************
       WORKING-STORAGE SECTION.
       01  Fmt-Dy                        PIC X(3).
       01  Mo-Table.
           05  Mo-Tbl-Values.
               10  Mo-Tbl-Jan            PIC X(9) VALUE "January".
               10  Mo-Tbl-Feb            PIC X(9) VALUE "February".
               10  Mo-Tbl-Mar            PIC X(9) VALUE "March".
               10  Mo-Tbl-Apr            PIC X(9) VALUE "April".
               10  Mo-Tbl-May            PIC X(9) VALUE "May".
               10  Mo-Tbl-Jun            PIC X(9) VALUE "June".
               10  Mo-Tbl-Jul            PIC X(9) VALUE "July".
               10  Mo-Tbl-Aug            PIC X(9) VALUE "August".
               10  Mo-Tbl-Sep            PIC X(9) VALUE "September".
               10  Mo-Tbl-Oct            PIC X(9) VALUE "October".
               10  Mo-Tbl-Nov            PIC X(9) VALUE "November".
               10  Mo-Tbl-Dec            PIC X(9) VALUE "December".
           05  Mo-Tbl REDEFINES Mo-Tbl-Values OCCURS 12 TIMES
                                         PIC X(9).
       LINKAGE SECTION.
       01  Current-Date.
           05  Cd-Yr                     PIC 9(4).
           05  Cd-Mo                     PIC 99.
           05  Cd-Dy                     PIC 99.
       01  Formatted-Date                PIC X(30).
       PROCEDURE DIVISION USING Current-Date, 
                                Formatted-Date.
       A00-Begin.
           IF Cd-Dy < 10
              THEN MOVE Cd-Dy(2:1) TO Fmt-Dy
              ELSE MOVE Cd-Dy to Fmt-Dy
           END-IF
           MOVE SPACES TO Formatted-Date
           STRING Fmt-Dy DELIMITED ".",
                  " " DELIMITED SIZE,
                  Mo-Tbl(Cd-Mo) DELIMITED " ", " " DELIMITED SIZE
                  Cd-Yr DELIMITED SIZE INTO Formatted-Date
           END-STRING
           GOBACK.
       END PROGRAM DyTextDate.
       END PROGRAM UserPlay.
       END PROGRAM TESTDATE.

0059">

Chapter 29 READING PROGRAMS


Program example, for reading unstructured program. Page 568-575


This is a sample program of a typical legacy system written in unstructured COBOL.


000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID.  PAYYE.
000003* REMARKS.
000004* THIS PROGRAM COPIES THE PAY FILE AND EXCLUDES THOSE
000005* PERSONNEL RECORDS WHICH ARE NOT NEEDED IN NEW FISCAL YEAR.
000006* RECORDS ARE NOT NEEDED FOR NEW FISCAL YEAR IF THE PERSON
000007* IS INACTIVE, DOES NOT HAVE A COST IN THE COST
000008* FILE, AND DOES NOT APPEAR AS A PERSON RESPONSIBLE FOR A
000009* PROJECT IN THE PROJ FILE.
000010 ENVIRONMENT DIVISION.
000011 CONFIGURATION SECTION.
000012 SOURCE-COMPUTER.  IBM-370.
000013 OBJECT-COMPUTER.  IBM-370.
000014 INPUT-OUTPUT SECTION.
000015 FILE-CONTROL.
000016     SELECT In-Pay-File ASSIGN TO PAY.
000017     SELECT In-Cost-File ASSIGN TO SCOST.
000018     SELECT In-Proj-File ASSIGN TO PROJ.
000019     SELECT Out-Pay-File ASSIGN TO PAYOUT.
000020 DATA DIVISION.
000021 FILE SECTION.
000022 FD  In-Pay-File
000025     BLOCK CONTAINS 0 RECORDS
000024     RECORD CONTAINS 80 CHARACTERS
000025     LABEL RECORDS ARE STANDARD.
000026***** PAY FILE RECORD LAYOUT.  RECORD LENGTH = 80.
000027***** RELATIVE BYTE POSITION IN COLUMNS 75-77.
000028 01  Pay-Record.
00002      05  Pay-Key.
000030*                             RECORD KEY.
000031         10  Pay-Emp-Id          PIC X(9).
000032*                             PERSONS ID
000035     05  Pay-Name                PIC X(25).
000034*                             PERSONS NAME.
000035     05  Pay-Org-Person          PIC X(3).
000036*                             ORG OF PERSON.
000037     05  Pay-Salary              PIC S9(9)V9(2).
000038*                             ANNUAL SALARY IN DOLLARS.
000039     05  Pay-Status              PIC X(1).
000040*                             PERSONS STATUS.
000041*                             A-ACTIVE- I-INACTIVE.
000042     05  Pay-Date-Updated        PIC X(6).
000043*                             DATE RECORD LAST UPDATED.
000044*                             YYMMDD
000045     05  FILLER                  PIC X(25).
000046*                             AVAILABLE SPACE.
000047 FD  In-Cost-File
000048     RECORD CONTAINS 80 CHARACTERS
000049     BLOCK CONTAINS 0 RECORDS
000050     LABEL RECORDS ARE STANDARD.
000051***** COST FILE RECORD LAYOUT.  RECORD LENGTH = 80.
000052***** RELATIVE BYTE POSITION IN COLUMNS 73-77.
000053 01  Cost-Record.
000054     05  Cost-Key.
000055          10  Cost-Emp-Id        PIC X(9).
000056*                             ID or PERSON.
000057     05  Cost-Chg                PIC X(4).
000058*                             CHARGE NUMBER.
000059     05  Cost-Obj                PIC X(3).
000060*                             OBJECT CODE OF PERSON.
000061     05  Cost-To-Date.
000062*                             CUMULATIVE AMOUNTS TO DATE
000065          10  Cost-Amt           PIC S9(9)V99.
000064*                             DOLLAR AMOUNT EXCLUDING FRINGE
000065*                             AND OVERHEAD
000066          10  Cost-Days          PIC S9(9)V99.
000067*                             DAYS WORKED
000065          10  Cost-Fringe        PIC S9(9)V99.
000069*                             DOLLAR AMOUNT OF FRINGE.
000070          10  Cost-Overhead      PIC S9(9)V99.
000071*                             DOLLAR AMOUNT OF OVERHEAD.
000072     05  Cost-Date-Updated       PIC X(6).
000075*                             DATE RECORD LAST UPDATED.
000074*                             YYMMDD
000075     05  FILLER                  PIC X(14).
000076*                             AVAILABLE SPACE.
000077 FD  In-Proj-File
000078     BLOCK CONTAINS 0 RECORDS
000079     RECORD CONTAINS 80 CHARACTERS
000080     LABEL RECORDS ARE STANDARD.
000081***** PROJ FILE RECORD LAYOUT.  RECORD LENGTH = 80.
000082***** RELATIVE BYTE POSITION IN COLUMNS 73-77.
000085 01  Proj-Record.
000084     05  Proj-Key.
000085*                             RECORD KEY
000086          10  Proj-Chg           PIC X(4).
000087*                             CHARGE NUMBER.
000088     05  Proj-Chg-Title          PIC X(25).
000089*                             PROJECT TITLE.
000090     05  Proj-Act-Type           PIC X(1).
000091*                             ACTIVITY TYPE.
000092*                             D-DIRECT
000093*                             I-INDIRECT
000094     05  Proj-Person             PIC X(9).
000095*                             ID OF PERSON RESPONSIBLE.
000096     05  Proj-Amount             PIC S9(9)V9(2).
000097*                             TOTAL CONTRACT AMOUNT.
000098     05  Proj-Start-Date.
000099*                             CONTRACT START DATE.
000100          10  Proj-Start-Yr      PIC 9(2).
000101          10  Proj-Start-Mo      PIC 9(2).
000102          10  Proj-Start-Dy      PIC 9(2).
000103     05  Proj-End-Date.
000104*                             CONTRACT END DATE.
000105          10  Proj-End-Yr        PIC 9(2).
000106          10  Proj-End-Mo        PIC 9(2).
000107          10  Proj-End-Dy        PIC 9(2).
000108     05  Proj-Active-Flag        PIC X(1).
000109*                             ACTIVE FLAG.
000110*                             A - ACTIVE.
000111*                             I - INACTIVE.
000112     05  Proj-Date-Updated       PIC X(6).
000113*                             DATE RECORD LAST UPDATED.
000114*                             YYMMDD.
000115     05  FILLER                  PIC X(11).
000116*                             AVAILABLE SPACE.
000117 FD  Out-Pay-File
000118     BLOCK CONTAINS 0 RECORDS
000119     RECORD CONTAINS 80 CHARACTERS
000120     LABEL RECORDS ARE STANDARD.
000121 01  Out-Pay-Rec.
000122     05  Out-Pay-Key             PIC X(9).
000123     05  FILLER                  PIC X(71).
000124 WORKING-STORAGE SECTION.
000125 01  FILLER COMP SYNC.
000126     05  In-Count                PIC S9(4) VALUE 0.
000127     05  Out-Count               PIC S9(4) VALUE 0.
000128     05  Drop-Count              PIC S9(4) VALUE 0.
000129 01  FILLER.
000130     05  Proj-Table-Size         PIC S9(4) COMP SYNC VALUE 1000.
000131     05  Proj-Table OCCURS 1000 DEPENDING ON Proj-Table-Size
000132          INDEXED BY Projx       PIC X(6).
000133 PROCEDURE DIVISION.
000134 A10-Begin.
000135     OPEN INPUT In-Proj-File.
000136     SET Projx TO 1.
000137 A20-Read-Proj.
000138     READ In-Proj-File AT END GO TO A30.
000139     MOVE Proj-Person TO Proj-Table (Projx).
000140     SET Projx UP BY 1.
000141     GO TO A20-Read-Proj.
000142 A30.
000143     SET Projx DOWN BY 1.
000144     SET Proj-Table-Size TO Projx.
000145     CLOSE In-Proj-File.
000146     OPEN INPUT In-Pay-File.
000147     OPEN INPUT In-Cost-File.
000148     OPEN OUTPUT Out-Pay-File.
000149     MOVE LOW-VALUES TO Cost-Emp-Id.
000150 B10-Read-Pay.
000151     READ In-Pay-File AT END GO TO D10-End.
000152     ADD 1 TO In-Count.
000153     IF Pay-Status = "A" GO TO B30-Keep-Pay.
000154     PERFORM C10-Level-Cost THRU C20-Exit.
000155     IF Pay-Emp-Id = Cost-Emp-Id GO TO B30-Keep-Pay.
000156     SET Projx TO 1.
000157     SEARCH Proj-Table
000158       WHEN Pay-Emp-Id = Proj-Table (Projx)
000159            GO TO B30-Keep-Pay.
000160 B20-Drop-Pay.
000161     ADD 1 TO Drop-Count.
000162     DISPLAY "Pay-Key: ", Pay-Key.
000163     GO TO B10-Read-Pay.
000164 B30-Keep-Pay.
000165     WRITE Out-Pay-Rec FROM Pay-Record.
000166     ADD 1 TO Out-Count.
000167     GO TO B10-Read-Pay.
000168 C10-Level-Cost.
000169     IF Cost-Emp-Id NOT < Pay-Emp-Id GO TO C20-Exit.
000170     READ In-Cost-File AT END
000171       MOVE HIGH-VALUES TO Cost-Emp-Id
000172       GO TO C20-Exit.
000173     IF Cost-Emp-Id < Pay-Emp-Id GO TO C10-Level-Cost.
000174 C20-Exit.  EXIT.
000175 D10-End.
000176     DISPLAY "PAY IN =" In-Count.
000177     DISPLAY "PAY OUT =" Out-Count.
000175     DISPLAY "PAY DROP =" Drop-Count.
000179     CLOSE In-Pay-File.
000180     CLOSE Out-Pay-File.
000181     CLOSE In-Cost-File.
000182     STOP RUN.
000183*** END OF PROGRAM ***

0059">

Chapter 31
APPLICATION PROGRAMMING INTERFACES


Program example, application programming interface. Page 592-593


This program illustrates the SQL interface.


       IDENTIFICATION DIVISION.
       PROGRAM-ID.  PARTQUERY.
      *****************************************************************
      * PROGRAM TO ACCEPT A PART NUMBER AND THEN RETRIEVE INFORMATION *
      * ABOUT THE PART USING SQL.                                     *
      * IN:  LIBRARY (TESTDB2.DCLGENS COBOL (PARTS)                   *
      *      TEST.PARTS TABLE                                         *
      * OUT: PARTS INFORMATION DISPLAYED.                             *
      *****************************************************************
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  Switches.
           05  End-Of-Query-Sw           PIC X VALUE "N".
               88  End-Of-Query          VALUE "Y".
           05  Part-Located-Sw           PIC X VALUE "N".
               88  Part-Located          VALUE "Y".
              EXEC SQL
                   INCLUDE PARTS
              END-EXEC.
              EXEC SQL
                   INCLUDE SQLCA
              END-EXEC.
       PROCEDURE DIVISION.
       A00-Begin.
           PERFORM A10-Get-Parts UNTIL End-Of-Query
           GOBACK
           .
       A10-Get-Parts.
           DISPLAY "Type in the part number and press the Enter key"
           DISPLAY "or type in  xxxxxx and press the Enter key to quit."
           ACCEPT PartNo.
           IF PartNo = "xxxxxx"
              THEN MOVE "Y" TO End-Of-Query-Sw
           END-IF
           IF NOT End-Of-Query
              THEN MOVE "Y" TO Part-Located-Sw
                   PERFORM A30-Retrieve-Part-Row
                   IF Part-Located
                      THEN DISPLAY "  PART NUMBER    ", PartNo
                           DISPLAY "  SUPPLIER        ", Supplier
                           DISPLAY "  Phone          ", Phone
                      ELSE DISPLAY  "PART NUMBER NOT FOUND ", PartNo
                   END-IF
           END-IF
           .
      **** EXIT
       A30-Retrieve-Part-Row.
           EXEC SQL
                SELECT Supplier, Phone
                       INTO :Supplier,:Phone
                       FROM TEST.PARTS
                       WHERE PartNo = :PartNo
           END-EXEC.
           IF SQLCODE NOT = 0
              THEN MOVE "N" TO Part-Located-Sw
           END-IF
           .
      **** EXIT
       END PROGRAM PARTQUERY.
83

0059">

Cover

  ISBN 0-471-31481-1
656 pages
November, 1998

Wiley Computer Publishing
Timely. Practical. Reliable.


Email the author with questions and comments

WCP Home Page

[ Home ] [ References ] [ Exercises ] [ Programs ]