You are on page 1of 128

COBOL

Version – 2.2
12th August 2003

1
COBOL

Table of Contents

1. INTRODUCTION ......................................................................................................5

2. WORKING WITH DATA........................................................................................14

3. ACCEPT/DISPLAY VERBS ...................................................................................35

4. MOVE STATEMENTS............................................................................................37

5. ARITHMETIC VERBS ............................................................................................42

6. DECISION MAKING ..............................................................................................52

7. ITERATIONS ...........................................................................................................59

8. FILE HANDLING ....................................................................................................63

9. SORTING .................................................................................................................74

10. TRAPPING RUNTIME ERRORS ...........................................................................77

11. REPORTS .................................................................................................................79

12. CONTROL BREAK PROCESSING........................................................................84

13. INDEXED FILES .....................................................................................................94

14. CALL STATEMENT .............................................................................................108

15. TABLE HANDLING..............................................................................................111

16. APPENDIX –A (STANDARDS) ...........................................................................115

17. APPENDIX –B (BIBLIOGRAPHY/REFERENCES) ...........................................116

18. APPENDIX –C (FILE STATUS CODES).............................................................117

19. APPENDIX – D (SYNTAX) ..................................................................................118

20. APPENDIX – E (ADDITIONAL READING) STRING HANDLING ................124

2
COBOL

Day-Wise Schedule

Day 1
Introduction
Programming Structure, Coding Formats
Constants, Identifiers, Figurative Constants
Data Division
Level numbers
Elementary and group data names

Procedure Division
Input and Output verbs
Simple Programs

Data Division (contd)


Arithmetic verbs
Control verbs
If, condition names

Move
Numeric, Non numeric, Group
Sample Programs

Day 2
Control verbs
Goto, Perform
Picture clauses [Edit and computation]
Value clause, Usage clause, Redefines clause, Renames clause

File Organization Concepts


Sequential Files
Creation
Access
Query
Copy verb

3
COBOL
Day 3
Computational Usage
Index files
Creation [Record key and alternate keys]
Conversion of sequential to indexed files
Random and sequential access

Trapping Runtime errors


Simple reports
Sorting

Day 4
Reports with page totals and net totals
Single level control break
Double level control break ( logic only )

Day 5
Start verb
Edit and deleted records in indexed files
File maintenance
Report generation with index files

Day 6
Subprograms
Call verb
Linkage section
Table Handling
String Handling verbs (Self study)

4
COBOL

1. Introduction
COBOL (Common Business Oriented Language) was developed in 1959 by a group called the
CODASYL Committee. CODASYL is an abbreviation for Conference on Data Systems
Languages. This committee included representatives from academia, user groups, and
computer manufacturers. The ultimate objective of this committee was to develop a standard
business-oriented language for which all major manufacturers would provide compilers. The
Department of Defense convened this conference since it, as well as other government
agencies, was particularly dissatisfied with the lack of standards in the computing field.

1.1 Features of COBOL


Business-Oriented Language
As a business-oriented language COBOL is designed specifically for commercial applications,
such as payroll and inventory, that typically operate on a large volume of data. File handling, is
an essential part of business programming. Most business programming applications center
around storing and retrieving information.

A Standard Language
COBOL compilers are available for most computers. The same COBOL program may be
compiled and run on a variety of different machines.
The universality of COBOL allows computer users greater flexibility than they would have
with many other languages. A company is free to acquire different brands of computers while
using a single programming language. Similarly, conversion from one model computer to a
more advanced or newer one presents no great problem as long as there is a COBOL compiler
for each model.

An English-like Language
COBOL is an English-like language. All instructions can be coded using English words rather
than complex codes. To add two numbers together, for example, we use the word ADD.
Similarly, the rules for programming in COBOL conform to many of the rules for writing in
English, making it a relatively simple language to learn.

Self Documenting
One advantage of COBOL computer programs is that they can be substantially self-
documenting. Self-documentation is a characteristic of a language that allows a reader of a
program to understand its function and follow its processing steps. The language instructions
are very English-like, but the programmer has substantial choice as to whether to make a
program self-documenting or obscure.

5
COBOL

1.2 Coding a COBOL program


A COBOL program file will have an extension .CBL. A COBOL program needs to be coded
following the below mentioned coding rules.

Columns Use Explanation


1-6 Sequence numbers or Page Used for sequence-checking
and Line numbers (optional)
7 Indicator column Denotes
* comments
/ page break
- continue strings
8-11 Area A DIVISION, SECTION, paragraph
names and level 01, 77 entries
12-72 Area B Statements and sentences
73-80 Comment Ignored by the compiler
Note : Division, Section, Paragraph Names and Sentences must end with a period followed by at least one space.

Each line in a COBOL program can consist of up to 80 characters. This size reflects the fact
that all early COBOL programs were punched into standard IBM 80-column computer cards.
Despite the fact that much COBOL programming is now done on terminals as well as mini-
and microcomputers, the 80-column line length has been maintained.

The first six characters in the line contain the line or sequence number. The sequence numbers
generally serve as references for inserting, deleting, and editing program lines.

Column 7 is reserved for a continuation or comment character. When an * is typed in column


7, the remainder of the line is treated by the COBOL compiler as a comment of the
programmer. That is, when the source code program is compiled, all lines with an asterisk in
column 7 are ignored.

When the – (hyphen) is found in column 7, this signals that the line contians the remainder of a
nonnumeric literal. In other words, a nonnumeric literal is being continued on this line from the
preceding line.

Column 8 is referred to as Margin A, and columns 8-11 are commonly Area A. A number of
entries must begin in this area – division names, section names, paragraph names, FD entries,
01-level entries, and 77-level entries. These entries must begin only in Area A, they can go
beyond column 11 but must begin somewhere in Area A. For example, a paragraph name could
begin in column 11 and continue beyond.

Column 12 is known as Margin B, and columns 12-72 are commonly called Area B. Most
COBOL entries, particularly those in the Procedure Division, begin in this area. Margin B
entries include all sentences, statements, 02-49 level entries, and others. Note, that these entries
must begin in Area B and cannot extend beyond column 72.

6
COBOL
Column 73-80 are referred to as the program-identification columns. These columns are
ignored by the compiler.

1.3 The COBOL Character set


The character set used in COBOL consists of the following :
Alphabetic characters
The capital letters of the English alphabets, A to Z.

Numeric characters
The first ten numerals, 0 to 9.

Punctuation characters
Comma ,
Semicolon ;
Period .
Blank or Space
Apostrophe ’
Left Parenthesis (
Right Parenthesis )

Special characters
Hyphen -
Equal =
Asterisk *
Plus +
Slash /
Greater Than >
Less Than <
Dollar $

1.4 COBOL Words


A sequence of continuous characters from the character set can form a word. Like any other
language, COBOL consists of words and symbols. There are rules for making COBOL words.
There are two types of COBOL words, reserved words and user-defined words.

Reserved words are words that are defined both syntactically and semantically by the COBOL
language. The programmer cannot use any of these words except in the form specified by the
language.

User-defined words (data names) are words supplied by the programmer in order to satisfy the
format of a clause or statement in the language.

7
COBOL
Rules for forming user-defined words

• 1 to 30 characters.
• Letters, digits, and hyphens (-) only.
• No embedded blanks.
• At least one alphabetic character.
• May not begin or end with a hyphen.
• No COBOL reserved words such as DATA, DIVISION, etc.

Valid datanames Invalid datanames


HOURS DISCOUNT-
SALES-TOTAL AUTHOR
SUBJECT1 BASIC+HRA
AMOUNT-OF-TRANSACTION-OUT 123

1.5 Structure of COBOL programs


COBOL programs are written according to a special structure, which is organized into a
hierarchy of parts.

A character is the lowest form in the program structure

A word is made up of one or more characters.

A clause consists of characters and words and is used to specify an attribute of an entry.

A statement is a syntactically valid combination of words and characters written in the


PROCEDURE DIVISION of a COBOL program and beginning with a verb.

A sentence is a sequence of one or more statements, the last of which is terminated by a period
followed by a space.

A paragraph consists of one or more sentences.

A section consists of one or more paragraphs.

A division consists of one or more paragraphs or sections. Every COBOL program consists of
four divisions in the following order : IDENTIFICATION DIVISION, ENVIRONMENT
DIVISION, DATA DIVISION and PROCEDURE DIVISION.

1.6 Divisions
1.6.1 IDENTIFICATION DIVISION

8
COBOL
The IDENTIFICATION DIVISION is the first division of a COBOL program. It supplies the
information about the program to others who may read or use the program. The
IDENTIFICATION DIVISION is divided into the following paragraphs :

PROGRAM-ID. Program-name.
Used to specify the program name. Use names of eight characters or less, letter and digits only,
because such names are accepted on all systems.

AUTHOR. author-name.
Used to specify the programmer’s name.

DATE-WRITTEN. Date.
Specify the date the program was coded.

DATE-COMPILED. Date.
Can be coded with an actual date. But if it is coded without a date entry, the compiler itself will
automatically fill in the actual date of compilation.

While PROGRAM-ID is the only required paragraph in the Identification Division, all other
entries should routinely be included. Only if the programmer includes the non-required entries,
which provide useful information, will COBOL be the self-documenting language that it was
designed to be.

1.6.2 ENVIRONMENT DIVISION


The ENVIRONMENT DIVISION is the only machine-dependent division of a COBOL
program. Machine dependent means that the entries are determined by the particular type of
computer equipment being used. While the sections and paragraph names will always be the
same, the entries themselves will depend on the type of equipment used. This division is
composed of two sections :

• CONFIGURATION SECTION.
SOURCE-COMPUTER. Computer.
Names the computer equipment used for compiling the program.

OBJECT-COMPUTER. Computer.
Names the computer equipment used for executing the program.

• INPUT-OUTPUT SECTION.
Supplies information concerning the input and output devices used. This section is required
only if the program uses files or prints reports.
FILE-CONTROL.

1.6.3 DATA DIVISION


The DATA DIVISION provides detailed specifications for all the files and records within the
files that will be used in the program. In addition, all other data items required by the program
are named and described in this division. Commonly, it consists of the following sections :

9
COBOL

10
COBOL
FILE SECTION.
Defines all input and output files.

WORKING-STORAGE SECTION.
Reserves storage for fields not part of input or output but nonetheless required for processing.
These include constants, end-of-file indicators, and work areas.

LINKAGE SECTION.
Used to identify items that will be passed to the called program from the calling program and
vice-versa.

These sections appear in the given order.

1.6.4 PROCEDURE DIVISION


The PROCEDURE DIVISION is divided into sections/paragraphs. Each paragraph is an
independent module or routine that includes a series of instructions designed to perform
specific set of operations. Paragraph names are coined by the programmer following the rules
for forming data-names.

A PROCEDURE DIVISION may also consist of several sections. A section may contain
several paragraphs.

11
COBOL

1.7 COBOL Coding rules


Division and section names must
a. begin in Area A,
b. end with a period, and
c. appear on a line alone – that is, with no other entries.

Paragraph names
d. must begin in Area A,
e. must end with a period, and
f. may appear on a line alone or with other entries. There must be at least one space
between each entry on the line.

Sentences
g. must begin in Area B,
h. must end with a period, and
i. may appear on a line alone or with other entries. There must be at least one space
between each entry on a line.

12
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH01EX01.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'MY FIRST COBOL PROGRAM'.
STOP RUN.

A Sample COBOL Program – Eg. 1.1

13
COBOL

2. Working with data


Data Names
A data-storage item or variable, as it is sometime known, is a symbolic name that references a
particular memory location, or address, within the computer.
A data name is a COBOL word formed by the programmer to represent the data items used in
his program. A data name should adhere to the rules for naming a user-defined word.

Hierarchical representation of data


Level numbers
The record description specifies the format of a record . Record description entries indicate:
1. The items or fields to appear in the record
2. The order in which the fields appear
3. How these fields are related to one another

Data is grouped in COBOL using the concept of a level. Records are considered the highest
level of data in a file, and are coded on the 01 level. There can be only one data-name at the 01
level for each record, as it is the all-inclusive data-name. A field of data within the record is
coded on a level subordinate to 01, i.e. 02, 03 and so on. Any level number between 02 and 49
may be used to describe fields within a record. Level numbers are used to indicate the
relationship of one field to another.

The permissible level numbers are :


01 – 49
66 77 88

Elementary and Group Items


An elementary item has no subordinate parts. A group item may consist of one or more
group/elementary items. In the code below :
CUST-FIRST-NAME, CUST-ZIP-CODE are elementary items
CUST-ADDRESS, CUST-STREET are group items

01 CUST-ADDRESS.
05 CUST-NAME.
10 CUST-FIRST-NAME PIC X(10).
10 CUST-LAST-NAME PIC X(15).
05 CUST-STREET.
10 CUST-ST-NO PIC 9(03).
10 CUST-ST-NAME PIC X(20).
05 CUST-ZIP-CODE PIC 9(06).

Eg 2.1:

14
COBOL

PICTURE Clauses
Group items are defined by a level number and a name, which is followed by a period.
Elementary items must be described with a PICTURE (or PIC, for short) clause. Group items
cannot have a PICTURE clause. The syntax for the PICTURE clause is simple the word
PICTURE or PIC followed by the type and field size.

PICTURE type(size)

There cannot be a space between the type symbol and the number enclosed in parentheses.

Functions of the PICTURE Clause


1. Specifies the type of data contained within an elementary item.
2. Indicates the size of the field.

Types of data fields

Type Picture clause Explanation


Alphabetic A A field that may contain only letters or blanks. E.g. a
name or item description field.
Alphanumeric X A field that may contain any character i.e. letters,
digits, blanks and/or special characters. E.g. an
address field.
Numeric 9 Any signed or unsigned field that will contain only
digits is considered numeric.

Size of data fields


The size of the field is denoted b the number of A’s, X’s, or 9’s used in the PICTURE.

05 W01-AMT PIC 99999.


Eg 2.2:
W01-AMT is an elementary field consisting of five positions of numeric data. Alternatively,
the same can be coded as follows :

05 W01-AMT PIC 9(05).


Eg 2.3:

At least one space must follow the word PIC. All A’s, X’s, or 9’s should appear consecutively
with no spaces between the characters. Similarly, if parentheses are used to denote the size of a
field, no spaces should appear between the type and size or within the parentheses.
Alphanumeric and alphabetic fields can be a maximum of 120 characters in size while numeric
fields can be a maximum of 18 digits in size.
Each field can contain only one type of data. For example, PICTURE XXX99 is invalid.

15
COBOL
WORKING-STORAGE SECTION

Defines and describes all data storage fields required for Processing (Including constants).
These fields are not part of any record in an input/output file.

Can be used for storing


• Intermediate results
• Counters, Flags
• Input/Output Records
• Tables etc.

1.8 Types of data


• Variable
Data entered by the user at run-time.

• Constant
Data required for processing that is not dependent on the input to the system. There are 3
types of literals.

1. Numeric Literals
A numeric literal is a constant used primarily for arithmetic operations.

Rules for forming numeric literals


• 1 to 18 digits
• A + or – sign may be used, but it must appear to the left of the number.
• A decimal point is permitted within the literal. The decimal point, however may not
be the rightmost character of the literal.

+34
-8.6
.008
Eg 2.4:

2. Nonnumeric Literals
A nonnumeric literal is a constant that is used in the PROCEDURE DIVISION for
all operations except arithmetic.

Rules for forming nonnumeric literals


• The literal must be enclosed in quotation marks.
• A maximum of 120 characters are permitted.
• Any character permitted in the COBOL character set may be used except the
quotation mark.

16
COBOL

‘CODE’
‘$ 123’
Eg 2.5:
3. Figurative Constants
A figurative constant is a COBOL reserved word that has special significance to the compiler.

The figurative constants are :

ZERO, ZEROS, ZEROES references the value of zeros


SPACE, SPACES reference the value of blank
QUOTE, QUOTES references the quotation mark
used in nonnumeric literals to include a quote.
LOW-VALUE, LOW-VALUES references the lowest value in the collating
sequence for the particular computer system
HIGH-VALUE, HIGH_VALUES references the highest value in the collating
sequence for the particular computer system.
ALL references one or more occurrences of the single
character nonnumeric literal.
e.g. MOVE ALL ‘A’ TO HEAD-1, will result in
the field HEAD-1 being filled with A’s.

VALUE Clause
In addition to defining storage fields using the PICTURE clause it is often desirable to assign
initial values to elementary items in the WORKING-STORAGE SECTION. Such a value may
remain unchanged throughout the program, or it may change in the course of program
execution. Such initial values are generally not assigned to FILE SECTION items, since such
fields either receive their data from the external medium or from other storage location as the
result of program execution.

02 PAGE-TITLE PIC A(14) VALUE ‘SAMPLE PROGRAM’.


02 TAX-RATE PIC 99 VALUE IS 10.

Eg 2.6:
Continuation of Literals from one line to the next
A nonnumeric literal may contain up to 120 characters. The same applies to a nonnumeric
literal in a VALUE clause. Sometimes a nonnumeric literal may not fit on a single line, hence
it is necessary to continue this literal.

17
COBOL
Rules for continuation of nonnumeric literals
1. Begin the literal in the VALUE clause with a quotation mark.

2. Continue the literal until position 72, the end of the line, is reached. Do not end with a
quotation mark on this line.

3. Place a hyphen on the next line in the position beginning in 7th column of the second line.
Begin with a quotation mark.

4. End the literal with a quotation mark.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX07.
*************************************************
*Continuation of a literal *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 H01-PAGE-HEADING PIC X(43) VALUE 'MONTHLY TRANSACTIONS FO
- 'R THE MONTH OF APRIL'.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY H01-PAGE-HEADING.
STOP RUN.
Eg 2.7:

Special Characters (Numeric Field) :

Implied decimal point

The symbol V denotes an implied decimal point, which does not occupy a storage position. In
the code below, W01-AMOUNT occupies 5 positions.

05 W01-AMOUNT PIC 999V99.


Eg 2.8:

18
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX09.
*************************************************
*Using picture clause V (implied decimal point) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC 99V9 VALUE 38.50.
05 W01-NUM2 PIC 9(04)V99 VALUE 452.39.
05 W01-NUM3 PIC 9(04)V99 VALUE 102.4.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
STOP RUN.
Eg 2.9:

PIC Description Value Stored as


99V9 38.50 385
9(04)V99 452.39 045239
9(04)V99 102.4 010240
Eg 2.10:

Signed numbers

If a numeric field can have negative contents, then it must have an S in its PIC clause. It must
be the leftmost character. It does not take any storage space.

05 W04-BALANCE PIC S999.


Eg 2.11:

19
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX11.
*******************************************
*Using picture clause S (signed numbers) *
*******************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC S999 VALUE 105.
05 W01-NUM2 PIC S999 VALUE -452.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'W01-NUMBERS :' W01-NUMBERS.
STOP RUN.
Eg 2.12:

Edited fields
The purpose of editing is to make data more suitable for human reading. Thus editing in its
most common use is associated with printing data on the printer. For example, we may
suppress leading zeros, we may use commas to make long numeric values more legible, we
may insert a dollar sign in front of a value, etc.

The editing characters are Z * $ - + CR DB . , B 0 /

