COBOL Tutorial | COBOL Theory | Learn COB


 

                                                                                COBOL
 
     COMMON BUSINESS ORIENTED LANGUAGE
 
 



 
Table of Contents
 
 
1.       COBOL – AN INTRODUCTION
 
1.1         FEATURES OF COBOL
1.2         COBOL CHARACTER SET
1.3         COBOL LANGUAGE STRUCTURE
1.4         DIVISIONS IN COBOL
1.4.1           IDENTIFICATION DIVISION
1.4.2           ENVIRONMENT DIVISION
1.4.3           DATA DIVISION
1.4.4           PROCEDURE DIVISION
 
2.       COBOL – AN INTRODUCTION(Cntd)
 
2.1     WORDS IN COBOL
2.1.1           RESERVED WORDS
2.1.2           USER-DEFINED WORDS
2.1.2.1                  DATA NAMES
2.2     LITERALS
2.2.1           NUMERIC LITERAL
2.2.2           NON-NUMERIC LITERAL
2.2.3           FIGURATIVE CONSTANT
2.3     LEVEL NUMBERS
2.3.1           01 …. 49
2.3.2           77( Elementary Data Item)
2.3.3           88(Condition Names)
2.3.4           66( Rename )
2.4    PICTURE CLAUSE
 
3.       SIMPLE STATEMENT IN COBOL
 
3.1 DISPLAY
3.2 ACCEPT
3.3 MOVE STATEMENT
                        3.3.1 NUMERIC MOVE
                        3.3.2 NON-NUMERIC MOVE
3.4 ARITHMATIC VERB
                        3.4.1 ADD
                        3.4.2 SUBTRACT
                        3.4.3 MULTIPLY
                        3.4.4 DIVIDE
                        3.4.5 REMAINDER
                        3.4.6 ROUNDED
3.5 COMPUTE STATEMENT
 
4.             CONDITIONAL STATEMENT
 
        4.1 OPERATORS IN COBOL
        4.2 CONDITIONAL STATEMENT
                                4.2.1 RELATIONAL CONDITION
                                4.2.2 CLASS CONDITION
                                4.2.3 SIGN CONDITION
                                4.2.4 NESTED CONDITION
                        4.3 PERFORM STATEMENT
                                                4.3.1 PERFORM
                                                4.3.2 PERFORM …..TIMES
                                                4.3.3 PERFORM …..UNTIL
                                                4.3.4 PERFORM …..VARYING
                                                4.3.5 NESTED PERFORM
                                                4.3.6 INLINE PERFORM
 
                5. EDITING FEATURES IN COBOL
 
                                5.1 ZERO SUPRESSION
                                5.2 DECIMAL NUMBERS
                                5.3 POSITIVE / NEGATIVE SIGNS
                                5.4 USING $ CURRENCY
                                5.5 INSERTION OF CHARACTER
                                                LIKE 0, COMMA, / , BLANKS
                                5.6 BLANK WHEN ZERO OPTION
                                5.7 CR & DB
                                5.8 ASTRISK ( *  )
 
                6. INTRODUCTION TO FILES
 
                                6.1 FILE TYPES
                                6.2 FILE DEFINITION ENTRIES
                                6.3 FILE DESCRIPTION ENTRIES
                                6.4 DATA DESCRIPTION ENTRIES
                                6.5 FILE STATUS
 
                7. SEQUENTIAL FILE
 
                                7.1 CREATION OF SEQUENTIAL FILE
                                7.2 ACCESSING A SEQUENTIAL FILE
                                7.3. SEQUENTIAL FILE REPORT PRINTING
 
                8. CONTROL BREAK
 
                                8.1 LEVEL – 1
                                8.2 LEVEL – 2
 
                9. SEQUENTIAL FILE MAINTENANCE
 
                                9.1 MULTIPLE FILE HANDLING
                                9.2 ADDING NEW RECORDS
                                9.3 MODIFYING RECORDS
                                9.4 DELETING RECORDS
 
                10. ARRAYS / TABLES
 
                                10.1 SINGLE DIMENSION
                                10.2 TWO DIMENTION
                11. REDEFINE CLAUSE & TABLE SEARCH
 
                                11.1 REDEFINE CLAUSE
                                11.2 TABLE SEARCH
                                                11.2.1 LINEAR SEARCH
                                                11.2.2 BINARY SEARCH
 
                12. INDEX FILE
 
                                12.1 INTRODUCTION
                                12.2 CREATION OF AN INDEX FILE
                                12.3 ACCESSING INDEX FILE
                                                12.3.1 SEQUENTIAL ACCESS
                                                12.3.2 RANDOM ACCESS
                                                12.3.3 DYNAMIC ACCESS
                                12.4 ALTERNATE KEYS
                                12.5 UPDATION OF INDEX FILE
                                12.6 DELETION OF INDEX FILE
 
                13. RELATIVE FILE
                                13.1 INTRODUCTION
                                13.2 CREATION FILE
                                13.3 ACCESSING FILE
 
                14. SORTING & MERGING
                                14.1 SORTING OF FILES
                                14.2 MERGING OF FILES
                                14.3 SELECTIVE SORTING
                                                14.3.1 RELEASE
                                                14.3.2 RETURN
 
                15. SUB-ROUTINE
                                15.1 CALL STATEMENT
                                15.2 CANCEL & IS INITAL
                                15.2 CALL BY REFERENCE
                                15.3 CALL BY CONTENT
                                15.4 STATIC & DYNAMIC CALL
               
                16. COMPILE, LINK & EDIT and RUN PROCESS    
 
 
  
 
 
 
 
 
CHAPTER – 1
 
 
 
 
INTRODUCTION TO COBOL
 
COBOL CHARACTER SET
 
COBOL LANGUAGE STRUCTURE
 
DIVISIONS IN COBOL
 
IDENTIFICATION DIVISION
 
ENVIRONMENT DIVISION
 
DATA DIVISION
 
PROCEDURE DIVISION

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

1.Introduction

 
COBOL 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.
 

Features of COBOL

 

1.      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.
 

2.      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 uses 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.
 

3.     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.

 

4.     Self Documenting Language

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.

 

COBOL CHARACTER SET

 
The cobol character set consists of 51 symbols. Only these characters can be used in writing a COBOL program.The alphabet is also known as character set of COBOL – the word “character” being a synonym of symbol. The symbol may be grouped into the four categories:
 
                ALPHABETS                       :               A B C…….Z (LOWER and UPPER case)
 
                DIGITS                                  :               0 1 2 3 4 5 6 7 8 9
 
                SPECIAL CHARACTER   :               +  -  *  /  $  =  ,    ;  (  )  space  fullstop(period), < >
 
 
 
CODING A COBOL PROGRAM
 
 A COBOL program needs to be coded following the below mentioned coding rules (COBOL Coding Sheet)
 
Columns
Use
Explanation
1-6
Sequence numbers or Page and Line numbers (optional)
Used for sequence-checking
7
Indicator Area
Denotes
*    comments
/     page break( Form Feed)
-     continue strings from previous line
8-11
Area A
DIVISION Header, SECTION Header, 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.
 
