
Declaring Data in COBOL
|
Introduction
|
Aims
|
The aim of this unit is give you an understanding of the different
categories of data used in a COBOL program and to demonstrate how
items of each category may be created and used.
|
Objectives
|
By the end of this unit you should -
- Know how to use and create literals, variables and Figurative
Constants.
- Understand how to declare numeric, alphabetic and alphanumeric
data-items.
- Be able to create a record structure by assigning the appropriate
level numbers to its data-items.
- Understand the difference between group and an elementary data-items.
- Be able to assign an initial value to a variable.
|
Prerequisites
|
Introduction to COBOL.
but more information on declaring data items in COBOL can be found
in the units covering
- Edited Pictures
- Sequential Files
- The USAGE clause
|
Further
reading
|
More information on declaring data items in COBOL can be found
in the units covering -
- Edited Pictures
- Sequential Files
- The USAGE clause
|
|
Categories
of COBOL data
|
Introduction
|
There are three categories of data item used in COBOL programs:
- Variables.
- Literals.
- Figurative Constants.
|
Variables
|
A data-name or identifier is the name used to identify the area
of memory reserved for a variable. A variable is a named location
in memory into which a program can put data, and from which it can
retrieve data.
Every variable used in a COBOL program must be described in the
DATA DIVISION.
In addition to the data-name, a variable declaration also defines
the type of data to be stored in the variable. This is known as
the variable's data type.
|
Variable
Data types

Attempting to perform computations on numeric
data items that contain non-numeric data is a frequent cause
of program crashes for beginning COBOL programmers.
|
|
Some languages like Modula-2,Pascal or Ada are described as being
strongly typed. In these languages there are a large number
of different data types and the distinction between them is rigorously
enforced by the compiler. For instance, the compiler will reject
a statement that attempts to assign character value to an integer
data item.
In COBOL, there are really only three data types -
- numeric
- alphanumeric (text/string)
- alphabetic
The distinction between these data types is a little blurred and
only weakly enforced by the compiler. For instance, it is perfectly
possible to assign a non-numeric value to a data item that has been
declared to be numeric.
The problem with this lax approach to data typing is that, since
COBOL programs crash (halt unexpectedly) if they attempt to do computations
on items that contain non-numeric data, it is up to the programmer
to make sure this never happens.
COBOL programmers must make sure that non-numeric data is never
assigned to numeric items intended for use in calculations. Programmers
who use strongly typed languages don't need this level of discipline
because the compiler ensures that a variable of a particular types
can only be assigned appropriate values.
|
Literals
|
A literal is a data-item that consists only of the data-item value
itself. It cannot be referred to by a name. By definition, literals
are constant data-items.
There are two types of literal -
- String/Alphanumeric Literals
- Numeric Literals
|
String
Literals
|
String/Alphanumeric literals are enclosed in quotes and consist
of alphanumeric characters.
For example: "Michael Ryan", "-123", "123.45"
|
Numeric
Literals
|
Numeric literals may consist of numerals, the decimal point, and
the plus or minus sign. Numeric literals are not enclosed in quotes.
For example: 123, 123.45, -256, +2987
|
Figurative
Constants

Actually COBOL
does allow you to set up single character user-defined Figurative
Constants. These can be useful if you need to use the non-printable
ASCII characters such as ESC
or FormFeed.
User-defined Figurative Constants
are declared in the SYMBOLIC CHARACTERS clause
of the ENVIRONMENT DIVISION.
In an extension that previews the
new COBOL specification, NetExpress does
allow user-defined constants. It uses the level 78 for this purpose.
|
Unlike most other programming languages COBOL does not provide
a mechanism for creating user-defined constants but it does provide
a set of special constants called Figurative Constants.
A Figurative Constant may be used wherever it is legal to use a
literal but unlike literals, when a Figurative Constant is assigned
to a data-item it fills the whole item overwriting everything in
it.
The Figurative Constants are:
SPACE
or SPACES |
Acts like one or more spaces |
ZERO
or ZEROS or ZEROES |
Acts like one or more zeros |
QUOTE
or QUOTES |
Used instead of a quotation mark |
HIGH-VALUE
or HIGH-VALUES |
Uses the maximum value possible |
LOW-VALUE
or LOW-VALUES |
Uses the minimum value possible |
ALL
literal |
Allows a ordinary literal to act
as Figurative Constant |
Figurative Constant Notes
- When the ALL Figurative Constant is used,
it must be followed by a one character literal. The designated
literal then acts like the standard Figurative Constants.
- ZERO, ZEROS and
ZEROES are synonyms, not separate Figurative
Constants. The same applies to SPACE and
SPACES, QUOTE and
QUOTES, HIGH-VALUE
and HIGH-VALUES, LOW-VALUES
and LOW-VALUES.
|
Using
COBOLdata
------ examples ------
|
The
animated program fragments below demonstrate how variables, literals
and Figurative Constants may be created and used.

