You are on page 1of 204

COBOL Concepts

David Woolbright 2008

Enterprise Cobol for z\OS


IBM Documentation: http://www3.ibm.com/software/awdtools/cobol/zos/library Java interoperability supported by new objectoriented syntax. Compatibility with WebSphere tools. XML support. Unicode support. Enhancements to z/OS and OS/390 UNIX System Services support for tolerating threads and asynchronous signals. CICS translator integration.

Program Organization
Program Section Paragraph Sentence Clause Word

Grammatical Hierarchy
The grammatical hierarchy follows this form: Identification division
Paragraphs
Entries
Clauses

Environment division
Sections
Paragraphs
Entries Clauses Phrases

Data division
Sections
Entries
Clauses Phrases

Procedure division
Sections
Paragraphs
Sentences Statements Phrases

Coding Rules
Cols 1-6 left blank. Compiler fills in with sequence numbers Col 7 - * means comment line Cols 8-11 A margin Cols 12-72 B margin Cols 73-80 unused

Things That Go in Area A


Area A items: Division headers Section headers Paragraph headers or paragraph names Level indicators or level-numbers (01 and 77) DECLARATIVES and END DECLARATIVES End program, end class, and end method markers

Things That Go in Area B


Area B items: Entries, sentences, statements, and clauses Continuation lines

Things That Go in A or B
Area A or B Level-numbers Comment lines Compiler-directing statements Debugging lines Pseudo-text

Structure of a Program
IDENTIFICATION DIVISION ENVIRONMENT DIVISION DATA DIVISION PROCEDURE DIVISION

IDENTIFICATION DIVISION
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. AUTHOR. JOE SMITH. INSTALLATION. TSYS. DATE-WRITTEN. 12/03/2004. DATE-COMPILED. 12/03/2004. (Only PROGRAM-ID is required.)

ENVIRONMENT DIVISION
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MSTRFILE ASSIGN TO MSTRFILE SELECT CUSTOMER-FILE ASSIGN TO CUSTMAST ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS COSTOMER-KEY FILE STATUS IS CUSTOMER-FILE-STATUS.

DATA DIVISION
Used to create variables and constant fields Only three data types
numeric PIC 99999. alphanumeric (text/string) alphabetic PIC AAA. PIC XXX.

Level numbers indicate subordination of fields. Use levels 01-49

Level Numbers
Group item a subdivided field Elementary item a non-subdivided field 01 Group or independent item Higher numbers indicate subordinate fields 66, 77, 88 have special significance 66 used to rename (no longer used) 77 an independent item 88 condition name

Level Numbers
01 XXX. 05 YYY. 10 AAA PIC X. 10 BBB PIC X. 05 ZZZ PIC X(20). 77 AAA PIC 999V99.

Level Numbers
01 TRAN-CODE PIC X. 88 GOOD VALUE G. 88 BAD VALUE B. 88 INDIFFERENT VALUE I. SET GOOD TO TRUE IF (GOOD)

Picture Clauses
Picture clause values usually use 9, X, V, S, A 9 a decimal digit X any alphanumeric character V an implied decimal point S a sign A A-Z, and blank

Picture Clauses
PIC 9(6) PIC 9(6)V99 PIC 999999V99 PICTURE X(10) PIC XXXXXXXXXX PIC S9(4)V9(4) PIC S9999V9999 PIC 9(18)

Numeric Edited Fields


XXXBXXBXXXX 99/99/99 ZZ,ZZZ.99DB ***,***.99 ----.99 $$$9.99 99999.99

DATA DIVISION
Define data used in input-output operations (FILE SECTION). FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-MASTER. 05 CUST-NUM PIC 9(2). 05 CUST-FNAME PIC X(20). 05 CUST-LNAME PIC X(20). FD SALES-REPORT. 01 REPORT-AREA PIC X(132).

Data Formats
COMPUTATIONAL or COMP BINARY PACKED-DECIMAL BINARY 05 XDATA PIC S9(5) PACKED-DECIMAL. 05 YDATA PIC S9(4) BINARY.

EBCDIC
EBCDIC is an IBM format for storing alphanumeric characters A - XC1 J - XD1 B - XC2 K - XD2 S XE2 C - XC3 L - XD3 T XE3 D - XC4 M - XD4 U XE4 E - XC5 N - XD5 V XE5 F - XC6 O - XD6 W XE6 G - XC7 P - XD7 X XE7 H - XC8 Q - XD8 Y XE8 I - XC9 R - XD9 Z XE9

EBCDIC
EBCDIC is an IBM format for storing alphanumeric characters 0 - XF0 SPACE X40 1 XF1 . - X4B 2 - XF2 , - X6B 3 XF3 * - X5C 4 - XF4 - X60 5 XF5 6 - XF6 7 XF7 8 XF8 9 XF9

BINARY DATA
Stored in 2s Complement format Leftmost bit is a sign ( 0 +, 1 - ) If the number is positive, interpret it as plain binary 01011 = 8 + 2 + 1 = + 11 If the number is negative, compute the complement Invert. (Change all 1s to 0s and 0s to 1s.) Add 1. The result is the additive complement 10011 is a negative number. Inverting we have 01100. Adding 1 we have 01100 + 1 = 01101. This is a positive number. 01101 8 + 4 + 1 = 13, so the original number is -13.

BINARY DATA
Declaring a data field as BINARY causes the data to be stored in 2s complement format.
01 X-FIELD PIC S9(4) BINARY VALUE -1 . X-FIELD will contain 1111111111111111 = XFFFF. Binary data is processed in a register

PACKED-DECIMAL DATA
Defining a field to be PACKED-DECIMAL or Computational-3 causes the data to be stored internally in a packed decimal format. In packed decimal, there are 2 decimal digits stored in each byte. A sign is stored in the rightmost nibble. (C +, D -)
Y-FIELD PIC S999 VALUE -23 PACKED-DECIMAL.

produces a 2 byte field containing X023D Most business arithmetic occurs in packed decimal.

ZONED-DECIMAL DATA
A numeric field which is described as DISPLAY, or in which the usage clause is omitted, is stored in a zoned decimal format. In zoned decimal, each digit takes up one byte, and a sign is stored in the zone portion of the rightmost byte of the field. Z-FIELD PIC S999 VALUE -32 produces a 3 byte field containing XF0F3D2.