The following rules must be observed in writing COBOL program.
 
  1. All divisions, sections and paragraph names must start in AREA A. They may extend into AREA B but should end with a fullstop. Nothing else may be written on these lines.
  2. All sentences and entries must be written in AREA B from any position and end in full-stops. Every sentence must begin on a new line.
  3. All operators (Arithmetic, Relational and Logical) must be preceded and followed by atleast one blank space.
  4. Parenthesis may be used in arithmetic expressions. There should be no blank spaces immediately after left parentheses and before the right parentheses.
  5. In most of the cases, COBOL defines the punctuation symbols to be used. The Period, comma and semicolon, whenever used should not be preceded by a blank, but must be followed by at least one blank.
  6. The statements within a sentence or clauses within an entry may be separated by blanks.
 

STRUCTURE OF COBOL PROGRAM

 
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.
 
Divisions
 
·         IDENTIFICATION DIVISION
The IDENTIFICATION DIVISION is the first division of a COBOL program. It supplies the administrative information about the program to others who may read or use the program(Only for documentation Purpose). 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.
 
·         ENVIRONMENT DIVISION
The ENVIRONMENT DIVISION is the only machine-dependent division of a COBOL program. It describes the facilities used by a program from the environment of the computer system on which it will be executed. It is composed of two sections:
 
CONFIGURATION SECTION.
                SOURCE-COMPUTER. Computer.
Ø   Computer used for compiling the program.
 
                OBJECT-COMPUTER. Computer.
Ø  Computer 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.
Describes the device type, organization, access mode, file status..Etc about the various files handled in the program
 
·         DATA DIVISION
The DATA DIVISION defines and describes fields, records, and files in storage. Commonly, it consists of the following sections :
 
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.
 
·         PROCEDURE DIVISION
The PROCEDURE DIVISION is divided into 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 user-defined sections. A section may contain several paragraphs.
 
A Sample COBOL Program
 
                IDENTIFICATION DIVISION.
                PROGRAM-ID. MYFIRST.
                AUTHOR. DASH.
                DATE-WRITTEN. 08/10/2006
                DATE-COMPILED. 08/10/2006.
                INSTALLATION. KASSHKU.
 
                ENVIRONMENT DIVISION.
                CONFIGURATION SECTION.
                SOURCE-COMPUTER. IBM-PC.
                OBJECT-COMPUTER. IBM-PC.
                INPUT-OUTPUT SECTION.
               
                PROCEDURE DIVISION.
                0000-MAINLINE.
                    DISPLAY ‘ MY FIRST COBOL PROGRAM ‘.
                    STOP RUN.
 
 
 
 
 
 
 
 
 
 
2. Working with data
 
COBOL Words
 
A sequence of continuous characters from the character set can form a word. 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.
 
Eg.          MOVE, ADD, PERFORM, SUBTRACT………Etc.
 
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.
 
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
ITEMCODE                                                         DISCOUNT-
ITEMNAME                                                        AUTHOR
PRODUCTCD                                                      BASIC+HRA
AMOUNT-OF-TRANSACTION-OUT             123                                        
 
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
When a array of numbers entered following certain rules, they are known as NUMERIC LITERAL. A numeric literal is a constant used primarily for arithmetic operations and calculations.
 
Rules for forming numeric literals
a)       1 to 18 digits
b)       A + or – sign may be used, but it must appear to the left of the number.
c)       A decimal point is permitted within the literal. The decimal point, however may not be the rightmost character of the literal.
 
Eg:         +10                         -22.25
 
 
2.       NON-NUMERIC LITERALS
String of characters grouped together is known as NON-NUMERIC literal. A nonnumeric literal is a constant that is used in the PROCEDURE DIVISION for all operations except arithmetic. Any literal enclosed within quotes are called Non Numeric Literals.
 
Rules for forming nonnumeric literals
a)       The literal must be enclosed in quotation marks.
b)       A maximum of 120 characters are permitted.
c)       Any character permitted in the COBOL character set may be used except the quotation mark.
 
Eg:         ‘IBM MAINFRAME’                         ‘123245’
 
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.
   e.g ‘D’Quote’Souza will store the value D’Souza.
 
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.
 
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 up to 49. Any level number between 02 and 49 may be used to describe fields within a record.
 
Elementary and Group Items
 
An elementary item has no subordinate (non divisible) parts. A group item may consist of one or more group items. In the code below :
 
Eg :        01 CUSTOMER-ADDRESS
                                02 NAME.
                                                03 FIRST-NAME
                                                03 LAST-NAME
                                02 STREET
                                                03 S-NUMBER
                                                03 STREET-NM
                                02 ZIP-CODE
 
FIRST-NAME, ZIP-CODE  are elementary items
CUSTOMER-ADDRESS, STREET are group items
 
COBOL allows a special level – 77 which generally used for data names which are independent and do not have any sub group but an elementary item by itself. They are used only for those data names which are not part of any record in a file i.e used in the working-storage section.
 
Eg :     77 HRA PIC 999.
 
PICTURE CLAUSES AND ITS TYPES
 
A picture clause symbolically represents the type of characters that are going to be stored in that elementary item. The picture clause specification of a data item defines the class, range and the editing characteristics of the data item.
 
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.
 
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.
77 STUDNAME PIC A(20).
Alphanumeric
X
A field that may contain any character i.e. letters, digits, blanks and/or special characters.
E.g. an address field.
77 ITEM-NAME PIC X(10).
Numeric
9
Any signed or unsigned field that will contain only digits is considered numeric.
E.g. An salary field.
77 SALARY PIC 9(5).
Sign
S
If a numeric field can have positive and negative contents, then it must have an S in its PIC clause otherwise negative numbers will not be accepted by a picture clause which have only 9’s without S. It must be the leftmost character. It does not take any storage space.
E.g. 77 ITEMVALUE PIC S9999.
Decimal
V
The symbol V denotes an implied decimal point which can be positive or negative and also real, which does not occupy a storage position.
77 AMOUNT PIC 9(4)V99.
 

WORKING-STORAGE SECTION

 
Defines and describes all data storage fields required for Processing (Including constants).
These fields are not part of any input/output file.
 
 
Can be used for storing
  • Intermediate results
  • Counters, Flags
  • Input/Output Records
  • Tables etc.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

3. SIMPLE STATEMENTS IN COBOL

 
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 STATEMENT
 
The instruction ACCEPT identifier enable the user to enter input data directly from a keyboard at the time of program execution or from the JCL submission. The program will halt for the user to  enter the value or supplied from the SYSIN of JCL while executing that instruction. On entering the value, it occupies that memory location allocated for that data name.
 
The ACCEPT statement can take in only one value at a time.
 
Eg           ACCEPT MY-NAME.
 
DISPLAY STATEMENT
 
DISPLAY is used for displaying the contents of the variables or the literals on the screen. The Display verb can be followed by data names, Literals, or a combination of both each being separated at least by a single space.
 
