Use Excel to Compute COBOL Results

Does Excel belong in a COBOL class? We think it does because it is a fantastic tool with which to compute anticipated output, the first step in developing any COBOL program. The first thing I do as an instructor in assigning a project, is to require students to submit the anticipated output based on the sample data supplied with the program. They can do this via pencil and paper. They can also do it in Excel depending on how much of the application they remember. But it's easy. In essence you open a data file in Excel (be sure to specify all files as the file type) and the Input Wizard will convert the txt file to a workbook. From there you can use formulas as appropriate to get the output.

As indicated, the first step in the assignment is for the student to read the processing specifications and to compute the intended results. The typical solution is traditional, with pencil and paper, but you can facilitate the process with an Excel worksheet. Regardless, however, of how the student determines the anticipated output, computation of the output does several things:

  1. It confirms for both student and instructor the desired result of the COBOL program. The student knows the intended result and the instructor has an invaluable aid in grading the projects.
  2. It eliminates any ambiguities that might exist in the specifications and/or clarifies the intended result of more complicated specifications.
  3. It reinforces material learned in an earlier class; moreover the concept is applicable to programming in any language.

Once the class is introduced to Excel, the next question is inevitably "If I can do this in 10 minutes in Excel, why do I need two weeks to write a COBOL program?" The answer in a word is the I/O capability that is built into COBOL to process large files, which far exceeds the capability of a spreadsheet. Of course not every project is amenable to a solution by Excel, but you will be pleasantly surprised at how many fit. More advanced projects will require the Excel IF, VLOOKUP, and SUBTOTAL functions, but students enjoy this review.


Using the Primary Key for a Record Look-up

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\I\PERSON.DAT'
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS PERSON-KEY
ALTERNATE RECORD KEY IS PERSON-ALTERNATE-KEY
WITH DUPLICATES
FILE STATUS IS IO-FILE-STATUS.

DATA DIVISION.
FILE SECTION.

FD PERSON-FILE
DATA RECORD IS PERSON-ITEM.

01 PERSON-ITEM.
02 PERSON-KEY.
03 PERSON-ID PICTURE X(4).
02 PERSON-ALTERNATE-KEY.
03 PERSON-NAME PICTURE X(20).
02 PERSON-ADDRESS PICTURE X(20).
02 PERSON-CITY PICTURE X(18).
02 PERSON-STATE PICTURE X(2).
02 PERSON-ZIP PICTURE X(5).
02 PERSON-PHONE.
03 PERSON-AREA-CODE PICTURE X(3).
03 PERSON-PHONE-NUMBER PICTURE X(7).
02 PERSON-STATUS PICTURE X.

WORKING-STORAGE SECTION.

01 INVALID-PERSON-KEY-FLAG PICTURE X.
88 INVALID-PERSON-KEY VALUE 'Y'.
88 VALID-PERSON-KEY VALUE 'N'.

01 IO-FILE-STATUS PICTURE X(2).

PROCEDURE DIVISION.

MAIN-LINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM LOOKUP-A-RECORD.
PERFORM EOJ-ROUTINE.
STOP RUN.


INITIALIZATION-ROUTINE.
OPEN I-O PERSON-FILE.


LOOKUP-A-RECORD.
DISPLAY 'Enter ID Number for the record you want to view: '.
ACCEPT PERSON-KEY.
PERFORM GET-PERSON-ITEM.
IF INVALID-PERSON-KEY
DISPLAY 'Record not found'
ELSE
DISPLAY PERSON-NAME
DISPLAY PERSON-ADDRESS
DISPLAY PERSON-CITY ' ' PERSON-STATE ' ' PERSON-ZIP
DISPLAY '(' PERSON-AREA-CODE ') '
PERSON-PHONE-NUMBER (1:3) '-'
PERSON-PHONE-NUMBER (4:4)
END-IF.


EOJ-ROUTINE.
CLOSE PERSON-FILE.


GET-PERSON-ITEM.
MOVE 'N' TO INVALID-PERSON-KEY-FLAG.
READ PERSON-FILE
INVALID KEY
MOVE 'Y' TO INVALID-PERSON-KEY-FLAG.

Program to Delete a Record from an Indexed File

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\I\PERSON.DAT'
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS PERSON-KEY
ALTERNATE RECORD KEY IS PERSON-ALTERNATE-KEY
WITH DUPLICATES
FILE STATUS IS IO-FILE-STATUS.

DATA DIVISION.
FILE SECTION.

FD PERSON-FILE
DATA RECORD IS PERSON-ITEM.

01 PERSON-ITEM.
02 PERSON-KEY.
03 PERSON-ID PICTURE X(4).
02 PERSON-ALTERNATE-KEY.
03 PERSON-NAME PICTURE X(20).
02 PERSON-ADDRESS PICTURE X(20).
02 PERSON-CITY PICTURE X(18).
02 PERSON-STATE PICTURE X(2).
02 PERSON-ZIP PICTURE X(5).
02 PERSON-PHONE.
03 PERSON-AREA-CODE PICTURE X(3).
03 PERSON-PHONE-NUMBER PICTURE X(7).
02 PERSON-STATUS PICTURE X.

WORKING-STORAGE SECTION.

01 INVALID-PERSON-KEY-FLAG PICTURE X.
88 INVALID-PERSON-KEY VALUE 'Y'.
88 VALID-PERSON-KEY VALUE 'N'.

01 IO-FILE-STATUS PICTURE X(2).

PROCEDURE DIVISION.

MAIN-LINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM DELETE-A-RECORD.
PERFORM EOJ-ROUTINE.
STOP RUN.


INITIALIZATION-ROUTINE.
OPEN I-O PERSON-FILE.


DELETE-A-RECORD.
DISPLAY 'Enter ID Number for the record you want to delete: '.
ACCEPT PERSON-KEY.
PERFORM DELETE-PERSON-ITEM.
IF INVALID-PERSON-KEY
DISPLAY 'Record not found'
ELSE
DISPLAY 'Record deleted'
END-IF.


EOJ-ROUTINE.
CLOSE PERSON-FILE.


DELETE-PERSON-ITEM.
MOVE 'N' TO INVALID-PERSON-KEY-FLAG.
DELETE PERSON-FILE
INVALID KEY
MOVE 'Y' TO INVALID-PERSON-KEY-FLAG.

Updating a Record in an Indexed File

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\I\PERSON.DAT'
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS PERSON-KEY
ALTERNATE RECORD KEY IS PERSON-ALTERNATE-KEY
WITH DUPLICATES
FILE STATUS IS IO-FILE-STATUS.

DATA DIVISION.
FILE SECTION.

FD PERSON-FILE
DATA RECORD IS PERSON-ITEM.

01 PERSON-ITEM.
02 PERSON-KEY.
03 PERSON-ID PICTURE X(4).
02 PERSON-ALTERNATE-KEY.
03 PERSON-NAME PICTURE X(20).
02 PERSON-ADDRESS PICTURE X(20).
02 PERSON-CITY PICTURE X(18).
02 PERSON-STATE PICTURE X(2).
02 PERSON-ZIP PICTURE X(5).
02 PERSON-PHONE.
03 PERSON-AREA-CODE PICTURE X(3).
03 PERSON-PHONE-NUMBER PICTURE X(7).
02 PERSON-STATUS PICTURE X.

WORKING-STORAGE SECTION.