. - (Decimal Point)
The . (decimal) PICTURE character indicates the position of the decimal point and serves to
align the actual decimal values in the field, only one such character may appear in a field.
Further, a field cannot contain both a V and a . PICTURE character. It cannot be the rightmost
character. If all the digits before and after the decimal point are zero, the resulting field will be
blank.

20
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX12.
*******************************************
*Using picture clause . (decimal point) *
*******************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC 9999.99 VALUE 2350.22.
05 W01-NUM2 PIC 9999.99 VALUE 150.31.
05 W01-NUM3 PIC 9999.99 VALUE 0.0.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
STOP RUN.
Eg 2.13:

PIC Description Value Printed as


9999.99 2350.22 2350.22
9999.99 150.31 0150.31
9999.99 0.0 0000.00
Eg 2.14:

Z - Suppressing leading zeros


The Z PICTURE character is used to replace leading zeros by blanks and thus performs a
function identical to that of the floating . Zero suppression terminates when the first nonzero
digit or the . character is encountered, whichever occurs first. When Z’s have been designated
for all positions in a field and the value to be inserted in that field is zero, in that case the entire
field is blanked. Z’s can appear before as well as after the decimal point. The number of Z’s
representing integers in the report-item should be equal to the number of integers or 9’s in the
sending field.

21
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX13.
*************************************************
*Using picture clause Z (zero suppression) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC Z99 VALUE 25.
05 W01-NUM2 PIC Z(03).99 VALUE 25.
05 W01-NUM3 PIC Z(03).99 VALUE 0.10.
05 W01-NUM4 PIC Z(03).ZZ VALUE 0.052.
05 W01-NUM5 PIC Z(03).ZZ VALUE 0.0.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
DISPLAY 'NUM 4 :' W01-NUM4.
DISPLAY 'NUM 5 :' W01-NUM5.
STOP RUN.
Eg 2.15:

PIC Description Value Printed as


Z99 25 b25
Z(03).99 25 b25.00
Z(03).99 0.10 bbb.10
Z(03).ZZ 0.052 bbb.05
Z(03).ZZ 0.00 bbbbbb
Eg 2.16:

* - Check Protection

The * character is referred to as a check-protect character and is normally used to protect dollar
amounts written on checks or other negotiable documents. Asterisks are zero-suppression
characters that replace each non-significant zero and comma with * instead of a space.

22
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX14.
*************************************************
*Using picture clause * (check protection) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC **999 VALUE 4678.
05 W01-NUM2 PIC ***99 VALUE 52.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
STOP RUN.
Eg 2.17:

PIC Description Value Printed as


**999 04678 *4678
***99 00052 ***52

Eg 2.18:

$ - Dollar Sign

By use of the $ PICTURE character the dollar sign is written in the position in which it is to
appear in the output. Since the $ sign is counted in the size of the field, the field should be
assigned at least one more position than the maximum number of significant digits expected.
The $ may also be floated, by which we mean that it will be entered to the left of the first
significant digit in the field and be preceded by blanks. The $ float stops when wither the first
nonzero digit or the . or V is encountered. When the $ sign appears in all positions and the
value is zero, the effect is to blank the entire field (including any. and,).

23
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX15.
*************************************************
*Using picture clause $ (dollar sign) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC $999 VALUE 125.
05 W01-NUM2 PIC $9(05).99 VALUE 100.
05 W01-NUM3 PIC $$99.99 VALUE 12.49.
05 W01-NUM4 PIC $(04)9.99 VALUE 150.10.
05 W01-NUM5 PIC $(04).99 VALUE 0.15.
05 W01-NUM6 PIC $(04).$$ VALUE 0.0.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
DISPLAY 'NUM 4 :' W01-NUM4.
DISPLAY 'NUM 5 :' W01-NUM5.
DISPLAY 'NUM 6 :' W01-NUM6.
STOP RUN.
Eg 2.19:

PIC Description Value Printed as


$999.99 125.13 $125.13
$9(05).99 100.00 $00100.00
$$99.99 12.49 b$12.49
$$$$9.99 150.10 $150.10
$$$$.99 0.15 bbb$.15
$$$$.$$ 0.0 bbbbb

Eg 2.20

, - (Comma)

The comma is placed in the positions in which it is desired. A field may include more than one
, (comma) PICTURE character if the size of the field warrants it. A comma will be
appropriately suppressed if no significant digit precedes it. It cannot appear as the leftmost or
rightmost character.

24
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX16.
*************************************************
*Using picture clause , (comma) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC $9,999.99 VALUE 2350.22.
05 W01-NUM2 PIC $9,999.99 VALUE 150.31.
05 W01-NUM3 PIC $$,999.99 VALUE 150.31.
05 W01-NUM4 PIC $$,$$$.99 VALUE 24.40.
05 W01-NUM5 PIC $$,$$$.999 VALUE 0.019.
05 W01-NUM6 PIC $$,$$$.$$$ VALUE 0.009.
05 W01-NUM7 PIC $$,$$$.$$$ VALUE 0.0.
05 W01-NUM8 PIC $$,$$9.999 VALUE 10.2.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
DISPLAY 'NUM 4 :' W01-NUM4.
DISPLAY 'NUM 5 :' W01-NUM5.
DISPLAY 'NUM 6 :' W01-NUM6.
DISPLAY 'NUM 7 :' W01-NUM7.
DISPLAY 'NUM 8 :' W01-NUM8.
STOP RUN.
Eg 2.21:

PIC Description Value Printed as


$9,999.99 2350.22 $2,350.22
$9,999.99 150.31 $0,150.31
$$,999.99 150.31 bb$150.31
$$,$$$.99 24.40 bbb$25.40
$$,$$$.999 0.019 bbbbb$.019
$$,$$$.$$$ 0.009 bbbbb$.009
$$,$$$.$$$ 0.0 bbbbbbbbbb
$$,$$9.999 10.2 bbb$10.200
Eg 2.22:

25
COBOL

- (Minus) and + (Plus)


The – PICTURE character prints a minus sign only if the quantity is negative and omits a sign
for all other quantities. It can appear as the leftmost or rightmost character. The – PICTURE
insertion character differs from the S character in that the use of the S character identifies a
field as a signed one for computational purposes, but the sign does not occupy a position. Use
of the – PICTURE character leads to a field in which the sign occupies a character position.

The + PICTURE character is used to print wither a plus sign or a minus sign for all values. A +
sign will be generated for positive or unsigned quantities, and a – sign will be generated for
negative quantities. The sending field should have an $ in its PICTURE clause for it to be
interpreted as a signed number.

The + or – PICTURE character can appear as the leftmost or rightmost character. They can
also be floated, similar to the $ character. However , the +, -, and $ are mutually exclusive as
floating characters. If we want to have both $ float and + or – sign representation, we write the
+ or – to the right of the field.

26
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX17.
*************************************************
*Using picture - (minus) and + (plus) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC +999.9 VALUE 35.2.
05 W01-NUM2 PIC 999.9+ VALUE 35.2.
05 W01-NUM3 PIC 999.9+ VALUE -35.2.
05 W01-NUM4 PIC ++9.9 VALUE -1.3.
05 W01-NUM5 PIC +++9.99 VALUE 0.05.
05 W01-NUM6 PIC +++9.99 VALUE -0.05.
05 W01-NUM7 PIC ++++.++ VALUE .01.
05 W01-NUM8 PIC ++++.++ VALUE 0.0.
05 W01-NUM1A PIC -999.9 VALUE 35.2.
05 W01-NUM2A PIC 999.9- VALUE 35.2.
05 W01-NUM3A PIC 999.9- VALUE -35.2.
05 W01-NUM4A PIC --9.9 VALUE -1.3.
05 W01-NUM5A PIC ---9.99 VALUE 0.05.
05 W01-NUM6A PIC ---9.99 VALUE -0.05.
05 W01-NUM7A PIC ----.-- VALUE .01.
05 W01-NUM8A PIC ----.-- VALUE 0.0.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
DISPLAY 'NUM 4 :' W01-NUM4.
DISPLAY 'NUM 5 :' W01-NUM5.
DISPLAY 'NUM 6 :' W01-NUM6.
DISPLAY 'NUM 7 :' W01-NUM7.
DISPLAY 'NUM 8 :' W01-NUM8.
DISPLAY 'NUM 1A :' W01-NUM1A.
DISPLAY 'NUM 2A :' W01-NUM2A.
DISPLAY 'NUM 3A :' W01-NUM3A.
DISPLAY 'NUM 4A :' W01-NUM4A.

27
COBOL

DISPLAY 'NUM 5A :' W01-NUM5A.


DISPLAY 'NUM 6A :' W01-NUM6A.
DISPLAY 'NUM 7A :' W01-NUM7A.
DISPLAY 'NUM 8A :' W01-NUM8A.
STOP RUN.
Eg 2.23:

PIC Description Value Printed as


+999.9 35.2 +035.2
999.9+ 35.2 035.2+
999.9+ -35.2 035.2-
++9.9 -001.3 b-1.3
+++9.99 .05 bb+0.05
+++9.99 -.05 bb-0.05
++++.++ .01 bbb+.01
++++.++ 0.0 bbbbbbb
-999.9 35.2 b035.2
999.9- 35.2 035.2b
999.9- -35.2 035.2-
--9.9 -001.3 b-1.3
---9.99 .05 bbb0.05
---9.99 -.05 bb-0.05
----.-- .01 bbbb.01
----.-- .0 bbbbbbb

Eg 2.23:

DB/CR
In accounting applications there is often need to identify values that represent debits or credits.
The COBOL language facilitates such differentiation by means of the DB (debit) and CR (CR)
editing characters. The DB or CR symbol is written only to the right of a field in the PICTURE
clause, and in both cases it is represented in storage for the purpose of subsequent output only
when the value is negative.

28
COBOL

Summary for use of + - DB CR


PIC Storage when Storage when
Character data positive data negative
+ + -
- Blank -
DB Blank DB
CR Blank CR

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX18.
*************************************************
*Using picture clause DB/CR *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NUMBERS.
05 W01-NUM1 PIC $999.99DB VALUE 135.26.
05 W01-NUM2 PIC $999.99DB VALUE -135.26.
05 W01-NUM3 PIC $,$$99.99CR VALUE -10.50.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'NUM 1 :' W01-NUM1.
DISPLAY 'NUM 2 :' W01-NUM2.
DISPLAY 'NUM 3 :' W01-NUM3.
STOP RUN.

Eg 2.24:

PIC Description Value Printed as


$999.99DB 135.26 $135.26bb
$999.99DB -135.26 $135.26DB
$,$$99.99CR -10.50 bb$10.50CR

Eg 2.25:

29
COBOL

B – (blank)

The B insertion editing character results in blanks being entered in the designated positions.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX19.
*************************************************
*Using picture clause B (blank) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NAME PIC ABABA(10).

PROCEDURE DIVISION.
0000-MAIN.
MOVE 'RBSMITH' TO W01-NAME.
DISPLAY W01-NAME.
STOP RUN.
Eg 2.25:

W01-NAME = RbBbSMITHbbbbb

0 - (Zero)
The zero insertion character causes zeros to be inserted in the positions in which it appears.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX20.
*************************************************
*Using picture clause 0 (zero) *
*************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-AMOUNT PIC 9(4)000 VALUE 365.

PROCEDURE DIVISION.
0000-MAIN.

30
COBOL

DISPLAY W01-AMOUNT.
STOP RUN.
Eg 2.26:

W01-AMOUNT = 0365000

/ - (stroke)

Each / (stroke) in the PICTURE character string represents a character position into which the
stroke character will be inserted.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH02EX21.
*************************************************
*Using picture clause / (stroke) *
*************************************************

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-DATE PIC 99/99/99 VALUE 110601.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY W01-DATE.
STOP RUN.
Eg 2.27:

W01-DATE = 11/06/01

USAGE clause

The USAGE clause specifies the manner in which a data item is stored in memory. This clause
can be specified for group as well as for elementary items. If it is specified for a group item, it
applies to each elementary item within the group.
Numeric data in a computer may be represented in one of two basic modes. They may be
represented as character data or as numeric data. The arithmetic registers of computers
perform arithmetic with numeric data that is in numeric, not character mode. If numeric data is

31
COBOL
represented in character mode, it must first be converted to numeric mode before arithmetic
computations can be performed.
In COBOL, data in character mode is described in DISPLAY mode, while data in numeric
mode is described as being COMPUTATIONAL MODE. All data items are assumed to be in
DISPLAY mode unless they are declared to be COMPUTATIONAL. The declaration is done
in the DATA DIVISION with the USAGE clause.
The following are the options available with the Usage clause :

DISPLAY
COMPUTATIONAL
COMPUTATIONAL-1
COMPUTATIONAL-2
COMPUTATIONAL-3
INDEX

DISPLAY

A DISPLAY data item is stored in memory in the character form where each character
occupies one byte. Non-numeric data items are all considered to be of usage DISPLAY.

02 AMOUNT-1 PIC 99.


02 AMOUNT-2 PIC 99 USAGE DISPLAY.
02 AMOUNT-3 PIC 99 USAGE COMPUTATIONAL.
02 AMOUNT-4 PIC 99 USAGE COMP.
Eg 2.28:

The usage for W01-AMOUNT-1 is taken as DISPLAY, as no usage is specified. This data item
occupies 2 bytes of memory.

COMPUTATIONAL or (COMP)
This usage is applicable only for numeric data items. The data items are stored in binary (base
2) form. The item must be an integer (with no decimal point). Depending on the size of the
data item, it is stored either in a half word ( HALF WORD BINARY) or a full-word (FULL
WORD BINARY) of the machine. The maximum size of the picture clause for half word
binary is S9(4) and for full word binary is S9(8). The left-most bit of a the word is reserved for
the sign. Thus, the values of a data item, described by usage COMPUTATIONAL, should be in
the range of -32768 to 32767.

05 W02-BALANCE PIC S9999 USAGE IS COMP.


This item requires only 2 bytes of storage as distinct from 4 bytes, had usage DISPLAY been
specified.

COMPUTATIONAL-2 or (COMP-2)
This is the same as COMP-1 except that two words are used to store a number. Thus, COMP-2
increases the precision of the number.

32
COBOL

COMPUTATIONAL-3 or (COMP-3)
This usage is also applicable only to numeric data items and specifies that the data is stored in
packed decimal form. In packed decimal form, two numeric digits are packed in one byte. One
digit thus occupies one half byte (4 bits) of memory.
Memory is allocated only in terms of the whole number of bytes. The sign also occupies one
half byte of memory, even if no “S” appears in the PICTURE clause. Thus, for any PICTURE
clause specifying an even number of 9’s in the data item, only one half byte of memory will be
wasted. The right-most byte of the item contains the digit and sign of the item.

Note : The picture clause cannot be specified for items with usage COMP-1 or COMP-2.

SYNCHRONIZED clause
Most computer memories are organized in such a way that there are natural addressing
boundaries such as word boundaries. A word might for example contain 2, 4, 8 or 10
characters. If no special action is taken some data items will start on word boundaries and some
will start part way through a word and perhaps end part way through another word. Since most
computers can process whole words more efficiently than individual characters there is an
overhead in extracting the characters from the words. Much of this overhead is avoided for
data items which have the SYNCHRONIZED or SYNC clause in their description. It causes
the data item to be aligned on the machine’s natural boundaries. This results in some character
positions being wasted. So the data occupies more space but it can be handled more efficiently.

REDEFINES Clause
The REDEFINES clause can be used to allow the same storage location to be referenced by
different data-names or to allow a regrouping or different description of the data in a particular
storage location.

Restrictions

The REDEFINES clause cannot be used


- at the 01 level in the FILE SECTION.
- when the levels of data-name-1 and data-name-2 are different.
- When the level number is 66 or 88.

01 SAMPLE.
02 RECEIVABLE.
03 CUSTOMER-NUMBER PIC 9(8).
03 CUSTOMER-NAME PIC X(11).
03 AMOUNT PIC 9(4)V99.
02 PAYABLE REDEFINES RECEIVABLE.
03 VENDOR-NUMBER PIC 9(6).
03 VENDOR-NAME PIC X(12).
03 VENDOR-OWED-AMT PIC 9(5)V99.

Eg 2.29:

33
COBOL

RENAMES Clause
The RENAMES clause provides the programmer with the capability of regrouping elementary
data items. It resembles the REDEFINES clause, except that it can form a new grouping of
data items which combines several items. Use of the RENAMES clause is always signaled by
the special 66 level number. Level 66 entry is written in margin B.

01 TAX-RECORD.
02 SOC-SEC-NUMBER PIC X(9).
02 NAME.
03 FIRST-NAME PIC X(10).
03 LAST-NAME PIC X(15).
02 TOTAL-YTD.
03 GROSS-PAY PIC 9(8)V99.
03 NET-PAY PIC 9(8)V99.
03 TAX PIC 9(5)V99.
66 LAST-GROSS RENAMES LAST-NAME THRU NET-PAY.

Eg 2.30:
Qualification of names

A data name that is not unique must be qualified in COBOL verbs.

01 IN-REC
05 NAME PIC X(10).
05 AGE PIC 99.
01 OUT-REC.
05 NAME PIC X(10).
05 B-DATE PIC 9(6).

MOVE NAME OF IN-REC TO NAME OF OUT-REC.

Eg 2.31:

34
COBOL

3. ACCEPT/DISPLAY verbs
The PROCEDURE DIVISION contains all the instructions required for processing. It is
divided into various paragraphs or modules. Each module consists of sentences.

The ACCEPT and DISPLAY verbs are used for input and output in conjunction with storage
fields that are not part of any files.

ACCEPT

The instruction ACCEPT identifier enable the user to enter input data directly from a keyboard.

ACCEPT MY-NAME.
Eg 3.1:
DISPLAY

DISPLAY can reference a series of identifiers or literals.

DISPLAY MY-NAME.
DISPLAY ‘HELLO’.
Eg 3.2:

STOP RUN

The verb STOP RUN terminates program execution. A program may contain more than one
STOP RUN statement, depending on the logic of the program. STOP RUN signifies the logical
end of the program.

35
COBOL

A program using DISPLAY and ACCEPT.


IDENTIFICATION DIVISION.
PROGRAM-ID. CH03EX03.
****************************************************
* Accept a name from the user. Display a greeting *
* "Hello" followed by the name. *
****************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-FIRST-NAME PIC X(15).

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER YOUR NAME : ' WITH NO ADVANCING.
ACCEPT W01-FIRST-NAME.
DISPLAY 'HELLO ' W01-FIRST-NAME.
STOP RUN.
Eg 3.3:

36
COBOL

4. MOVE statements
A value can be moved from one storage location to another by the move statement. Contents of
receiving field are changed after the operation.

Verb SENDING

RECEIVING
MOVE AMT-IN TO AMT-OUT.

The contents of AMT-In will be copied to the second field, AMT-OUT, as a result of the
MOVE operation.

MOVE TOTAL TO PRINT-TOTAL


MOVE ‘INVALID’ TO MESSAGE.
MOVE ZEROS TO TOTAL
Eg 4.1:

Types of MOVE :

The MOVE statement can be categorized based on the receiving field : numeric MOVEs and
non-numeric MOVEs.

Numeric MOVE