Eg        DISPLAY MY-NAME.
DISPLAY “HELLO”.
 
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.
 
A program using DISPLAY and ACCEPT.
 
Eg           IDENTIFICATION DIVISION.
            PROGRAM-ID. SAMPLE2.
             *This program accepts the user’s name and displays a message.
AUTHOR. XYZ.
DATE-WRITTEN. 1-JUN-2000.
DATE-COMPILED.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01         USER-NAME                 PIC X(15).
PROCEDURE DIVISION.
0000-MAIN.
      DISPLAY “Enter your name : “.
      ACCEPT   USER-NAME.
      DISPLAY   “HELLO “ USER-NAME.
      STOP RUN.


MOVE statements

 
A value can be moved from one storage location to another by the move statement. Contents of receiving field are changed(Over written) after the operation.
 
 

Sending field
 

Text Box: Verb


 
 
 

                     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.
 
Eg 4.1:
MOVE TOTAL TO PRINT-TOTAL
            MOVE ‘INVALID’ TO MESSAGE.
            MOVE ZEROS TO TOTAL
 
 
 

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 nonfilled high-order (leftmost) integer positions of the receiving field are replaced with zeros.
 
Eg 4.2:
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
 
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.
 
Eg           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
 
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.
 
Eg 4.4:
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
 
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
 
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.
 
Eg 4.4:
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
 
b. When receiving field is smaller than the sending field
 
05  NAME-IN                 PIC XXX  VALUE “ABC”.
05  NAME-OUT PIC XX VALUE “PQ”.
 
MOVE NAME-IN TO NAME-OUT.
 
Result :
NAME-OUT  = AB
 
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
 
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
 
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
 
A group move is considered a non-numeric move
 
All group items, even those with numeric subfields, are treated as alphanumeric fields.
 
Eg 4.5:
05   DATE-OUT.
       10   MONTH-OUT    PIC 99 .
       10   YEAR-OUT        PIC 99.
 
a.  MOVE 1 TO MONTH-OUT.MOVE 99 TO YEAR-OUT.
 
Result :
   DATE-OUT = 0194
 
b.  MOVE 194 TO DATE-OUT.
 
Result :
   DATE-OUT = 194b
 
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.

 

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.
 
Syntax:
                ADD value1 value2  TO data-name
                ADD value1 TO value2 GIVING data-name1 data-name2….
 
Eg:      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 TO EMP-HRA GIVING EMP-TOTAL.
 
Result :
                EMP-TOTAL = 4650
 
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.
 
Syntax :
                SUBTRACT value FROM data-name
                SUBTRACT value FROM data-name1 GIVING data-name2
 
Eg :     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-BASIC.
 
Result :
                EMP-BASIC = 4000
 
b.             SUBTRACT EMP-PF EMP-ITAX FROM EMP-GROSS.
 
Result :
                EMP-GROSS = 3900
 
c.             SUBTRACT EMP-PF EMP-ITAX FROM EMP-GROSS GIVING EMP-NET.
 
Result :
EMP-GROSS = 4250
                EMP-NET = 3900
 
MULTIPLY Statements
 
With MULTIPLY statement specified; only two operands can be multiplied. Always make sure the receiving fields is large enough to store the result. The preposition used with the MULTIPLY verb is always BY.
 
Syntax :                 MULTIPLY value  BY data-name
                                MULTIPLY value1  BY value2 GIVING data-name
 
Eg:      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
 
 
 
DIVIDE Statements
 
With DIVIDE statement specified; only two operands can be divided. Always make sure the receiving field is large enough to store the result. In the DIVIDE operation, the preposition is either BY or INTO.
 
Syntax :                 DIVIDE  value1 BY  value2 GIVING data-name
                                DIVIDE value1  INTO data-name
                                DIVIDE value1  INTO value2 GIVING data-name
 
a.             DIVIDE 4 INTO EMP-GROSS.
Result :
                EMP-GROSS = 1000
 
b.             DIVIDE 4 INTO EMP-GROSS GIVING EMP-NEW-SAL.
Result :
                EMP-GROSS = 4000
                EMP-NEW-SAL = 1000
 
c.             DIVIDE EMP-GROSS BY 4 GIVING EMP-NEW-SAL.
Result :
                EMP-NEW-SAL = 1000
 
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.
 
Eg 5.4:
DIVIDE 130 BY 40 GIVING WS-TOTAL.
 
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.
 
ROUNDED Option
 
A frequent need exists for rounding numeric values.
 
Eg 5.5:            05 AMT1        PIC 99V999    VALUE  12.857.
05 AMT2           PIC 99V999       VALUE 25.142.
05 AMT3           PIC 99V99         VALUE 37.99.
 
ADD AMT1 AMT2 GIVING AMT3.
 
In the code given above, the result 37.999 is placed in an accumulator. When this value is move to the field AMT3 , 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.
 
Eg :     ADD AMT1 AMT2 GIVING AMT3 ROUNDED.
 
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 :
 
Eg :     05 AMT1        PIC 999           VALUE  800.
05 AMT2           PIC 999 VALUE 150.
05 AMT3           PIC 999 VALUE 050.
 
ADD AMT1 AMT2 TO AMT3.
 
The effect of the above statement would be the same as coding MOVE 1000 TO AMT3. 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.
 
Eg :     ADD AMT1 AMT2 TO AMT3
                        ON SIZE ERROR MOVE ZERO TO TOTAL-OUT.
 
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.
 
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
 
Eg :     COMPUTE TOTAL = AMT1 + AMT2 – AMT3.
 
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.
 
 
4.    CONDITIONAL STATEMENT
 
OPERATORS IN COBOL
 
The COMPUTE statement seen earlier uses the ARITHMATIC operators while there are more types of operators used with conditional statements. They are CONDITION AL operators and LOGICAL operators.
 
The Relational operators are used in conditional statements whenever there is a necessary for comparing two values. The result of these comparisons will be only a TRUE or FALSE value.
 
The relational operators used in cobol are.
 
            EQUAL TO                                                    =
            GREATER THAN                                         >
            LESS THAN                                                  <
            GREATER THAN OR EQUAL TO             > =
            LESS THAN OR EQUAL TO                      < =
            NOT EQUAL TO                                           < >
 
The Logical operators used in COBOL are NOT, AND and OR. These operators are used when more than one condition (Compound Condition) have to be checked for taking appropriate decisions.
 