01 INVALID-PERSON-KEY-FLAG PICTURE X.
88 INVALID-PERSON-KEY VALUE 'Y'.
88 VALID-PERSON-KEY VALUE 'N'.

01 IO-FILE-STATUS PICTURE X(2).

PROCEDURE DIVISION.

MAIN-LINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM CHANGE-A-RECORD.
PERFORM EOJ-ROUTINE.
STOP RUN.


INITIALIZATION-ROUTINE.
OPEN I-O PERSON-FILE.


CHANGE-A-RECORD.
DISPLAY 'Enter ID Number for the record you want to change: '.
ACCEPT PERSON-KEY.
PERFORM GET-PERSON-ITEM.
IF INVALID-PERSON-KEY
DISPLAY 'Record not found'
ELSE
DISPLAY PERSON-NAME
DISPLAY PERSON-ADDRESS
DISPLAY PERSON-CITY ' ' PERSON-STATE ' ' PERSON-ZIP
DISPLAY 'Enter new area code and phone number: '
ACCEPT PERSON-PHONE
PERFORM REPLACE-PERSON-ITEM
IF VALID-PERSON-KEY
DISPLAY 'Phone number updated: '
'(' PERSON-AREA-CODE ') '
PERSON-PHONE-NUMBER (1:3) '-'
PERSON-PHONE-NUMBER (4:4)
ELSE
DISPLAY 'Error updating phone number'
END-IF
END-IF.


EOJ-ROUTINE.
CLOSE PERSON-FILE.


GET-PERSON-ITEM.
MOVE 'N' TO INVALID-PERSON-KEY-FLAG.
READ PERSON-FILE
INVALID KEY
MOVE 'Y' TO INVALID-PERSON-KEY-FLAG.


REPLACE-PERSON-ITEM.
MOVE 'N' TO INVALID-PERSON-KEY-FLAG.
REWRITE PERSON-ITEM
INVALID KEY
MOVE 'Y' TO INVALID-PERSON-KEY-FLAG.

Program to lists all records in the file in sequential order.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\I\PERSON.DAT'
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS PERSON-KEY
ALTERNATE RECORD KEY IS PERSON-ALTERNATE-KEY
WITH DUPLICATES
FILE STATUS IS IO-FILE-STATUS.

DATA DIVISION.
FILE SECTION.

FD PERSON-FILE
DATA RECORD IS PERSON-ITEM.

01 PERSON-ITEM.
02 PERSON-KEY.
03 PERSON-ID PICTURE X(4).
02 PERSON-ALTERNATE-KEY.
03 PERSON-NAME PICTURE X(20).
02 PERSON-ADDRESS PICTURE X(20).
02 PERSON-CITY PICTURE X(18).
02 PERSON-STATE PICTURE X(2).
02 PERSON-ZIP PICTURE X(5).
02 PERSON-PHONE.
03 PERSON-AREA-CODE PICTURE X(3).
03 PERSON-PHONE-NUMBER PICTURE X(7).
02 PERSON-STATUS PICTURE X.

WORKING-STORAGE SECTION.

01 KBD-LETTER PIC X.

01 INVALID-PERSON-KEY-FLAG PICTURE X.
88 INVALID-PERSON-KEY VALUE 'Y'.
88 VALID-PERSON-KEY VALUE 'N'.

01 IO-FILE-STATUS PICTURE X(2).

PROCEDURE DIVISION.

MAIN-LINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM THE-LOOP
UNTIL INVALID-PERSON-KEY.
PERFORM EOJ-ROUTINE.
STOP RUN.

INITIALIZATION-ROUTINE.
OPEN I-O PERSON-FILE.
PERFORM GET-NEXT-PERSON-ITEM.

THE-LOOP.
DISPLAY PERSON-NAME.
DISPLAY PERSON-ADDRESS.
DISPLAY PERSON-CITY ' ' PERSON-STATE ' ' PERSON-ZIP.
DISPLAY '(' PERSON-AREA-CODE ') '
PERSON-PHONE-NUMBER (1:3) '-'
PERSON-PHONE-NUMBER (4:4).
DISPLAY '------------------------------'.
PERFORM GET-NEXT-PERSON-ITEM.


EOJ-ROUTINE.
CLOSE PERSON-FILE.

GET-NEXT-PERSON-ITEM.
MOVE 'N' TO INVALID-PERSON-KEY-FLAG.
READ PERSON-FILE NEXT
AT END
MOVE 'Y' TO INVALID-PERSON-KEY-FLAG.

Create Indexed File and Add Records

 ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\I\PERSON.DAT'
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS PERSON-KEY
ALTERNATE RECORD KEY IS PERSON-ALTERNATE-KEY
WITH DUPLICATES
FILE STATUS IS IO-FILE-STATUS.

DATA DIVISION.
FILE SECTION.

FD PERSON-FILE
DATA RECORD IS PERSON-ITEM.

01 PERSON-ITEM.
02 PERSON-KEY.
03 PERSON-ID PICTURE X(4).
02 PERSON-ALTERNATE-KEY.
03 PERSON-NAME PICTURE X(20).
02 PERSON-ADDRESS PICTURE X(20).
02 PERSON-CITY PICTURE X(18).
02 PERSON-STATE PICTURE X(2).
02 PERSON-ZIP PICTURE X(5).
02 PERSON-PHONE.
03 PERSON-AREA-CODE PICTURE X(3).
03 PERSON-PHONE-NUMBER PICTURE X(7).
02 PERSON-STATUS PICTURE X.

WORKING-STORAGE SECTION.

01 INVALID-PERSON-KEY-FLAG PICTURE X.
88 INVALID-PERSON-KEY VALUE 'Y'.
88 VALID-PERSON-KEY VALUE 'N'.

01 IO-FILE-STATUS PICTURE X(2).

01 EOF-FLAG PICTURE X.
88 NO-MORE-INPUT VALUES 'N' 'n'.

PROCEDURE DIVISION.

MAIN-LINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM DATA-ENTRY
UNTIL NO-MORE-INPUT.
PERFORM EOJ-ROUTINE.
STOP RUN.

* We use OPEN OUTPUT to create a new file. If the file already
* existed we would use OPEN I-O PERSON-FILE to add additional
* records to it.

INITIALIZATION-ROUTINE.
OPEN OUTPUT PERSON-FILE.
PERFORM PROMPT-THE-OPERATOR.


DATA-ENTRY.
DISPLAY 'Enter ID Number: '.
ACCEPT PERSON-ID.
DISPLAY 'Enter Name: '.
ACCEPT PERSON-NAME.
DISPLAY 'Enter Address: '.
ACCEPT PERSON-ADDRESS.
DISPLAY 'Enter City: '.
ACCEPT PERSON-CITY.
DISPLAY 'Enter State: '.
ACCEPT PERSON-STATE.
DISPLAY 'Enter Zip Code: '.
ACCEPT PERSON-ZIP.
DISPLAY 'Enter Area Code and Phone Number: '.
ACCEPT PERSON-PHONE.
MOVE '1' TO PERSON-STATUS.
PERFORM ADD-PERSON-ITEM.
IF VALID-PERSON-KEY
DISPLAY 'Record added successfully'
ELSE
DISPLAY 'Error adding record to Person file'
END-IF.
PERFORM PROMPT-THE-OPERATOR.


EOJ-ROUTINE.
CLOSE PERSON-FILE.