A numeric move is one in which a numeric field or literal is moved to a numeric receiving
field.

When Sending and Receiving fields have the same PIC clauses
If the PIC clauses of both fields are identical, the contents of identifier-2 will be replaced with
the contents of identifier-1 and the sending field will be unchanged.

When Sending and Receiving fields have different PIC clauses

Rule 1 : Moving integer portions of numeric fields

When moving an integer sending field or an integer portion of a numeric sending field to a
numeric receiving field, move, movement is from right to left. All non-filled high-order
(leftmost) integer positions of the receiving field are replaced with zeros.

37
COBOL

05 AMT-IN PIC 999 VALUE 123.


05 AMT-OUT PIC 9(4) VALUE 4567.
MOVE AMT-IN TO AMT-OUT.
Result :
AMT-OUT = 0123
Eg 4.2:

Avoiding truncation
In a numeric move, if the receiving field has fewer integer positions than the sending the field,
the most significant digits will be truncated.

05 AMT-IN PIC 999 VALUE 123.


05 AMT-OUT PIC 9(2) VALUE 45.

MOVE AMT-IN TO AMT-OUT.

Result :
AMT-OUT = 23

Eg 4.3:
Rule 2: Moving decimal portions of numeric fields

When moving a decimal portion of a numeric sending field to the decimal portion of a numeric
receiving field, movement is from left to right, beginning at the implied decimal point. Low-
order (rightmost) non-filled decimal portions of the receiving field are replaced with zeros.

a.When receiving field has more decimal positions than the sending field

05 AMT-IN PIC 99V99 VALUE 12.34.


05 AMT-OUT PIC 99V999 VALUE 56.789.

MOVE AMT-IN TO AMT-OUT.

Result :
AMT-OUT = 12.340

Eg 4.4:

38
COBOL

b. When receiving field has fewer decimal positions than the sending field

05 AMT-IN PIC V99 VALUE.34.


05 AMT-OUT PIC V9 VALUE .5.

MOVE AMT-IN TO AMT-OUT.

Result :
AMT-OUT = .3

Eg 4.5:
Note : The same rules apply to numeric literals moved to numeric fields

Non-numeric MOVE

A non-numeric MOVE operation occurs in the following cases :

1. Moving an alphanumeric or alphabetic field, defined by a PICTURE of X’s or A’s,


to another alphanumeric or alphabetic field.
2. Moving a non-numeric literal to an alphanumeric or alphabetic field.
3. Moving a numeric field or numeric literal to an alphanumeric field or to any group
item.

Rule :

In a non-numeric move, data is transmitted from the sending field to the receiving field from
left to right. Low-order or rightmost positions of the receiving field that are not replaced with
sending field characters are filled with spaces.

a. When receiving field is larger than the sending field

05 NAME-IN PIC XXX VALUE ‘ABC’.


05 NAME-OUT PIC X(5) VALUE ‘DEFGH’.

MOVE NAME-IN TO NAME-OUT.

Result :
NAME-OUT = ABCbb
Eg 4.6:

b. When receiving field is smaller than the sending field

39
COBOL

05 NAME-IN PIC XXX VALUE ‘ABC’.


05 NAME-OUT PIC XX VALUE ‘PQ’.

MOVE NAME-IN TO NAME-OUT.

Result :
NAME-OUT = AB
Eg 4.7:

c. When the sending field is numeric integer and the receiving field is non-numeric

05 NAME-IN PIC 999 VALUE 321


05 NAME-OUT PIC X(5) VALUE ‘DEFGH’.

MOVE NAME-IN TO NAME-OUT.

Result :
NAME-OUT = 321bb

Eg 4.8:
d. When the sending field is a non-numeric literal

05 NAME-OUT PIC X(5) VALUE ‘DEFGH’.

MOVE ‘XYZ’ TO NAME-OUT.

Result :
NAME-OUT = XYZbb
Eg 4.9:

e. When the sending field is a figurative constant

05 NAME-OUT PIC X(5) VALUE ‘DEFGH’.

MOVE SPACES TO NAME-OUT.

Result :
NAME-OUT = bbbbb

Eg 4.10:
A group move is considered a non-numeric move

All group items, even those with numeric subfields, are treated as alphanumeric fields.

40
COBOL

05 DATE-OUT.
10 MONTH-OUT PIC 99 .
10 YEAR-OUT PIC 99.

a. MOVE 1 TO MONTH-OUT.MOVE 94 TO YEAR-OUT.

Result :
DATE-OUT = 0194

b. MOVE 194 TO DATE-OUT.

Result :
DATE-OUT = 194b
Eg 4.11:

Permissible MOVE operations

Sending Field Receiving Field


Numeric Alphabetic Alphanumeric Group item
Numeric √ x √* √
Alphabetic X √ √ √
Alphanumeric x √ √ √
ZEROS √ x √ √
SPACES x √ √ √
Group item x √ √ √
Numeric integer fields can be moved to alphanumeric fields but numeric fields
with a V in the PIC clause cannot be moved to alphanumeric fields.

The MOVE CORRESPONDING statement


In the MOVE CORRESPONDING statement, all elementary items within the sending
group-item that have the same names as corresponding elementary items in the receiving
group-item will be moved. The same-named fields in the receiving group-item need not be in
any specific order. Any fields of the sending record, that are not matched by the same-named
fields in the receiving record are ignored.

MOVE CORRESPONDING WORKER-REC TO EMP-REC.

The values of items in the group item WORKER-REC are moved to corresponding items in the
group item EMP-REC.

41
COBOL

5. Arithmetic verbs
All the basic arithmetic operations of ADD, SUBTRACT, MULTIPLY, and DIVIDE require
that the fields operated on (1) have numeric PIC clauses and (2) actually have numeric data
when the program is executed.

In all cases, the resultant field must be an identifier or data-name, not a literal.

ADD statement

The result, or sum, of an ADD operation is always placed in the last field mentioned. The only
field that is altered as a result of the ADD operation is this last field, which is the one directly
following the word TO.

When using the TO format in an ADD statement, all the data-names and literals are added
together, and the result placed in the last field specified.

When using the GIVING format, all fields and literals preceding the word GIVING are added
together and the sum is placed in the field following the word GIVING.

05 EMP-BASIC PIC 9(5) VALUE 4000.


05 EMP-HRA PIC 9(3) VALUE 650.
05 EMP-TOTAL PIC 9(6) VALUE 100.

a. ADD EMP-BASIC TO EMP-TOTAL.

Result :
EMP-TOTAL = 4100

b. ADD EMP-BASIC EMP-HRA GIVING EMP-TOTAL.

Result :
EMP-TOTAL = 4650
Eg 5.1:

42
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX02.
***************************************************************
* This program accepts 2 numbers from the user and displays *
* the sum of the numbers. *
***************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-NO-1 PIC 9(02).
05 W01-NO-2 PIC 9(02).
05 W01-TOT PIC 9(03) VALUE ZEROES.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER THE FIRST NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-1.
DISPLAY 'ENTER THE SECOND NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-2.
ADD W01-NO-1 W01-NO-2 GIVING W01-TOT.
DISPLAY 'THE SUM OF ' W01-NO-1 ' AND '
W01-NO-2 ' IS ' W01-TOT.
STOP RUN.

Eg 5.2:

SUBTRACT statement
All fields and literals preceding the word FROM will be added together and the sum subtracted
from the field following the word FROM. The result, or difference, will be placed in this same
field if no GIVING option is used. All other fields will remain unchanged.

43
COBOL

05 EMP-GROSS PIC 9(5) VALUE 4250.


05 EMP-PF PIC 9(3) VALUE 250.
05 EMP-ITAX PIC 9(3) VALUE 100.
05 EMP-NET PIC 9(6) VALUE 100.

a. SUBTRACT EMP-PF FROM EMP-GROSS.

Result :
EMP-BASIC = 4000

b. SUBTRACT EMP-PF EMP-ITAX FROM EMP-GROSS.

Result :
EMP-GROSS = 3900

SUBTRACT EMP-PF EMP-ITAX FROM EMP-GROSS GIVING EMP-NET.

Result :
EMP-GROSS = 4250
EMP-NET = 3900
Eg 5.3:

MULTIPLY and DIVIDE statements

With each MULTIPLY or DIVIDE statement specified, only two operands can be multiplied
or divided. Always make sure the receiving fields is large enough to store the result. The
preposition used with the MULTIPLY verb is always BY. In the DIVIDE operation, the
preposition is either BY or INTO.

44
COBOL

05 EMP-GROSS PIC 9(5) VALUE 4000.


05 EMP-ANN-SAL PIC 9(5) VALUE ZERO.
05 EMP-NEW-SAL PIC 9(5) .
05 EMP-REM PIC 9(3).

a. MULTIPLY 12 BY EMP-GROSS.
Result :
EMP-GROSS = 48000

b. MULTIPLY EMP-GROSS BY 12 GIVING EMP-ANN-SAL.


Result :
EMP-GROSS = 4000
EMP-ANN-SAL=48000

c. DIVIDE 4 INTO EMP-GROSS.


Result :
EMP-GROSS = 1000

d. DIVIDE 4 INTO EMP-GROSS GIVING EMP-NEW-SAL.


Result :
EMP-GROSS = 4000
EMP-NEW-SAL = 1000

e. DIVIDE EMP-GROSS BY 4 GIVING EMP-NEW-SAL.


Result :
EMP-NEW-SAL = 1000
Eg 5.4:

Use of the REMAINDER clause in the DIVIDE operation


When performing a division operation, the result will be placed in the receiving field according
to the PIC specifications of that field.

DIVIDE 130 BY 40 GIVING WS-TOTAL.


Eg 5.5:

After the operation is performed, 03 is placed in WS-TOTAL.

It is sometimes useful to store the remainder of a division operation for additional processing.
The DIVIDE can be used for this purpose by including a REMAINDER clause.

45
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX06.
***************************************************************
* This program accepts the basic pay from the user. Display *
* basic pay(per day). Display the remainder if any. *
***************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-BASIC-PAY PIC 9(05).
05 W01-PER-DAY PIC 9(04).
05 W01-REM PIC 9(04).

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER THE BASIC PAY : ' WITH NO ADVANCING.
ACCEPT W01-BASIC-PAY.

DIVIDE W01-BASIC-PAY BY 30
GIVING W01-PER-DAY
REMAINDER W01-REM.

DISPLAY 'THE PER DAY BASIC IS - ' W01-PER-DAY.


DISPLAY 'THE REMAINDER IS - ' W01-REM.
STOP RUN.

Eg 5.6:

ROUNDED Option

A frequent need exists for rounding numeric values.

46
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX07.
***************************************************************
* This program accepts 2 numbers from the user and displays *
* the sum of the numbers. *
***************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-NO-1 PIC 9(02)V999.
05 W01-NO-2 PIC 9(02)V999.

01 W02-PRT-NOS.
05 W02-PRT-NO1 PIC 9(02).999.
05 W02-PRT-NO2 PIC 9(02).999.
05 W02-PRT-TOT PIC 9(03).99.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER THE FIRST NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-1.
DISPLAY 'ENTER THE SECOND NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-2.
ADD W01-NO-1 W01-NO-2 GIVING W02-PRT-TOT.

MOVE W01-NO-1 TO W02-PRT-NO1.


MOVE W01-NO-2 TO W02-PRT-NO2.

DISPLAY 'THE SUM OF ' W02-PRT-NO1 ' AND '


W02-PRT-NO2 ' IS ' W02-PRT-TOT.
STOP RUN.

1000-ERROR.
DISPLAY 'SIZE ERROR'.

1000-EXIT.
EXIT.
Eg 5.7:

Sample data
W01-NO-1 W01-NO-2 W02-PRT-TOT
12.857 25.142 37.99
10.33 35.20 45.53
8.515 43.223 51.73

47
COBOL
In the code given above, if 12.857 and 25.142 are entered, the result 37.999 is placed in an
accumulator. When this value is move to the field W02-PRT-TOT, the low-order decimal
position is truncated and 37.99 is stored in the field. A more desirable result would be 38.00
since, 38 is closer to the sum of 37.999. We consider results more accurate if they are rounded
to the nearest decimal position.
To obtain rounded results, the ROUNDED option may be specified with any arithmetic
statement. In all case, it directly follows the resultant data-name.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX08.
***************************************************************
* This program accepts 2 numbers from the user and displays *
* the sum of the numbers(Using ROUNDED). *
***************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-NO-1 PIC 9(02)V999.
05 W01-NO-2 PIC 9(02)V999.

01 W02-PRT-NOS.
05 W02-PRT-NO1 PIC 9(02).999.
05 W02-PRT-NO2 PIC 9(02).999.
05 W02-PRT-TOT PIC 9(03).99.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER THE FIRST NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-1.
DISPLAY 'ENTER THE SECOND NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-2.
ADD W01-NO-1 W01-NO-2 GIVING W02-PRT-TOT ROUNDED.

MOVE W01-NO-1 TO W02-PRT-NO1.


MOVE W01-NO-2 TO W02-PRT-NO2.

DISPLAY 'THE SUM OF ' W02-PRT-NO1 ' AND '


W02-PRT-NO2 ' IS ' W02-PRT-TOT.
STOP RUN.

1000-ERROR.
DISPLAY 'SIZE ERROR'.

1000-EXIT.
EXIT.
Eg 5.8:

48
COBOL
If the ROUNDED option is not specified, truncation of decimal positions will occur if the
resultant field cannot accommodate all the decimal positions in the result. With the
ROUNDED option, the computer will always round the result to the PICTURE specification of
the receiving field.

If ROUNDED and REMAINDER are to be used in the same DIVIDE statement, ROUNDED
must appear first.

ON SIZE ERROR
Consider the following :

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX09.
***************************************************************
* This program accepts 2 numbers from the user and displays *
* the sum of the numbers. *
***************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-NO-1 PIC 9(02).
05 W01-NO-2 PIC 9(02).
05 W01-TOT PIC 9(02) VALUE ZEROES.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER THE FIRST NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-1.
DISPLAY 'ENTER THE SECOND NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-2.
ADD W01-NO-1 W01-NO-2 GIVING W01-TOT.

DISPLAY 'THE SUM OF ' W01-NO-1 ' AND '


W01-NO-2 ' IS ' W01-TOT.
STOP RUN.
Eg 5.9:

If 80 and 35 are entered in the above program, the effect of the ADD statement would be the
same as coding MOVE 115 TO W01-TOT. In this case, the resultant field is not large enough
to store the accumulated sum. In other words , an overflow or size error condition has occurred.
This will produce erroneous results.

49
COBOL
In the above program, the leading digits would be truncated. Hence, the contents of W01-TOT
would be 15.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX10.
***************************************************************
* This program accepts 2 numbers from the user and displays *
* the sum of the numbers. (Using ON SIZE ERROR ) *
***************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-NO-1 PIC 9(02).
05 W01-NO-2 PIC 9(02).
05 W01-TOT PIC 9(02) VALUE ZEROES.

PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER THE FIRST NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-1.
DISPLAY 'ENTER THE SECOND NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-2.
ADD W01-NO-1 TO W01-NO-2 GIVING W01-TOT
ON SIZE ERROR
PERFORM 1000-ERROR THRU 1000-EXIT.
DISPLAY 'THE SUM OF ' W01-NO-1 ' AND '
W01-NO-2 ' IS ' W01-TOT.
STOP RUN.

1000-ERROR.
DISPLAY 'SIZE ERROR'.

1000-EXIT.
EXIT.
Eg 5.10:
In the above program, in case of a size error condition, the erroneous value is not moved to the
resultant field i.e. the original contents of W01-TOT is retained.

In a divide, the size error condition has additional significance. If an attempt is made to divide
by zero, a size error condition will occur. This is because division by zero yields a result of
infinity, which makes it impossible to define a sufficiently large receiving field.

If the ON SIZE ERROR option is employed along with the ROUNDED option, the word
ROUNDED always precedes ON SIZE ERROR.

50
COBOL

COMPUTE statement
If complex or extensive arithmetic operations are required in a program, the use of the four
arithmetic verbs may prove cumbersome. The COMPUTE verb provides another method of
performing arithmetic. The COMPUTE statement uses the following arithmetic symbols :

+ Add
- Subtract
* Multiply
/ Divide
** exponentiation

COMPUTE TOTAL = AMT1 + AMT2 – AMT3.


Eg 5.11:

To round the results in a COMPUTE statement to the specifications of the receiving field, use
the ROUNDED option directly following the receiving field. If we need to test for a size error
condition we may use the ON SIZE ERROR clause as the last one in the statement.

The sequence in which operations are performed in a COMPUTE statement

**
* or / (whichever appears first from left to right)
+ or - (whichever appears first from left to right)
The use of parentheses overrides rules 1-3. That is, operations with parentheses are performed
first.

51
COBOL

6. Decision Making
A conditional statement is one that performs operations depending on the existence of some
condition. In COBOL, such statements generally begin with the word IF and are called IF-
THEN-ELSE or selection structures.
An imperative statement , as opposed to a conditional statement, is one that performs an
operation regardless of any existing condition.
A condition may test for a specific relation. A simple condition may be a single relational test
of the following form :

IDENTIFICATION DIVISION.
PROGRAM-ID. CH06EX01.
***************************************************************
* This program accepts 2 numbers from the user and displays *
* the maximum. If both the numbers are equal, it displays the *
* message 'EQUAL'. *
***************************************************************
ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NOS.
05 W01-NO-1 PIC 9(02).
05 W01-NO-2 PIC 9(02).

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-DATA THRU 1000-EXIT.
PERFORM 2000-COMPARE THRU 2000-EXIT.
STOP RUN.

1000-ACPT-DATA.
DISPLAY 'ENTER THE FIRST NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-1.
DISPLAY 'ENTER THE SECOND NO. : ' WITH NO ADVANCING.
ACCEPT W01-NO-2.

1000-EXIT.
EXIT.

2000-COMPARE.
IF W01-NO-1 = W01-NO-2
DISPLAY 'EQUAL'
ELSE
IF W01-NO-1 > W01-NO-2
DISPLAY W01-NO-1 ' IS GREATER'
ELSE
DISPLAY W01-NO-2 ' IS GREATER'.

52
COBOL

2000-EXIT.
EXIT.
Eg 6.1:

The following symbols for simple relational conditions are valid within a COBOL statement :
< IS LESS THAN
> IS GREATER THAN
= IS EQUAL TO

The NEXT SENTENCE or CONTINUE clause


There are times when you might want to execute a series of steps only if a certain condition
does not exist. The COBOL expression NEXT SENTENCE will enable you (1) to avoid
performing any operation if a condition exists and (2) to execute instructions only if the ELSE
condition is met.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH06EX02.
***************************************************************
* This program accepts the invoice no, customer code, invoice *
* amount from the user and calculates the payable amount. *
* Discount is 3% of the amount for amounts exceeding 5000. Tax*
* 1% of the amount except for customer codes 'X','P'. *
***************************************************************
ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-INVOICE-REC.
05 W01-INV-NO PIC 9(04).
05 W01-CUST-CODE PIC X(01).
05 W01-INV-AMOUNT PIC 9(05).
05 W01-AMT-PAYABLE PIC 9(05).