NOT (All simple relation, class or sign tests may be coded using a negated conditional). AND (If a statement or statements are to be executed only when all of several conditions are met). OR (Performs an operation or a series of operations if any one of several conditions exists.
 
E.g                  IF AMT1 IS NOT EQUAL TO AMT2
                                    PERFORM 200-NOT-EQUAL-RTN.
 
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.
 
CONDITIONAL STATEMENTS
 
The Conditional Statements in COBOL can be classifies as follows.
 
                RELATIONAL CONDITIONAL STATEMENTS
                CLASS CONDITION STATEMENTS
                SIGN CONDITION STATEMENTS
                NESTED CONDITION STATEMENTS ( USING ELSE STATEMENTS)
 
RELATIONAL CONDITIONAL STATEMENT
 
            The Syntax of these relational conditional statement is
 
                IF  < condition  >   Statement(s)
                               
OR
                IF  < Condition  > Statement             ELSE      Statement
 
Eg:      IF AMT1 IS EQUAL TO AMT2
                        DIVIDE QTY INTO TOTAL.
ELSE
                        ADD UNIT-PRICE TO FINAL-TOTAL.
 
OR
            IF AMT1 IS EQUAL TO AMT2
                        DIVIDE QTY INTO TOTAL.
ELSE
                        ADD UNIT-PRICE TO FINAL-TOTAL.
 
CLASS CONDITION STATEMENT
 
This is used for checking the contents of the data-item whether they are numeric or alphabetic. The statement returns a TRUE value depending on whether the test is successful or not.
 
                The syntax of this type of the statement is
 
                IF   identifier  (data-name)  IS  [ NOT ] NUMERIC  /  ALPHABETIC
 
Eg:      IF AMT-IN IS NUMERIC
                                PERFORM 300-CALC-RTN.
 
SIGN CONDITION STATEMENT
 
This Condition is used to check whether the value present in a data-item is positive, negative or a zero.
 
            The Syntax of this statement is
               
                IF data-name IS  [ NOT ] POSITIVE  /  NEGATIVE  /  ZERO
 
The data-name can also be replaced with an expression where the value of the expression will be forst evaluated and then the condition checked.
 
Eg :     IF AMT IS POSITIVE
                                PERFORM 200-CALC-RTN.
           
NESTED CONDITIONS
 
Cobol allows nested conditional statements i.e. condition within condition. Logic in coding nested conditions should be absolutely flawless as otherwise it might give unexpected results after the execution of the program.
 
 
Eg:      IF A IS GREATER THAN B
                        DIVIDE A TO B
ELSE IF A IS GREATER THAN C
ADD A TO C
ELSE IF A IS GREATER THAN D
            ADD A TO D.
           
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.
 
Eg 6.2:
                IF AMT1 = AMT2
                NEXT SENTENCE
            ELSE
                ADD 1 TO TOTAL.
 
CONDITION NAMES
 
A condition-name is an entity which itself is a condition and can either have a TRUE or FALSE value. A data name can be defined independently whereas a condition name is always associated with the data name and this data name is known as conditional variable for the associated condition name. There may be more than one condition name associated with a conditional variable.
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.
 
Eg :        05           MARITAL-STATUS                           PIC X.
                                88   SINGLE                                         VALUE “S”.
 
Either of the following tests may be used in the PROCEDURE DIVISION .
 
Eg :     IF MARITAL-STATUS = “S”
                                PERFORM 1000-SINGLE-ROUTINE.
OR
IF SINGLE
                                PERFORM 1000-SINGLE-ROUTINE.

 

Note: A condition name can be associated with a group name.

E.g :        01  DATE.
                                88   DAY1   VALUE   IS   “123456”
                                    05 DAYX   PIC 99.
                                    05 MNTH   PIC 99.
                                    05 YEAR    PIC 99.
 

ITERATIONS

 
PERFORM statement
 
The MODULAR approach in COBOL is achived by the use of the PERFORM statements. This statement temporarily stops the sequential execution of the statements of the program, transfers the control to some other part of the program as required by the user, to execute a predefined set of statements before returning to the starting place to continue the sequence. This helps to separate the program into smaller modules, so that managing the program becomes simpler and easier to comprehend.
 
A.SIMPLE PERFORM
This simple PERFORM statement is used to execute a specified routine from one point in a program.
OR
The PERFORM THRU 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.
 
Eg:                  PERFORM    para1.
OR
PERFORM    para1   THRU   para5.
 
PROCEDURE DIVISION.
100-MAIN-MODULE.
            :
            PERFORM 400-HEADING-RTN.
            :
200-CALC-RTN.
            :
            :
400-HEADING-RTN.
            :
OR
100-MAIN.
                        PERFORM 300-PARA THRU 500-PARA.
                        :
200-PARA.
                        :
300-PARA.
                        :
400-PARA.
                        :
500-PARA.
EXIT.
600-PARA.
            :
 
B. PERFORM   N  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.
 
                PERFORM para1 4 TIMES
OR
                PERFORM para1 THRU para4  5 TIMES.
 
Eg:      * This program displays the Hello 3 times.
                        MOVE 3 TO COUNTER1.
                        PERFORM 200-DISP-RTN COUNTER1 TIMES.
                        :
STOP RUN.
            200-DISP-RTN.
                        DISPLAY “HELLO”.
 
 
C. PERFORM   WITH UNTIL OPTION.
 
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).
 
Eg :     * This program displays Hello 3 times.
                        MOVE 1 TO COUNTER1.
                        PERFORM 200-DISP-RTN UNTIL COUNTER1 = 4.
                          :
                        STOP RUN.
200-DISP-RTN.
                        DISPLAY “HELLO”.
                        ADD 1 TO COUNTER1.

 

D. PERFORM …VARYING ….. STATEMENT
 
When the program execution encounters this statement, the value of the variable is set to its initial value and the condition is immediately checked. If the result of evaluating this condition is FALSE, the specified paragraph is executed and the control returns to the PERFORM statement. The value of the variable is altered by the step value and the condition once again checked and the decision taken. This process continues as long as the condition is not satisfied. Once the condition is satisfied, the control is transferred to the statement immediately after the PERFORM statement and the execution continues in the sequence of the statements.
 
Syntax is
PERFORM para1 VARYING variable
FROM initial-value BY step-value UNTIL condition
 
Note : The variable must be declared in working-storage section.
 
E.g.         PERFORM parax VARYING I FROM 1 BY 1 UNTIL I < 10.
 
E. NESTED PERFORM
 
Whenever a PERFORM…..VARYING loop is invokes from within another PERFORM……VARYING loop it is called NESTED PERFORM statements.
 
Syntax is
PERFORM para1 VARYING variable1
FROM initial-value BY step-value UNTIL condition AFTER
VARIABLE2 FROM initial-value BY step-value UNTIL condition.
E.g.         Syntax is
PERFORM parax VARYING I
FROM 1 BY 1 UNTIL I < 2
AFTER J
FROM 1 BY 1 UNTIL J < 3.
 
G. INLINE PERFORM
 
 
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.
 
GO TO
 
A GO TO permanently transfers control to another paragraph. It does not return control to the paragraph from where it was issued.
 
GO TO STATEMENT with DEPENDING option
 
The GO TO with depending phrase can transfer control to two or more procedure names depending on the value of the control variable mentioned with the phrase.
 
E.g :        GO TO PARA1  PARA2  PARA3  PARA4  DEPENDING ON ACCOUNT-TYPE.
 
Alternatively the GO TO statement can be used to transfer control to one of the different procedure names.
 