PROMPT-THE-OPERATOR.
DISPLAY 'Do you want to enter a new record? '.
ACCEPT EOF-FLAG.
IF NOT NO-MORE-INPUT
MOVE 'Y' TO EOF-FLAG.


ADD-PERSON-ITEM.
MOVE 'N' TO INVALID-PERSON-KEY-FLAG.
WRITE PERSON-ITEM
INVALID KEY.
MOVE 'Y' TO INVALID-PERSON-KEY-FLAG

Sequential file, Sequential access,Indexed file, Dynamic access

Sequential file, Sequential access

       ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'A:\PERSON.DAT'
ORGANIZATION IS LINE SEQUENTIAL.

Indexed file, Dynamic access

       ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PERSON-FILE
ASSIGN TO 'A:\PERSON.DAT'
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS PERSON-KEY
ALTERNATE RECORD KEY IS PERSON-ALTERNATE-KEY
WITH DUPLICATES
FILE STATUS IS IO-FILE-STATUS.

One field must be designated the primary key. The primary key must be unique within the file; no two records in the file may have the same value for the primary key field. For example, social security number is a unique value per person.

The alternate key is optional. And, the alternate key is not required to be unique. For example, a data file might contain records for more than one person with a common name such as John Smith. An alternate key such as name may have duplicate values within the file, but the records could be distinguished by their unique primary key (e.g., social security number).

There may be multiple alternate key fields. For example, a data file might have social security number as its primary key, name as one alternate key, and telephone number as another alternate key.

Dynamic mode in Cobol allows the program both random and sequential access as needed to an indexed file.

Test Grading Example

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT TEST-CARDS
ASSIGN TO 'C:\PCOBWIN\ROGERS\TESTCARD.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT GRADE-REPORT
ASSIGN TO 'C:\PCOBWIN\ROGERS\RESULTS.TXT'
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD TEST-CARDS
DATA RECORD IS CARD-IN.
01 CARD-IN.
02 CARD-NAME PIC X(20).
02 CARD-ANSWERS.
03 CARD-ANSWER
OCCURS 20 TIMES PIC X.

FD GRADE-REPORT
DATA RECORD IS REPORT-LINE.
01 REPORT-LINE PIC X(80).

WORKING-STORAGE SECTION.

01 ANSWER-TABLE.
02 CORRECT-ANSWER
OCCURS 20 TIMES PIC X.

01 ANSWER-SUB PIC 9(2).

01 WS-SCORE PIC 9(3).

01 DETAIL-LINE.
02 DETAIL-NAME PIC X(20).
02 PIC X(5) VALUE SPACES.
02 DETAIL-SCORE PIC ZZ9.
02 PIC X VALUE '%'.
02 PIC X(5) VALUE SPACES.
02 DETAIL-LETTER PIC X.

01 DATA-REMAINS-SWITCH PIC X VALUE 'Y'.
88 NO-MORE-TESTS-TO-GRADE VALUE 'N'.

PROCEDURE DIVISION.
MAIN-LINE.
PERFORM LETS-GET-STARTED.
PERFORM GRADE-THE-TESTS
UNTIL NO-MORE-TESTS-TO-GRADE.
PERFORM CLEAN-UP.
STOP RUN.

LETS-GET-STARTED.
OPEN INPUT TEST-CARDS.
OPEN OUTPUT GRADE-REPORT.
* Read the answer key and save it
READ TEST-CARDS
AT END MOVE 'N' TO DATA-REMAINS-SWITCH.
MOVE CARD-ANSWERS TO ANSWER-TABLE.
* Read the first student's answers
READ TEST-CARDS
AT END MOVE 'N' TO DATA-REMAINS-SWITCH.

GRADE-THE-TESTS.
MOVE ZERO TO WS-SCORE.
PERFORM GRADE-A-TEST
VARYING ANSWER-SUB FROM 1 BY 1
UNTIL ANSWER-SUB > 20.
MOVE CARD-NAME TO DETAIL-NAME.
MOVE WS-SCORE TO DETAIL-SCORE.
IF WS-SCORE > 92
MOVE 'A' TO DETAIL-LETTER
ELSE IF WS-SCORE > 84
MOVE 'B' TO DETAIL-LETTER
ELSE IF WS-SCORE > 75
MOVE 'C' TO DETAIL-LETTER
ELSE IF WS-SCORE > 69
MOVE 'D' TO DETAIL-LETTER
ELSE
MOVE 'F' TO DETAIL-LETTER
END-IF
END-IF
END-IF
END-IF.
WRITE REPORT-LINE FROM DETAIL-LINE.
* Read the next student's answers
READ TEST-CARDS
AT END MOVE 'N' TO DATA-REMAINS-SWITCH.

GRADE-A-TEST.
* 20 questions are each worth 5 points
IF CARD-ANSWER (ANSWER-SUB) = CORRECT-ANSWER (ANSWER-SUB)
ADD 5 TO WS-SCORE.

CLEAN-UP.
CLOSE TEST-CARDS.
CLOSE GRADE-REPORT.

Input Data

                    ACBDAABCDDDAABDDAAAB
Jason Dube ACBDAABBDDDAABDDAAAB
Ashley Flynn ACBDAABCDDDAABDDAAAB
Adriane Gehl ACBDAABCDDDAABACAAAB
Rachel Holtz BCBBAABCDDDAABDDDAAB
Bryan King ACBCAA CABCAABDDAAAB
Amanda Solpa ACBDAABCDDAAABDDAAAB
Sean Theis ACBDAABCADCAACDDAAAC

Output Report

Jason Dube                95%     A
Ashley Flynn 100% A
Adriane Gehl 90% B
Rachel Holtz 85% B
Bryan King 75% D
Amanda Solpa 95% A
Sean Theis 80% C

Example: Sort on Calculated Field

 ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTC.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTC.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-STUDENT-NAME PIC X(15).
02 IN-CREDITS-TAKEN PIC 9(3).
02 IN-QUALITY-POINTS PIC 9(3).

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD PIC X(80).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-STUDENT-NAME PIC X(15).
02 SORT-CREDITS-TAKEN PIC 9(3).
02 SORT-QUALITY-POINTS PIC 9(3).
02 SORT-GPA PIC 9V99.

WORKING-STORAGE SECTION.

01 DETAIL-LINE.
02 DETAIL-STUDENT-NAME PIC X(15).
02 PIC X(3) VALUE SPACES.
02 DETAIL-GPA PIC 9.99.

01 SORTED-DATA-SWITCH PIC X VALUE 'N'.
88 NO-MORE-SORTED-DATA VALUE 'Y'.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON DESCENDING KEY SORT-GPA
INPUT PROCEDURE IS CALCULATE-GPA
OUTPUT PROCEDURE IS PRINT-THE-REPORT.
STOP RUN.

CALCULATE-GPA.
OPEN INPUT IN-FILE.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.
PERFORM DATA-LOOP
UNTIL NO-MORE-INPUT-RECORDS.
CLOSE IN-FILE.

DATA-LOOP.
MOVE IN-STUDENT-NAME TO SORT-STUDENT-NAME.
MOVE IN-CREDITS-TAKEN TO SORT-CREDITS-TAKEN.
MOVE IN-QUALITY-POINTS TO SORT-QUALITY-POINTS.
COMPUTE SORT-GPA ROUNDED =
IN-QUALITY-POINTS / IN-CREDITS-TAKEN.
RELEASE SORT-RECORD.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.