DATA DIVISION
Define data developed for internal processing: To have storage be statically allocated and exist for the life of the run unit (WORKING-STORAGE SECTION). WORKING-STORAGE SECTION. 01 TOTAL-FIELDS. 05 CUST-TOTAL PIC S9(7)V99 VALUE 0. 05 COST-TOTAL PIC S9(7)V99 VALUE 0. 01 DATE-AND-TIME. 05 CD-YEAR PIC 9999. 05 CD-MONTH PIC 99.

DATA RELATIONSHIPS
BINARY

PACKEDDECIMAL

CHARACTER or ALPHANUMERIC

ZONEDDECIMAL

DATA DIVISION
Describe data from another program or storage you want to associate with a symbolic name (LINKAGE SECTION).

LINKAGE SECTION. 01 LK-DATA-AREA 05 NAME PIC X(40). 05 AGE PIC 999.

DATA DIVISION
To have storage be allocated each time a program is entered, and deallocated on return from the program (LOCALSTORAGE SECTION). LOCAL-STORAGE SECTION. 01 CUST-NO PIC X(3). 01 COST PIC 9(5)V99.

Initialization of Storage
WORKING-STORAGE for programs is allocated at the start of the run unit. Any data items with VALUE clauses are initialized to the appropriate value at that time. For the duration of the run unit, WORKING-STORAGE items persist in their last-used state. Exceptions are: A program with INITIAL specified in the PROGRAM-ID paragraph In this case, WORKING-STORAGE data items are reinitialized each time that the program is entered. A subprogram that is dynamically called and then canceled In this case, WORKING-STORAGE data items are reinitialized on the first reentry into the program following the CANCEL.

Group and Data Items


01 Customer-Record. 05 Customer-Name. 10 Last-Name Pic x(17). 10 Filler Pic x. 10 Initials Pic xx. 05 Part-Order. 10 Part-Name Pic x(15). 10 Part-Color Pic x(10).

REDEFINES
01 MONTH-NAMES. 05 STRING-1 PIC X(15) VALUE JANFEBMARAPRMAY. 05 MONTH REDEFINES STRING-1 OCCURS 5 TIMES PIC XXX.

REDEFINES
05 AMOUNT PIC ZZ9.9-. 05 AMOUNTX REDEFINES AMOUNT PIC X(6). 10 X PIC 9(5). 10 Y REDEFINES X. 20 A PIC X(3). 20 B PIC X (2).

Literals
String Literals enclosed in quotes MOVE INVALID" To CUST-NAME Numeric literals without quotes MOVE 19 TO CUST-AGE Hexadecimal literals with X MOVE XAF3B TO CUST-CODE

Constants
A constant is a data item that has only one value. COBOL does not define a construct specifically for constants.
Data Division. 01 Report-Header pic x(50) value "Company Report". 01 Interest pic 9v9999 value 1.0265.

Figurative Constants
ZERO SPACE HIGH-VALUE LOW-VALUE QUOTE NULL ALL

Tables (Arrays)
A table is a set of logically consecutive data items that you define in the DATA DIVISION by using the OCCURS clause. 01 TABLE. 05 TABLE-ENTRY OCCURS 10 TIMES. 10 NUM PIC 99. 10 NAME PIC X(30). 10 ITEM PIC X(5) OCCURS 3 TIMES.

Valid References with subscripts: TABLE-ENTRY(SUB) TABLE NUM(SUB) NAME(SUB) ITEM(SUB1,SUB2)

Subscripts vs Indexes
Subscripts are defined separately from the table definitions. Subscripts are numeric fields choose BINARY fields for efficiency Subscripts can be easily printed Subscripts represent an occurrence number Indexes are created when a table is defined Indexes manipulated with SET statements Indexes are generally more efficient than subscripts Indexes represent offsets from the beginning of the table

Tables with Indexes


01 TABLE. 05 TABLE-ENTRY OCCURS 10 TIMES INDEXED BY SUB1. 10 NUM PIC 99. 10 NAME PIC X(30). 10 ITEM PIC X(5) OCCURS 3 TIMES INDEXED BY SUB2. Valid References with subscripts: TABLE-ENTRY(SUB1) TABLE NUM(SUB1) NAME(SUB1) ITEM(SUB1,SUB2)

Subscripts and Indexes


In a two-dimensional table, the two subscripts correspond to the row and column numbers. In a three-dimensional table, the three subscripts correspond to the depth, row, and column numbers. Indexes use address computation to efficiently reference items in a table.

PROCEDURE DIVISION
The PROCEDURE DIVISION is where you code the executable statements in your COBOL program Divided into Paragraphs (terminated with periods): 100-MAIN. DISPLAY HELLO PERFORM 200-SUB GOBACK . 200-SUB. DISPLAY WORLD! .

PROCEDURE DIVISION
The period is a statement terminator We will code in a period-less style Use periods to end a paragraph name, only To resolve ambiguity caused by not using periods, we will use statement delimiters: END-IF, END-PERFORM, END-COMPUTE, ETC.

DISPLAY

DISPLAY
Handy for debugging and simple report creation DISPLAY X Y Z DISPLAY A = A

MOVE

MOVE STATEMENT
Used to copy data from one field to another Example MOVE X-FIELD TO Y-FIELD Z-FIELD Data is copied from the sending field to the receiving field

MOVE STATEMENT
The two fields should be compatible but dont have to be identical. Compatible moves: -alphanumeric to alphanumeric -numeric to numeric -numeric to numeric edited -alphanumeric to numeric if the sending field is an unsigned integer -alphanumeric to numeric edited if the sending field is an unsigned integer -numeric to alphanumeric if the sending field is an unsigned integer -numeric edited fields can be sent to numeric and numeric edited fields this causes a de-edit process to occur -numeric edited fields can be sent to alphanumeric and alphanumeric edited fields this causes a de-edit process to occur

MOVE STATEMENT
Moving data can cause data conversions to occur. 01 X PIC S9(4) BINARY. 01 Y PIC S9(5) PACKED-DECIMAL. MOVE X TO Y

MOVE STATEMENT
If the receiving field is larger than the sending field, the receiving field is filled with leading 0s in a numeric move. If the receiving field is larger than the sending field, the receiving field is filled with trailing spaces in a alphanumeric move. If the receiving field is smaller than the sending field, data will be truncated on the left for numeric moves and on the right for alphanumeric moves

Use Move for Assignment


X01 WORK. 05 A-FIELD PIC X(3). 05 B-FIELD PIC S999V99. MOVE ABC TO A-FIELD MOVE 123.45 TO B-FIELD MOVE LOW-VALUE TO WORK