E.g :        IF ACCOUNT-TYPE IS EQUAL TO 1 GO TO PARA1
                                ELSE IF ACCOUNT-TYPE IS EQUAL TO 2 GO TO PARA2
                                                ELSE IF ACCOUNT-TYPE IS EQUAL TO 3 GO TO PARA3
                                                                ELSE IF ACCOUNT-TYPE IS EQUAL TO 4 GO TO PARA4.
 
 
 
 
 
 
 
 
 
 
 
5. EDITING FEATURES IN COBOL
 
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 /
 
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.
 
Eg 2.10:
PIC Description                  Value                     Printed as
Z99                                         25                           b25
ZZZV99                                                25                           b2500
ZZZV99                                                0.10                        bbb10
ZZZVZZ                                0.052                      bbb05
ZZZVZZ                                0.00                        bbbbb
 
* - 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.
 
Eg 2.11:
PIC Description                  Value                     Printed as
                **999                    04678                    *4678
***99                    00052                    ***52
 
$ - 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 whether 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 ,).
 
Eg 2.12:
PIC Description                  Value                    Printed as
$999V99                               125.13                   $12513
$9(5)V99                               100.00                   $0010000
$$99V99                               12.49                      b$1249
$$$$9V99                             150.10                   $15010 
$$$$V99                               0.15                        bbb$15
$$$$V$$                               0.0                          bbbbb
 
 
 
. - (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.
 
Eg 2.13:
PIC Description                  Value                     Printed as            
$9,999.99                              2,350.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.0                          bbbbbbbbb          
 
 
 
, - (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.
 
Eg 2.14:
PIC Description                  Value                     Printed as
$9,999.99                              2,350.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                           2,210.2                  $2,210.200          
$$,999.9                                                2,210.2                  $2,210.2
$$,999.9                                                2,210.256              $2,210.2
$9,999.9999                         23                           $0,023.0000
 
- (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.
 
Eg 2.15:
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
--99.99                                   -10.25                    b-10.25
--999.99                                 100.25                   b100.25
999.9-                                    -10.2                       010.2-
 
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.
 
 
Summary for use of + - DB CR
 
                PIC                         Storage when                       Storage when
                Character             data positive                        data negative
               
+                              +                                              -
                -                               Blank                                     -
                DB                          Blank                                     DB
                CR                          Blank                                     CR
 
Eg 2.16:
PIC Description                  Value                     Printed as
$999.99DB                           135.26                   $135.26bb
$999.99DB                           -135.26                  $135.26DB
$,$$99.99CR                        -10.50                    bb$10.50CR
 
B – (blank)
 
The B insertion editing character results in blanks being entered in the designated positions.
 
Eg 2.17:
                05 NAME PIC A(10) VALUE ‘RBSMITH’.
     NAME = RbBbSMITHbbbbb
 
0 - (Zero)
 
The zero insertion character causes zeros to be inserted in the positions in which it appears.
 
Eg 2.18:
                05 AMOUNT PIC 9(4)000 VALUE 1365.
                     AMOUNT = 1365000 
 
/ - (stroke)
 
Each / (stroke) in the PICTURE character string represents a character position into which the stroke character will be inserted.
 
Eg 2.19:
                05 PRINT-DATE PIC 99/99/99  VALUE 040798.
                     PRINT-DATE = 04/07/98       
 
 
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.
 
Eg 2.20:
02 PAGE-TITLE   PIC A(14) VALUE “SAMPLE PROGRAM”.
02 TAX-RATE      PIC V99  VALUE  IS 0.03.
 
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.
 
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 Area B of the second line. Begin with a quotation mark.
  4. End the literal with a quotation mark.
 
Eg 2.21:
     01 PAGE-HEADING   PIC X(36) VALUE “MONTHLY TRANSACTIONS FOR AP
    -                     “RIL 2000”.
 
USAGE clause
 
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 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.
 
Eg 2.22:
     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.
 
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 to conserve the memory space. REDEFINES clause can be used to redefine group items as well as elementary items
 
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.
 
Eg:
01     SAMPLE-REC.
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.
 
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.
 
Eg 2.24:
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.
 
Qualification of names
 
A data name that is not unique must be qualified in COBOL verbs.
 
 
Eg 2.25:
 
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.
 
NOTE : There is hardly any common between RENAMES and REDEFINES clauses. While RENAMES is a special data description entries and appears only as the 66level entry, REDEFINES can appears a clause in any entry at levels 01 to 49. RENAMES provides means for alternate regrouping of elementary items within a record, REDEFINES on the other hand provides means to have alternate descriptions for group or elementary items.                                       
 
SYNCHRONIZED Clause
 
The SYNCHRONIZED clause or SYNC is used to specify alignment of an elementary data item to the natural boundaries of the computer memory. This clause can be used with any USAGE clause. The natural boundary can be a double word boundary, one word boundary, half word boundary or byte boundary depending o the USAGE format used.
The SYNCHRONIZED clause enables programmer to obtain more efficient object program, however due to the use of SYNCHRONIZED clause, the elementary fields in a group may not have contiguous space in the memory. A few bytes may be unused in between two consecutive fields called slack bytes.
 
E.g :


6.File Handling

 

File Organization methods

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.
 
Eg 8.1:
ENVIRONMENT DIVISION.
   :
INPUT-OUTPUT SECTION.
FILE-CONTROL.
            SELECT EMPLOYEE-FILE
               ASSIGN TO “EMP.DAT”
                ORGANIZATION IS LINE SEQUENTIAL.
 
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.
 
Eg 8.2:
DATA DIVISION.
FILE SECTION.
FD   EMPLOYEE-FILE
        LABEL RECORDS ARE STANDARD
         RECORD CONTAINS 70 CHARACTERS
          BLOCK CONTAINS 10 RECORDS.
 
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 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.
 
Eg 8.3:
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).
 
Input/output verbs
There are 4 input/output verbs : OPEN, READ, WRITE, CLOSE.
 
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.
 
Eg 8.4:
OPEN INPUT EMPLOYEE-FILE.
OPEN OUTPUT REPORT-FILE.
 
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.
 
Eg 8.5:
READ EMPLOYEE-FILE
      AT END
            MOVE “YES” TO END-OF-FILE.
 
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. 
 
Eg 8.6:
WRITE  EMPLOYEE-REC.
 
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.
 
Eg 8.7:
CLOSE  EMPLOYEE-FILE.
 
 
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 EMP.REC
Eg 8.8a:
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).
 
The DATA DIVISION entry using a COPY statement
Eg 8.8b:
DATA DIVISION.
FILE SECTION.
FD   EMPLOYEE-FILE
        LABEL RECORDS ARE STANDARD
        RECORD CONTAINS 70 CHARACTERS
        BLOCK CONTAINS 10 RECORDS.
COPY  “EMP.REC”.
 
A program to create the employee file.
 
Eg 8.9:
      IDENTIFICATION DIVISION.
            PROGRAM-ID. FILE-CRT.
      * This program creates a sequential EMPLOYEE file.
 
            ENVIRONMENT DIVISION.
            INPUT-OUTPUT SECTION.
            FILE-CONTROL.
               SELECT EMPLOYEE-FILE ASSIGN TO "EMP.DAT"
               ORGANIZATION IS LINE SEQUENTIAL.
             
 
            DATA DIVISION.
            FILE SECTION.
            FD EMPLOYEE-FILE
               LABEL RECORDS STANDARD.
            01  EMPLOYEE-REC.
                05 EMP-NO                 PIC 9(4).
                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).
 
            WORKING-STORAGE SECTION.
            01 WS-ANS       PIC X(01) VALUE "Y".
               88 ANS-NO    VALUE "N" "n".
 
            PROCEDURE DIVISION.
            0000-MAIN.
               OPEN OUTPUT EMPLOYEE-FILE.
               PERFORM 1000-ACPT-PARA UNTIL 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 WS-ANS.
 
 