PRINT-THE-REPORT.
OPEN OUTPUT OUT-FILE.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.
PERFORM REPORT-LOOP
UNTIL NO-MORE-SORTED-DATA.
CLOSE OUT-FILE.

REPORT-LOOP.
MOVE SORT-STUDENT-NAME TO DETAIL-STUDENT-NAME.
MOVE SORT-GPA TO DETAIL-GPA.
WRITE OUT-RECORD FROM DETAIL-LINE.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.

Input

CHARLIE HACKLEY010040
GORDON HUME 006018
TOMMY BEIDLER 012048
KATHY PECK 040080
MARY UECKER 020070
J.C. SANFORD 006000
DUANE NORTON 015042

Output (report sorted by calculated field G.P.A.)

CHARLIE HACKLEY   4.00
TOMMY BEIDLER 4.00
MARY UECKER 3.50
GORDON HUME 3.00
DUANE NORTON 2.80
KATHY PECK 2.00
J.C. SANFORD 0.00

Sort Example: With Control Break

  ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED4.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).
88 VALID-STATE-CODE VALUES 'AK'
'AL' 'AR' 'AZ' 'CA' 'CO' 'CT' 'DC' 'DE' 'FL' 'GA'
'HI' 'IA' 'ID' 'IL' 'IN' 'KS' 'KY' 'LA' 'MA' 'MD'
'ME' 'MI' 'MN' 'MO' 'MS' 'MT' 'NC' 'ND' 'NE' 'NH'
'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'RI' 'SC'
'SD' 'TN' 'TX' 'UT' 'VA' 'VT' 'WA' 'WI' 'WV' 'WY'.

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD PIC X(80).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

01 DETAIL-LINE.
02 DETAIL-ID PIC 9(5).
02 PIC X(3) VALUE SPACES.
02 DETAIL-LAST-NAME PIC X(15).
02 PIC X(3) VALUE SPACES.
02 DETAIL-FIRST-NAME PIC X(10).
02 PIC X(3) VALUE SPACES.
02 DETAIL-CITY PIC X(12).
02 PIC X(3) VALUE SPACES.
02 DETAIL-STATE PIC X(2).

01 SORTED-DATA-SWITCH PIC X VALUE 'N'.
88 NO-MORE-SORTED-DATA VALUE 'Y'.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

01 STATE-COUNT PIC 9(3) VALUE ZERO.

01 BREAK-LINE.
02 PIC X(8) VALUE SPACES.
02 PRINT-COUNT PIC ZZ9.
02 PIC X(12)
VALUE ' RECORDS IN '.
02 CURRENT-STATE PIC X(2).

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON ASCENDING KEY SORT-STATE
ON ASCENDING KEY SORT-LAST-NAME
INPUT PROCEDURE IS INPUT-LOGIC
OUTPUT PROCEDURE IS CREATE-REPORT.
STOP RUN.

INPUT-LOGIC.
OPEN INPUT IN-FILE.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.
PERFORM DATA-LOOP
UNTIL NO-MORE-INPUT-RECORDS.
CLOSE IN-FILE.

DATA-LOOP.
IF VALID-STATE-CODE
MOVE IN-RECORD TO SORT-RECORD
RELEASE SORT-RECORD.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.

CREATE-REPORT.
OPEN OUTPUT OUT-FILE.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.
MOVE SORT-STATE TO CURRENT-STATE.
PERFORM REPORT-LOOP
UNTIL NO-MORE-SORTED-DATA.
PERFORM DO-CONTROL-BREAK.
CLOSE OUT-FILE.

REPORT-LOOP.
IF SORT-STATE NOT = CURRENT-STATE
PERFORM DO-CONTROL-BREAK.
MOVE SORT-ID TO DETAIL-ID
MOVE SORT-LAST-NAME TO DETAIL-LAST-NAME.
MOVE SORT-FIRST-NAME TO DETAIL-FIRST-NAME.
MOVE SORT-CITY TO DETAIL-CITY.
MOVE SORT-STATE TO DETAIL-STATE.
WRITE OUT-RECORD FROM DETAIL-LINE.
ADD 1 TO STATE-COUNT.
MOVE SORT-STATE TO CURRENT-STATE.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.

DO-CONTROL-BREAK.
MOVE STATE-COUNT TO PRINT-COUNT.
WRITE OUT-RECORD FROM BREAK-LINE AFTER 2.
MOVE ZERO TO STATE-COUNT
MOVE SPACES TO OUT-RECORD.
WRITE OUT-RECORD.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (report with control break)

91163   Dube              Jason        Chicago        IL
42966 Vilella Reza Urbana IL

2 RECORDS IN IL

10216 Gehl Bryan Louisville KY
45636 Holtz Rachel Newport KY
69216 Steele Karen Covington KY

3 RECORDS IN KY

52158 Flynn Ashley Muskegon MI
38551 Solpa Mac Lansing MI
34932 Vogel Sandra Grand Rapids MI
94000 Waymel Bradley Kalamazoo MI

4 RECORDS IN MI

61535 King Adriane Cincinnati OH
56913 Moreno Jan Dayton OH
04928 Streeter Farhad Toledo OH
22277 Theis Hanah Norwood OH

4 RECORDS IN OH

78496 McCoy Amanda Brookfield WI

1 RECORDS IN WI

Sort Example: With Header and Footer

 ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED3A.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).
88 VALID-STATE-CODE VALUES 'AK'
'AL' 'AR' 'AZ' 'CA' 'CO' 'CT' 'DC' 'DE' 'FL' 'GA'
'HI' 'IA' 'ID' 'IL' 'IN' 'KS' 'KY' 'LA' 'MA' 'MD'
'ME' 'MI' 'MN' 'MO' 'MS' 'MT' 'NC' 'ND' 'NE' 'NH'
'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'RI' 'SC'
'SD' 'TN' 'TX' 'UT' 'VA' 'VT' 'WA' 'WI' 'WV' 'WY'.

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD PIC X(80).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

01 DETAIL-LINE.
02 DETAIL-ID PIC 9(5).
02 PIC X(3) VALUE SPACES.
02 DETAIL-LAST-NAME PIC X(15).
02 PIC X(3) VALUE SPACES.
02 DETAIL-FIRST-NAME PIC X(10).
02 PIC X(3) VALUE SPACES.
02 DETAIL-CITY PIC X(12).
02 PIC X(3) VALUE SPACES.
02 DETAIL-STATE PIC X(2).

01 SORTED-DATA-SWITCH PIC X VALUE 'N'.
88 NO-MORE-SORTED-DATA VALUE 'Y'.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

01 RECORD-COUNT PIC 9(3) VALUE ZERO.

01 HEADER-LINE.
02 PIC X(8) VALUE 'ID NUM'.
02 PIC X(18) VALUE 'LAST NAME'.
02 PIC X(13) VALUE 'FIRST NAME'.
02 PIC X(15) VALUE 'CITY'.
02 PIC X(5) VALUE 'STATE'.

01 FOOTER-LINE.
02 PIC X(8) VALUE SPACES.
02 FOOTER-COUNT PIC ZZ9.
02 PIC X(20)
VALUE ' RECORDS PROCESSED'.

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON ASCENDING KEY SORT-LAST-NAME
INPUT PROCEDURE IS INPUT-LOGIC
OUTPUT PROCEDURE IS CREATE-REPORT.
STOP RUN.