Assignment is Sophisticated
Consider the following move: 01 A 01 B 01 C PIC PIC PIC S999V99. ZZ9.99-. S9(5)V9999 PACKED-DECIMAL.

MOVE A TO B MOVE A TO C

MOVE CORRESPONDING
MOVE CORRESPONDING CORR identifier-1 TO identifier-2

Both identifiers must name group items. Elementary items with the same name are moved. 01 A-GROUP. 01 B-GROUP. 05 W PIC X(3). 05 W PIC X(3). 05 X PIC X(2). 05 X PIC X(2). 05 Y PIC 999. 05 Y PIC 999. MOVE CORRESPONDING A-GROUP TO B-GROUP

MOVE CORRESPONDING
Subordinate items must not be identified by the keyword FILLER No reference modification for either identifier Subordinate items must not include a REDEFINES, RENAMES, OCCURS, INDEX or POINTER description 01 A-GROUP. 01 B-GROUP. 05 W PIC X(3). 05 P PIC X(3). 05 X PIC X(2). 05 X PIC X(2). 05 Y PIC 999. 05 W PIC 999. MOVE CORRESPONDING A-GROUP TO B-GROUP

INITIALIZE

INITIALIZE
SPACE is the implied sending item for receiving items of category alphabetic, alphanumeric, alphanumeric-edited, DBCS, national, or national-edited. ZERO is the implied sending item for receiving items of category numeric or numeric-edited.

INITIALIZE
01 PRICE-FIELDS. 05 UNIT-PRICE PIC 9(5)V9(2). 05 DISCOUNT PIC V9(2). 05 UNIT-CODE PIC XX. 05 SALES-PRICE PIC 9(5)V9(2). ... INITIALIZE PRICE-FIELDS

ADD

ADD Semantics
All identifiers or literals that precede the keyword TO are added together, and this sum is added to and stored in identifier-2. This process is repeated for each successive occurrence of identifier-2 in the left-to-right order in which identifier-2 is specified. ADD X Y Z TO P Q Before X=1,Y=2, Z=3, P=4, Q=6 After X=1,Y=2, Z=3, P=10, Q=12

ADD EXAMPLES
ADD X TO Y ADD X Y Z TO P ADD X Y TO P Q ADD 1 TO Z ADD X TO Y ROUNDED ADD X TO Y ON SIZE ERROR DISPLAY ADD ERROR END-ADD

ADD GIVING

ADDGIVING Semantics
All identifiers or literals that precede the keyword TO are added together, and this sum is added to identifier-2 to obtain a temporary sum. (Identifier-2 is unchanged) The the temporary sum is moved to identifier-3. ADD X Y Z TO V GIVING P Before X=1,Y=2, Z=3, V=4, P=6 After X=1,Y=2, Z=3, V=4, P=10

SUBTRACT

SUBTRACT
All identifiers or literals preceding the keyword FROM are added together and their sum is subtracted from and stored immediately in identifier-2. This process is repeated for each successive occurrence of identifier-2, in the leftto-right order in which identifier-2 is specified. SUBTRACT X Y FROM P Q Before: X=1,Y=2, P=3,Q=4 After: X=1,Y=2, P=0,Q=1

SUBTRACT

SUBTRACT Semantics
All identifiers or literals preceding the keyword FROM are added together and their sum is subtracted from identifier-2 to obtain a temporary value which is moved to identifier-3. SUBTRACT X Y FROM P GIVING Q Before: X=1,Y=2,P=5,Q=6 After: X=1,Y=2,P=5,Q=3

MULTIPLY

MULTIPLY Semantics
In format 1, the value of identifier-1 or literal-1 is multiplied by the value of identifier-2; the product is then placed in identifier-2. For each successive occurrence of identifier-2, the multiplication takes place in the left-to-right order in which identifier-2 is specified. MULTIPLY X BY P Q Before: X=2,P=4,Q=5 After: X=2,P=8,Q=10

MULTIPLY

MULTIPLY
In format 2, the value of identifier-1 or literal-1 is multiplied by the value of identifier-2 or literal-2. The product is then stored in the data items referenced by identifier-3. Identifier-2 is unchanged. MULTIPLY X BY Y GIVING Z Before: X=2, Y=3, Z=4 After: X=2, Y=3, Z=6

DIVIDE

DIVIDE
In format 1, the value of identifier-1 or literal-1 is divided into the value of identifier-2, and the quotient is then stored in identifier-2. For each successive occurrence of identifier-2, the division takes place in the left-to-right order in which identifier-2 is specified. DIVIDE X INTO Y Z Before: X=3, Y=7, Z=12 After: X=3, Y=2, Z=4

DIVIDE

DIVIDE
In format 2, the value of identifier-1 or literal-1 is divided into the value of identifier-2 or literal-2. The value of the quotient is stored in each data item referenced by identifier-3. DIVIDE X INTO Y GIVING Z Before: X = 2, Y = 13, Z = 1 After: X = 2, Y = 13, Z = 6

DIVIDE

DIVIDE
In format 3, the value of identifier-1 or literal-1 is divided by the value of identifier2 or literal-2. The value of the quotient is stored in each data item referenced by identifier-3. DIVIDE X BY Y GIVING Z Before: X = 10, Y = 3, Z = 1 After: X = 10, Y = 3, Z = 3

DIVIDE

DIVIDE
In format 4, the value of identifier-1 or literal-1 is divided into identifier-2 or literal-2. The value of the quotient is stored in identifier-3, and the value of the remainder is stored in identifier-4. DIVIDE X INTO Y GIVING Z REMAINDER R Before: X = 2, Y = 9, Z = 8, R = 7 After: X = 2, Y = 9, Z = 4, R = 1

COMPUTE

COMPUTE
COMPUTE can be used to initialize a numeric field Usually reserved for nontrivial computations. For simple computations choose ADD, SUBTRACT, MULTIPLY or DIVIDE S9(4)V9 PACKED DECIMAL.

05 X PIC

COMPUTE X ROUNDED = (A + B) / 2.3 ON SIZE ERROR DISPLAY X WAS TRUNCATED END-COMPUTE

Arithmetic Operators
+ is Addition - is Subtraction * is Multiplication / is Division ** is Exponentiation ( ) provide precedence. Always parenthesize! ((X + Y) * ( Z ** 3))

Locate Mode I/O


Your Program

Input Buffers Region

Output Buffers

Move Mode I/O


READ MYFILE INTO MYREC WRITE RECOUT FROM MYREC 01 MYREC PIC X(80).

Input Buffers Region

Output Buffers