9.Sorting and merging files

 
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.
 
Eg 9.1:
                SORT SORT-FILE
                        ON ASCENDING KEY S-EMP-DEPT
                        ON ASCENDING KEY S-EMP-NAME
                        USING EMPLOYEE-FILE
                        GIVING SORT-EMPLOYEE-FILE.
 
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.
 
Eg 9.2:
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).
 
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.
 
INPUT PROCEDURE
The INPUT PROCEDURE processes data from the incoming file prior to sorting. An INPUT PROCEDURE may be used to perform the following operations prior to sorting : (1) validate data in the input records, (2) eliminate records with blank fields, (3) count input records.
 
With COBOL 74, the procedure-name of an INPUT PROCEDURE must be a section-name and not a paragraph-name. A section is a series of PROCEDURE DIVISION paragraphs that is treated as a single entry or unit. Rule for forming section-names are the same as rules for forming paragraph-names. The word SECTION, however, follows a section-name (e.g., A000-ERROR SECTION). The end of a section is recognized when another section-name is encountered, or when the end of the program is reached.
 
Code for an INPUT PROCEDURE
Eg 9.3:
                SORT SORT-FILE
                        ON ASCENDING KEY S-EMP-DEPT
                        ON ASCENDING KEY S-EMP-NAME
                        INPUT PROCEDURE A000-TEST-IT
                        GIVING SORT-EMPLOYEE-FILE.
            STOP RUN
A000-TEST-IT SECTION.
A100-PARA-1.
            OPEN INPUT IN-FILE.
            READ IN-FILE
              AT END MOVE “NO” TO ARE-THERE-MORE RECORDS.
            PERFORM A200-TEST-RTN
              UNTIL THERE-ARE-NO-MORE-RECORDS.
            CLOSE IN-FILE.
            GO TO A300-TEST-IT-EXIT.
A200-TEST-RTN.
            IF QTY = ZEROS
               NEXT SENTENCE
            ELSE
              MOVE IN-REC TO SORT-REC
              RELEASE SORT-REC.
            READ IN-FILE
              AT END MOVE “NO” TO ARE-THERE-MORE RECORDS.
A300-TEST-IT-EXIT.
            EXIT.
 

Explanation

  1. The first section in the PROCEDURE DIVISION contains the SORT instruction, any processing to be performed before or after the SORT verb is executed, and a STOP RUN.
  2. The second section begins with the main module of the INPUT PROCEDURE. It opens the input file, reads the first record, and then performs a process routine (in a separate paragraph within this second section) until there is no more data.
  3. After the separate paragraph is executed until ARE-THER-MORE-RECORDS = “NO”, control returns to the main module of the second section to be terminated, control must pass to the last statement within the section. This means that a GO TO is required. We code GO TO A300-TEST-IT-EXIT as the last sentence. Since no operations are required in this last paragraph, EXIT is coded, which passes control back to the SORT statement, where the file is then sorted.
 
OUTPUT PROCEDURE
The OUTPUT PROCEDURE  is used to process the sorted records prior to, or perhaps even instead of, placing them in the output file. The OUTPUT PROCEDURE can be used instead of the GIVING option. The OUTPUT PROCEDURE is similar to the INPUT PROCEDURE. When the INPUT PROCEDURE is complete, the file is then sorted. An OUTPUT PROCEDURE processes all sorted records in the sort file and handles the transfer of these records to the output file.
                In an INPUT PROCEDURE we RELEASE records to a sort file rather than writing them. In an INPUT PROCEDURE we RETURN records from the sort file rather than reading them.
 
Merging
The MERGE statement combines two or more files into a single file. Its format is similar to the SORT. The file to be merged is a work file designated as an SD. At least two file-names must be included for a merge, but more than two are permitted. Unlike, the SORT, however, an INPUT PROCEDURE may not be specified with the MERGE statement. That is, using the MERGE statement, you may only process records after they have been merged, not before. The OUTPUT PROCEDURE has the same format as with the SORT.
 
Eg 9.4:
MERGE MERGE-FILE
            ON ASCENDING KEY M-EMP-DEPT
            USING OLD-PAYROLL
                         NEW-PAYROLL
            GIVING EMPLOYEE-FILE.

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.
 
Eg 10.1:
SELECT EMPLOYEE-FILE
   ASSIGN TO “EMP.DAT”
  ORGANIZATION IS LINE SEQUENTIAL
  FILE STATUS IS WS-STATUS.
            :
WORKING-STORAGE SECTION.
01 WS-STATUS                PIC X(2).
 
The possible values that may be placed in the FILE STATUS field when an input or output operation is performed are listed in Appendix – E.
 
OPEN INPUT EMPLOYEE-FILE.
IF WS-STATUS NOT = “00”
     DISPLAY “ERROR OPENING EMPLOYEE FILE”
     STOP RUN.
READ EMPLOYEE-FILE ….
:
:
 


11.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.
  1. Move the control field to a hold area in WORKING-AREA.
  2. 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.
  3. 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.
  1. If required, after all records have been processed perform a control break to print the last control group.


12.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.
 
 
 
 
Eg 12.1:
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.
 
 
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.
 
Eg 12.2:
WRITE IND-EMP-REC
            INVALID KEY
                        PERFORM 2000-ERROR-PARA.
 
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.
 
Eg 12.3:
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.
 

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.
 
Eg 12.4:
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”.
 

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.
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.
 
Eg 12.5:
            SELECT IND-EMP-FILE
              ASSIGN TO “INDEMP.DAT”
              ORGANIZATION IS INDEXED
              ACCESS IS SEQUENTIAL
              RECORD KEY IS I-EMP-NO
  ALTERNATE RECORD KEY IS I-EMP-DEPT WITH DUPLICATES.
 
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.
 
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.
 
Eg 12.6:
MOVE “Y” TO WS-FOUND.
MOVE 1001 TO I-EMP-NO.
START IND-EMP-FILE
            KEY > I-EMP-NO
            INVALID KEY DISPLAY “THERE IS NO EMP NO > 1001”
                                     MOVE “N” TO WS-FOUND.
IF WS-FOUND = “Y”
      READ IND-EMP-FILE
            AT END
              MOVE “Y” TO WS-EOF.
 
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.
 
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 ate 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 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.
 
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.


13.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.
 
Eg 13.1:
01         TEMP-REC.
            05  TEMPERATURE   OCCURS 24 TIMES        PIC S9(3).
 

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.
 