|
|
Declaring
Data-Items in COBOL
|
Introduction
|
Because COBOL is not a typed language like Modula-2 or C it employs
a different mechanism for describing the characteristics of the
data-items in a program.
Rather than using types, as these languages do, COBOL uses a kind
of "declaration by example" strategy. The programmer provides the
system with an example, or template, or PICture of the storage required
for the data-item.
In COBOL, a variable declaration consists of a line in the DATA
DIVISION that contains the following items:
- A level number.
- A data-name or identifier.
- A Picture clause.
|
COBOL
picture clauses

There are actually many more picture
symbols than these. Most of these will be introduced when we cover
Edited Pictures.
|
To create the required 'picture' the programmer uses a set of symbols.
The most common symbols used in standard picture clauses are:
9
|
The digit nine is used to indicate
the occurrence of a digit at the corresponding position in
the picture.
|
X
|
The character X is used to indicate
the occurrence of any character from the character set at
the corresponding position in the picture.
|
A
|
The character A is used to indicate
the occurrence of any alphabetic character (A to Z plus blank)
at the corresponding position in the picture.
|
V
|
The character V is used to indicate
the position of the decimal point in a numeric value. It is
often referred to as the "assumed decimal point". It is called
that because, although the actual decimal point is not stored,
values are treated as if they had a decimal point in that
position.
|
S
|
The character S indicates the
presence of a sign and can only appear at the beginning of
a picture.
|
|
Picture clause notes
|
Although the word PICTURE can be used when
defining a picture clause it is normal to use the abbreviation PIC.
Recurring symbols may be specified by using a 'repeat' factor inside
brackets. For instance:
PIC 9(6) is equivalent to PICTURE 999999
PIC 9(6)V99 is equivalent to PIC 999999V99
PICTURE X(10) is equivalent to PIC XXXXXXXXXX
PIC S9(4)V9(4) is equivalent to PIC S9999V9999
PIC 9(18) is equivalent to PIC 999999999999999999
Numeric values can have a maximum of 18 (eighteen) digits.
The limit on string values is usually system dependent.
|
|
Group
and Elementary data-items
|
Introduction
|
Although we stated above that each variable declaration
consists of a level number, an identifying name and a picture
clause, that definition only applies to elementary data-items.
Group items are defined using only a level-number and an identifying
name; no picture clause is required or allowed.
Which begs the question - what is a group item
and what is an elementary item?
|
Elementary
items

A variable declaration may also
have a number of other clauses such as USAGE
or BLANK WHEN ZERO
|
An "elementary item" is the name we use in COBOL to describe
a data-item that has not been further subdivided. Other languages
might describe these as ordinary variables.
Elementary items must have a picture clause
because they actually reserve the storage required for the item.
The amount of storage reserved is specified by the item's picture
clause.
An elementary item declaration consists of;
- a level number
- a data name
- a picture clause
A starting value may be assigned to a variable by
means of an extension to the PICTURE clause
called the VALUE clause.
Some examples:
01 GrossPay PIC 9(5)V99 VALUE ZEROS.
01 NetPay PIC 9(5)V99 VALUE ZEROS.
01 CustomerName PIC X(20) VALUE SPACES.
01 CustDiscount PIC V99 VALUE .25.
|
Group
items
|
Sometimes when we are manipulating data it is convenient
to treat a collection of elementary items as a single group. For
instance, we may want to group the data-items YearofBirth, MonthofBirth,
DayOfBirth under the group name - DateOfBirth. If we are recording
information about students we may want to subdivide StudentName
into FirstName, MiddleInitial and Surname. And we may want to use
both these group items and the elementary items StudentId and CourseCode
in a student record description.
We can create groups like these in COBOL using group
items. A "group item" is the term used in COBOL to describe a data-item
- like DateOfBirth or StudentName - that has been further subdivided.
In other languages group items might be described as "structures".
A group item consists of subordinate items. The items
subordinate to a group item may be elementary items or other group
items. But ultimately every group item must be defined in terms
of its subordinate elementary items.
In a group item, the hierarchical relationship between
the various subordinate items of the group is expressed using level
numbers. The higher the level number, the lower the item is in the
hierarchy. Where a group item is the highest item in a data hierarchy
it is referred to as a "record" and uses the level number
01.
Group items are declared using a level number and
a data name only. A group item cannot have a picture clause because
it does not actually reserve any storage. It is merely a name given
to a collection of (ultimately) elementary items which do reserve
the storage.
Therefore, the size of a group item is the sum of
the sizes of its subordinate elementary items.
The type of a group item is always assumed to be PIC
X because a group item may have several different data items
and types subordinate to it and an X picture is the only one which
could support such collections.
|
Level
Numbers