QSAM FILE OPERATIONS


ENVIRONMENT DIVISION. INPUT-OUTPUT-SECTION. FILE-CONTROL. SELECT MY-INPUT-FILE ASSIGN TO MASTER FILE STATUS IS MAST-STAT . DATA DIVISION. FILE SECTION. FD MY-INPUT-FILE 01 RECORD-AREA PIC X(80). MY-INPUT-FILE Internal file name MASTER External DD name MAST-STAT A two byte PIC XX field in which the operating system returns a status code. Consult IBM Language Reference page 315 for status code details.

QSAM
Queued Sequential Access Method For input files, records are buffered when the file is OPENed For output, records are buffered before being written Records are processed from the beginning record sequentially to the end of the file Very efficient access method for sequential files Sometimes referred to as flat files

QSAM FILE OPERATIONS


Every file must be OPENed before it can be processed. Opening a QSAM Input file queues records for subsequent read operations OPEN INPUT MY-INPUT-FILE OPEN OUTPUT MY-OUTPUT-FILE Files should be closed when you have finished processing the records CLOSE MY-FILE

OPEN

CLOSE

READ

QSAM File Operations


Remember: READ a file, WRITE a record. READ MY-INPUT-FILE AT END MOVE NO TO MORE-RECS END-READ This is a locate-mode read and the most efficient way to read records

File Reading
READ MY-INPUT-FILE INTO MY-REC AT END MOVE NO TO MORE-RECS END-READ WRITE This is a move-mode read and the least efficient way to deliver records

QSAM File Operations


WRITE A RECORD! WRITE MY-RECORD This is a locate-mode write. WRITE MY-RECORD FROM REC-BUFF END-WRITE This is a move-mode write. CLOSE MY-OUTPUT-FILE CLOSE MY-INPUT-FILE

SEQUENTIAL FILE READ PATTERN PRIMING


READ MYFILE AT END MOVE N TO MORE-RECS END-READ PERFORM UNTIL MORE-RECS = N (process a record code) READ MYFILE AT END MOVE N TO MORE-RECS END-READ END-PERFORM
PRIMING READ READ

CONTINUATION READ

File Status Codes


00 normal 10 end of file 2x invalid key 3x permanent i/o error 4x logic error 9x unsuccessful operation

Exercise #1
Create a file of 80 byte records Each record has 3 fields AFIELD ZONED DECIMAL 4 DIGITS 2 DECIMALS BFIELD PACKED DECIMAL 7 DIGITS 3 DECIMALS CFIELD - PACKED DECIMAL 7 DIGITS 1 DECIMAL Print a report with a column for each field and a column for the computed value : (AFIELD + BFIELD)/ CFIELD Print the result with 2 decimals rounded. Total each column.

FLOW OF CONTROL
There is a theoretical result in Computer Science by Boehm and Jacopini that states that only 3 control structures are required to write any program Sequence - do this, now do this Selection - If x something is true do this, else do that Repetition do this until something happens Practice has shown that being able to create procedures is helpful in overcoming complexity, but they arent strictly necessary One implication is that GO TOs arent needed

FLOW OF CONTROL
F ? T T F

IF

IF
The condition is tested and either the true or false blocks are selected for execution Dont use NEXT SENTENCE if you are using END-IF as the delimiter. (Use of NEXT SENTENCE causes execution to continue with the next closest period.)

IF Examples
IF X < Y ADD 1 TO X DISPLAY AAA ELSE DISPLAY BBB END-IF IF X > Y DISPLAY X WAS BIGGER END-IF

NESTED IFs
Each ELSE is matched with the nearest preceding IF IF X < Y DISPLAY XXX IF Y < Z DISPLAY ZZZ ELSE DISPLAY AAA END-IF MORAL: INDENT PROPERLY, TERMINATE ALL IF STATEMENTS WITH END-IF

EVALUATE

EVALUATE
EVALUATE PLANET-NUMBER WHEN 1 MOVE "Mercury" TO PLANET-NAME WHEN 2 MOVE "Venus " TO PLANET-NAME WHEN 3 MOVE "Earth " TO PLANET-NAME WHEN 4 MOVE "Mars " TO PLANET-NAME WHEN 5 MOVE "Jupiter" TO PLANET-NAME WHEN 6 MOVE "Saturn " TO PLANET-NAME WHEN 7 MOVE "Uranus " TO PLANET-NAME WHEN 8 MOVE "Neptune" TO PLANET-NAME WHEN 9 MOVE "Pluto " TO PLANET-NAME WHEN OTHER MOVE " " TO PLANET-NAME END-EVALUATE.

EVALUATE
EVALUATE PLANET-NAME WHEN "Mercury" WHEN "Venus " WHEN "Earth " WHEN "Mars " WHEN "Jupiter" WHEN "Saturn " WHEN "Uranus " WHEN "Neptune" WHEN "Pluto " WHEN OTHER END-EVALUATE. MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE 1 2 3 4 5 6 7 8 9 0 TO TO TO TO TO TO TO TO TO TO PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER

EVALUATE
EVALUATE TRUE WHEN PLANET-NAME = "Mercury" MOVE 1 TO PLANET-NUMBER WHEN PLANET-NAME = "Venus " MOVE 2 TO PLANET-NUMBER WHEN PLANET-NAME = "Earth " MOVE 3 TO PLANET-NUMBER WHEN PLANET-NAME = "Mars " MOVE 4 TO PLANET-NUMBER WHEN PLANET-NAME = "Jupiter" MOVE 5 TO PLANET-NUMBER WHEN PLANET-NAME = "Saturn " MOVE 6 TO PLANET-NUMBER WHEN PLANET-NAME = "Uranus " MOVE 7 TO PLANET-NUMBER WHEN PLANET-NAME = "Neptune" MOVE 8 TO PLANET-NUMBER WHEN PLANET-NAME = "Pluto " MOVE 9 TO PLANET-NUMBER WHEN OTHER MOVE 0 TO PLANET-NUMBER END-EVALUATE.

EVALUATE
EVALUATE Qty ALSO TRUE ALSO Member WHEN 1 THRU 5 ALSO VOP < 501 ALSO "Y" MOVE 2 TO Discount WHEN 6 THRU 16 ALSO VOP < 501 ALSO "Y" MOVE 3 TO Discount WHEN 17 THRU 99 ALSO VOP < 501 ALSO "Y" MOVE 5 TO Discount WHEN 1 THRU 5 ALSO VOP < 2001 ALSO "Y" MOVE 7 TO Discount WHEN 6 THRU 16 ALSO VOP < 2001 ALSO "Y" MOVE 12 TO Discount WHEN 17 THRU 99 ALSO VOP < 2001 ALSO "Y" MOVE 18 TO Discount WHEN 1 THRU 5 ALSO VOP > 2000 ALSO "Y" MOVE 10 TO Discount WHEN 6 THRU 16 ALSO VOP > 2000 ALSO "Y" MOVE 23 TO Discount END-EVALUATE