Eg 13.2:
            MOVE TEMPERATURE (2) TO TEMP-OUT.
 
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 upto three levels of OCCURS clauses
 
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.
 
 
 
Eg 13.3:
01 MONTH-NAMES.
      05 STRING-1           PIC X(36) VALUE
            ‘JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC’.
      05 MONTH REDEFINES STRING-1 OCCURS 12 TIMES PIC XXX.
 
The SEARCH statement
                The best method for searching a table is with the use of a SEARCH statement. The identifier used with the SEARCH verb is the table entry name specified on the OCCURS level, not on the 01 level. The WHEN clause indicates what action is to be taken when the condition specified is actually met. Additional comparisons between search and table arguments can be made using other WHEN clauses. The AT END  clause specifies what should be done if the table has been completely searched and no match is found.
                To use a SEARCH statement, two additional entries are required : the INDEXED BY clause along with OCCURS, and the SET statement in the PROCEDURE DIVISION.
Table entries must be specified with an index rather than a subscript. An index is similar to a subscript, but it is defined along with the table entries as part of the OCCURS description.
 
Eg 13.4:
01  SALES-TAX-TABLE,
            05 TABLE-ENTRIES OCCURS 1000 TIMES INDEXED BY X1.
                  10 WS-ZIPCODE            PIC 9(5).
                  10 WS-TAX-RATE         PIC V999.
 
However, unlike a subscript, an index is not defined separately in WORKING-STORAGE. The compiler automatically provides an appropriate PICTURE clause.  An index is processed more efficiently than a subscript, because the index contains the displacement from the start of the table.
A SEARCH statement does not automatically initialize the index at 1 because sometimes we may want to begin searching a table at some point other than the beginning. Initializing an index at  1 must be performed by a SET statement prior to the SEARCH.
 
Eg 13.5:
SET X1 TO 1.
SEARCH TABLE-ENTRIES
   AT END MOVE 0 TO WS-SALES-TAX
WHEN ZIP-IN  = WS-ZIPCODE (X1)
      COMPUTE ........
 
An index can be used to reference an element only in the table or array for which it was defined.
With 2 WHEN clauses, the computer begins by performing the first comparison. Only if the condition in the first WHEN is not met does it test the second WHEN.
To search for multiple matches in a table, it is better to use a PERFORM rather than a SEARCH statement for processing the entire table.
If you have parallel table with CUST-NO-TABLE storing 25 customer numbers and CUST-ARRAY storing the corresponding BAL-DUE for each. In such a case the SEARCH... VARYING can be used.
 
Eg 13.6:
SET X1, X2 TO 1.
SEARCH EACH-CUST-NO VARYING X2
      AT END PERFORM 300-ERR-RTN
      WHEN CUST-NO-IN = EACH-CUST-NO (X1)
      ADD AMT-IN TO BAL-DUE (X2).
 
Binary search
When table entries are arranged in sequence by some field, such as T-CUSTOMER-NO, the most efficient type of look-up is a binary search.  The SEARCH  ALL verb is used to perform a binary search. A SET statement is not necessary with the SEARCH  ALL, since the computer sets the index to the appropriate point initially when each binary search begins.
 
Limitations of the SEARCH  ALL
  1. The condition following the word WHEN can test only for equality.
  2. If the condition following the word WHEN is a compound conditional :
    • Each part of the conditional can only consist of a relational test that involves an equal condition.
    • The only compound condition permitted is with ANDs, not Ors.
  3. Only one WHEN clause can be used with a SEARCH ALL.
  4. The VARYING option may not be used with the SEARCH  ALL.
  5. The OCCURS item and its index, which define the table argument, must appear to the left of the equal sign.
 
Eg 13.7:
 WHEN S-AMT (X1) = AMT1 .....
 
To use the SEARCH  ALL statement, we must indicate which table entry will serve as the key field. The identifier used in the ASCENDING KEY clause must be an entry within the table and it must appear before the INDEXED BY clause.
 
Eg 13.8:
01 TABLE-1.
      05 DISCOUNT-TABLE OCCURS 50 TIMES
            ASCENDING KEY T-CUSTOMER-NO
            INDEXED BY X1.
          10 T-CUSTOMER-NO     PIC 9(4).
          10 T-DISCOUNT-PCT     PIC V999.
 
Eg 13.9:
01 INVENTORY-TABLE.
      05 WAREHOUSE OCCURS 50 TIMES INDEXED BY X1.
            10 ITEM-X OCCURS 100 TIMES INDEXED BY X2.
            15 PART-NO       PIC 9(4).
            15 UNIT-PRICE     PIC 999V99.
 
The identifier used with the SEARCH refers to the lowest-level OCCURS entry.
e.g. SEARCH ITEM-X.
Note that SEARCH ITEM-X increments the lowest-level index only. Hence if X1 is set to 1 initially, the SEARCH will perform a look-up on items in warehouse 1 only, that is (1,1) to (1,100).
To search all warehouses, the major index X1 must be incremented.


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.
 
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 : MAIN.CBL
Eg 14.1a:
        IDENTIFICATION DIVISION.
        PROGRAM-ID. MAIN.
        ENVIRONMENT DIVISION.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
        01 MY-NAME   PIC X(20).
        PROCEDURE DIVISION.
        MAIN.
            DISPLAY "ENTER NAME ".
            ACCEPT MY-NAME.
            CALL "DISP" USING MY-NAME.
            STOP RUN.
 
Called Program : DISP.CBL
Eg 14.1b:
        IDENTIFICATION DIVISION.
        PROGRAM-ID. DISP.
        ENVIRONMENT DIVISION.
        DATA DIVISION.
        LINKAGE SECTION.
        01 NM PIC X(20).
        PROCEDURE DIVISION USING NM.
        MAIN.
            DISPLAY "HELLO " NM.
            EXIT PROGRAM.
 
 
 


15.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.
 
05   NAME.
10  LAST-NAME      PIC X(10) VALUE “EDISON”.
10  FIRST-NAME     PIC X(10) VALUE “THOMAS”.
10  MIDDLE-NAME PIC X(10) VALUE “ALVA”.
01   NAME-OUT             PIC X(33).
 
STRING
      FIRST-NAME DELIMITED BY ‘ ‘
      ‘ ‘ DELIMITED BY SIZE
      MIDDLE-NAME DELIMITED BY ‘ ‘
      ‘ ‘ DELIMITED BY SIZE
      LAST-NAME DELIMITED BY ‘ ‘
      ‘ ‘ DELIMITED BY SIZE
      INTO NAME-OUT.
 
Output
 
NAME-OUT = 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 zero.
 
01  WS-COUNT   PIC 99 VALUE 0.
 
        MOVE 1 TO WS-COUNT.
        STRING FIRST-NAME DELIMITED BY ‘ ‘
                INTO NAME-OUT
                WITH POINTER WS-COUNT.
 
Output
 
WS-COUNT = 6
 
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 NAME-OUT into its components and store them without the commas.
 