01 W02-OTHERS.
05 W02-DISCOUNT PIC 9(03) VALUE ZEROS.
05 W02-TAX PIC 9(03) VALUE ZEROS.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-DATA THRU 1000-EXIT.
PERFORM 2000-CALCULATE THRU 2000-EXIT.
PERFORM 3000-DISPLAY THRU 3000-EXIT.
STOP RUN.

1000-ACPT-DATA.

53
COBOL

DISPLAY 'ENTER THE INVOICE NO. : ' WITH NO ADVANCING.


ACCEPT W01-INV-NO.
DISPLAY 'ENTER THE CUSTOMER CODE : ' WITH NO ADVANCING.
ACCEPT W01-CUST-CODE.
DISPLAY 'ENTER THE INVOICE AMOUNT : ' WITH NO ADVANCING.
ACCEPT W01-INV-AMOUNT.

1000-EXIT.
EXIT.

2000-CALCULATE.
IF W01-INV-AMOUNT > 5000
MULTIPLY W01-INV-AMOUNT BY 0.03
GIVING W02-DISCOUNT ROUNDED.

IF W01-CUST-CODE = 'X' OR W01-CUST-CODE = 'P'


NEXT SENTENCE
ELSE
MULTIPLY W01-INV-AMOUNT BY 0.01
GIVING W02-TAX.

COMPUTE W01-AMT-PAYABLE =
W01-INV-AMOUNT - (W02-DISCOUNT + W02-TAX).

2000-EXIT.
EXIT.

3000-DISPLAY.
DISPLAY 'DISCOUNT : ' W02-DISCOUNT.
DISPLAY 'TAX : ' W02-TAX.
DISPLAY 'AMOUNT PAYABLE : ' W01-AMT-PAYABLE.

3000-EXIT.
EXIT.
Eg 6.2:

Compound conditional
The compound conditional offers even greater flexibility for selection and enables the IF
statement to be used for more complex problems. The compound conditionals are as follows :

OR

Performs an operation or a series of operations if any one of several conditions exists.

AND
If a statement or statements are to be executed only when all of several conditions are met.

54
COBOL

Negating conditionals

NOT

All simple relation, class or sign tests may be coded using a negated conditional (NOT).

IF AMT1 IS NOT EQUAL TO AMT2


PERFORM 200-NOT-EQUAL-RTN.
Eg 6.3:

Hierarchy rules for compound conditionals

1. NOT is evaluated first.


2. Conditions surrounding the word AND are evaluated first.
3. Conditions surrounding the word OR are evaluated last.
4. When there are several AND or OR connectors, the AND conditions are evaluated first,
as they appear in the statement, from left to right. Then the OR conditions are
evaluated, also from left to right.
5. To override Rules 1-3, use parentheses around conditions you want to be evaluated
first.

Sign test

We can test whether a field is POSITIVE, NEGATIVE, or ZERO with a sign test.
If a numeric field contains an amount less than zero, it is considered negative. If it has an
amount greater than zero, then it is considered positive.

IF AMT IS POSITIVE
PERFORM 200-CALC-RTN.
Eg 6.4:

Class test
We can test for the type of data (ALPHABETIC or NUMERIC) using the class test.

IF AMT-IN IS NUMERIC
PERFORM 300-CALC-RTN.

Eg 6.5:

55
COBOL

Condition names
A condition-name is a user-defined word established in the DATA DIVISION that gives a
name to a specific value that an identifier can assume. An 88-level coded in the DATA
DIVISION is a condition-name that denotes a possible value for an identifier. A condition-
name is always coded on the 88 level and has only a VALUE clause associated with it. Since a
condition-name is not the name of a field, it will not contain a PICTURE clause.

05 MARITAL-STATUS PIC X.
88 SINGLE VALUE ‘S’.
Eg 6.6:

Either of the following tests may be used in the PROCEDURE DIVISION .

IF MARITAL-STATUS = ‘S’
PERFORM 1000-SINGLE-ROUTINE.
Eg 6.6a:
or

IF SINGLE
PERFORM 1000-SINGLE-ROUTINE.
Eg 6.6b:

IDENTIFICATION DIVISION.
PROGRAM-ID. CH06EX07.
***************************************************************
* This program accepts the sexcode, age, place, and health *
* code from the user and calculates the insurance amount. *
* Display an error message for rejected customers. *
* SEXCODE AGE HEALTH CODE PLACE AMOUNT *
* ------- ---- ----------- ------ ------- *
* (M)ale 20-45 (G)ood (C)ity 1,25,000 *
* (M)ale 20-50 (G)ood (V)illage 1,50,000 *
* (M)ale 25-35 (P)oor (V)illage 25,000 *
* (F)emale 22-40 (G)ood (C)ity 1,00,000 *
* (F)emale 20-45 (G)ood (V)illage 1,25,000 *
***************************************************************

56
COBOL

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-INS-REC.
05 W01-SEX-CODE PIC A(01).
88 88-MALE VALUE 'M'.
88 88-FEMALE VALUE 'F'.
05 W01-AGE PIC 9(02).
88 88-20-TO-45 VALUE 20 THRU 45.
88 88-20-TO-50 VALUE 20 THRU 50.
88 88-25-TO-35 VALUE 25 THRU 35.
88 88-22-TO-40 VALUE 22 THRU 40.
05 W01-PLACE PIC A(01).
88 88-CITY VALUE 'C'.
88 88-VILLAGE VALUE 'V'.
05 W01-HEALTH-CODE PIC A(01).
88 88-GOOD-HEALTH VALUE 'G'.
88 88-POOR-HEALTH VALUE 'P'.
05 W01-INS-AMOUNT PIC 9(06) VALUE ZEROS.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-DATA THRU 1000-EXIT.
PERFORM 2000-CHECK THRU 2000-EXIT.
PERFORM 3000-DISPLAY THRU 3000-EXIT.
STOP RUN.

1000-ACPT-DATA.
DISPLAY 'ENTER THE SEXCODE : ' WITH NO ADVANCING.
ACCEPT W01-SEX-CODE.
DISPLAY 'ENTER THE AGE : ' WITH NO ADVANCING.
ACCEPT W01-AGE.
DISPLAY 'ENTER THE PLACE : ' WITH NO ADVANCING.
ACCEPT W01-PLACE.
DISPLAY 'ENTER THE HEALTH CODE : ' WITH NO ADVANCING.
ACCEPT W01-HEALTH-CODE.

1000-EXIT.
EXIT.

2000-CHECK.
IF 88-MALE
PERFORM 2100-MALE THRU 2100-EXIT
ELSE
PERFORM 2200-FEMALE THRU 2200-EXIT.

57
COBOL

2000-EXIT.
EXIT.

2100-MALE.

IF 88-GOOD-HEALTH
IF 88-20-TO-45 AND 88-CITY
MOVE 125000 TO W01-INS-AMOUNT
ELSE
IF 88-20-TO-50 AND 88-VILLAGE
MOVE 15000 TO W01-INS-AMOUNT
ELSE
NEXT SENTENCE
ELSE
IF 88-POOR-HEALTH
IF 88-20-TO-45 AND 88-VILLAGE
MOVE 25000 TO W01-INS-AMOUNT.

2100-EXIT.
EXIT.

2200-FEMALE.
IF 88-GOOD-HEALTH
IF 88-22-TO-40 AND 88-CITY
MOVE 100000 TO W01-INS-AMOUNT
ELSE
IF 88-20-TO-45 AND 88-VILLAGE
MOVE 125000 TO W01-INS-AMOUNT.

2200-EXIT.
EXIT.

3000-DISPLAY.
IF W01-INS-AMOUNT = ZEROS
DISPLAY 'CUSTOMER REJECTED'
ELSE
DISPLAY 'INSURANCE AMOUNT : ' W01-INS-AMOUNT.

3000-EXIT.
EXIT.

Eg 6.7:

58
COBOL

7. Iterations
PERFORM statement
The simple PERFORM statement, is used to execute a specified routine from one or more
points in a program.

The PERFORM statement will :


1. Execute all instructions in the named paragraph.
2. Transfer control to the next instruction in sequence, after the PERFORM.

PROCEDURE DIVISION.
100-MAIN-MODULE.
:
PERFORM 400-HEADING-RTN.
:
200-CALC-RTN.
:
:
400-HEADING-RTN.
:
:

Eg 7.1:

PERFORM..THRU
The PERFORM executes all statement beginning at pargraph-name-1 until the end of
paragraph-name-2 is reached. Control is then transferred to the statement directly following the
PERFORM.

100-MAIN.
PERFORM 300-PARA THRU 500-PARA.
:
200-PARA.
:
300-PARA.
:
400-PARA.
:
500-PARA.
EXIT.
600-PARA.
:

Eg 7.2:

59
COBOL

The EXIT statement


EXIT is a COBOL reserved word that performs no operation. It is used to allow execution to
pass over other statements or to transfer control back to the statement following the original
PERFORM. It is used, when necessary, as an end point in a paragraph.

PERFORM..UNTIL
Iteration may be performed in COBOL using a PERFORM..UNTIL statement. The contents of
the identifiers used in the UNTIL clause should be changed within the paragraph(s) being
performed. The condition in a PERFORM .. UNTIL is tested before the named paragraph is
executed even once. If the condition indicated in the UNTIL clause is met at the time of
execution, then the name paragraph(s) will not be executed.

Procedure used in Looping

Paragraph containing the PERFORM that “Loops”

1. Initialize the field to be tested (e.g., MOVE 0 TO COUNTER1).


2. Code a PERFORM..UNTIL using a separate paragraph. For example, PERFORM
UNTIL COUNTER1 = 5.

Loop to be performed

1. Code the steps required in the loop as a separated paragraph.


2. Increase or decrease the value in the field to be tested (e.g., ADD 1 TO COUNTER1).

60
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH05EX03.
*************************************************
* This program displays the series 1,2,3...25. *
*************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-CNT PIC 9(02) VALUE 1.
01 W02-PRT-CNT PIC Z9.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-DISP THRU 1000-EXIT UNTIL W01-CNT > 25.
STOP RUN.

1000-DISP.
MOVE W01-CNT TO W02-PRT-CNT.
DISPLAY W02-PRT-CNT.
ADD 1 TO W01-CNT.

1000-EXIT.
EXIT.
Eg 7.3:

PERFORM..TIMES
The PERFORM..TIMES construct is used to execute a sequence of steps a fixed number of
times. It is not necessary to establish a counter that must be incremented each time through the
loop. When using the TIMES format (PERFORM paragraph-name-1 identifier-1 TIMES) : (1)
the identifier must be specified in the DATA DIVISION; (2) it must have a numeric PICTURE
clause; and (3) it must contain only integers or zeros.

* This program displays the Hello 3 times.


MOVE 3 TO COUNTER1.
PERFORM 200-DISP-RTN COUNTER1 TIMES.
:
STOP RUN.
200-DISP-RTN.
DISPLAY ‘HELLO’.
Eg 7.4:

61
COBOL

GO TO
A GO TO permanently transfers control to another paragraph. It does not return control to the
paragraph from where it was issued.

62
COBOL

8. File Handling
File Organization method
It is important that file be so organized that efficient processing can be accomplished
by matching the file data characteristics, processing method, and file organization.
Basically, three methods of file organization are available on disk systems :
sequential, indexed sequential, and relative file organization.

Sequential file organization


Sequential file organization indicates that the records in the file are positioned in a
sequential order, such as according to part number.

Indexed sequential file organization