EVALUATE
EVALUATE TRUE ALSO Position WHEN L-Arrow ALSO 2 THRU 10 SUBTRACT 1 FROM Position WHEN R-Arrow ALSO 1 THRU 9 ADD 1 TO Position WHEN L-Arrow ALSO 1 MOVE 10 TO Position WHEN R-Arrow ALSO 10 MOVE 1 TO Position WHEN DelKey ALSO ANY PERFORM DeleteChar WHEN Char ALSO 1 THRU 9 PERFORM InsertChar ADD 1 TO Position WHEN Char ALSO 10 PERFORM InsertChar WHEN OTHER PERFORM DisplayErrorMessage END-EVALUATE

PERFORM

PERFORM Paragraph
PERFORM paragraph name
Execute all instructions in the paragraph Return control to the next instruction after the PERFORM

PERFORM 100-ROUTINE PERFORM 200-ROUTINE PERFORM 100-ROUTINE 100-ROUTINE. 200-ROUTINE. 300-ROUTINE.

PERFORM THRU
I view use of PERFORMTHRU as an older, unnecessary style. This is an opinion. PERFORM paragraph name THRU paragraph name PERFORM 100-RTN THRU 300-RTN. 100-RTN. 200-RTN. 300-RTN. 400-RTN.

PERFORM 100-XXX THUR 100-XXX-EXIT 100-XXX. DISPLAY IN 100-XXX. 100-XXX-EXIT. EXIT. There is an implicit EXIT in every paragraph.

PERFORM WITH TIMES

PERFORM x TIMES
MOVE 5 TO COUNT PERFORM COUNT TIMES DISPLAY XXX END-PERFORM PERFORM 100-DISPLAY COUNT TIMES

PERFORM UNTIL

PERFORM UNTIL
MOVE 0 TO X PERFORM UNTIL X > 10 MOVE X TO X-EDITED DISPLAY X-EDITED ADD 1 TO X END-PERFORM PERFORM X-PARA UNTIL X > 10 PERFORM X-PARA WITH TEST AFTER UNTIL X > 10

PERFORM VARYING

Inline Perform
PERFORM VARYING X FROM 1 BY 1 UNTIL X > 100 DISPLAY X END-PERFORM PRINTS 1 2 3 100

Inline PERFORM
PERFORM VARYING X FROM 5 BY -1 UNTIL X =0 DISPLAY X END-PERFORM PRINTS 5 4 3 2 1 0

Inline PERFORM
MOVE 10 TO X PERFORM WITH TEST AFTER UNTIL X = 0 DISPLAY X SUBTRACT 1 FROM X END-PERFORM

PERFORM PARAGRAPH
PERFORM 100-RTN WITH TEST AFTER VARYING X FROM 1 BY 1 UNTIL X = 100 100-RTN. .

Inline PERFORM
MOVE ZERO TO Y PERFORM UNTIL X = 0 READ AT END MOVE 0 TO X ADD X TO Y DISPLAY Y END-PERFORM

Alternate PERFORM
PERFORM 100-PARA VARYING I FROM 1 BY 1 UNTIL I > 5 AFTER J FROM 1 BY 1 UNTIL J > 3 END-PERFORM 100-PARA. DISPLAY I J . 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 4 1

Table Processing with Subscripts


01 TOT PIC S9(8) PACKED DECIMAL. 01 SUB1 PIC 99. 01 TEMP-REC. 05 TEMP OCCURS 12 TIMES PIC S9(4). MOVE 0 TO TOT PERFORM VARYING SUB1 FROM 1 BY 1 UNTIL SUB1 > 12 ADD TEMP(SUB1) TO TOT ENDPERFORM

Table Processing with Indexes


01 TOT PIC S9(8) PACKED DECIMAL. 01 TEMP-REC. 05 TEMP OCCURS 12 TIMES INDEXED BY K PIC S9(4). MOVE 0 TO TOT PERFORM VARYING K FROM 1 BY 1 UNTIL K > 12 ADD TEMP(K) TO TOT END-PERFORM

Manipulating Indexes
Indexes cant be manipulated with ordinary arithmetic commands. Instead use SET. SET K TO 3 SET K UP BY 1 SET K UP BY 2 SET K DOWN BY 3

CONTINUE

Used to indicate that no operation is present.

EXIT

Sometimes used to provide a common endpoint to a series of paragraphs. (Unnecessary in my opinion since each paragraph contains an implicit exit.) 100-PARA. DISPLAY X . 100-PARA-EXIT. EXIT .

STOP

Usually used to permanently halt execution of a program Can be used to temporarily halt execution and require operator intervention

GOBACK

Functions like an EXIT PROGRAM when coded at the end of a called program Functions like STOP RUN when coded in a main program I prefer coding this in place of STOP RUN

GO TO

Causes an unconditional jump in program execution to the procedure that is named. This statement should be used only in very special situations, for instance, to branch to an error routine that terminates the program from a deeply nested area of your program. Overuse of this statement is unnecessary and leads to spaghetti code Dont even think of using the alternate forms of GO TO : Computed and Altered!

Exercise #2
Create a file of 80 byte records Each record has 3 fields CUSTlNAME CHARACTER 15 CUSTFNAME - CHARACTER 15 BALANCE - PACKED DECIMAL 5 BYTES 2 DECIMALS Table the file data using subscripts. Sort the table with a bubble sort on customer name. Print the sorted table: Last Name First Name Balance

Exercise #3
Repeat Exercise #2 using indexes

SEQUENTIAL SEARCH

SEARCH
Search performs a sequential search with an index Rule of thumb: Use for tables with 20 items or less 01 SALES-TAX. 05 TAB-ENTRIES OCCURS 20 TIMES INDEXED BY K. 10 ZIPCODE PIC 9(5). 10 RATE PIC V999. SET K TO 1 SEARCH TAB-ENTRIES AT END MOVE 0 TO TAX WHEN ZIPIN = ZIPCODE(K) COMPUTE TAX = RATE(K) * AMOUNT END-SEARCH