Although level numbers specify the
actual data hierarchy you should use indentation to provide a graphic
representation of it. This will make your
programs easier to read. For instance, indentation makes it obvious
that DayOfBirth, MonthOfBirth and YearOfBirth are subordinate items
of DateOfBirth, while CourseCode is not.
|
Level numbers are used to express data hierarchy.
The higher the level number, the lower the item is in the hierarchy.
At the lowest level the data is completely atomic.
What is important in a structure defined with level
numbers is the relationship of the level numbers to one another,
not the actual level numbers used. For instance, the record descriptions
shown below are equivalent.
Record-A
|
01 StudentDetails.
02 StudentId PIC 9(7).
02 StudentName.
03 FirstName PIC X(10).
03 MiddleInitial PIC X.
03 Surname PIC X(15).
02 DateOfBirth.
03 DayOfBirth PIC 99.
03 MonthOfBirth PIC 99.
03 YearOfBirth PIC 9(4).
02 CourseCode PIC X(4).
|
Record-B
|
01 StudentDetails.
05 StudentId PIC 9(7).
05 StudentName.
07 FirstName PIC X(10).
07 MiddleInitial PIC X.
07 Surname PIC X(15).
05 DateOfBirth.
07 DayOfBirth PIC 99.
07 MonthOfBirth PIC 99.
07 YearOfBirth PIC 9(4).
05 CourseCode PIC X(4).
|
|
Some
observations on Record-A
|
It is useful to examine Record-A above and to answer the following
questions:
Q1. |
What is the size (in characters) of Record-A?
|
Q2. |
What is the size of the data-item StudentName?
|
Q3. |
What is the size of DateOfBirth?
|
Q4. |
What is the data type of DateOfBirth? Is
it numeric, alphabetic or alphanumeric.
|
|
|
A1. |
The size of Record-A is the sum of the sizes
of all the elementary items subordinate to it (7+10+1+15+2+2+4+4
= 45 characters).
|
A2. |
The size of StudentName is the sum of the
sizes of FirstName, MiddleInitial and Surname. So StudentName
is 26 characters in size (10+1+15).
|
A3. |
DateOfBirth is 8 characters in size (2+2+4).
|
A4. |
The data type of DateOfBirth is alphanumeric
(i.e. PIC X) even though all its subordinate items are numeric
because the type of a group item is always alphanumeric.
|
|
Level
number notes
|
The level numbers 01 through 49 are general level
numbers but there are also special level numbers such as 66, 77
and 88.
- Level 77's can only be used to define individual elementary
items. The use of 77's is banned in some shops who take the
view that instead of declaring large numbers of indistinguishable
77's it is better to collect the individual items into groups.
- Level 88's are used to define Condition Names.
- Level 66's (RENAMES clause) are used
to apply a new name to an identifier or group of identifiers.
It is not generally used in modern COBOL programs.
|
Building
a record structure
|
In the animation below we show how level numbers can be used to
define a record structure as hierarchy of data-items.
|
Copyright Notice
These COBOL course materials are the copyright
property of Michael Coughlan.
All rights reserved. No part of these
course materials may be reproduced in any form or by any means
- graphic, electronic, mechanical, photocopying, printing, recording,
taping or stored in an information storage and retrieval system
- without the written permission of the
author.
(c) Michael Coughlan
|