INPUT-LOGIC.
OPEN INPUT IN-FILE.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.
PERFORM DATA-LOOP
UNTIL NO-MORE-INPUT-RECORDS.
CLOSE IN-FILE.

DATA-LOOP.
IF VALID-STATE-CODE
MOVE IN-RECORD TO SORT-RECORD
RELEASE SORT-RECORD.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.

CREATE-REPORT.
OPEN OUTPUT OUT-FILE.
PERFORM PRINT-HEADERS.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.
PERFORM REPORT-LOOP
UNTIL NO-MORE-SORTED-DATA.
PERFORM PRINT-FOOTERS.
CLOSE OUT-FILE.

REPORT-LOOP.
MOVE SORT-ID TO DETAIL-ID
MOVE SORT-LAST-NAME TO DETAIL-LAST-NAME.
MOVE SORT-FIRST-NAME TO DETAIL-FIRST-NAME.
MOVE SORT-CITY TO DETAIL-CITY.
MOVE SORT-STATE TO DETAIL-STATE.
WRITE OUT-RECORD FROM DETAIL-LINE.
ADD 1 TO RECORD-COUNT.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.

PRINT-HEADERS.
WRITE OUT-RECORD FROM HEADER-LINE.
MOVE SPACES TO OUT-RECORD.
WRITE OUT-RECORD.

PRINT-FOOTERS.
MOVE RECORD-COUNT TO FOOTER-COUNT.
WRITE OUT-RECORD FROM FOOTER-LINE AFTER 2.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output

ID NUM  LAST NAME         FIRST NAME   CITY           STATE

91163 Dube Jason Chicago IL
52158 Flynn Ashley Muskegon MI
10216 Gehl Bryan Louisville KY
45636 Holtz Rachel Newport KY
61535 King Adriane Cincinnati OH
78496 McCoy Amanda Brookfield WI
56913 Moreno Jan Dayton OH
38551 Solpa Mac Lansing MI
69216 Steele Karen Covington KY
04928 Streeter Farhad Toledo OH
22277 Theis Hanah Norwood OH
42966 Vilella Reza Urbana IL
34932 Vogel Sandra Grand Rapids MI
94000 Waymel Bradley Kalamazoo MI

14 RECORDS PROCESSED

Sort Example: OUTPUT PROCEDURE

 * In this example we use the OUTPUT PROCEDURE option instead of
* GIVING because we want to format a report rather than just
* creating a sorted and validated version of the input data.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED3.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).
88 VALID-STATE-CODE VALUES 'AK'
'AL' 'AR' 'AZ' 'CA' 'CO' 'CT' 'DC' 'DE' 'FL' 'GA'
'HI' 'IA' 'ID' 'IL' 'IN' 'KS' 'KY' 'LA' 'MA' 'MD'
'ME' 'MI' 'MN' 'MO' 'MS' 'MT' 'NC' 'ND' 'NE' 'NH'
'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'RI' 'SC'
'SD' 'TN' 'TX' 'UT' 'VA' 'VT' 'WA' 'WI' 'WV' 'WY'.

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD PIC X(80).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

01 DETAIL-LINE.
02 DETAIL-ID PIC 9(5).
02 PIC X(3) VALUE SPACES.
02 DETAIL-LAST-NAME PIC X(15).
02 PIC X(3) VALUE SPACES.
02 DETAIL-FIRST-NAME PIC X(10).
02 PIC X(3) VALUE SPACES.
02 DETAIL-CITY PIC X(12).
02 PIC X(3) VALUE SPACES.
02 DETAIL-STATE PIC X(2).

01 SORTED-DATA-SWITCH PIC X VALUE 'N'.
88 NO-MORE-SORTED-DATA VALUE 'Y'.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON ASCENDING KEY SORT-LAST-NAME
INPUT PROCEDURE IS INPUT-LOGIC
OUTPUT PROCEDURE IS CREATE-REPORT.
STOP RUN.

INPUT-LOGIC.
OPEN INPUT IN-FILE.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.
PERFORM DATA-LOOP
UNTIL NO-MORE-INPUT-RECORDS.
CLOSE IN-FILE.

DATA-LOOP.
IF VALID-STATE-CODE
MOVE IN-RECORD TO SORT-RECORD
RELEASE SORT-RECORD.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.

CREATE-REPORT.
OPEN OUTPUT OUT-FILE.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.
PERFORM REPORT-LOOP
UNTIL NO-MORE-SORTED-DATA.
CLOSE OUT-FILE.

REPORT-LOOP.
MOVE SORT-ID TO DETAIL-ID
MOVE SORT-LAST-NAME TO DETAIL-LAST-NAME.
MOVE SORT-FIRST-NAME TO DETAIL-FIRST-NAME.
MOVE SORT-CITY TO DETAIL-CITY.
MOVE SORT-STATE TO DETAIL-STATE.
WRITE OUT-RECORD FROM DETAIL-LINE.
RETURN SORT-FILE
AT END MOVE 'Y' TO SORTED-DATA-SWITCH.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (report sorted by name)

91163   Dube              Jason        Chicago        IL
52158 Flynn Ashley Muskegon MI
10216 Gehl Bryan Louisville KY
45636 Holtz Rachel Newport KY
61535 King Adriane Cincinnati OH
78496 McCoy Amanda Brookfield WI
56913 Moreno Jan Dayton OH
38551 Solpa Mac Lansing MI
69216 Steele Karen Covington KY
04928 Streeter Farhad Toledo OH
22277 Theis Hanah Norwood OH
42966 Vilella Reza Urbana IL
34932 Vogel Sandra Grand Rapids MI
94000 Waymel Bradley Kalamazoo MI

Sort Example: INPUT PROCEDURE with inline PERFORM

* In this example we use the INPUT PROCEDURE option instead of
* USING because we want to verify that the state code in the
* input record is valid.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED2A.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).
88 VALID-STATE-CODE VALUES 'AK'
'AL' 'AR' 'AZ' 'CA' 'CO' 'CT' 'DC' 'DE' 'FL' 'GA'
'HI' 'IA' 'ID' 'IL' 'IN' 'KS' 'KY' 'LA' 'MA' 'MD'
'ME' 'MI' 'MN' 'MO' 'MS' 'MT' 'NC' 'ND' 'NE' 'NH'
'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'RI' 'SC'
'SD' 'TN' 'TX' 'UT' 'VA' 'VT' 'WA' 'WI' 'WV' 'WY'.

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD.
02 OUT-ID PIC 9(5).
02 OUT-LAST-NAME PIC X(15).
02 OUT-FIRST-NAME PIC X(10).
02 OUT-CITY PIC X(12).
02 OUT-STATE PIC X(2).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON ASCENDING KEY SORT-LAST-NAME
INPUT PROCEDURE IS INPUT-LOGIC
GIVING OUT-FILE.
STOP RUN.

INPUT-LOGIC.
OPEN INPUT IN-FILE.
PERFORM UNTIL NO-MORE-INPUT-RECORDS
READ IN-FILE
AT END
MOVE 'Y' TO EOF-SWITCH
NOT AT END
IF VALID-STATE-CODE
MOVE IN-RECORD TO SORT-RECORD
RELEASE SORT-RECORD
END-IF
END-READ
END-PERFORM.
CLOSE IN-FILE.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (sorted by name with invalid state code omitted)