Exercise #4
Read the file from exercise #3 Store the data in a table Read the file BCST.SICCC01.PDSLIB(DAT4EXER). Each record has a LAST NAME, FIRST NAME field: Last name columns 1 15 First name columns 16 30 Code a Sequential Search statement to find each name in the file. Print each name, Found or Not Found, and the customer balance if found.

SEARCH ALL

SEARCH ALL
SEARCH ALL performs a binary search with an index ENTRIES MUST BE IN ORDER No SET necessary (whole table searched) 01 SALES-TAX. 05 TAB-ENTRIES OCCURS 100 TIMES ASCENDING KEY ZIPCODE INDEXED BY K. 10 ZIPCODE PIC 9(5). 10 RATE PIC V999. SEARCH ALL TAB-ENTRIES AT END MOVE 0 TO TAX WHEN ZIPCODE(K) = ZIPIN COMPUTE TAX = RATE(K) * AMOUNT END-SEARCH

SEARCH ALL CONSTRAINTS


The condition following WHEN must test for equality Compound conditions with ANDs not Ors Only one WHEN clause VARYING not allowed OCCURS item and its index must appear on the left of the equal sign
WHEN TEMP(K) = 80

SEARCH ALL Constraints


Table must indicate ASCENDING or DESCENDING KEY 01 TABLE. 05 CUST-REC OCCURS 40 TIMES ASCENDING KEY CUST INDEXED BY K. 10 CUST PIC 9(4). 10 RATE PIC V999.

Exercise #5
Read the file from exercise #3 Store the data in a table Read the file BCST.SICCC01.PDSLIB(DAT4EXER). Each record has a LAST NAME FIRST NAME field Last name columns 1 15 First name columns 16 30 Code a Binary Search statement to find each name in the file. Print each name, Found or Not Found, and the customer balance if found.

STRING

STRING
Used to build string expressions by concatenation (blanks not stored) STRING FNAME DELIMITED BY MNAME DELIMITED BY LNAME DELIMITED BY INTO NAME-OUT

STRING
Blanks stored DELIMITED BY SIZE means include the entire literal or variable contents STRING FNAME DELIMITED BY DELIMITED BY SIZE MNAME DELIMITED BY DELIMITED BY SIZE LNAME DELIMITED BY DELIMITED BY SIZE INTO NAME-OUT

STRING

UNSTRING

UNSTRING
Separates a string into several component strings Sending field must be numeric UNSTRING NAME DELIMITED BY , INTO LNAME FNAME MI END-UNSTRING

UNSTRING
UNSTRING JCL-DATA DELIMITED BY ALL SPACES OR ALL ',' INTO WS-DATE-REQUESTED WS-DATE1 WS-DATE2 END-UNSTRING

Exercise #6
Read the file BCST.SICCC01.PDSLIB(STRINGS) Print the first name, middle initial, and last names in columns

Exercise #7
Read the file BCST.SICCC01.PDSLIB(STRINGS1) Print the digits followed by the letters. Use / as the delimiter of the two fields.

CALL

Static and Dynamic Call


Programs A and B that are linked together prior to being loaded are statically linked. If A calls B, the call is static If programs A and B are separately compiled and linked, A can call B dynamically: 01 PGMNAME PIC X(8) VALUE B. CALL PGMNAME

Calling Other Programs Statically


CALL literal program name USING identifier-1, Examples CALL CUST1030 USING X,Y CALL PROG1000

CALLING ANOTHER PROGRAM


CALL PROGXXXX USING A,B IDENTIFICATION DIVISION. PROGRAM-ID. PROGXXXX. LINKAGE SECTION. 01 X PIC X(5). 01 Y PIC 999V99. PROCEDURE DIVISION USING X,Y. GOBACK .

Static and Dynamic CALLS


Two methods for generating dynamic calls 1. Call MYPROG USING X,Y,Z (Using an identifier insures a dynamic call.) 2. DYNAM/NODYNAM compiler option determines whether a static or dynamic call occurs 3. At TSYS all calls are dynamic.

Exercise #8
Write a main program that, 1) Prints I am in the main program, 2) Calls your subprogram, 3) Prints I am back in the main program Write a subprogram that prints I am in the subprogram. Compile and link the programs, execute the main program

Exercise #9
Write a main program that passes 3 packed decimal numbers to a subprogram and a fourth variable in which to receive a result. Write a subprogram that accepts the 3 integers, computes their sum and returns the answer to the main Have the main print the result

Exercise #10
Write a main program that passes a variable X by reference and Y by content Have the subprogram add one to both numbers Have the main program print X and Y after returning from the subprogram

NUMERIC Class Test


Before using a suspect field that has a PIC of 9s, use the NUMERIC class test to verify the field before doing arithmetic IF AMOUNT-IN IS NUMERIC ADD 1 TO AMOUNT-IN ELSE DISPLAY AMOUNT IS NOT NUMERIC END-IF

Sign Test
Numeric data can be tested for positive, negative, and zero values IF AMOUNT-IN IS POSITIVE ADD 1 TO AMOUNT-IN END-IF IF AMOUNT-IN IS NEGATIVE DISPLAY AMOUNT-IN END-IF IF AMOUNT-IN IS ZERO DISPLAY THE FIELD IS ZERO END-IF

INSPECT (TALLYING)

INSPECT (TALLYING)
INSPECT MYLINE TALLYING ECOUNT FOR ALL E AFTER INITIAL START" BEFORE INITIAL END END-INSPECT INSPECT WORK TALLYING COUNT1 FOR LEADING * COUNT2 FOR CHARACTERS END-INSPECT INSPECT WORK TALLYING COUNT1 FOR ALL * BEFORE . COUNT2 FOR ALL CHARACTERS AFTER . END-INSPECT

INSPECT (REPLACING)

INSPECT (REPLACING)
INSPECT MYDATA REPLACING ALL X" BY Y AFTER INITIAL A" BEFORE INITIAL Z INSPECT MYDATA REPLACING LEADING " BY + INSPECT MYDATA REPLACING ALL A" BY + AFTER INITIAL X" INSPECT MYDATA REPLACING FIRST A" BY +" AFTER INITIAL A" BEFORE INITIAL Z INSPECT MYDATA REPLACING ALL AAAA" BY ZZZZ"

INSPECT (CONVERTING)

INSPECT (CONVERTING)
INSPECT TEXTLINE CONVERTING "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ" INSPECT FIELDA CONVERTING 1234567890 TO ABCDEFGHIJ

