Title: COBOL Concepts
1COBOL Concepts
2Enterprise Cobol for z\OS
- IBM Documentation
- http//www-3.ibm.com/software/awdtools/cobol/zos/l
ibrary - Java interoperability supported by new
object-oriented 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.
3Program Organization
- Program
- Section
- Paragraph
- Sentence
- Clause
- Word
4Grammatical 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
5Coding 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
6Things 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
7Things That Go in Area B
- Area B items
- Entries, sentences, statements, and clauses
- Continuation lines
8Things That Go in A or B
- Area A or B
- Level-numbers
- Comment lines
- Compiler-directing statements
- Debugging lines
- Pseudo-text
9Structure of a Program
- IDENTIFICATION DIVISION
- ENVIRONMENT DIVISION
- DATA DIVISION
- PROCEDURE DIVISION
10IDENTIFICATION 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.)
11ENVIRONMENT 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. -
-
12DATA DIVISION
- Used to create variables and constant fields
- Only three data types
- numeric PIC 99999.
- alphanumeric (text/string) PIC XXX.
- alphabetic PIC AAA.
- Level numbers indicate subordination of fields.
Use levels 01-49
13Level 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
14Level Numbers
- 01 XXX.
- 05 YYY.
- 10 AAA PIC X.
- 10 BBB PIC X.
- 05 ZZZ PIC X(20).
- 77 AAA PIC 999V99.
-
15Level Numbers
- 01 TRAN-CODE PIC X.
- 88 GOOD VALUE G.
- 88 BAD VALUE B.
- 88 INDIFFERENT VALUE I.
-
- SET GOOD TO TRUE
-
- IF (GOOD)
16Picture 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
17 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)
18Numeric Edited Fields
- XXXBXXBXXXX
- 99/99/99
- ZZ,ZZZ.99DB
- ,.99
- ----.99
- 9.99
- 99999.99
19DATA 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).
20Data Formats
- COMPUTATIONAL or COMP BINARY
- PACKED-DECIMAL
- BINARY
- 05 XDATA PIC S9(5) PACKED-DECIMAL.
- 05 YDATA PIC S9(4) BINARY.
21EBCDIC
- 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
-
22EBCDIC
- 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
23BINARY 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.
24BINARY 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
25PACKED-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.
26ZONED-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.
27DATA 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.
28DATA RELATIONSHIPS
BINARY
PACKED-DECIMAL
CHARACTER or ALPHANUMERIC
ZONED-DECIMAL
29DATA 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.
30DATA DIVISION
- To have storage be allocated each time
- a program is entered, and deallocated on
- return from the program (LOCAL-STORAGE SECTION).
- LOCAL-STORAGE SECTION.
- 01 CUST-NO PIC X(3).
- 01 COST PIC 9(5)V99.
31Initialization 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.
32Group 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).
33REDEFINES
- 01 MONTH-NAMES.
- 05 STRING-1 PIC X(15)
- VALUE JANFEBMARAPRMAY.
- 05 MONTH REDEFINES STRING-1
- OCCURS 5 TIMES PIC XXX.
34REDEFINES
- 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).
35Literals
- 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
36Constants
- 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.
37Figurative Constants
- ZERO
- SPACE
- HIGH-VALUE
- LOW-VALUE
- QUOTE
- NULL
- ALL
38Tables (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)
-
39Subscripts 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
40Tables 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)
41Subscripts 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.
42PROCEDURE 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!
- GOBACK
- .
43PROCEDURE 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.
44DISPLAY
45DISPLAY
- Handy for debugging and simple report creation
- DISPLAY X Y Z
- DISPLAY A A
46MOVE
47MOVE 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
48MOVE 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
49MOVE 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
50MOVE 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
51Use 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
52Assignment is Sophisticated
- Consider the following move
- 01 A PIC S999V99.
- 01 B PIC ZZ9.99-.
- 01 C PIC S9(5)V9999
- PACKED-DECIMAL.
- MOVE A TO B
- MOVE A TO C
53MOVE CORRESPONDING
- MOVE CORRESPONDING identifier-1 TO
identifier-2 - CORR
- 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
54MOVE 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
55INITIALIZE
56INITIALIZE
- 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.
57INITIALIZE
- 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
58ADD
59ADD 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
60ADD GIVING
61ADDGIVING
- 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. - The values of the operands that precede the word
GIVING are added together, and the sum is stored
as the new value of each data item referenced by
identifier-3. - ADD X Y Z TO V GIVING P
- Before X1,Y2,Z3,V4,W5,P6
- After X1,Y2,Z3,V10,W11,P21
62SUBTRACT
63SUBTRACT
- 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
left-to-right order in which identifier-2 is
specified. - SUBTRACT X Y FROM P Q
- Before X1,Y2, P3,Q4
- After X1,Y2, P0,Q1
64SUBTRACT
65SUBTRACT
- All identifiers or literals preceding the keyword
FROM are added together and their sum is
subtracted from identifier-2 or literal-2. The
result of the subtraction is stored as the new
value of each data item referenced by
identifier-3. - SUBTRACT X Y FROM P GIVING Q
- Before X1,Y2,P5,Q6
- After X1,Y2,P2,Q2
66MULTIPLY
67MULTIPLY
- 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 X2,P4,Q5
- After X2,P8,Q10
68MULTIPLY
69MULTIPLY
- 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. - MULTIPLY X BY Y GIVING Z
- Before X2, Y3, Z4
- After X2, Y3, Z6
70DIVIDE
71DIVIDE
- 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 X3, Y7, Z12
- After X3, Y2, Z4
72DIVIDE
73DIVIDE
- 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
74DIVIDE
75DIVIDE
- In format 3, the value of identifier-1 or
literal-1 is divided by 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 BY Y GIVING Z
- Before X 10, Y 3, Z 1
- After X 10, Y 3, Z 3
76DIVIDE
77DIVIDE
- 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
78COMPUTE
79COMPUTE
- COMPUTE can be used to initialize a numeric field
- Usually reserved for nontrivial computations.
For simple computations choose ADD, SUBTRACT,
MULTIPLY or DIVIDE - 05 X PIC S9(4)V9 PACKED DECIMAL.
- COMPUTE X ROUNDED (A B) / 2.3
- ON SIZE ERROR
- DISPLAY X WAS TRUNCATED
- END-COMPUTE
80Arithmetic Operators
- is Addition
- - is Subtraction
- is Multiplication
- / is Division
- is Exponentiation
- ( ) provide precedence. Always parenthesize!
- ((X Y) ( Z 3))
81Locate Mode I/O
Your Program
Input Buffers
Output Buffers
Region
82Move Mode I/O
READ MYFILE INTO MYREC WRITE RECOUT FROM MYREC
01 MYREC PIC X(80).
Input Buffers
Output Buffers
Region
83QSAM 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.
84QSAM
- 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
85QSAM 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
86OPEN
87CLOSE
88READ
89QSAM 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
90File 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
91QSAM 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
92SEQUENTIAL FILE READ PATTERN
PRIMING READ
PRIMING READ
- 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
CONTINUATION READ
93File Status Codes
- 00 normal
- 10 end of file
- 2x invalid key
- 3x permanent i/o error
- 4x logic error
- 9x unsuccessful operation
94Exercise 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.
95FLOW OF CONTROL
- There is a theoretical result in Computer Science
by Boehm and Jacopini that states 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
96FLOW OF CONTROL
F
?
T
T
F
97IF
98IF
- 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.)
99IF Examples
- IF X
- ADD 1 TO X
- DISPLAY AAA
- ELSE
- DISPLAY BBB
- END-IF
- IF X Y
- DISPLAY X WAS BIGGER
- END-IF
100NESTED IFs
- Each ELSE is matched with the nearest preceding
IF - IF X
- DISPLAY XXX
- IF Y
- DISPLAY ZZZ
- ELSE
- DISPLAY AAA
- END-IF
- MORAL INDENT PROPERLY, TERMINATE ALL IF
STATEMENTS WITH END-IF
101EVALUATE
102EVALUATE
- 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.
103EVALUATE
- EVALUATE PLANET-NAME
- WHEN "Mercury" MOVE 1 TO PLANET-NUMBER
- WHEN "Venus " MOVE 2 TO PLANET-NUMBER
- WHEN "Earth " MOVE 3 TO PLANET-NUMBER
- WHEN "Mars " MOVE 4 TO PLANET-NUMBER
- WHEN "Jupiter" MOVE 5 TO PLANET-NUMBER
- WHEN "Saturn " MOVE 6 TO PLANET-NUMBER
- WHEN "Uranus " MOVE 7 TO PLANET-NUMBER
- WHEN "Neptune" MOVE 8 TO PLANET-NUMBER
- WHEN "Pluto " MOVE 9 TO PLANET-NUMBER
- WHEN OTHER MOVE 0 TO PLANET-NUMBER
- END-EVALUATE.
104EVALUATE
- 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.
105EVALUATE
- EVALUATE Qty ALSO TRUE ALSO Member
- WHEN 1 THRU 5 ALSO VOP
- MOVE 2 TO Discount
- WHEN 6 THRU 16 ALSO VOP
- MOVE 3 TO Discount
- WHEN 17 THRU 99 ALSO VOP
- MOVE 5 TO Discount
- WHEN 1 THRU 5 ALSO VOP
- MOVE 7 TO Discount
- WHEN 6 THRU 16 ALSO VOP
- MOVE 12 TO Discount
- WHEN 17 THRU 99 ALSO VOP
- 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
106EVALUATE
- 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
107PERFORM
108PERFORM 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.
109PERFORM 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.
110PERFORM WITH TIMES
111PERFORM x TIMES
- MOVE 5 TO COUNT
- PERFORM COUNT TIMES
- DISPLAY XXX
- END-PERFORM
112PERFORM UNTIL
113PERFORM 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
-
114PERFORM VARYING
115Inline Perform
- PERFORM VARYING X FROM 1 BY 1
- UNTIL X 100
- DISPLAY X
- END-PERFORM
- PRINTS
- 1
- 2
- 3
-
- 100
116Inline PERFORM
- PERFORM VARYING X FROM 5 BY -1
- UNTIL X 0
- DISPLAY X
- END-PERFORM
- PRINTS
- 5
- 4
- 3
- 2
- 1
- 0
117Inline PERFORM
- MOVE 10 TO X
- PERFORM WITH TEST AFTER
- UNTIL X 0
- DISPLAY X
- SUBTRACT 1 FROM X
- END-PERFORM
118PERFORM PARAGRAPH
- PERFORM 100-RTN
- WITH TEST AFTER
- VARYING X FROM 1 BY 1
- UNTIL X 100
-
- 100-RTN.
- .
119Inline PERFORM
- MOVE ZERO TO Y
- PERFORM UNTIL X 0
- READ AT END MOVE 0 TO X
- ADD X TO Y
- DISPLAY Y
- END-PERFORM
120Alternate 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
121Table 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
122Table 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
123Manipulating 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
124CONTINUE
Used to indicate that no operation is present.
125EXIT
- 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
- .
126STOP
- Usually used to permanently halt execution of a
program - Can be used to temporarily halt execution and
require operator intervention
127GOBACK
- 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
128GO 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!
129Exercise 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
130Exercise 3
- Repeat Exercise 2 using indexes
131SEQUENTIAL SEARCH
132SEARCH
- 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
133Exercise 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.
134SEARCH ALL
135SEARCH 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
136SEARCH 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
137SEARCH 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.
138Exercise 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.
139STRING
140STRING
- Used to build string expressions by concatenation
(blanks not stored) - STRING FNAME DELIMITED BY
- MNAME DELIMITED BY
- LNAME DELIMITED BY
- INTO NAME-OUT
141STRING
- 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
142STRING
143UNSTRING
144UNSTRING
- Separates a string into several component
strings - Sending field must be numeric
- UNSTRING NAME
- DELIMITED BY ,
- INTO LNAME
- FNAME
- MI
- END-UNSTRING
145UNSTRING
- UNSTRING JCL-DATA
- DELIMITED BY ALL SPACES OR ALL ','
- INTO WS-DATE-REQUESTED
- WS-DATE1
- WS-DATE2
- END-UNSTRING
146Exercise 6
- Read the file BCST.SICCC01.PDSLIB(STRINGS)
- Print the first name, middle initial, and last
names in columns
147Exercise 7
- Read the file BCST.SICCC01.PDSLIB(STRINGS1)
- Print the digits followed by the letters. Use
/ as the delimiter of the two fields. -
148CALL
149Static 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
150Calling Other Programs Statically
- CALL literal program name
- USING identifier-1,
- Examples
- CALL CUST1030 USING X,Y
- CALL PROG1000
151CALLING 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
- .
152Static and Dynamic CALLS
- Two methods for generating dynamic calls
- Call MYPROG USING X,Y,Z
- (Using an identifier insures a dynamic
call.) - DYNAM/NODYNAM compiler option determines whether
a static or dynamic call occurs - At TSYS all calls are dynamic.
153Exercise 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
154Exercise 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
155Exercise 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
156NUMERIC 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
157Sign 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
158INSPECT (TALLYING)
159INSPECT (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
160INSPECT (REPLACING)
161INSPECT (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"
162INSPECT (CONVERTING)
163INSPECT (CONVERTING)
- INSPECT TEXTLINE CONVERTING "abcdefghijklmnopqrstu
vwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - INSPECT FIELDA CONVERTING
- 1234567890 TO ABCDEFGHIJ
164REFERENCE MODIFICATION
- Allows you to process PIC 9 and PIC X fields as
if they were an array of characters. - FIELDNAME(start pos length)
- 05 FIELDA PIC X(7) VALUE ABCDEFG.
- FIELDA(13) ? ABC
- FIELDA(22) ? BC
- FIELDA(4 ) ? DEFG
165Qualification 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
-
166Intrinsic 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.
167Intrinsic 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.
168Intrinsic 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. - MOVE FUNCTION RANDOM(99) TO NUM
- MOVE FUNCTION REVERSE(ABCD) TO
- NAME
169Sample 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.
170Intrinsic 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
171Date 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.
172Math 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.
173Math 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
174Condition 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.
175Variable 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.
-
176Loading 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
177Exercise 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
178Files with Multiple Record Types
- FD TransFile.
- 01 InsertRec.
- 02 RECI PIC X.
- 02 STUDENTIDI PIC 9(7).
- 02 STUDENTNAME.
- 03 SURNAME PIC X(8).
- 03 INITIALS PIC XX.
- 02 DOB.
- 03 YOBIRTH PIC 9(4).
- 03 MOBIRTH PIC 99.
- 03 DOBIRTH PIC 99.
- 02 COURSECODE PIC X(4).
- 02 GENDER PIC X.
- 01 DELETEREC.
- 02 RECD PIC X.
- 02 STUDENTIDD PIC 9(7).
- 01 UpdateRec.
- 02 STUDENTIDU PIC 9(7).
- 02 NEWCOURSECODE PIC X(4).
179Multiple 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
180Writing With Carriage Control
181Variable Length Records
- The RECORD IS VARYING IN SIZE clause specifies a
file containing variable length records.
182Variable 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.
183Variable 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
184Variable 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(1RECSIZE)
185Writing 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!
186Alternative
- 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 -
187Reading 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
188EXERCISE 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
189EXERCISE 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
190EXERCISE 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
-
191KSDS 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).
192KSDS 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
193KSDS 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
194KSDS File Statements
- START file-name
- KEY IS data-name
-
-
- INVALID KEY imperative
- NOT INVALID KEY imperative
- END-START
-
195KSDS File Statements
- DELETE file-name RECORD
- INVALID KEY imperative
- NOT INVALID KEY imperative
- END-DELETE
196Exercise 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.
197Exercise 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
198Nested Programs
- 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 i