91163Dube           Jason     Chicago     IL
52158Flynn Ashley Muskegon MI
10216Gehl Bryan Louisville KY
45636Holtz Rachel Newport KY
61535King Adriane Cincinnati OH
78496McCoy Amanda Brookfield WI
56913Moreno Jan Dayton OH
38551Solpa Mac Lansing MI
69216Steele Karen Covington KY
04928Streeter Farhad Toledo OH
22277Theis Hanah Norwood OH
42966Vilella Reza Urbana IL
34932Vogel Sandra Grand RapidsMI
94000Waymel Bradley Kalamazoo MI

Sort Example: INPUT PROCEDURE

* In this example we use the INPUT PROCEDURE option instead of
* USING because we want to verify that the state code in the
* input record is valid.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED2.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).
88 VALID-STATE-CODE VALUES 'AK'
'AL' 'AR' 'AZ' 'CA' 'CO' 'CT' 'DC' 'DE' 'FL' 'GA'
'HI' 'IA' 'ID' 'IL' 'IN' 'KS' 'KY' 'LA' 'MA' 'MD'
'ME' 'MI' 'MN' 'MO' 'MS' 'MT' 'NC' 'ND' 'NE' 'NH'
'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'RI' 'SC'
'SD' 'TN' 'TX' 'UT' 'VA' 'VT' 'WA' 'WI' 'WV' 'WY'.

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD.
02 OUT-ID PIC 9(5).
02 OUT-LAST-NAME PIC X(15).
02 OUT-FIRST-NAME PIC X(10).
02 OUT-CITY PIC X(12).
02 OUT-STATE PIC X(2).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON ASCENDING KEY SORT-LAST-NAME
INPUT PROCEDURE IS INPUT-LOGIC
GIVING OUT-FILE.
STOP RUN.

INPUT-LOGIC.
OPEN INPUT IN-FILE.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.
PERFORM DATA-LOOP
UNTIL NO-MORE-INPUT-RECORDS.
CLOSE IN-FILE.

DATA-LOOP.
IF VALID-STATE-CODE
MOVE IN-RECORD TO SORT-RECORD
RELEASE SORT-RECORD.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (sorted by name with invalid state code omitted)

91163Dube           Jason     Chicago     IL
52158Flynn Ashley Muskegon MI
10216Gehl Bryan Louisville KY
45636Holtz Rachel Newport KY
61535King Adriane Cincinnati OH
78496McCoy Amanda Brookfield WI
56913Moreno Jan Dayton OH
38551Solpa Mac Lansing MI
69216Steele Karen Covington KY
04928Streeter Farhad Toledo OH
22277Theis Hanah Norwood OH
42966Vilella Reza Urbana IL
34932Vogel Sandra Grand RapidsMI
94000Waymel Bradley Kalamazoo MI

Sort Example: INPUT PROCEDURE

* In this example we use the INPUT PROCEDURE option instead of
* USING because we want to verify that the state code in the
* input record is valid.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED2.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).
88 VALID-STATE-CODE VALUES 'AK'
'AL' 'AR' 'AZ' 'CA' 'CO' 'CT' 'DC' 'DE' 'FL' 'GA'
'HI' 'IA' 'ID' 'IL' 'IN' 'KS' 'KY' 'LA' 'MA' 'MD'
'ME' 'MI' 'MN' 'MO' 'MS' 'MT' 'NC' 'ND' 'NE' 'NH'
'NJ' 'NM' 'NV' 'NY' 'OH' 'OK' 'OR' 'PA' 'RI' 'SC'
'SD' 'TN' 'TX' 'UT' 'VA' 'VT' 'WA' 'WI' 'WV' 'WY'.

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD.
02 OUT-ID PIC 9(5).
02 OUT-LAST-NAME PIC X(15).
02 OUT-FIRST-NAME PIC X(10).
02 OUT-CITY PIC X(12).
02 OUT-STATE PIC X(2).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

01 EOF-SWITCH PIC X VALUE 'N'.
88 NO-MORE-INPUT-RECORDS VALUE 'Y'.

PROCEDURE DIVISION.
MAIN-LOGIC.
SORT SORT-FILE
ON ASCENDING KEY SORT-LAST-NAME
INPUT PROCEDURE IS INPUT-LOGIC
GIVING OUT-FILE.
STOP RUN.

INPUT-LOGIC.
OPEN INPUT IN-FILE.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.
PERFORM DATA-LOOP
UNTIL NO-MORE-INPUT-RECORDS.
CLOSE IN-FILE.

DATA-LOOP.
IF VALID-STATE-CODE
MOVE IN-RECORD TO SORT-RECORD
RELEASE SORT-RECORD.
READ IN-FILE
AT END MOVE 'Y' TO EOF-SWITCH.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (sorted by name with invalid state code omitted)

91163Dube           Jason     Chicago     IL
52158Flynn Ashley Muskegon MI
10216Gehl Bryan Louisville KY
45636Holtz Rachel Newport KY
61535King Adriane Cincinnati OH
78496McCoy Amanda Brookfield WI
56913Moreno Jan Dayton OH
38551Solpa Mac Lansing MI
69216Steele Karen Covington KY
04928Streeter Farhad Toledo OH
22277Theis Hanah Norwood OH
42966Vilella Reza Urbana IL
34932Vogel Sandra Grand RapidsMI
94000Waymel Bradley Kalamazoo MI

Sort Example: Multiple Sort Keys

* Sorting on 2 keys

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED1A.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD.
02 OUT-ID PIC 9(5).
02 OUT-LAST-NAME PIC X(15).
02 OUT-FIRST-NAME PIC X(10).
02 OUT-CITY PIC X(12).
02 OUT-STATE PIC X(2).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAINLINE.
SORT SORT-FILE
ON ASCENDING KEY SORT-STATE
ON ASCENDING KEY SORT-LAST-NAME
USING IN-FILE
GIVING OUT-FILE.
STOP RUN.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (sorted by state then by name)

65720Read           Sean      Springfield BF
91163Dube Jason Chicago IL
42966Vilella Reza Urbana IL
10216Gehl Bryan Louisville KY
45636Holtz Rachel Newport KY
69216Steele Karen Covington KY
52158Flynn Ashley Muskegon MI
38551Solpa Mac Lansing MI
34932Vogel Sandra Grand RapidsMI
94000Waymel Bradley Kalamazoo MI
61535King Adriane Cincinnati OH
56913Moreno Jan Dayton OH
04928Streeter Farhad Toledo OH
22277Theis Hanah Norwood OH
78496McCoy Amanda Brookfield WI

Sort Example: USING and GIVING

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\UNSORTED.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SORTED1.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\WORK.TMP'.

DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD.
01 IN-RECORD.
02 IN-ID PIC 9(5).
02 IN-LAST-NAME PIC X(15).
02 IN-FIRST-NAME PIC X(10).
02 IN-CITY PIC X(12).
02 IN-STATE PIC X(2).

FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD.
02 OUT-ID PIC 9(5).
02 OUT-LAST-NAME PIC X(15).
02 OUT-FIRST-NAME PIC X(10).
02 OUT-CITY PIC X(12).
02 OUT-STATE PIC X(2).

SD SORT-FILE
DATA RECORD IS SORT-RECORD.
01 SORT-RECORD.
02 SORT-ID PIC 9(5).
02 SORT-LAST-NAME PIC X(15).
02 SORT-FIRST-NAME PIC X(10).
02 SORT-CITY PIC X(12).
02 SORT-STATE PIC X(2).

WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAINLINE.
SORT SORT-FILE
ON ASCENDING KEY SORT-LAST-NAME
USING IN-FILE
GIVING OUT-FILE.
STOP RUN.

Input

91163Dube           Jason     Chicago     IL
61535King Adriane Cincinnati OH
45636Holtz Rachel Newport KY
10216Gehl Bryan Louisville KY
52158Flynn Ashley Muskegon MI
22277Theis Hanah Norwood OH
38551Solpa Mac Lansing MI
78496McCoy Amanda Brookfield WI
65720Read Sean Springfield BF
94000Waymel Bradley Kalamazoo MI
42966Vilella Reza Urbana IL
04928Streeter Farhad Toledo OH
69216Steele Karen Covington KY
56913Moreno Jan Dayton OH
34932Vogel Sandra Grand RapidsMI

Output (sorted by last name)

91163Dube           Jason     Chicago     IL
52158Flynn Ashley Muskegon MI
10216Gehl Bryan Louisville KY
45636Holtz Rachel Newport KY
61535King Adriane Cincinnati OH
78496McCoy Amanda Brookfield WI
56913Moreno Jan Dayton OH
65720Read Sean Springfield BF
38551Solpa Mac Lansing MI
69216Steele Karen Covington KY
04928Streeter Farhad Toledo OH
22277Theis Hanah Norwood OH
42966Vilella Reza Urbana IL
34932Vogel Sandra Grand RapidsMI
94000Waymel Bradley Kalamazoo MI

pseudocode format are some examples of how you might structure programs using control breaks.

           INITIALIZATION-PARAGRAPH.
open the files.
do the initial read.
save the value of the break field.

LOOP-PARAGRAPH.
if value of break field has changed
perform the control break.
(statements that process the current record)
save the value of the break field.
read the next record.

END-OF-JOB-PARAGRAPH.
perform the control break.
close the files.

CONTROL-BREAK-PARAGRAPH.
write a subtotal line.
reinitialize any counters or totals.

Alternative Single Level Control Break

           INITIALIZATION-PARAGRAPH.
open the files.
do the initial read.
save the value of the break field.

LOOP-PARAGRAPH.
(statements that process the current record)
read the next record.
if the value of the break field has changed
or end-of-file
perform the control break.
if not end-of-file
save the value of the break field.

END-OF-JOB-PARAGRAPH.
close the files.

CONTROL-BREAK-PARAGRAPH.
write a subtotal line.
reinitialize any counters or totals.

Control Break with Page Break

           INITIALIZATION-PARAGRAPH.
open the files.
move 1 to the page number.
print the headers.
do the initial read.
save the value of the break field.

LOOP-PARAGRAPH.
if value of break field has changed
perform the control break.
if the detail line count > page break value
print the headers.
(statements that process the current record)
add 1 to the detail line count.
save the value of the break field.
read the next record.

END-OF-JOB-PARAGRAPH.
perform the control break.
close the files.

PRINT-THE-HEADERS.
write the header lines.
increment the page number.
reset the detail line count back to zero

CONTROL-BREAK-PARAGRAPH.
write a subtotal line.
increment line counter.
reinitialize any counters or totals.

Accumulating Running Totals

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-DATA
ASSIGN TO 'A:\METER.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT REPORT-FILE
ASSIGN TO 'A:\REPORT.TXT'
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD INPUT-DATA
DATA RECORD IS INPUT-RECORD.
01 INPUT-RECORD.
02 INPUT-CUST-ID-NUMBER PIC X(5).
02 INPUT-CUST-NAME PIC X(25).
02 INPUT-KILOWATT-HOURS PIC 9(4).
FD REPORT-FILE
DATA RECORD IS REPORT-LINE.
01 REPORT-LINE PIC X(80).

WORKING-STORAGE SECTION.
01 NO-MORE-DATA-SWITCH PIC X VALUE SPACE.

01 ENERGY-RATE PIC V9(2) VALUE .08.
01 WS-ENERGY-CHARGE PIC 9(4)V99.

01 TOTAL-NUMBER-OF-RECORDS PIC 9(4) VALUE ZERO.
01 TOTAL-KILOWATT-HOURS PIC 9(8) VALUE ZERO.
01 TOTAL-ENERGY-CHARGE PIC 9(8)V99 VALUE ZERO.

01 HEADER-LINE.
02 FILLER PIC X(10) VALUE 'CUST#'.
02 FILLER PIC X(28) VALUE
'CUSTOMER NAME'.
02 FILLER PIC X(6) VALUE
'KW HRS'.
02 FILLER PIC X(3) VALUE SPACES.
02 FILLER PIC X(10) VALUE
'AMT BILLED'.

01 DETAIL-LINE.
02 DETAIL-CUST-ID-NUMBER PIC X(5).
02 FILLER PIC X(5) VALUE SPACES.
02 DETAIL-CUST-NAME PIC X(25).
02 FILLER PIC X(5) VALUE SPACES.
02 DETAIL-KILOWATT-HOURS PIC ZZZ9.
02 FILLER PIC X(5) VALUE SPACES.
02 DETAIL-ENERGY-CHARGE PIC Z,ZZ9.99.

01 TOTAL-LINE.
02 FILLER PIC X(10) VALUE 'TOTALS->'.
02 FILLER PIC X(11) VALUE
'CUSTOMERS: '.
02 TL-NUMBER-OF-RECORDS PIC ZZZ9.
02 FILLER PIC X(13) VALUE
' KW HOURS: '.
02 TL-KILOWATT-HOURS PIC ZZ,ZZZ,ZZ9.
02 FILLER PIC X(18) VALUE
' AMOUNT BILLED: '.
02 TL-ENERGY-CHARGE PIC ZZ,ZZZ,ZZ9.99.

PROCEDURE DIVISION.
MAIN-PARAGRAPH.
PERFORM STARTUP-PARAGRAPH.
PERFORM PRINT-HEADER.
PERFORM PROCESS-RECORDS
UNTIL NO-MORE-DATA-SWITCH = 'Y'.
PERFORM TOTAL-ROUTINE.
PERFORM CLEANUP-PARAGRAPH.
STOP RUN.

STARTUP-PARAGRAPH.
OPEN INPUT INPUT-DATA.
OPEN OUTPUT REPORT-FILE.
READ INPUT-DATA
AT END MOVE 'Y' TO NO-MORE-DATA-SWITCH.

PROCESS-RECORDS.
MOVE INPUT-CUST-ID-NUMBER TO DETAIL-CUST-ID-NUMBER.
MOVE INPUT-CUST-NAME TO DETAIL-CUST-NAME.
MOVE INPUT-KILOWATT-HOURS TO DETAIL-KILOWATT-HOURS.
COMPUTE WS-ENERGY-CHARGE ROUNDED =
ENERGY-RATE * INPUT-KILOWATT-HOURS.
MOVE WS-ENERGY-CHARGE TO DETAIL-ENERGY-CHARGE.
MOVE DETAIL-LINE TO REPORT-LINE.
WRITE REPORT-LINE.
ADD 1 TO TOTAL-NUMBER-OF-RECORDS.
ADD WS-ENERGY-CHARGE TO TOTAL-ENERGY-CHARGE.
ADD INPUT-KILOWATT-HOURS TO TOTAL-KILOWATT-HOURS.
READ INPUT-DATA
AT END MOVE 'Y' TO NO-MORE-DATA-SWITCH.