REFERENCE MODIFICATION
05 Allows you to process PIC 9 and PIC X fields as if they were an array of characters. FIELDNAME(start pos : [ length]) FIELDA PIC X(7) VALUE ABCDEFG. ABC BC DEFG

FIELDA(1:3) FIELDA(2:2) FIELDA(4: )

Qualification of Names
COBOL allows the same variable name to be used to define fields in different records or group items. Duplicate names must be qualified when they are referenced 01 XFIELD. 05 YFIELD. 10 ZFIELD PIC X(3). If ZFIELD is a duplicate name it can be qualified in two ways: ZFIELD OF YFIELD ZFIELD OF XFIELD

Intrinsic Functions
COBOL does not permit user-defined functions or procedures Intrinsic (built-in) Functions can be used in your programs Three broad categories of intrinsic functions: date functions, numeric functions and string functions.

Intrinsic Functions
Intrinsic Function values are replaced in the position where they occur by the function result. In COBOL, an Intrinsic Function is a temporary data item whose value is determined at the time the function is executed. Functions that return a number value (numeric & integer) are always considered to be signed. A function that returns a number value can be used only in an arithmetic expression or as the source of a MOVE statement.

Intrinsic Functions
Intrinsic function pattern: FUNCTION FunctionName(Parameters) FunctionName is the name of the function and Parameters is one or more parameters supplied to the function. COMPUTE NUM = FUNCTION RANDOM(99) MOVE FUNCTION REVERSE(ABCD) TO NAME

Sample Intrinsic Functions


CHAR(PosInt) AlphanumericReturns the character at ordinal position PosInt of the collating sequence. ORD(Alph) IntegerReturns the ordinal position of character Alph. ORD-MAX({Any}...) IntegerReturns the ordinal position of whichever of the parameters has the highest value. All parameters must be of the same type. The parameter list may be replaced by an array. ORD-MIN({Any}...) IntegerReturns the ordinal position of whichever of the parameters has the lowest value. All parameters must be of the same type.

Intrinsic Functions
REVERSE(Alph) Alphanumeric Returns a character string with the characters in Alph reversed. LOWER-CASE(Alph) Alphanumeric Returns a character string with the characters in Alph changed to their lower case equivalents. UPPER-CASE(Alph) Alphanumeric Returns a character string with the characters in Alph changed to their upper case equivalents

Date Intrinsic Functions


CURRENT-DATE - Returns a 21 character string representing the current date and time DATE-OF-INTEGER(PosInt) - Returns the yyyymmdd (standard date) equivalent of the integer date - PosInt. The integer date is the number of days that have passed since Dec 31st 1600 in the Gregorian Calendar.

Math Intrinsic Functions


MAX({Any}...)Return type on type of Any. Takes a parameter list and returns the content of whichever parameter contains the maximum value. The returned type depends upon the parameter types as follows; Alphanumeric if parameters are Alphabetic or Alphnumeric. Integer if all are integer. Numeric if all are Numeric. An array may be used instead of the parameter list.

Math Intrinsic Functions


SQRT(Num) Returns an approximation of the square root of Num. STANDARD-DEVIATION({Num}...) Returns an approximation of the standard deviation of its parameters. And many others

Condition Names
01 NO-OF-NEIGHBORS PIC 9. 88 JUST-RIGHT VALUE 2 THRU 3. 88 TOO-FEW VALUE 0 THRU 1. 88 TOO-MANY VALUE 4 THRU 8. 01 MARITAL-STATUS PIC X. 88 VALID-STATUS VALUE S M D W.

Variable Length Tables


01 TCOUNT PIC S9(3) PACKED-DECIMAL. 01 STATE-TABLE. 05 ST-GROUP OCCURS 1 TO 100 TIMES DEPENDING ON TCOUNT ASCENDING KEY IS ZIP INDEXED BY NDX. 10 ZIP PIC X(5). 10 RATE PIC V9999.

Loading a Variable Length Table


PERFORM WITH TEST AFTER VARYING NDX FROM 1 BY 1 UNTIL PTABLE-EOF OR NDX = 100 PERFORM FILE-READ IF NOT PTABLE-EOF MOVE ZIP-IN TO ZIP(NDX) MOVE RATE-IN TO RATE(NDX) ELSE SET NDX DOWN BY 1 SET TCOUNT TO NDX END-IF END-PERFORM

Exercise #11
Read the file BCST.SICCC01.PDSLIB(STATES) Store the data in a variable length table Read the file BCST.SICCC01.PDSLIB(COBDATA4). Each record has a 2 digit state code and a 5 byte zip code. For each record in this file print a record on a report. The report will have the following format:

GA 31907 GEORGIA - VALID ZIP AND STATE CA 90003 CALIFORNIA - INVALID ZIP ZD 30002 INVALID STATE Capitalize the state name found in the table. Print message next to each state name separated by a dash. Use the SEARCH command perform a sequential search of the table for each look up. After the program is working, modify it to perform a binary search with SEARCH ALL

Files with Multiple Record Types


FD TransFile. 01 InsertRec. 02 RECI 02 STUDENTIDI 02 STUDENTNAME. 03 SURNAME 03 INITIALS 02 DOB. 03 YOBIRTH 03 MOBIRTH 03 DOBIRTH 02 COURSECODE 02 GENDER 01 DELETEREC. 02 RECD 02 STUDENTIDD 01 UpdateRec. 02 STUDENTIDU 02 NEWCOURSECODE PIC X. PIC 9(7). PIC X(8). PIC XX. PIC PIC PIC PIC PIC 9(4). 99. 99. X(4). X.

PIC X. PIC 9(7). PIC 9(7). PIC X(4).

Multiple O1 File Descriptions


Any number of 01 record descriptions can be coded with the FD Only one buffer is used no matter how many record descriptions have been coded Record fields cant be referenced before the file is opened or after it is closed With multiple record formats, there needs to be a fixed field to indicate the record type Value clauses are only used for 88 level items

Writing With Carriage Control

Variable Length Records


The RECORD IS VARYING IN SIZE clause specifies a file containing variable length records.

Variable Length Records


The RecordSize number in the DEPENDING ON phase must be an elementary unsigned integer data-item declared in the WORKING-STORAGE SECTION. FD TRANFILE RECORD IS VARYING IN SIZE FROM 1 TO 80 CHARACTERS DEPENDING ON RECSIZE.

Variable Length Record Processing


When writing a variable length record, the size of the record must be placed in the RecordSize variable before the WRITE is issued. When reading a variable length record, the length of the record is delivered into the RecordSize variable. The 01 Record description must be long enough to accommodate the largest record