MOVE “THOMAS,ALVA,EDISON” TO NAME-OUT.
UNSTRING NAME-OUT
                DELIMITED BY ‘,’
                INTO FIRST-NAME
                                MIDDLE-NAME
                                LAST-NAME.
 
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.
 
01  CTR-1          PIC 9 VALUE 0.
01 WS-NAME  PIC X(10).
 
ACCEPT WS-NAME.
INSPECT WS-NAME TALLYING CTR-1 FOR ALL SPACES.
 
This code will check for the number of spaces in the field WS-NAME and store the value in the field CTR-1.
 
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.
 
 
 
 
 
 
 
 
 
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.
 
 


               

COBOL 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

                RECORD  CONTAINS  integer-1 TO integer-2 CHARACTERS

BLOCK   CONTAINS  integer-1  RECORDS .

                DATA RECORDS ARE RECORD1, RECORD2, RECORD3…….

 

 

  1. RECORD-NAME-1.
    05 FIELD-1.
    05 FIELD-2.
    05 FIELD-3.
     
    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
                                    [ 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  ...



 


                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

                               

                                  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

 

                [ 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 ]

 

 

 

 

 

 

5 comments :

  1. Cobol program to use DEPENDING ON in OCCURS Clause. (Dynamic array)

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO-WORLD.

    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 WS-TABLE1.
    05 VAR1 OCCURS 0 TO 10 TIMES DEPENDING ON C PIC X.

    01 WS-TABLE2.
    05 VAR2 OCCURS 10 TIMES PIC X.

    77 C PIC 999.
    77 I PIC 99.

    PROCEDURE DIVISION.
    MOVE '12345ABCDE' TO WS-TABLE2.
    MOVE LENGTH WS-TABLE2 TO C

    PERFORM VARYING I FROM 1 BY 1 UNTIL I > C
    MOVE VAR2 (I) TO VAR1(I)
    END-PERFORM

    PERFORM VARYING I FROM 1 BY 1 UNTIL I > C
    DISPLAY VAR1 (I)
    END-PERFORM

    STOP RUN.


    OUTPOT:
    1
    2
    3
    4
    5
    A
    B
    C
    D
    E

    ReplyDelete
  2. Cobol program to find an element in a table.!

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO-WORLD.

    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 TABLE1.
    05 F PIC X(12) VALUE '101 KLMN 100'.
    05 F PIC X(12) VALUE '102 ABC 200'.
    05 F PIC X(12) VALUE '103 XYZM 300'.

    01 REF-TABLE REDEFINES TABLE1.
    05 R-TABLE OCCURS 3 TIMES INDEXED BY I.
    10 E-ID PIC X(3).
    10 FILLER PIC X.
    10 ENAME PIC X(4).
    10 FILLER PIC X.
    10 ESAL PIC X(3).

    77 X PIC X(3).

    PROCEDURE DIVISION.

    DISPLAY 'TABLE DATA:'
    MOVE TABLE1 TO REF-TABLE.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I>3
    DISPLAY E-ID(I) '|' ENAME(I) '|' ESAL(I)
    END-PERFORM

    DISPLAY 'SEARCH ELEMENT:'
    MOVE '102' TO X.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I>3
    IF E-ID(I) = X
    DISPLAY E-ID(I) '|' ENAME(I) '|' ESAL(I)
    END-IF
    END-PERFORM

    STOP RUN.

    --------------------------------------------------------
    TABLE DATA:
    101|KLMN|100
    102|ABC |200
    103|XYZM|300

    SEARCH ELEMENT:
    102|ABC |200

    ReplyDelete
  3. Cobol program to print transpose of a matrix.!

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO-WORLD.

    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 TABLE1.
    05 R OCCURS 3 TIMES.
    06 C OCCURS 3 TIMES.
    10 X PIC X(1).
    77 I PIC 9.
    77 J PIC 9.
    77 A PIC 9 VALUE 0.
    01 DISP.
    05 Y PIC X OCCURS 6 TIMES.

    PROCEDURE DIVISION.

    DISPLAY 'MATRIX ELEMENTS:'
    MOVE '1234567890' TO TABLE1.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I>3
    PERFORM VARYING J FROM 1 BY 1 UNTIL J>3
    ADD +1 TO A MOVE X(I,J) TO Y(A)
    ADD +1 TO A MOVE ' ' TO Y(A)
    END-PERFORM
    IF A = 6 DISPLAY DISP MOVE ZERO TO A END-IF
    END-PERFORM

    DISPLAY 'TRANSPOSE OF MATRIX:'
    MOVE '1234567890' TO TABLE1.
    PERFORM VARYING I FROM 3 BY -1 UNTIL I=0
    PERFORM VARYING J FROM 3 BY -1 UNTIL J=0
    ADD +1 TO A MOVE X(I,J) TO Y(A)
    ADD +1 TO A MOVE ' ' TO Y(A)
    END-PERFORM
    IF A = 6 DISPLAY DISP MOVE ZERO TO A END-IF
    END-PERFORM

    STOP RUN.

    -------------------------------
    OUTPUT:
    -------------------------------
    Matrix elements:
    1 2 3
    4 5 6
    7 8 9
    Transpose of matrix:
    9 8 7
    6 5 4
    3 2 1

    ReplyDelete
  4. PROGRAM TO SEARCH AN ELEMENT IN A TABLE USING SEARCH STATEMENT.!

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO-WORLD.

    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 TABLE1.
    05 SEQ-NO PIC 9(1) OCCURS 10 TIMES INDEXED BY I.

    PROCEDURE DIVISION.
    MOVE '0123456789' TO TABLE1.
    DISPLAY 'SEARCH ELEMENT IS: ' SEQ-NO (10).

    SEARCH SEQ-NO AT END DISPLAY 'NOT FOUND'
    WHEN SEQ-NO (I) = SEQ-NO (10) DISPLAY 'ELEMENT FOUND: ' SEQ-NO (I).

    STOP RUN.

    -------------
    OUTPUT:
    -------------
    SEARCH ELEMENT IS: 9
    ELEMENT FOUND: 9

    ReplyDelete
  5. PROGRAM TO SEARCH AND ELEMENT IN A TABLE USING 'SEARCH ALL' STATEMENT.!

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO-WORLD.

    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 TABLE1.
    05 SEQ-NO PIC 9(1) OCCURS 10 TIMES ASCENDING KEY IS SEQ-NO INDEXED BY I.

    PROCEDURE DIVISION.
    MOVE '0123456789' TO TABLE1.
    DISPLAY 'SEARCH ELEMENT IS: ' SEQ-NO (6).

    SEARCH ALL SEQ-NO
    AT END DISPLAY 'NOT FOUND'
    WHEN SEQ-NO (I) = SEQ-NO (6)
    DISPLAY 'ELEMENT FOUND: ' SEQ-NO (I)
    END-SEARCH.

    STOP RUN.

    -------------------------------
    OUTPUT:
    SEARCH ELEMENT IS: 5
    ELEMENT FOUND: 5
    -------------------------------

    ReplyDelete