PRINT-HEADER.
MOVE HEADER-LINE TO REPORT-LINE.
WRITE REPORT-LINE AFTER ADVANCING PAGE.
MOVE SPACES TO REPORT-LINE.
WRITE REPORT-LINE.

TOTAL-ROUTINE.
MOVE TOTAL-NUMBER-OF-RECORDS TO TL-NUMBER-OF-RECORDS.
MOVE TOTAL-KILOWATT-HOURS TO TL-KILOWATT-HOURS.
MOVE TOTAL-ENERGY-CHARGE TO TL-ENERGY-CHARGE.
MOVE TOTAL-LINE TO REPORT-LINE.
WRITE REPORT-LINE AFTER 2.

CLEANUP-PARAGRAPH.
CLOSE INPUT-DATA.
CLOSE REPORT-FILE.

Program to Acces System Date & Time..

MAINLINE.
ACCEPT SYSTEM-WEEKDAY FROM DAY-OF-WEEK.
ACCEPT SYSTEM-DATE FROM DATE.
ACCEPT SYSTEM-TIME FROM TIME.

EVALUATE SYSTEM-WEEKDAY
WHEN 1 MOVE 'Mon' TO HEADER-WEEKDAY
WHEN 2 MOVE 'Tue' TO HEADER-WEEKDAY
WHEN 3 MOVE 'Wed' TO HEADER-WEEKDAY
WHEN 4 MOVE 'Thu' TO HEADER-WEEKDAY
WHEN 5 MOVE 'Fri' TO HEADER-WEEKDAY
WHEN 6 MOVE 'Sat' TO HEADER-WEEKDAY
WHEN 7 MOVE 'Sun' TO HEADER-WEEKDAY
END-EVALUATE.

EVALUATE SYSTEM-MONTH
WHEN 1 MOVE 'Jan' TO HEADER-MONTH
WHEN 2 MOVE 'Feb' TO HEADER-MONTH
WHEN 3 MOVE 'Mar' TO HEADER-MONTH
WHEN 4 MOVE 'Apr' TO HEADER-MONTH
WHEN 5 MOVE 'May' TO HEADER-MONTH
WHEN 6 MOVE 'Jun' TO HEADER-MONTH
WHEN 7 MOVE 'Jul' TO HEADER-MONTH
WHEN 8 MOVE 'Aug' TO HEADER-MONTH
WHEN 9 MOVE 'Sep' TO HEADER-MONTH
WHEN 10 MOVE 'Oct' TO HEADER-MONTH
WHEN 11 MOVE 'Nov' TO HEADER-MONTH
WHEN 12 MOVE 'Dec' TO HEADER-MONTH
END-EVALUATE.

MOVE SYSTEM-DAY TO HEADER-DAY.

IF SYSTEM-HOUR IS LESS THAN 12
MOVE 'AM' TO HEADER-AM-PM
ELSE
MOVE 'PM' TO HEADER-AM-PM
IF SYSTEM-HOUR IS NOT LESS THAN 13
SUBTRACT 12 FROM SYSTEM-HOUR
END-IF
END-IF.
MOVE SYSTEM-HOUR TO HEADER-HOUR.

MOVE SYSTEM-MINUTE TO HEADER-MINUTE.

DISPLAY HEADER-LINE.
STOP RUN.

DO-EVALUATE & DO-NESTED-IF in Cobol

MAIN-LINE.
PERFORM DO-SETUP.
PERFORM DO-NESTED-IF.
PERFORM DO-EVALUATE.
STOP RUN.

DO-SETUP.
DISPLAY 'Enter a digit '.
ACCEPT KBD-ENTRY.

DO-NESTED-IF.
IF KBD-ENTRY = '1'
DISPLAY 'Freshman'
ELSE IF KBD-ENTRY = '2'
DISPLAY 'Sophomore'
ELSE IF KBD-ENTRY = '3'
DISPLAY 'Junior'
ELSE IF KBD-ENTRY = '4'
DISPLAY 'Senior'
ELSE IF KBD-ENTRY = '5'
DISPLAY 'Graduate'
ELSE
DISPLAY 'Undefined code'
END-IF
END-IF
END-IF
END-IF
END-IF.

DO-EVALUATE.
EVALUATE KBD-ENTRY
WHEN '1' DISPLAY 'Freshman'
WHEN '2' DISPLAY 'Sophomore'
WHEN '3' DISPLAY 'Junior'
WHEN '4' DISPLAY 'Senior'
WHEN '5' DISPLAY 'Graduate'
WHEN OTHER DISPLAY 'Undefined code'
END-EVALUATE.

The Grades Program in Cobol

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT-FILE
ASSIGN TO 'C:\PCOBWIN\ROGERS\SCORES.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT REPORT-CARDS
ASSIGN TO 'C:\PCOBWIN\ROGERS\REPORT.TXT'
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD STUDENT-FILE
DATA RECORD IS STUDENT-RECORD.

01 STUDENT-RECORD.
02 STUDENT-ID PIC X(5).
02 STUDENT-NAME PIC X(25).
02 STUDENT-TEST-SCORE-1 PIC 9(3).
02 STUDENT-TEST-SCORE-2 PIC 9(3).
02 STUDENT-TEST-SCORE-3 PIC 9(3).

FD REPORT-CARDS
DATA RECORD IS REPORT-RECORD.

01 REPORT-RECORD PIC X(80).

WORKING-STORAGE SECTION.

01 REPORT-ITEM.
02 REPORT-ID PIC X(5).
02 PIC X(5) VALUE SPACES.
02 REPORT-NAME PIC X(25).
02 PIC X(5) VALUE SPACES.
02 REPORT-GRADE PIC X.

01 AVERAGE-SCORE PIC 9(3)V9(2).

01 EOF-FLAG PIC X(3) VALUE 'NO '.

PROCEDURE DIVISION.
MAIN-LINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM THE-LOOP
UNTIL EOF-FLAG = 'YES'.
PERFORM CLEANUP-ROUTINE.
STOP RUN.

INITIALIZATION-ROUTINE.
OPEN INPUT STUDENT-FILE.
OPEN OUTPUT REPORT-CARDS.
READ STUDENT-FILE
AT END MOVE 'YES' TO EOF-FLAG.

THE-LOOP.
MOVE STUDENT-ID TO REPORT-ID.
MOVE STUDENT-NAME TO REPORT-NAME.
COMPUTE AVERAGE-SCORE ROUNDED =
( STUDENT-TEST-SCORE-1 +
STUDENT-TEST-SCORE-2 +
STUDENT-TEST-SCORE-3 ) / 3.
IF AVERAGE-SCORE NOT LESS THAN 93
MOVE 'A' TO REPORT-GRADE
ELSE IF AVERAGE-SCORE NOT LESS THAN 85
MOVE 'B' TO REPORT-GRADE
ELSE IF AVERAGE-SCORE NOT LESS THAN 76
MOVE 'C' TO REPORT-GRADE
ELSE IF AVERAGE-SCORE NOT LESS THAN 70
MOVE 'D' TO REPORT-GRADE
ELSE
MOVE 'F' TO REPORT-GRADE
END-IF
END-IF
END-IF
END-IF.
MOVE REPORT-ITEM TO REPORT-RECORD.
WRITE REPORT-RECORD.
READ STUDENT-FILE
AT END MOVE 'YES' TO EOF-FLAG.

CLEANUP-ROUTINE.
CLOSE STUDENT-FILE.
CLOSE REPORT-CARDS.