Indexed sequential file organization is one in which the records are filed
sequentially, but a table (index is available which identifies the location of groups of
records, thereby reducing access time.

Relative file organization

Relative file organization is such that the logical order and physical order of the
records do not necessarily correspond with one another. For such a file, a technique,
or rule, is required to determine the location of the record in the disk system.

This chapter shows you how to process sequential files in COBOL.

Any program that (1) reads data from input files or (2) produces output files, requires an
INPUT-OUTPUT SECTION and a FILE SECTION to describe the input and output areas.

INPUT-OUTPUT SECTION
The INPUT-OUTPUT SECTION of the ENVIRONMENT DIVISION follows the
CONFIGURATION SECTION and supplies information concerning the input and output
devices used in the program. In the FILE-CONTROL paragraph, a file-name is selected for
each file to be used in the program; in addition, each file-name selected is assigned to a device.
The SELECT statement is coded in Area B.

63
COBOL

ENVIRONMENT DIVISION.
:
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPLOYEE-FILE
ASSIGN TO ‘EMP.DAT’
ORGANIZATION IS SEQUENTIAL.
Eg 8.1:

FILE SECTION.
Each file is described in the FILE SECTION with an FD sentence that may consist of a series
of clauses. After the clauses are specified, the FD sentence ends with a period. FD is an
abbreviation for File Description. Each FD entry will describe a file defined in a SELECT
statement in the ENVIRONMENT DIVISION.

The two entries, DATA DIVISION and FILE SECTION, are coded in Area A. FD is also
coded in Area A. The file-name, however, is typically coded in Area B.

DATA DIVISION.
FILE SECTION.
FD EMPLOYEE-FILE
LABEL RECORDS ARE STANDARD
RECORD CONTAINS 70 CHARACTERS
BLOCK CONTAINS 10 RECORDS.
Eg 8.2:

Label Records
Label records are usually created as the first and last records of a disk or tape to provide
identifying information about the file on disk or tape. Labels are created on output files so that,
when the same file is later read as input, the labels may be checked to ensure that the file being
accessed is the correct one. Labels are created on output files and checked on input files. The
COBOL compiler will supply the routine for writing labels on output files or for checking
labels on input file if the entry LABEL RECORDS ARE STANDARD is included.

This LABEL RECORDS clause will result in the following :


1. For output files, the first record on disk or tape file will be created as a standard 80-
position header label identifying the file to the system; similarly, the last record on the
disk or tape will be created as a trailer label.
2. For input files, these labels will be computer-checked to ensure that the file being
processed is the correct one.

The clause LABEL RECORDS ARE STANDARD is permitted for disk and tape files only.
Devices such as printers do not use label records, since identifying information is unnecessary

64
COBOL
where data is visible to the human eye. The clause LABEL RECORDS ARE OMITTED is
used for such files.

RECORD CONTAINS clause


The RECORD CONTAINS clause indicates the size of each record. For printer files the
RECORD CONTAINS clause may include one extra position that is used to control the
spacing of the form (e.g., single spacing, double spacing). Thus, for 132 character printers, a
record size is sometimes set as 133 characters. In such cases, the first or leftmost position in
these 133-position print records is the form control position; it is not actually printed.

BLOCK CONTAINS clause


The BLOCK CONTAINS clause is included in the File Description entry only for files in
which disk or tape records have been blocked. Blocking is a technique that increases the speed
of input/output operations and makes more effective use of storage space on disk and tape. A
group of logical records is included within one block to maximize the efficient use of a disk or
tape area. For example, reading in a block of 10 disk records, is more efficient than reading in
each disk record separately. Even if blocking is used, the program processes records in the
standard way, that is, one logical record at a time.

Record Description entries


A record is a unit of information consisting or related data items within a file. Most often, a file
consists of records that all have the same length and format. These are called fixed-length
records.

For each file defined, we have one record format.

01 EMPLOYEE-REC.
05 EMP-NAME.
10 EMP-FIRST-NAME PIC X(10).
10 EMP-LAST-NAME PIC X(15).
05 EMP-DEPT PIC X(4).
05 EMP-SALARY PIC 9(5)V99.
05 EMP-DOJ PIC 9(6).
Eg 8.3:

Input/output verbs

There are 4 input/output verbs : OPEN, READ, WRITE, CLOSE.

65
COBOL
OPEN statement

Before an input or an output file can be used by the program it must be opened. An OPEN
statement, designates files as either input or output. It also accesses the specific devices, and
makes the files available for processing. It performs header label routines if label records are
STANDARD. The OPEN statement checks the header label to determine if the correct file has
been accessed.

OPEN INPUT EMPLOYEE-FILE.


OPEN OUTPUT REPORT-FILE.
Eg 8.4:

The order in which files are opened is not significant. The only restriction is that a file must be
opened before it may be read or written; a file must be accessed before it may be processed.
Since the OPEN statement accesses the files, it is generally on of the first instructions coded in
the PROCEDURE DIVISION.

READ statement

After an input file has been opened, it may be read. A READ statement transmits data from the
input device, assigned in the ENVIRONMENT DIVISION, to the input storage area, defined
in the FILE SECTION of the DATA DIVISION.

The primary function of the READ statement is to transmit one data record to the input area
reserved for that file. That is, each time a READ statement is executed, one record is read into
primary storage.

The READ statement has, however, several other functions. Like the OPEN
statement, it performs certain checks. It checks the length of each input record to
ensure that it corresponds to the length specified in a RECORD CONTAINS clause
in the data DIVISION. If a discrepancy exists, an error message prints, and a
program interrupt occurs.

The READ statement will also use the BLOCK CONTAINS clause, if specified, to perform a
check on the blocking factor.

The AT END clause in the READ statement tests to determine if there is any more input. An
AT END clause of the READ statement tells the computer what to do if there is no more data
to be read.

66
COBOL

READ EMPLOYEE-FILE
AT END
MOVE ‘YES’ TO END-OF-FILE.
Eg 8.5:
WRITE statement

The WRITE instruction takes data in the output area defined in the DATA DIVISION and
transmits it to the device specified in the ENVIRONMENT DIVISION.

Note that although files are read, we write records. The record-name appear on the 01 level and
is generally subdivided into fields. The record description specifies the format of the output.

WRITE EMPLOYEE-REC.
Eg 8.6:
CLOSE statement

A CLOSE statement is coded at the end of the job after all records have been processed to
release these files and deactivate the devices. All files that have been opened at the beginning
of the program are closed at the end of a program. The CLOSE statement, like the OPEN, will
perform additional functions. When creating disk or tape records, for example, the CLOSE will
create trailer labels; it will also rewind a tape.

CLOSE EMPLOYEE-FILE.
Eg 8.7:

A program to create an employee file.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH08EX08.
*****************************************************************
* This program creates a employee file containing the following *
* details : *
* Empcode (2001 onwards, should be generated) *
* Name *
* Department (Sales,Purchase,Admin,S/W) *
* Designation (Programmer,Analyst,Consultant for S/W department)*
* (Jr.Officer,Sr.Officer,Manager for other departments)*
* Salary (Should be between 2000 to 20000). *
* Accept details till the user enters 'N'. *
*****************************************************************

67
COBOL

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-FILE ASSIGN TO 'EMPL.DAT'
ORGANIZATION IS SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD EMP-FILE
LABEL RECORDS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.
01 EMP-REC.
05 EMP-CODE PIC 9(04).
05 EMP-NAME.
10 EMP-FIRST-NAME PIC X(10).
10 EMP-LAST-NAME PIC X(15).
05 EMP-DEPT PIC X(08).
88 88-SW VALUE 'S/W'.
88 88-VALID-DEPT VALUE 'SALES', 'PURCHASE', 'ADMIN',
'S/W'.
05 EMP-DESIG PIC X(12).
88 88-SW-DESIG VALUE 'PROGRAMMER', 'ANALYST',
'CONSULTANT'.
88 88-OTH-DESIG VALUE 'JR.OFFICER', 'SR.OFFICER',
'MANAGER'.
05 EMP-SALARY PIC 9(5).
88 88-VALID-SALARY VALUE 2000 THRU 20000.
05 FILLER PIC X(26).

WORKING-STORAGE SECTION.
01 W01-FLAG.
05 W01-ANS PIC X(01) VALUE 'Y'.
88 88-VALID-ANS VALUE 'Y', 'y', 'N', 'n'.
88 88-ANS-NO VALUE 'N', 'n'.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT UNTIL 88-ANS-NO.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN OUTPUT EMP-FILE.
MOVE 2000 TO EMP-CODE.

1000-EXIT.

68
COBOL

EXIT.

2000-PROCESS.
ADD 1 TO EMP-CODE.
DISPLAY 'ENTER FIRST NAME : '.
ACCEPT EMP-FIRST-NAME.
DISPLAY 'ENTER LAST NAME : '.
ACCEPT EMP-LAST-NAME.

MOVE SPACES TO EMP-DEPT.


PERFORM 2100-ACPT-DEPT THRU 2100-EXIT UNTIL 88-VALID-DEPT.

MOVE SPACES TO EMP-DESIG.


IF 88-SW
PERFORM 2200-ACPT-SW-DESG THRU 2200-EXIT
UNTIL 88-SW-DESIG
ELSE
PERFORM 2300-ACPT-OTH-DESG THRU 2300-EXIT
UNTIL 88-OTH-DESIG.

MOVE ZEROES TO EMP-SALARY.


PERFORM 2400-ACPT-SALARY THRU 2400-EXIT UNTIL 88-VALID-SALARY.

WRITE EMP-REC.

MOVE SPACES TO W01-ANS.


PERFORM 2500-ACPT-ANS THRU 2500-EXIT UNTIL 88-VALID-ANS.

2000-EXIT.
EXIT.

2100-ACPT-DEPT.
DISPLAY 'ENTER THE DEPARTMENT : '.
ACCEPT EMP-DEPT.

2100-EXIT.
EXIT.

2200-ACPT-SW-DESG.
DISPLAY 'ENTER THE DESIGNATION : '.
ACCEPT EMP-DESIG.

2200-EXIT.
EXIT.

2300-ACPT-OTH-DESG.
DISPLAY 'ENTER THE DESIGNATION : '.
ACCEPT EMP-DESIG.

2300-EXIT.

69
COBOL

EXIT.

2400-ACPT-SALARY.
DISPLAY 'ENTER SALARY (2000-20000) :'.
ACCEPT EMP-SALARY.

2400-EXIT.
EXIT.

2500-ACPT-ANS.
DISPLAY 'DO YOU WANT TO ENTER MORE DATA ? '.
ACCEPT W01-ANS.

2500-EXIT.
EXIT.

3000-TERM.
CLOSE EMP-FILE.
3000-EXIT.
EXIT.
Eg 8.8:

COPY statement
A COPY statement is used to bring into a program a series of prewritten COBOL entries
that have been stored in a library. Copying entries from a library, rather than coding them, has
the following benefits : (1) it could save a programmer a considerable amount of coding and
debugging time; (2) it promotes program standardization since all programs that copy entries
from a library will be using common data-names and/or procedures; (3) it reduces the time it
takes to make modifications and reduces duplication of effort; if a change needs to be made to
a data entry, it can be made just once in the library without the need to alter individual
programs; and (4) library entries are extensively annotated so that they are meaningful to all
users; this annotation results in better-documented programs and systems.

Most often, the COPY statement is used to copy FD and 01 entries that define and describe
files and records. In addition, standard modules to be used in the PROCEDURE DIVISION of
several programs may also be stored in a library and copied as needed.

Contents of EMP01

SELECT EMP-FILE ASSIGN TO 'EMPL.DAT'


ORGANIZATION IS SEQUENTIAL.

Eg 8.9a:

70
COBOL

The ENVIRONMENT DIVISION entry using a COPY statement

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY EMP01.
Eg 8.9b:

Contents of EMP02

FD EMP-FILE
LABEL RECORDS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.
01 EMP-REC.
05 EMP-CODE PIC 9(04).
05 EMP-NAME.
10 EMP-FIRST-NAME PIC X(10).
10 EMP-LAST-NAME PIC X(15).
05 EMP-DEPT PIC X(08).
88 88-SW VALUE 'S/W'.
88 88-VALID-DEPT VALUE 'SALES', 'PURCHASE', 'ADMIN',
'S/W'.
05 EMP-DESIG PIC X(12).
88 88-SW-DESIG VALUE 'PROGRAMMER', 'ANALYST',
'CONSULTANT'.
88 88-OTH-DESIG VALUE 'JR.OFFICER', 'SR.OFFICER',
'MANAGER'.
05 EMP-SALARY PIC 9(5).
88 88-VALID-SALARY VALUE 2000 THRU 20000.
05 FILLER PIC X(26).
Eg 8.9c:
The DATA DIVISION entry using a COPY statement

DATA DIVISION.
FILE SECTION.
COPY EMP02.
Eg 8.9d:

71
COBOL

A program to read from the employee file.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH08EX10.
****************************************************************
* This program displays the details of employees in the *
* SALES department and the average salary for the *
* department. *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY EMP01.

DATA DIVISION.
FILE SECTION.
COPY EMP02.
WORKING-STORAGE SECTION.
01 W02-EOF.
05 W02-EMP-EOF PIC X(01) VALUE 'N'.
88 88-EMP-EOF VALUE 'Y'.
01 W03-TOTALS.
05 W03-TOT-SALARY PIC 9(07).
05 W03-TOT-EMP PIC 9(03) VALUE ZEROS.
05 W03-AVG-SALARY PIC Z(05)9.99.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT UNTIL 88-EMP-EOF.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
PERFORM 4000-READ-EMP THRU 4000-EXIT.

1000-EXIT.
EXIT.

2000-PROCESS.
IF EMP-DEPT = 'SALES'
DISPLAY EMP-NAME ' ' EMP-SALARY
ADD 1 TO W03-TOT-EMP
ADD EMP-SALARY TO W03-TOT-SALARY.

PERFORM 4000-READ-EMP THRU 4000-EXIT.

72
COBOL

2000-EXIT.
EXIT.

3000-TERM.
CLOSE EMP-FILE.
DIVIDE W03-TOT-SALARY BY W03-TOT-EMP
GIVING W03-AVG-SALARY.
DISPLAY 'THE AVERAGE SALARY IS : ' W03-AVG-SALARY.

3000-EXIT.
EXIT.

4000-READ-EMP.
READ EMP-FILE
AT END
MOVE 'Y' TO W02-EMP-EOF.

4000-EXIT.
EXIT.
Eg 8.10:

73
COBOL

9. Sorting
Sorting
Records in files frequently must be sorted into specific sequences for updating, answering
inquiries, or generating reports. Sorting is a common procedure used for arranging records into
a specific order so that sequential processing can be performed.

COBOL has a SORT verb, which can make it very useful as part of a COBOL program.

The programmer must specify whether the key field is to be an ASCENDING KEY or a
DESCENDING KEY, depending on which sequence is required :
ASCENDING : From lowest to highest
DESCENDING : From highest to lowest

The SORT verb may be used to sequence records with more than one key field. For example,
to sort an employee file so that it is in alphabetic sequence by name within each department.

SORT SORT-FILE
ON ASCENDING KEY S-EMP-DEPT
ON ASCENDING KEY S-EMP-NAME
USING EMPLOYEE-FILE
GIVING SORT-EMPLOYEE-FILE.
Eg 9.1:
There are three major files used in a sort :
1. Input file : File of unsorted input records.
2. Work or sort file : File used to store records temporarily during the sorting process.
3. Output file: File of sorted output records.

All these files would be defined in the ENVIRONMENT DIVISION using standard ASSIGN
clauses, which are system dependent. The SORT-FILE is actually assigned to a temporary
work area that is used during processing but not saved. Only the unsorted disk file and the
sorted output disk file are assigned standard file-names so that they can be permanently stored.

FDs are used in the DATA DIVISION to define and describe the input and output files in the
usual way. The sort or work file is described with an SD (sort file description) entry. The only
difference between SD and FD entries is that an SD must not have a LABEL RECORDS
clause. Note, too, that the field(s) specified as the KEY field(s) for sorting purposes must be
defined as part of the sort record format.

74
COBOL

ENVIRONMENT DIVISION.
:
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SORT-FILE
ASSIGN TO DISK.
:
DATA DIVISION.
FILE SECTION.
SD SORT-FILE.
01 SORT-REC.
05 S-EMP-NAME.
10 S-EMP-FIRST-NAME PIC X(10).
10 S-EMP-LAST-NAME PIC X(15).
05 S-EMP-DEPT PIC X(4).
05 FILLER PIC 9(13).
Eg 9.2:
The SORT statement can, however, be used in conjunction with procedures that process
records just before they are sorted and/or process records after they are sorted.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH09EX03.
****************************************************************
* This program sorts the employee file *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-EMP-FILE ASSIGN TO 'EMPL.DAT'
ORGANIZATION IS SEQUENTIAL.

SELECT SORT-FILE ASSIGN TO DISK.

SELECT OUT-EMP-FILE ASSIGN TO 'SRTEMPL.DAT'


ORGANIZATION IS SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD IN-EMP-FILE
LABEL RECORDS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.
01 IN-EMP-REC.
05 IN-EMP-CODE PIC 9(04).
05 IN-EMP-NAME.

75
COBOL

10 IN-EMP-FIRST-NAME PIC X(10).


10 IN-EMP-LAST-NAME PIC X(15).

05 IN-EMP-DEPT PIC X(08).


05 IN-EMP-DESIG PIC X(12).
05 IN-EMP-SALARY PIC 9(5).
05 FILLER PIC X(26).

SD SORT-FILE.
01 SORT-REC.
05 SRT-EMP-CODE PIC 9(04).
05 SRT-EMP-NAME.
10 SRT-EMP-FIRST-NAME PIC X(10).
10 SRT-EMP-LAST-NAME PIC X(15).
05 SRT-EMP-DEPT PIC X(08).
05 SRT-EMP-DESIG PIC X(12).
05 SRT-EMP-SALARY PIC 9(5).
05 FILLER PIC X(26).

FD OUT-EMP-FILE
LABEL RECORDS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.
01 OUT-EMP-REC.
05 OUT-EMP-CODE PIC 9(04).
05 OUT-EMP-NAME.
10 OUT-EMP-FIRST-NAME PIC X(10).
10 OUT-EMP-LAST-NAME PIC X(15).
05 OUT-EMP-DEPT PIC X(08).
05 OUT-EMP-DESIG PIC X(12).
05 OUT-EMP-SALARY PIC 9(5).
05 FILLER PIC X(26).

WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
0000-MAIN.
SORT SORT-FILE
ASCENDING KEY SRT-EMP-DEPT
USING IN-EMP-FILE
GIVING OUT-EMP-FILE.
STOP RUN.
Eg 9.3:

76
COBOL

10. Trapping Runtime errors


The FILE STATUS clause
The FILE STATUS clause can be used with the SELECT statement to determine the
exact type of input or output error that has occurred when either reading from or
writing to a file. The SELECT statement could include FILE STATUS as its last
clause. The data name specified with the FILE STATUS clause must appear in the
WORKING-STORAGE as a two-position alphanumeric field.

SELECT EMPLOYEE-FILE
ASSIGN TO ‘EMP.DAT’
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-STATUS.
:
WORKING-STORAGE SECTION.
01 WS-STATUS PIC X(2).
Eg 10.1:
The possible values that may be placed in the FILE STATUS field when an input or
output operation is performed are listed in Appendix – D.

OPEN INPUT EMPLOYEE-FILE.


IF WS-STATUS NOT = ‘00’
DISPLAY ‘ERROR OPENING EMPLOYEE FILE’
STOP RUN.
READ EMPLOYEE-FILE ….
:
:

Eg 10.2:

IDENTIFICATION DIVISION.
PROGRAM-ID. CH10EX03.
**********************************************************
* This program appends data to the EMPLOYEE file. *
* If the file does not exist, the file is created before *
* adding the data. *
**********************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPLOYEE-FILE ASSIGN TO 'EMP.DAT'
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS W01-EMP-STAT.

77
COBOL

DATA DIVISION.
FILE SECTION.
FD EMPLOYEE-FILE
LABEL RECORDS STANDARD.
01 EMPLOYEE-REC.
05 EMP-NO PIC 9(04).
05 EMP-NAME.
10 EMP-FIRST-NAME PIC X(10).
10 EMP-LAST-NAME PIC X(15).
05 EMP-DEPT PIC X(04).
05 EMP-SALARY PIC 9(05)V99.
05 EMP-DOJ PIC 9(06).

WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.
01 W02-ANS PIC X(01) VALUE 'Y'.
88 88-ANS-NO VALUE 'N' 'n'.

PROCEDURE DIVISION.
0000-MAIN.
OPEN EXTEND EMPLOYEE-FILE.
IF W01-EMP-STAT NOT = '00'
OPEN OUTPUT EMPLOYEE-FILE.
PERFORM 1000-ACPT-PARA THRU 1000-EXIT UNTIL 88-ANS-NO.
CLOSE EMPLOYEE-FILE.
STOP RUN.

1000-ACPT-PARA.
DISPLAY 'ENTER YOUR EMP CODE : ' WITH NO ADVANCING.
ACCEPT EMP-NO.
DISPLAY 'ENTER YOUR FIRST NAME : ' WITH NO ADVANCING.
ACCEPT EMP-FIRST-NAME.
DISPLAY 'ENTER YOUR LAST NAME : ' WITH NO ADVANCING.
ACCEPT EMP-LAST-NAME.
DISPLAY 'ENTER YOUR DEPARTMENT : ' WITH NO ADVANCING.
ACCEPT EMP-DEPT.
DISPLAY 'ENTER YOUR SALARY : ' WITH NO ADVANCING.
ACCEPT EMP-SALARY.
DISPLAY 'ENTER YOUR DATE OF JOINING : ' WITH NO ADVANCING.
ACCEPT EMP-DOJ.
WRITE EMPLOYEE-REC.
DISPLAY 'DO YOU WANT TO ADD MORE RECORDS : '
WITH NO ADVANCING.
ACCEPT W02-ANS.

1000-EXIT.
EXIT.
Eg 10.3:

78
COBOL

11. REPORTS
IDENTIFICATION DIVISION.
PROGRAM-ID. CH11EX01.
****************************************************************
* This program displays the details of employees in the *
* SALES department and the average salary for the *
* department. Print 10 records on each page. *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-FILE ASSIGN TO 'EMPL.DAT'
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS W01-EMP-STAT.

SELECT REPORT-FILE ASSIGN TO 'REP1101.DAT'


ORGANIZATION IS SEQUENTIAL
FILE STATUS IS W01-REP-STAT.

DATA DIVISION.
FILE SECTION.
FD EMP-FILE
LABEL RECORDS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.
01 EMP-REC.
05 EMP-CODE PIC 9(04).
05 EMP-NAME.
10 EMP-FIRST-NAME PIC X(10).
10 EMP-LAST-NAME PIC X(15).
05 EMP-DEPT PIC X(08).
88 88-SW VALUE 'S/W'.
88 88-VALID-DEPT VALUE 'SALES', 'PURCHASE', 'ADMIN',
'S/W'.
05 EMP-DESIG PIC X(12).
88 88-SW-DESIG VALUE 'PROGRAMMER', 'ANALYST',
'CONSULTANT'.
88 88-OTH-DESIG VALUE 'JR.OFFICER', 'SR.OFFICER',
'MANAGER'.
05 EMP-SALARY PIC 9(05).
88 88-VALID-SALARY VALUE 2000 THRU 20000.
05 FILLER PIC X(26).

FD REPORT-FILE
LABEL RECORDS OMITTED
RECORD CONTAINS 80 CHARACTERS.
01 REPORT-REC PIC X(80).

79
COBOL

WORKING-STORAGE SECTION.
01 W01-STATUS.
05 W01-EMP-STAT PIC X(02) VALUE SPACES.
05 W01-REP-STAT PIC X(02) VALUE SPACES.

01 W02-EOF.
05 W02-EMP-EOF PIC X(01) VALUE 'N'.
88 88-EMP-EOF VALUE 'Y'.

01 W03-TOTALS.
05 W03-TOT-SALARY PIC 9(07).
05 W03-TOT-EMP PIC 9(03) VALUE ZEROS.

01 W04-DEPT-LIT PIC X(08).

01 W05-OTHERS.
05 W05-REMAINDER PIC 9(02) VALUE ZERO.
05 W05-QUOT PIC 9(02) VALUE ZERO.

01 H01-CO-HEAD.
05 FILLER PIC X(35) VALUE SPACES.
05 FILLER PIC X(11) VALUE 'XYZ CO. LTD'.

01 H02-DEPT-HEAD.
05 FILLER PIC X(13) VALUE 'DEPARTMENT : '.
05 H02-DEPT PIC X(08).

01 H03-LINE.
05 FILLER PIC X(80) VALUE ALL '-'.

01 H04-COL-HEAD.
05 FILLER PIC X(06) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'SR.NO.'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(08) VALUE 'EMP CODE'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(04) VALUE 'NAME'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'SALARY'.

01 D01-EMP-DET.
05 FILLER PIC X(07) VALUE SPACES.
05 D01-SR-NO PIC Z9.
05 FILLER PIC X(10) VALUE SPACES.
05 D01-EMP-CODE PIC 9(04).
05 FILLER PIC X(07) VALUE SPACES.
05 D01-EMP-NAME PIC X(25).
05 FILLER PIC X(05).
05 D01-EMP-SALARY PIC $(5)9.

80
COBOL

01 F01-REP.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(17) VALUE 'AVERAGE SALARY : '.
05 FILLER PIC X(33) VALUE SPACES.
05 F01-AVG-SAL PIC $(5)9.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT UNTIL 88-EMP-EOF.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-STAT NOT = '00'
DISPLAY 'UNABLE TO OPEN EMPLOYEE FILE'
STOP RUN.

MOVE 'SALES' TO W04-DEPT-LIT.


OPEN OUTPUT REPORT-FILE.
IF W01-REP-STAT NOT = '00'
DISPLAY 'UNABLE TO CREATE REPORT FILE'
CLOSE EMP-FILE
STOP RUN.

PERFORM 1100-REP-HEADER THRU 1100-EXIT.


PERFORM 4000-READ-EMP THRU 4000-EXIT.

1000-EXIT.
EXIT.

1100-REP-HEADER.
MOVE H01-CO-HEAD TO REPORT-REC.
WRITE REPORT-REC.

MOVE W04-DEPT-LIT TO H02-DEPT.


WRITE REPORT-REC FROM H02-DEPT-HEAD.
WRITE REPORT-REC FROM H03-LINE.
WRITE REPORT-REC FROM H04-COL-HEAD.
WRITE REPORT-REC FROM H03-LINE.

1100-EXIT.
EXIT.

2000-PROCESS.
IF EMP-DEPT = W04-DEPT-LIT
ADD 1 TO W03-TOT-EMP
ADD EMP-SALARY TO W03-TOT-SALARY

81
COBOL

PERFORM 2100-REP-DETAIL THRU 2100-EXIT.

PERFORM 4000-READ-EMP THRU 4000-EXIT.

2000-EXIT.
EXIT.

2100-REP-DETAIL.
DIVIDE W03-TOT-EMP BY 11
GIVING W05-QUOT REMAINDER W05-REMAINDER.

IF W05-REMAINDER = ZERO
WRITE REPORT-REC FROM H03-LINE
MOVE SPACES TO REPORT-REC
WRITE REPORT-REC AFTER PAGE
PERFORM 1100-REP-HEADER.

MOVE W03-TOT-EMP TO D01-SR-NO.


MOVE EMP-CODE TO D01-EMP-CODE.
MOVE EMP-NAME TO D01-EMP-NAME.
MOVE EMP-SALARY TO D01-EMP-SALARY.
WRITE REPORT-REC FROM D01-EMP-DET.

2100-EXIT.
EXIT.

3000-TERM.
DIVIDE W03-TOT-SALARY BY W03-TOT-EMP
GIVING F01-AVG-SAL ROUNDED.
PERFORM 3100-REP-FOOTER THRU 3100-EXIT.

CLOSE EMP-FILE
REPORT-FILE.

3000-EXIT.
EXIT.

3100-REP-FOOTER.
WRITE REPORT-REC FROM H03-LINE.
WRITE REPORT-REC FROM F01-REP.
WRITE REPORT-REC FROM H03-LINE.

3100-EXIT.
EXIT.

4000-READ-EMP.
READ EMP-FILE
AT END
MOVE 'Y' TO W02-EMP-EOF.

82
COBOL

4000-EXIT.
EXIT.
Eg 11.1:

83
COBOL

12. CONTROL BREAK PROCESSING


What is a control break procedure ?
A control break procedure is used if records are in sequence by a control field and the number
of records in each control field is variable.

Steps for a Control Break


1. Read the initial record.
2. Move the control field to a hold area in WORKING-AREA.
3. As long as the control field is equal to the hold area, execute the detail routine for the
input record. This means : Add the appropriate amount to a control total, print the detail
record and read the next record.
4. If the control field is not equal to the hold area :
Print the control total.
Initialize the control total field to zero.
Reinitialize the hold field with the new control field value if there are more records.
Process the detail record as in step 3.
Print headings on a new page if each control total is to appear on a separate page.
5. If required, after all records have been processed perform a control break to print the
last control group.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH12EX01.
****************************************************************
* This program displays the details of employees *
* departmentwise. (Single level control break) *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY EMP01A.

SELECT REPORT-FILE ASSIGN TO 'REP1201.DAT'


ORGANIZATION IS SEQUENTIAL
FILE STATUS IS W06-REP-FS.

DATA DIVISION.
FILE SECTION.
COPY EMP02A.

FD REPORT-FILE
LABEL RECORDS OMITTED
RECORD CONTAINS 80 CHARACTERS.
01 REPORT-REC PIC X(80).

84
COBOL

WORKING-STORAGE SECTION.
01 W02-EOF.
05 W02-EMP-EOF PIC X(01) VALUE 'N'.
88 88-EMP-EOF VALUE 'Y'.

01 W03-TOTALS.
05 W03-TOT-SALARY PIC 9(07).
05 W03-TOT-EMP PIC 9(03) VALUE ZEROS.
05 W03-GRAND-TOT PIC 9(08) VALUE ZEROS.

01 W04-PREV-DEPT PIC X(08).

01 W05-DATE.
05 W05-YY PIC 9(02).
05 W05-MM PIC 9(02).
05 W05-DD PIC 9(02).

01 W06-REP-FS PIC X(02) VALUE SPACES.

01 H01-CO-HEAD.
05 FILLER PIC X(35) VALUE SPACES.
05 FILLER PIC X(11) VALUE 'XYZ CO. LTD'.

01 H02-DEPT-HEAD.
05 FILLER PIC X(13) VALUE 'DEPARTMENT : '.
05 H02-DEPT PIC X(08).

01 H03-LINE.
05 FILLER PIC X(80) VALUE ALL '-'.

01 H04-COL-HEAD.
05 FILLER PIC X(06) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'SR.NO.'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(08) VALUE 'EMP CODE'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(04) VALUE 'NAME'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'SALARY'.

01 H05-DATE-HEAD.
05 FILLER PIC X(64) VALUE SPACES.
05 FILLER PIC X(07) VALUE 'DATE : '.
05 H05-DATE.
10 H05-DD PIC 9(02)/.
10 H05-MM PIC 9(02)/.
10 H05-YY PIC 9(02).

01 D01-EMP-DET.
05 FILLER PIC X(07) VALUE SPACES.

85
COBOL

05 D01-SR-NO PIC Z9.


05 FILLER PIC X(10) VALUE SPACES.
05 D01-EMP-CODE PIC 9(04).
05 FILLER PIC X(07) VALUE SPACES.
05 D01-EMP-NAME PIC X(25).
05 FILLER PIC X(05).
05 D01-EMP-SALARY PIC $(5)9.

01 F01-DEPT.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(19) VALUE 'DEPARTMENT TOTAL : '.
05 FILLER PIC X(31) VALUE SPACES.
05 F01-DEPT-TOT PIC $(5)9.

01 F02-REP.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(14) VALUE 'GRAND TOTAL : '.
05 FILLER PIC X(34) VALUE SPACES.
05 F02-GRAND-TOT PIC $(7)9.

COPY EMP03.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT UNTIL 88-EMP-EOF.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-FS NOT = '00'
DISPLAY 'UNABLE TO OPEN EMPLOYEE FILE'
STOP RUN.

OPEN OUTPUT REPORT-FILE


IF W06-REP-FS NOT = '00'
DISPLAY 'UNABLE TO CREATE REPORT FILE'
CLOSE EMP-FILE
STOP RUN.

PERFORM 5000-ACPT-DATE THRU 5000-EXIT.


PERFORM 4000-READ-EMP THRU 4000-EXIT.
PERFORM 1100-REP-HEADER THRU 1100-EXIT.
PERFORM 1200-DEPT-HEADER THRU 1200-EXIT.

1000-EXIT.
EXIT.

86
COBOL

1100-REP-HEADER.
MOVE H01-CO-HEAD TO REPORT-REC.
WRITE REPORT-REC.
WRITE REPORT-REC FROM H05-DATE-HEAD.

1100-EXIT.
EXIT.

1200-DEPT-HEADER.
MOVE EMP-DEPT TO W04-PREV-DEPT, H02-DEPT.
MOVE ZEROS TO W03-TOT-EMP, W03-TOT-SALARY.
WRITE REPORT-REC FROM H02-DEPT-HEAD.
WRITE REPORT-REC FROM H03-LINE.
WRITE REPORT-REC FROM H04-COL-HEAD.
WRITE REPORT-REC FROM H03-LINE.

1200-EXIT.
EXIT.

2000-PROCESS.
IF EMP-DEPT NOT = W04-PREV-DEPT
PERFORM 2200-DEPT-BREAK.

ADD 1 TO W03-TOT-EMP
ADD EMP-SALARY TO W03-TOT-SALARY
PERFORM 2100-REP-DETAIL THRU 2100-EXIT.

PERFORM 4000-READ-EMP THRU 4000-EXIT.

2000-EXIT.
EXIT.

2100-REP-DETAIL.
MOVE W03-TOT-EMP TO D01-SR-NO.
MOVE EMP-CODE TO D01-EMP-CODE.
MOVE EMP-NAME TO D01-EMP-NAME.
MOVE EMP-SALARY TO D01-EMP-SALARY.
WRITE REPORT-REC FROM D01-EMP-DET.

2100-EXIT.
EXIT.

2200-DEPT-BREAK.
PERFORM 2300-DEPT-FOOTER THRU 2300-EXIT.
PERFORM 1200-DEPT-HEADER THRU 1200-EXIT.

2200-EXIT.
EXIT.

2300-DEPT-FOOTER.

87
COBOL

MOVE W03-TOT-SALARY TO F01-DEPT-TOT.


ADD W03-TOT-SALARY TO W03-GRAND-TOT.
WRITE REPORT-REC FROM H03-LINE.
WRITE REPORT-REC FROM F01-DEPT.
WRITE REPORT-REC FROM H03-LINE.

2300-EXIT.
EXIT.

3000-TERM.
PERFORM 2300-DEPT-FOOTER THRU 2300-EXIT.
PERFORM 3100-REP-FOOTER THRU 3100-EXIT.

CLOSE EMP-FILE
REPORT-FILE.

3000-EXIT.
EXIT.

3100-REP-FOOTER.
MOVE W03-GRAND-TOT TO F02-GRAND-TOT.
WRITE REPORT-REC FROM F02-REP.
WRITE REPORT-REC FROM H03-LINE.

3100-EXIT.
EXIT.

4000-READ-EMP.
READ EMP-FILE
AT END
MOVE 'Y' TO W02-EMP-EOF.

4000-EXIT.
EXIT.

5000-ACPT-DATE.
ACCEPT W05-DATE FROM DATE.
MOVE W05-YY TO H05-YY.
MOVE W05-MM TO H05-MM.
MOVE W05-DD TO H05-DD.

5000-EXIT.
EXIT.
Eg 12.1:]