Variable length Record Processing


FD TRANFILE RECORD IS VARYING IN SIZE FROM 1 TO 80 CHARACTERS DEPENDING ON RECSIZE. 01 TRANREC PIC X(80). 88 END-OF-RECS VALUE HIGH-VALUES. WORKING-STORAGE SECTION. 01 RECSIZE PIC 99. READ TRANFILE AT END DISPLAY TRANREC(1:RECSIZE)

Writing Variable Length Records


Many variable length records have a fixed front end, and varying numbers of segments FD CUST RECORD IS VARYING IN SIZE FROM 28 TO 408 CHARACTERS DEPENDING ON RECORD-LEN. 01 CUST-REC. 05 ROOT-SEG. 10 CUST-NO PIC X(6). 10 INVOICE-COUNT PIC S99. 05 INVOICE-SEGMENT OCCURS 20 TIMES INDEXED BY NDX 10 INVOICE-DATE PIC X(8). 10 INVOICE-NO PIC X(5). 10 INVOICE-AMT PIC S9(5)V99. YOU MUST SET THE RECORD-LEN BEFORE WRITING RECORD!

Alternative
FD CUSTFILE RECORD CONTAINS 20 TO 80 CHARACTERS 01 REC. 05 FIXED-PART PIC X(20). 10 05 VARY-PART OCCURS 1 TO 6 TIMES DEPENDING ON COUNT INDEXED BY NDX Count has to be initialized at the time of writing the record

Reading Variable Length Records


FD CUST RECORD IS VARYING IN SIZE FROM 28 TO 408 CHARACTERS. 01 CUST-REC. 05 ROOT-SEG. 10 CUST-NO PIC X(6). 10 INVOICE-COUNT PIC S99. 05 INVOICE-SEGMENT OCCURS 20 TIMES INDEXED BY NDX 10 INVOICE-DATE PIC X(8). 10 INVOICE-NO PIC X(5). 10 INVOICE-AMT PIC S9(5)V99. PERFORM VARYING NDX FROM 1 BY 1 UNTIL NDX > INVOICE-COUNT ADD INVOICE-AMT(NDX) TO AMT-OWED END-PERFORM

EXERCISE #12
Each A record for a given customer is followed by one to five B records for that customer. For each A record, write out one variable length record that contains the A record as the fixed part and the associated B records as the variable parts

EXERCISE #13
BCST.SICCC01.PDSLIB(COBDATA5) CONTAINS TWO TYPES OF 80 BYTE RECORDS : RECORD TYPE A 1 BYTE TYPE CODE PIC X CONTAINING A 5 BYTE CUSTOMER ID PIC X(5) RECORD TYPE B 1 BYTE TYPE CODE PIC X CONTAINING B 5 BYTE PART NUMBER PIC X(5) 6 BYTE COST PIC 9(4)V99

EXERCISE #14
Read the variable length records you created in exercise #5. Produce a report similar to the one below: CUSTOMER ID PART # COST 10030 22322 1,333.34 23444 3.44 50043 98.77 TOTAL 1435.55 20030 22322 1,333.34 23444 3.44 50043 98.77 TOTAL 1435.55

KSDS FILE CREATION


SELECT INVMAST ASSIGN TO INVMAST ORGANIZATION IS INDEXED ACCESS IS RANDOM RECORD KEY IS ITEM-NO FILE STATUS IS FILE-STAT. FD INVMAST 01 RECORD-AREA. 05 ITEM-NO PIC X(5) 05 PIC X(75). WORKING-STORAGE SECTION 01 FILE-STAT PIC X(2).

KSDS File Commands


OPEN INPUT file-name OPEN OUTPUT file-name READ file-name [NEXT] RECORD [INTO data-area] [AT END imperative] [NOT AT END imperative] [END-READ]

KSDS File Commands


WRITE record [FROM]] data-name] [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-WRITE] REWRITE record [FROM]] data-name] [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-REWRITE] CLOSE file-name

KSDS File Statements


START file-name KEY IS = data-name > >= [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-START]

KSDS File Statements


DELETE file-name RECORD [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-DELETE]

Exercise #15
Read BCST.SICCC01.PDSLIB(COBDATA6) COL 1-5 KEY COL 6-25 NAME Allocate a KSDS with record size 25 and a key field in cols 1-5 Write out a KSDS record for each record in the file. Write out the records sequentially.

Exercise #16
Read BCST.SICCC01.PDSLIB(COBDATA7) COL 1-5 KEY Read a KSDS record (randomly) for each record in the file. Write out the names you find sequentially. If the record doesnt exist, print a message Not Found

Nested Programs
1) 2) 3) 4) COBOL programs can be nested. There are many advantages for doing this: The monolithic working storage of most COBOL programs leads to difficulty in debugging because all data is global Nested programs break the working storage into smaller areas that can only be accessed by programs that need access. Nested programs provide for parameter passing by techniques found in all modern languages (by value, by reference) There is no execution degradation because of nested programs. In fact, calling a nested program is more efficient than calling a separately compiled program.

Nested Programs
Calling a nested program is as efficient as performing a paragraph Nested programs provide design flexibility and encourage good program design A nested program would be called a function or subroutine in any other language Nested programs unleash the power of COBOL pointers and allow COBOL programmers to design data structures that encourage efficient programming techniques

Nested Programs
PROGRAM-ID. MAIN. PROGRAM-ID. SUB1. END PROGRAM SUB1. PROGRAM-ID. SUB2 END PROGRAM SUB2. END PROGRAM MAIN.

COBOL Pointers
05 PTR1 USAGE IS POINTER. 05 PTR2-P USAGE IS POINTER VALUE NULL. SET PTR1 TO ADDRESS OF LINKAGE-THING SET PTR2 TO PTR1 LINKAGE SECTION. 01 NAME-STRUCTURE. 05 FIRST-NAME PIC X(18). 05 LAST-NAME PIC X(26). SET ADDRESS OF NAME-STRUCTURE TO EXAMPLE-P.

COBOL Pointers
IF PTR1 NOT = NULL AND PTR1 NOT = PTR2 PERFORM 2730-SOMETHING END-IF

SYNCHRONIZED
The SYNCHRONIZED clause is sometimes used with USAGE IS COMP or USAGE IS INDEX items. It is used to optimize speed of processing but it does so at the expense of increased storage requirements. The word SYNC can be used instead of SYNCHRONIZED SYNCHRONIZED causes slack bytes to be generated when needed.