88
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH12EX02.
****************************************************************
* This program displays the details of employees in the order *
* of department, designation. (2 level control break) *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY EMP01A.

SELECT REPORT-FILE ASSIGN TO 'REP1202.DAT'


ORGANIZATION IS SEQUENTIAL
FILE STATUS IS W05-REP-FS.

DATA DIVISION.
FILE SECTION.
COPY EMP02A.

FD REPORT-FILE
LABEL RECORDS OMITTED
RECORD CONTAINS 80 CHARACTERS.
01 REPORT-REC PIC X(80).

WORKING-STORAGE SECTION.
01 W02-EOF.
05 W02-EMP-EOF PIC X(01) VALUE 'N'.
88 88-EMP-EOF VALUE 'Y'.

01 W03-TOTALS.
05 W03-DESIG-TOT-SALARY PIC 9(07).
05 W03-DEPT-TOT-SALARY PIC 9(07).
05 W03-SR-NO PIC 9(03) VALUE ZEROS.
05 W03-GRAND-TOT PIC 9(08) VALUE ZEROS.

01 W04-PREV.
05 W04-PREV-DEPT PIC X(08).
05 W04-PREV-DESIG PIC X(12).

01 W05-REP-FS PIC X(02) VALUE SPACES.

01 H01-CO-HEAD.
05 FILLER PIC X(35) VALUE SPACES.
05 FILLER PIC X(11) VALUE 'XYZ CO. LTD'.

01 H02-DEPT-HEAD.
05 FILLER PIC X(13) VALUE 'DEPARTMENT : '.
05 H02-DEPT PIC X(08).

89
COBOL

01 H03-LINE.
05 FILLER PIC X(80) VALUE ALL '-'.

01 H04-COL-HEAD.
05 FILLER PIC X(06) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'SR.NO.'.
05 FILLER PIC X(05) VALUE SPACES.
05 FILLER PIC X(08) VALUE 'EMP CODE'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(04) VALUE 'NAME'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'SALARY'.

01 H05-DESIG-HEAD.
05 FILLER PIC X(14) VALUE 'DESIGNATION : '.
05 H05-DESIG PIC X(12).

01 D01-EMP-DET.
05 FILLER PIC X(07) VALUE SPACES.
05 D01-SR-NO PIC Z9.
05 FILLER PIC X(10) VALUE SPACES.
05 D01-EMP-CODE PIC 9(04).
05 FILLER PIC X(07) VALUE SPACES.
05 D01-EMP-NAME PIC X(25).
05 FILLER PIC X(05).
05 D01-EMP-SALARY PIC $(5)9.

01 F01-DEPT.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(19)
VALUE 'DEPARTMENT TOTAL : '.
05 FILLER PIC X(31) VALUE SPACES.
05 F01-DEPT-TOT PIC $(5)9.

01 F02-REP.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(14) VALUE 'GRAND TOTAL : '.
05 FILLER PIC X(34) VALUE SPACES.
05 F02-GRAND-TOT PIC $(7)9.

01 F03-DESIG.
05 FILLER PIC X(10) VALUE SPACES.
05 FILLER PIC X(20)
VALUE 'DESIGNATION TOTAL : '.
05 FILLER PIC X(30) VALUE SPACES.
05 F03-DESIG-TOT PIC $(5)9.

COPY EMP03.

PROCEDURE DIVISION.

90
COBOL

0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT UNTIL 88-EMP-EOF.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-FS NOT = '00'
DISPLAY 'UNABLE TO OPEN EMPLOYEE FILE'
STOP RUN.

OPEN OUTPUT REPORT-FILE


IF W05-REP-FS NOT = '00'
DISPLAY 'UNABLE TO CREATE REPORT FILE'
CLOSE EMP-FILE
STOP RUN.

PERFORM 4000-READ-EMP THRU 4000-EXIT.


PERFORM 1100-REP-HEADER THRU 1100-EXIT.
PERFORM 1200-DEPT-HEADER THRU 1200-EXIT.

1000-EXIT.
EXIT.

1100-REP-HEADER.
MOVE H01-CO-HEAD TO REPORT-REC.
WRITE REPORT-REC.

1100-EXIT.
EXIT.

1200-DEPT-HEADER.
MOVE EMP-DEPT TO W04-PREV-DEPT, H02-DEPT.
MOVE ZEROS TO W03-DEPT-TOT-SALARY.
WRITE REPORT-REC FROM H02-DEPT-HEAD.
WRITE REPORT-REC FROM H03-LINE.
PERFORM 1300-DESIG-HEADER THRU 1300-EXIT.

1200-EXIT.
EXIT.

1300-DESIG-HEADER.
MOVE EMP-DESIG TO W04-PREV-DESIG, H05-DESIG.
MOVE ZEROS TO W03-DESIG-TOT-SALARY, W03-SR-NO.
WRITE REPORT-REC FROM H05-DESIG-HEAD.
WRITE REPORT-REC FROM H03-LINE.
WRITE REPORT-REC FROM H04-COL-HEAD.
WRITE REPORT-REC FROM H03-LINE.

91
COBOL

1300-EXIT.
EXIT.

2000-PROCESS.
IF EMP-DEPT NOT = W04-PREV-DEPT
PERFORM 2200-DEPT-BREAK.
IF EMP-DESIG NOT = W04-PREV-DESIG
PERFORM 2400-DESIG-BREAK.

ADD 1 TO W03-SR-NO.
ADD EMP-SALARY TO W03-DESIG-TOT-SALARY.
PERFORM 2100-REP-DETAIL THRU 2100-EXIT.

PERFORM 4000-READ-EMP THRU 4000-EXIT.

2000-EXIT.
EXIT.

2100-REP-DETAIL.
MOVE W03-SR-NO TO D01-SR-NO.
MOVE EMP-CODE TO D01-EMP-CODE.
MOVE EMP-NAME TO D01-EMP-NAME.
MOVE EMP-SALARY TO D01-EMP-SALARY.
WRITE REPORT-REC FROM D01-EMP-DET.

2100-EXIT.
EXIT.

2200-DEPT-BREAK.
PERFORM 2300-DEPT-FOOTER THRU 2300-EXIT.
PERFORM 1200-DEPT-HEADER THRU 1200-EXIT.

2200-EXIT.
EXIT.

2300-DEPT-FOOTER.
PERFORM 2500-DESIG-FOOTER THRU 2500-EXIT.
MOVE W03-DEPT-TOT-SALARY TO F01-DEPT-TOT.
ADD W03-DEPT-TOT-SALARY TO W03-GRAND-TOT.
WRITE REPORT-REC FROM F01-DEPT.
WRITE REPORT-REC FROM H03-LINE.

2300-EXIT.
EXIT.

2400-DESIG-BREAK.
PERFORM 2500-DESIG-FOOTER THRU 2500-EXIT.
PERFORM 1300-DESIG-HEADER THRU 1300-EXIT.

2400-EXIT.

92
COBOL

EXIT.

2500-DESIG-FOOTER.
MOVE W03-DESIG-TOT-SALARY TO F03-DESIG-TOT.
ADD W03-DESIG-TOT-SALARY TO W03-DEPT-TOT-SALARY.
WRITE REPORT-REC FROM H03-LINE.
WRITE REPORT-REC FROM F03-DESIG.
WRITE REPORT-REC FROM H03-LINE.

2500-EXIT.
EXIT.

3000-TERM.
PERFORM 2300-DEPT-FOOTER THRU 2300-EXIT.
PERFORM 3100-REP-FOOTER THRU 3100-EXIT.

CLOSE EMP-FILE
REPORT-FILE.

3000-EXIT.
EXIT.

3100-REP-FOOTER.
MOVE W03-GRAND-TOT TO F02-GRAND-TOT.
WRITE REPORT-REC FROM F02-REP.
WRITE REPORT-REC FROM H03-LINE.

3100-EXIT.
EXIT.

4000-READ-EMP.
READ EMP-FILE
AT END
MOVE 'Y' TO W02-EMP-EOF.

4000-EXIT.
EXIT.
Eg 12.2:

93
COBOL

13. Indexed Files


An indexed file is really two files – the data file, which is created in sequence but can be
accessed randomly, and the index file, which contains the value of each key field and the disk
address of the record with that corresponding key field. To access an indexed record randomly,
the key field is looked up in the index file to find the disk address of the record; then the record
is accessed in the indexed data file directly.

The index on a disk is similar to a book’s index, which has unique subjects (keys) and their
corresponding page numbers (addresses). There would be two ways to find a topic in the book.
You can read the book sequentially, from the beginning, until that topic is found, but this
would be very time consuming and inefficient. The best method would be to look up the topic
in the index, find the corresponding page number, and go directly to that page. This is precisely
how records can be accessed on a disk file that has an index.

With an indexed file, records can be accessed either sequentially or randomly, depending on
the user’s needs. The term random access implies that records are to be processed or accessed
in some order other than the one in which they were physically written on the disk.

Creating an Indexed File


Indexed files are created in sequence; that is, the indexed file is created by reading each record
from an input file, in sequence by the key field, and writing the output indexed disk records in
the same sequence. Note, however, once the indexed file is created, it can be accessed
randomly.

The ORGANIZATION clause


The clause ORGANIZATION IS INDEXED indicates that the file is to be created with an
index.

The ACCESS clause


Since indexed files may be accessed either sequentially or randomly, the ACCESS clause is
used to denote which method will be used in the specific program. If the ACCESS clause is
omitted, the compiler will assume that the file is being processed in SEQUENTIAL mode.

The RECORD KEY clause


The RECORD KEY clause names the key field within the disk record that will be used to form
the index. This field must be in the same physical location in each index record. Usually, it is
the first field. It must have a unique value for each record.

94
COBOL

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IND-EMP-FILE
ASSIGN TO ‘INDEMP.DAT’
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
RECORD KEY IS I-EMP-NO.
DATA DIVISION.
FILE SECTION.
FD IND-EMP-FILE
LABEL RECORDS STANDARD.
01 IND-EMP-REC.
05 I-EMP-NO PIC 9(4).
05 I-EMP-NAME PIC X(25).
05 I-EMP-DEPT PIC X(4).
05 I-EMP-SAL PIC 9(5)V99.

Eg 13.1:

The INVALID KEY clause


With WRITE
The INVALID KEY clause is used with a WRITE instruction to test for two possible errors :
(1) a key field that is not in sequence or (2) a key field that is the same as one already on the
indexed file. If any of these conditions exist, we call this an INVALID KEY condition. The
computer checks for an INVALID KEY prior to writing the record.

Thus, if you use an INVALID KEY clause with the WRITE statement and a records has an
erroneous key, the record is not written and the statement(s) following INVALID KEY would
be executed.

WRITE IND-EMP-REC
INVALID KEY
PERFORM 2000-ERROR-PARA.
Eg 13.2:

IDENTIFICATION DIVISION.
PROGRAM-ID. CH13EX03.
****************************************************************
* This program creates an indexed employee file *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

95
COBOL

SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'


ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
RECORD KEY IS EMP-CODE
ALTERNATE RECORD KEY IS EMP-NAME
ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.

DATA DIVISION.
FILE SECTION.
COPY EMP02.

WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.
01 W02-ANS PIC X(01).
88 88-ANS-NO VALUE 'N' 'n'.
88 88-VALID-ANS VALUE 'y' 'Y' 'n' 'N'.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT UNTIL 88-ANS-NO.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN I-O EMP-FILE.
IF W01-EMP-STAT NOT = '00'
OPEN OUTPUT EMP-FILE.

1000-EXIT.
EXIT.

2000-PROCESS.
DISPLAY 'ENTER EMP CODE : ' WITH NO ADVANCING.
ACCEPT EMP-CODE.
DISPLAY 'ENTER FIRST NAME : ' WITH NO ADVANCING.
ACCEPT EMP-FIRST-NAME.
DISPLAY 'ENTER LAST NAME : ' WITH NO ADVANCING.
ACCEPT EMP-LAST-NAME.
DISPLAY 'ENTER DEPARTMENT : ' WITH NO ADVANCING.
ACCEPT EMP-DEPT.
DISPLAY 'ENTER DESIGNATION : ' WITH NO ADVANCING.
ACCEPT EMP-DESIG.
DISPLAY 'ENTER SALARY : ' WITH NO ADVANCING.
ACCEPT EMP-SALARY.

WRITE EMP-REC
INVALID KEY

96
COBOL

PERFORM 2100-ERROR THRU 2100-EXIT.

MOVE SPACES TO W02-ANS.


PERFORM 2500-ACPT-ANS THRU 2500-EXIT UNTIL 88-VALID-ANS.

2000-EXIT.
EXIT.

2100-ERROR.
DISPLAY 'ERROR WRITING RECORD'.

2100-EXIT.
EXIT.

2500-ACPT-ANS.
DISPLAY 'DO YOU WANT TO ENTER MORE DATA ? '.
ACCEPT W02-ANS.

2500-EXIT.
EXIT.

3000-TERM.
CLOSE EMP-FILE.

3000-EXIT.
EXIT.
Eg 13.3:

With READ
When reading a disk file randomly, we do not test for an AT END condition because
we are not reading the file in sequence; instead, we include an INVALID KEY test.
If there is no record in the INDEXED-FILE with a RECORD KEY equal to T-EMP-
NO, the INVALID KEY clause will be executed.

DISPLAY ‘ENTER EMPLOYEE CODE :’


ACCEPT T-EMP-EMP-NO.
MOVE T-EMP-NO TO I-EMP-NO.
READ IND-EMP-FILE
INVALID KEY
PERFORM 600-ERR-RTN.
Eg 13.4:

97
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH13EX05.
****************************************************************
* This program accepts an employee code from the user and *
* displays the employee record. *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'


ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS EMP-CODE
ALTERNATE RECORD KEY IS EMP-NAME
ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.

DATA DIVISION.
FILE SECTION.
COPY EMP02.
WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.
01 W02-FOUND PIC X(01) VALUE 'Y'.
88 88-FOUND VALUE 'Y'.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-STAT NOT = '00'
DISPLAY 'ERROR OPENING EMPLOYEE FILE'
STOP RUN.

1000-EXIT.
EXIT.

2000-PROCESS.
DISPLAY 'ENTER EMP CODE : ' WITH NO ADVANCING.
ACCEPT EMP-CODE.

READ EMP-FILE
INVALID KEY

98
COBOL

MOVE 'N' TO W02-FOUND


DISPLAY 'EMPLOYEE RECORD DOES NOT EXIST'.

IF 88-FOUND
DISPLAY 'NAME : ' EMP-NAME
DISPLAY 'DESIGNATION : ' EMP-DESIG
DISPLAY 'DEPARTMENT : ' EMP-DEPT
DISPLAY 'SALARY : ' EMP-SALARY.

2000-EXIT.
EXIT.
3000-TERM.
CLOSE EMP-FILE.
3000-EXIT.
EXIT.
Eg 13.5:

DELETE verb

The DELETE verb can be used to delete records from indexed files. Note that we use the file-
name with the DELETE verb, but the word RECORD can be specified as well. That is, both
the statements DELETE INDEXED-FILE and DELETE INDEXED-FILE RECORD can be
used to delete the record in the INDEXED-FILE storage area.

To delete a record from an indexed file, you should first read the record into storage and then
instruct the computer to delete it.

MOVE ‘Y’ TO WS-FOUND.


MOVE 1001 TO I-EMP-NO.
READ IND-EMP-FILE
INVALID KEY
MOVE ‘N’ TO WS-FOUND.
IF WS-FOUND = ‘Y’
DELETE IND-EMP-FILE
INVALID KEY
DISPLAY ‘ERROR DELETING RECORD’.
Eg 13.6:

Using ALTERNATE RECORD KEYs

Indexed files may be created with, and accessed by, more than one identifying key field. That
is, we may want to access employee records using the name as the key field. To enable a file to
be accessed randomly using more than one key field, we would need to establish an
ALTERNATE RECORD KEY.

99
COBOL
To establish multiple key fields for indexing, we use an ALTERNATE RECORD KEY clause
in the SELECT statement.

Note:
1. More than one ALTERNATE record key can be used.
2. WITH DUPLICATES means than an ALTERNATE RECORD KEY need not be
unique. Thus, fields like EMP-DEPT can be used as a key even though numerous
records may have the same department no.
3. A record can be accessed by its RECORD KEY or any of its ALTERNATE RECORD
KEYs.

SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'


ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
RECORD KEY IS EMP-CODE
ALTERNATE RECORD KEY IS EMP-NAME
ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.
Eg 13.7:
Accessing records randomly by alternate record key

The program that accesses the file by key field has the same SELECT clause except
that ACCESS IS RANDOM rather than SEQUENTIAL. In the PROCEDURE
DIVISION , we can access records by either I-EMP-NO , the record key, or I-EMP-
DEPT, the alternate key.

The KEY clause is used with the READ statement when an indexed file has ALTERNATE
RECORD KEYs that we want to use to randomly access a record. If the KEY clause is omitted
when accessing a file randomly, the RECORD KEY is assumed to be the KEY used for finding
the record.

Suppose ALTERNATE RECORD KEY WITH DUPLICATES was specified in the


ENVIRONMENT DIVISION and there is more than one record with the same ALTERNATE
RECORD KEY. The first one that was actually placed on the disk will be the one retrieved by
the READ.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH13EX08.
****************************************************************
* This program accepts employee name from the user and *
* displays the employee record. *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.

100
COBOL

FILE-CONTROL.
SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS EMP-CODE
ALTERNATE RECORD KEY IS EMP-NAME
ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.

DATA DIVISION.
FILE SECTION.
COPY EMP02.

WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.
01 W02-FOUND PIC X(01) VALUE 'Y'.

88 88-FOUND VALUE 'Y'.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-STAT NOT = '00'
DISPLAY 'ERROR OPENING EMPLOYEE FILE'
STOP RUN.

1000-EXIT.
EXIT.

2000-PROCESS.
DISPLAY 'ENTER EMP FIRST NAME : ' WITH NO ADVANCING.
ACCEPT EMP-FIRST-NAME.
DISPLAY 'ENTER EMP LAST NAME : ' WITH NO ADVANCING.
ACCEPT EMP-LAST-NAME.

READ EMP-FILE
KEY IS EMP-NAME
INVALID KEY
MOVE 'N' TO W02-FOUND
DISPLAY 'EMPLOYEE RECORD DOES NOT EXIST'.

IF 88-FOUND
DISPLAY 'EMP CODE : ' EMP-CODE

101
COBOL

DISPLAY 'DESIGNATION : ' EMP-DESIG


DISPLAY 'DEPARTMENT : ' EMP-DEPT
DISPLAY 'SALARY : ' EMP-SALARY.

2000-EXIT.
EXIT.

3000-TERM.
CLOSE EMP-FILE.

3000-EXIT.
EXIT.
Eg 13.8:

IDENTIFICATION DIVISION.
PROGRAM-ID. CH13EX09.
****************************************************************
* This program lists all the records in order of the employee *
* code. *
****************************************************************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
RECORD KEY IS EMP-CODE
ALTERNATE RECORD KEY IS EMP-NAME
ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.

DATA DIVISION.
FILE SECTION.
COPY EMP02.

WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT
UNTIL W01-EMP-STAT = '10'.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-STAT NOT = '00'

102
COBOL

DISPLAY 'ERROR OPENING EMPLOYEE FILE'


STOP RUN.
READ EMP-FILE.

1000-EXIT.
EXIT.

2000-PROCESS.
DISPLAY 'EMPCODE : ' EMP-CODE.
DISPLAY 'EMPNAME : ' EMP-FIRST-NAME EMP-LAST-NAME.
READ EMP-FILE.
2000-EXIT.
EXIT.
3000-TERM.
CLOSE EMP-FILE.
3000-EXIT.
EXIT.
Eg 13.9:
The START statement

The START statement enables a program to begin processing an indexed file sequentially but
at a record location other than the first or next physical record in the file. The access of the file
is to be in sequence (ACCESS IS SEQUENTIAL) if we use the RECORD KEY for finding a
record, even though we want to start the access at some point other than the beginning. The
ACCESS IS DYNAMIC clause is used if we want to begin the processing an indexed file
based on the contents of the ALTERNATE RECORD KEY.

When the record to be accessed has a key equal to the one placed in the RECORD KEY, the
KEY clause in the START statement is not required. The INVALID clause is executed only if
no such record is found.

Note that the START locates the desired record but it does not READ it into storage. The
record must always be brought into storage with a READ statement.

Suppose we wish to begin processing with an I-EMP-NO greater than 006. We must include a
KEY clause with the START because we wish to position the file at allocation greater than the
value of a RECORD KEY. The KEY clause can be omitted only if the record to be located has
a RECORD KEY equal to the one stored.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH13EX10.
****************************************************************
* Accept an employee code from the user. Display all the *
* records after the specified employee code. *
****************************************************************

ENVIRONMENT DIVISION.

103
COBOL

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
RECORD KEY IS EMP-CODE
ALTERNATE RECORD KEY IS EMP-NAME
ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.

DATA DIVISION.
FILE SECTION.
COPY EMP02.

WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT

UNTIL W01-EMP-STAT NOT = '00'.


PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-STAT NOT = '00'
DISPLAY 'ERROR OPENING EMPLOYEE FILE'
STOP RUN.

DISPLAY 'ENTER THE EMPLOYEE CODE :' WITH NO ADVANCING.


ACCEPT EMP-CODE.

START EMP-FILE
KEY > EMP-CODE
INVALID KEY
DISPLAY 'NO RECORDS BEYOND EMP CODE - ' EMP-CODE.

IF W01-EMP-STAT = '00'
READ EMP-FILE NEXT RECORD.

1000-EXIT.
EXIT.

2000-PROCESS.
DISPLAY 'EMPCODE : ' EMP-CODE.
DISPLAY 'EMPNAME : ' EMP-FIRST-NAME EMP-LAST-NAME.
READ EMP-FILE NEXT RECORD.

104
COBOL

2000-EXIT.
EXIT.

3000-TERM.
CLOSE EMP-FILE.

3000-EXIT.
EXIT.
Eg 13.10:

The ACCESS IS DYNAMIC clause

Sometimes we wish to access an indexed file both randomly and sequentially in a single
program. For this, we say that ACCESS IS DYNAMIC.

In addition to using ACCESS IS DYNAMIC for combining sequential and random access
techniques in a single program, we can use this clause to access records by ALTERNATE
RECORD KEY. Also, when records are to be accessed by both RECORD KEY and
ALTERNATE RECORD KEY, use ACCESS IS DYNAMIC.

Rules for using the START statement

1. The file must be accessed with (a) ACCESS IS SEQUENTIAL for reading records in
sequence by the RECORD KEY or (b) ACCESS IS DYNAMIC or SEQUENTIAL for
reading records in sequence by an ALTERNATE RECORD KEY.
2. The file must be opened as either input or I-O.
3. If the KEY phrase is omitted, the relational operator “IS EQUAL TO” is implied and
the primary record key is assumed to be the key of reference.
4. We use KEY =, >, NOT < for accessing records by ALTERNATE RECORD KEY. We
also use KEY >, NOT < for accessing records by a value that is correspondingly >,
NOT < the primary RECORD KEY.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH13EX11.
****************************************************************
* Accept the department code from the user. Display the empcode*
* and name of all the employee in the given department. *
****************************************************************

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMP-FILE ASSIGN TO 'INDEMPL.DAT'
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC
RECORD KEY IS EMP-CODE

105
COBOL

ALTERNATE RECORD KEY IS EMP-NAME


ALTERNATE RECORD KEY IS EMP-DEPT WITH DUPLICATES
FILE STATUS IS W01-EMP-STAT.

DATA DIVISION.
FILE SECTION.
COPY EMP02.

WORKING-STORAGE SECTION.
01 W01-EMP-STAT PIC X(02) VALUE SPACES.
01 W02-EMP-DEPT PIC X(08).

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-INIT THRU 1000-EXIT.
PERFORM 2000-PROCESS THRU 2000-EXIT
UNTIL W01-EMP-STAT NOT = '00' OR
W02-EMP-DEPT NOT = EMP-DEPT.
PERFORM 3000-TERM THRU 3000-EXIT.
STOP RUN.

1000-INIT.
OPEN INPUT EMP-FILE.
IF W01-EMP-STAT NOT = '00'
DISPLAY 'ERROR OPENING EMPLOYEE FILE'
STOP RUN.

DISPLAY 'ENTER THE DEPARTMENT NAME :' WITH NO ADVANCING.


ACCEPT W02-EMP-DEPT.

MOVE W02-EMP-DEPT TO EMP-DEPT.

START EMP-FILE
KEY = EMP-DEPT
INVALID KEY
DISPLAY 'NO EMPLOYEES IN DEPARTMENT - ' W02-EMP-DEPT.

IF W01-EMP-STAT = '00'
READ EMP-FILE NEXT RECORD.

1000-EXIT.
EXIT.

2000-PROCESS.
DISPLAY 'EMPCODE : ' EMP-CODE.
DISPLAY 'EMPNAME : ' EMP-FIRST-NAME EMP-LAST-NAME.
READ EMP-FILE NEXT RECORD.

2000-EXIT.
EXIT.

106
COBOL

3000-TERM.
CLOSE EMP-FILE.

3000-EXIT.
EXIT.
Eg 13.11:

The READ…NEXT RECORD … Instruction

To process records both randomly and sequentially in a single file, ACCESS IS DYNAMIC
must be specified. To indicate that we wish to read records in sequence by some key field from
a file accessed dynamically, we must use a NEXT RECORD clause. The READ…NEXT
RECORD is also used for sequentially reading from a file by this ALTERNATE RECORD
KEY, or, for beginning a sequential read at some point other than the beginning of a file.

107
COBOL

14. Call statement


Structured programs should consist of a series of independent modules that are executed from
the main module.

When programs are properly structured :

1. Each module may be written, compiled, and perhaps even tested independently.
2. The modules may be written in different stages, in atop-down manner. They
may even be coded by different programmers.
3. If a specific module needs to be modified, the entire logical flow should still
function properly without the need for extensive revision to other parts of the
program.

Modules within a program can be viewed as subroutines that are called or executed from the
main module. But a program may also CALL or reference independent subprograms stored in a
library that are entirely separate from the main program itself. The main program that
references or calls a subprogram is referred to as the calling program. The subprogram that is
linked and executed within the main program is referred to as the called program.

The called program would need to be compiled so that it may be called when needed.

When the CALL is performed, data is passed from the calling to the called program (if the
calling program has assigned values to fields used in the called program). The entire called
program is executed, data is passed from the called program back to the calling program, and
control return to the calling program.

Called Program Requirements


PROGRAM-ID.
The literal used in the CALL statement of the main program to extract a subprogram or routine
from a library and execute it must be identical to the called program’s PROGRAM-ID. Note
that the literal is enclosed in quotation marks when used in the CALL statement.

LINKAGE SECTION
A LINKAGE SECTION must be defined in the called program for identifying those items that
(1) will be passed to the called program from the calling program and (2) passed back from the
called program to the calling program. The LINKAGE SECTION of the called program, then,
describes all items to be passed between the two programs.

The LINKAGE SECTION, if used, is coded after the FILE and WORKING-STORAGE
SECTIONs of the called program. This section is similar to WORKING-STORAGE except
that VALUE clauses from initializing fields are not permitted in the LINKAGE SECTION.

108
COBOL

EXIT PROGRAM
The last executed statement in the called program must be the EXIT PROGRAM. It signals the
computer to return control back to the calling program. With COBOL 74, EXIT PROGRAM
must be the only statement in the last paragraph.

Calling Program Requirements


PROCEDURE DIVISION USING

The identifiers specified in the USING clause in the PROCEDURE DIVISION entry include
all fields defined in the LINKAGE SECTION; these identifiers will be passed from one
program to the other. They are passed to and from corresponding identifiers in the CALL …
USING of the main program.

The USING clause of the CALL statement is required if the subprogram performs any
operations in which data is to be passed from one program to another. The CALL … USING
identifies fields in the main or calling program that will be either passed to the called program
before it is executed, or passed back to the calling program after the called program has been
executed.

Sample Program

Calling Program : CH16EX01.CBL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH16EX01.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 MY-NAME PIC X(20).
PROCEDURE DIVISION.
0000-MAIN.
DISPLAY 'ENTER NAME '.
ACCEPT MY-NAME.
CALL 'CH16EX02' USING MY-NAME.
STOP RUN.
Eg 14.1:

109
COBOL

Called Program : CH16EX02.CBL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH16EX02.
ENVIRONMENT DIVISION.
DATA DIVISION.
LINKAGE SECTION.
01 NM PIC X(20).
PROCEDURE DIVISION USING NM.
0000-MAIN.
DISPLAY 'HELLO ' NM.
EXIT PROGRAM.
Eg 14.2:

110
COBOL

15. Table Handling


Use of OCCURS clause
1. An OCCURS clause is used in COBOL to indicate the repeated occurrence of fields
with the same format.
2. Defining a series of totals in WORKING-STORAGE to which amounts are added; after
all data is accumulated, the total can be printed.
3. Defining a table in WORKING-STORAGE to be accessed by each input record. For
example, using the contents of some input field to “look up” the required data in the
table.

01 TEMP-REC.
05 TEMPERATURE OCCURS 24 TIMES PIC S9(3).
Eg 15.1:

Subscript

A subscript is used in the PROCEDURE DIVISION to indicate which specific item within the
array we wish to access.

The subscript is used along with the identifier that is defined with an OCCURS, to refer to an
item within an array.

MOVE TEMPERATURE (2) TO TEMP-OUT.


Eg 15.2:

Rules for OCCURS and subscripts


There must be at least one space between the identifier and the left parenthesis that precedes
the subscript. Similarly, the subscript must be enclosed in parentheses with no spaces within
the parentheses.

A subscript may be a numeric literal or a data-name with a numeric PICTURE clause.

An OCCURS clause may be used on levels 02-49 only, because 01 level is used for defining
records not fields.
COBOL 74 permits only up to three levels of OCCURS clauses

111
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. CH15EX03.
**************************************************************
* This program accepts 10 numbers from the user and displays *
* the maximum. *
**************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-MARKS-TAB.
05 W01-MARKS OCCURS 10 TIMES PIC 9(03).

01 W02-SUB PIC 9(02).


01 W03-MAX PIC 9(03).

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-MARKS THRU 1000-EXIT
VARYING W02-SUB FROM 1 BY 1
UNTIL W02-SUB > 10.

MOVE W01-MARKS(1) TO W03-MAX.

PERFORM 2000-FIND-MAX THRU 2000-EXIT


VARYING W02-SUB FROM 1 BY 1
UNTIL W02-SUB > 10.
DISPLAY 'MAXIMUM : ' W03-MAX.
STOP RUN.

1000-ACPT-MARKS.
DISPLAY 'ENTER NUMBER ' W02-SUB ' : ' NO ADVANCING.
ACCEPT W01-MARKS(W02-SUB).

1000-EXIT.
EXIT.

2000-FIND-MAX.
IF W01-MARKS(W02-SUB) > W03-MAX
MOVE W01-MARKS(W02-SUB) TO W03-MAX.

2000-EXIT.
EXIT.
Eg 15.3:

112
COBOL

Using OCCURS with VALUE and REDEFINES clauses


Sometimes we want to initialize elements in a table or an array with specific values.

With COBOL 74, we cannot use a VALUE clause with an entry defined by an OCCURS
clause. Instead we can define the field with one value and then redefine that storage area into
separate array elements. As a result, each array element will have a different value.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH15EX04.
**************************************************************
* This program displays the system date in two formats: *
* a) 10-Jan-01 *
* b) January 10, 01 *
**************************************************************
ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-MONTH-1.
05 FILLER PIC X(09) VALUE 'January'.
05 FILLER PIC X(09) VALUE 'February'.
05 FILLER PIC X(09) VALUE 'March'.
05 FILLER PIC X(09) VALUE 'April'.
05 FILLER PIC X(09) VALUE 'May'.
05 FILLER PIC X(09) VALUE 'June'.
05 FILLER PIC X(09) VALUE 'July'.
05 FILLER PIC X(09) VALUE 'August'.
05 FILLER PIC X(09) VALUE 'September'.
05 FILLER PIC X(09) VALUE 'October'.
05 FILLER PIC X(09) VALUE 'November'.
05 FILLER PIC X(09) VALUE 'December'.

01 W02-FULL-MONTH-TAB REDEFINES W01-MONTH-1.


05 W02-MONTH-NAME OCCURS 12 TIMES PIC X(09).

01 W03-MONTH-2.
05 W03-STRING PIC X(36)
VALUE 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'.

05 W03-MTH REDEFINES W03-STRING


OCCURS 12 TIMES PIC X(03).
01 W04-DATE.
05 W04-YY PIC 9(02).
05 W04-MM PIC 9(02).
05 W04-DD PIC 9(02).
PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-DATE THRU 1000-EXIT.

113
COBOL

PERFORM 2000-DISPLAY-DATE THRU 2000-EXIT.


STOP RUN.
1000-ACPT-DATE.
ACCEPT W04-DATE FROM DATE.
1000-EXIT.
EXIT.
2000-DISPLAY-DATE.
DISPLAY 'A) ' W04-DD '-' W03-MTH(W04-MM) '-' W04-YY.
DISPLAY 'B) ' W02-MONTH-NAME(W04-MM) ' ' W04-DD ', '
W04-YY.
2000-EXIT.
EXIT.
Eg 15.4:

114
COBOL

16. Appendix –A (Standards)


For the COBOL standards refer to PKMS

QMS

QMS-Manual

Standards

COBOL Standards

115
COBOL

17. Appendix –B
(Bibliography/References)
1. M. K. Roy and D Ghosh Dastidar, COBOL Programming including MS-COBOL and
COBOL-85 – 2nd edition
2. Andreas S. Philippakis and Leonard J. Kazmier, Information Systems through COBOL
– 2nd edition
3. Nancy Stern and Robert A. Stern, Structured COBOL Programming - 7th edition

116
COBOL

18. Appendix –C (File Status codes)


Successful Completion

* 00 Successful completion - no error occurred


* 02 Duplicate alternate record key (when WITH
DUPLICATES) is not specified
04 Successful read, but length of record does not
conform to FD entry
Unsuccessful Completion

* 10 Sequential read attempted, but there are no more


input records
* 21 Keys are not in correct sequence
* 22 Attempt to write a record, which will create a
duplicate primary record key
* 23 Required record not found during a READ
* 24 Attempt to write beyond the pre-established
boundaries of an indexed file
* 30 Permanent data error has occurred (hardware
problem)
34 Boundary error for a sequential file
37 Permanent error has occurred because an OPEN
statement has been attempted on a file that will not
support the mode specified in the OPEN statement.
41 An OPEN statement has been attempted on a file
that is already open.
42 A CLOSE statement has been attempted on a file
that has not been opened
* 43 An attempt has been made to DELETE or
REWRITE a record after an unsuccessful READ

* apply specifically to indexed files.

117
COBOL

19. Appendix – D (Syntax)


RULES FOR INTERPRETING INSTRUCTION FORMATS

Uppercase words are COBOL reserved words that have special meaning to the
compiler.
Underlined words are required in the paragraph.
Lowercase words represent user-defined entries.
Braces { } denote that one of the enclosed items is required.
Brackets [ ] mean the clause or paragraph is optional.
If punctuation is specified in the format, it is required.
The use of dots or ellipses (...) means that additional entries of the same type may be
included if desired.

IDENTIFICATION DIVISION.
PROGRAM-ID. Program-name.
[AUTHOR. [Comment-entry]....].
[INSTALLATION. [Comment-entry]....].
[DATE-WRITTEN. [Comment-entry]....].
[DATE-COMPILED. [Comment-entry]....].
[ SECURITY. [Comment-entry]....].

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. computer-name.
OBJECT-COMPUTER. computer-name.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name-1
ASSIGN TO implementor-name-1
[ ORGANIZATION IS ] SEQUENTIAL
INDEXED
ACCESS MODE IS SEQUENTIAL
RANDOM
DYNAMIC

RECORD KEY IS data-name-1


[ ALTERNATE RECORD KEY IS data-name-2
[ WITH DUPLICATES ] ] ...
[ FILE STATUS IS data-name ] .

DATA DIVISION.
FILE SECTION.
FD file-name-1
LABEL RECORD IS OMITTED
RECORD ARE STANDARD

RECORD CONTAINS integer-1 CHARACTERS


BLOCK CONTAINS integer-1 RECORDS .

01 record-name-1.
COBOL

WORKING-STORAGE SECTION.
(level-number 02-49) identifier-1 OCCURS integer-1 TIMES

ASCENDING KEY IS data-name-2


DESCENDING

INDEXED BY index-name-1

LINKAGE SECTION.

PROCEDURE DIVISION.

OPEN INPUT
OUTPUT file-name-1 ...
I-O
EXTEND

READ file-name-1
[ AT END statement-1...] .

READ file-name-1 NEXT RECORD


[ AT END statement-1...] .

READ file-name-1
[ INVALID KEY statement-1...] .

READ file-name-1
KEY IS alternate-record-keyname
[ INVALID KEY statement-1...] .

WRITE record-name-1 [ FROM identifier-1 ]


AFTER ADVANCING PAGE LINE
BEFORE integer-1 LINES
identifier-2

WRITE record-name-1 [ FROM identifier-1 ]


[ INVALID KEY imperative-statement-1] .

REWRITE record-name-1 [ FROM identifier-1 ]


[ INVALID KEY imperative-statement-1 ] .

DELETE indexed-file-name-1 RECORD


[ INVALID KEY imperative-statement-1 ] .

START file-name-1 KEY IS EQUAL TO data-name-1


IS =
IS GREATER THAN
IS >
IS NOT LESS THAN
IS NOT <
[ INVALID KEY imperative-statement-1 ]

CLOSE file-name-1... .

DISPLAY identifier …
literal-1
COBOL
[ WITH NO ADVANCING ]

ACCEPT identifier-1
[ FROM mnemonic-name-1]

GO TO paragraph-name-1.

PERFORM procedure-name-1 .

PERFORM procedure-name-1
UNTIL condition-1.

PERFORM paragraph-name-1 THROUGH paragraph-name-2


THRU

PERFORM paragraph-name-1 THROUGH paragraph-name-2


THRU
UNTIL condition-1.

PERFORM paragraph-name-1 THROUGH paragraph-name-2


THRU
integer-1 TIMES .
identifier-1

PERFORM paragraph-name-1 THROUGH paragraph-name-2


THRU
VARYING identifier-2 FROM identifier-3 BY identifier-4
index-name-1 literal-1 literal-2
index-name-2
UNTIL condition-1

AFTER identifier-5 FROM identifier-6 BY identifier-7


index-name-3 literal-3 literal-4
index-name-4
UNTIL condition-2

STOP RUN.

MOVE identifier-1 TO identifier-2


literal-1

MOVE CORRESPONDING group-item-1 TO group-item-2


CORR

ADD identifier-1 ... TO identifier-2 ...


literal-1

ADD identifier-1 ... GIVING identifier-2 ..


literal-1

SUBTRACT identifier-1 ... FROM identifier-2 ...


literal-1

SUBTRACT identifier-1 ... FROM identifier-2


literal-1 literal-2
GIVING identifier-3 ...
COBOL
MULTIPLY identifier-1 BY identifier-2 ...
literal-1

MULTIPLY identifier-1 BY identifier-2


literal-1 literal-2
GIVING identifier-3 ...

DIVIDE identifier-1 INTO identifier-2 ...


literal-1

DIVIDE identifier-1 INTO identifier-2


literal-1 literal-2
GIVING identifier-3 ...
[ REMAINDER identifier-4 ]

DIVIDE identifier-1 BY identifier-2


literal-1 literal-2
GIVING identifier-3 ...
[ REMAINDER identifier-4 ]

COMPUTE identifier-1 [ ROUNDED ] ... = arithmetic expression-1


literal-1
identifier-2
[ ON SIZE ERROR imperative statement ]

IF condition
statement-1...
[ ELSE
statement-2 ... ] .

Class Test NUMERIC


ALPHABETIC

Sign Test POSITIVE


NEGATIVE
ZERO

SEARCH identifier-1 VARYING identifier-2


index-name-1
[ AT END imperative-statement-1 ]
WHEN condition-1 imperative-statement-2 ...
NEXT SENTENCE

SET index-name-1 TO integer-1


UP BY
DOWN BY

SEARCH ALL identifier-1


[ AT END imperative-statement-1 ]
WHEN data-name-1 IS EQUAL TO identifier-2
IS = literal-1
arithmetic-expression-1
condition-name-1
AND data-name-2 IS EQUAL TO identifier-3
IS = literal-2
arithmetic-expression-2

condition-name-2
COBOL

imperative-statement-2
NEXT SENTENCE

COPY text-name OF library-name-1


IN

==pseudo-text-1== ==pseudo-text-2==
identifier-1 identifier-2
REPLACING literal-1 BY literal-2 ...
word-1 word-2

CALL literal-1 [ USING identifier-1 ... ]

EXIT PROGRAM.

INSPECT identifier-1 TALLYING


identifier-2 FOR ALL identifier-3
LEADING literal-1
CHARACTERS

BEFORE INITIAL identifier-4 ...


AFTER literal-2

INSPECT identifier-1 REPLACING

CHARACTERS
ALL identifier-2
LEADING literal-1
FIRST

BY identifier-3 BEFORE INITIAL identifier-4 ...


literal-2 AFTER literal-3

SORT file-name-1
ON DESCENDING KEY data-name-1 ...
ASCENDING
USING file-name-2
INPUT PROCEDURE IS procedure-name-1 THRU procedure-name-2
THROUGH

GIVING file-name-3
OUTPUT PROCEDURE IS procedure-name-1 THRU procedure-name-2
THROUGH

RELEASE sort-record-name-1
[ FROM identifier-1 ]

RETURN sort-file-name-1
AT END imperative-statement-1

STRING identifier-1 DELIMITED BY identifier-2


literal-1 literal-2 ...
SIZE
INTO identifier-3
COBOL

[ WITH POINTER identifier-3 ]

UNSTRING identifier-1 DELIMITED BY [ALL] identifier-2


literal-1
OR [ALL] identifier-3
literal-2 ...

INTO identifier-4

[ WITH POINTER identifier-3 ]


COBOL

20. Appendix – E (Additional


Reading) String Handling
The STRING Statement
A STRING statement may be used to combine several fields to form once concise
field. This process is called concatenation.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH17EX01.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NAME.
05 W01-FNAME PIC X(10).
05 W01-MNAME PIC X(10).
05 W01-LNAME PIC X(10).

01 W02-PRT-NAME PIC X(33).

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-NAME THRU 1000-EXIT.
PERFORM 2000-DISP-NAME THRU 2000-EXIT.
STOP RUN.

1000-ACPT-NAME.
DISPLAY 'ENTER YOUR FIRST NAME : '
WITH NO ADVANCING.
ACCEPT W01-FNAME.
DISPLAY 'ENTER YOUR MIDDLE NAME : '
WITH NO ADVANCING.
ACCEPT W01-MNAME.
DISPLAY 'ENTER YOUR LAST NAME : '
WITH NO ADVANCING.
ACCEPT W01-LNAME.

1000-EXIT.
EXIT.

2000-DISP-NAME.
STRING W01-FNAME DELIMITED BY SPACE
' ' DELIMITED BY SIZE
W01-MNAME DELIMITED BY SPACE
' ' DELIMITED BY SIZE
W01-LNAME DELIMITED BY SPACE
INTO W02-PRT-NAME.

DISPLAY W02-PRT-NAME.
2000-EXIT.
EXIT.
COBOL
Eg E.1:

If the following contents are entered :


W01-FNAME = THOMAS
W01-MNAME = ALVA
W01-LNAME = EDISON

The contents of W02-PRT-NAME will be THOMAS ALVA EDISON

OVERFLOW Option
The OVERFLOW option specifies the operation(s) to be performed if the receiving
field is not large enough to accommodate the result.

POINTER Option
We may count the number of characters actually moved to the receiving field if it is
initialized at 1.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH17EX02.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NAME PIC X(10).
01 W02-PRT-NAME PIC X(15).
01 W03-COUNT PIC 9(01) VALUE 1.

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-NAME THRU 1000-EXIT.
PERFORM 2000-DISP-NAME THRU 2000-EXIT.
STOP RUN.
1000-ACPT-NAME.
DISPLAY 'ENTER YOUR NAME : '
WITH NO ADVANCING.
ACCEPT W01-NAME.
1000-EXIT.
EXIT.
2000-DISP-NAME.
STRING W01-NAME DELIMITED BY SPACE
INTO W02-PRT-NAME
WITH POINTER W03-COUNT.

DISPLAY 'COUNT : ' W03-COUNT.

2000-EXIT.
EXIT.
Eg E.2:
COBOL
If the contents of W01-NAME is ABC. The contents of W03-COUNT will be 4.

Rules for using the STRING statement

1. The DELIMITED BY clause is required. It can indicate :


SIZE : The entire sending field is transmitted.
Literal : The transfer of data is terminated when the specified literal is
encountered; the literal itself is not moved.
Identifier : The transfer of data is terminated when the contents of the
identifier is encountered.
2. The receiving field must be an elementary data item with no editing
symbols or JUSTIFIED RIGHT clause.
3. All literals must be described as non-numeric.
4. The identifier specified with the POINTER clause must be an
elementary numeric item.
5. The STRING statement move data from left to right just like
alphanumeric fields are moved, but a STRING does not pad data from
left to right just like alphanumeric fields are moved, but a STRING
does not pad with low-order blanks, unlike an alphanumeric MOVE.

The UNSTRING statement


The UNSTRING statement may be used to convert keyed data to a more compact
form for storing it on disk. For example, we can instruct the computer to separate the
W02-PRT-NAME into its components and store them without the commas.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH17EX03.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-NAME.
05 W01-FNAME PIC X(10).
05 W01-MNAME PIC X(10).
05 W01-LNAME PIC X(10).

01 W02-PRT-NAME PIC X(33).

PROCEDURE DIVISION.
0000-MAIN.
MOVE 'THOMAS,ALVA,EDISON' TO W02-PRT-NAME.
UNSTRING W02-PRT-NAME
DELIMITED BY ','
INTO W01-FNAME
W01-MNAME
W01-LNAME.
COBOL

PERFORM 1000-DISP-NAME THRU 1000-EXIT.


STOP RUN.

1000-DISP-NAME.
DISPLAY 'FIRST NAME : ' W01-FNAME.
DISPLAY 'MIDDLE NAME : ' W01-MNAME.
DISPLAY 'LAST NAME : ' W01-LNAME.

1000-EXIT.
EXIT.
Eg E.3:
Output

FIRST NAME : THOMAS


MIDDLE NAME : ALVA
LAST NAME : EDISON

Rules for using the UNSTRING statement


1. The sending field must be non-numeric. The receiving fields may be
numeric or non-numeric.
2. Each literal must be non-numeric.
3. The [WITH POINTER identifier] and [ON OVERFLOW imperative-
statement] clauses may be used in the same way as with the STRING.

The INSPECT statement


The INSPECT statement may be used for replacing a specific character in a field with
another character. It can also be used for counting the number of occurrences of a
given character.

IDENTIFICATION DIVISION.
PROGRAM-ID. CH17EX04.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-CTR1 PIC 9(01) VALUE ZERO.
01 W02-NAME PIC X(10).

PROCEDURE DIVISION.
0000-MAIN.
PERFORM 1000-ACPT-NAME THRU 1000-EXIT.
PERFORM 2000-CNT-NAME THRU 2000-EXIT.
STOP RUN.

1000-ACPT-NAME.
DISPLAY 'ENTER YOUR NAME : '
WITH NO ADVANCING.
ACCEPT W02-NAME.

1000-EXIT.
COBOL

EXIT.

2000-CNT-NAME.
INSPECT W02-NAME
TALLYING W01-CTR1 FOR LEADING SPACES.

DISPLAY 'COUNT : ' W01-CTR1.

2000-EXIT.
EXIT.
Eg E.4:

This code will check for the number of leading spaces in the field W01-NAME and
store the value in the field W01-CTR1.

Applications of the INSPECT statement


1. To count the number of occurrences of a given character in a field.
2. To replace specific occurrences of a given character with another
character.