SlideShare a Scribd company logo
1 of 254
Enterprise COBOL Concepts
Dr. David Woolbright
woolbright_david@columbusstate.edu
2013
Why Cobol?
• Billions of lines of existing code with more
added each year
• Designed for business
• Great compilers
• Runs fast
• Relatively simple to learn
• The language keeps evolving
Enterprise Cobol for zOS
IBM COBOL:
• http://www-01.ibm.com/software/awdtools/cobol/zos/
IBM COBOL Documentation:
• http://www-01.ibm.com/software/awdtools/cobol/zos/library/
Languagage Reference
• http://publibfp.boulder.ibm.com/epubs/pdf/igy3lr50.pdf
Programming Guide
• http://publibfp.boulder.ibm.com/epubs/pdf/igy3pg50.pdf
Program Organization
• Program – Organized like a book
• Division – Identification, Environment, Data, Procedure
• Section
• Paragraph
• Sentence
• Clause
• Phrase
• 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 – Usually blank,* means comment line, - is continuation, D for
debugging lines
• Cols 8-11 – “A” margin or Area A
• Cols 12-72 – “B” margin or Area B
• Cols 73-80 – unused
• 1 2 3 4 5 6|7| 8 9 10 11|12 13 …71 71 |
Seq Nos | | Area A | Area B |
Continuation of Statements
• Statements can be continued on the next
line in Area B
Continuation of Literals
• Continue the constant through column 71
• Put a “-” in column 7
• Continue constant with a ‘ OR “
• Continue constant in area B
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
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
AUTHOR. JOE SMITH.
INSTALLATION. TSYS.
DATE-WRITTEN. 12/03/2011.
DATE-COMPILED. 12/03/2011.
• Only PROGRAM-ID is required
• Some interesting parms can be coded on the
PROGRAM-ID
ENVIRONMENT DIVISION
This division connects external DD file names with internal
file names.
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.
Internal File
Name
External DD
File Name
DATA 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
• Alphabetic is seldom used
Level Numbers
• Group item – a subdivided field
• Elementary item – a non-subdivided field
• 01 – Group or independent item
• Higher numbers indicate subordinate fields
Level Numbers
• 66, 77, 88 have special significance
• 66 – Used to rename (no longer used)
• 77 – An independent item (choose 01)
• 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.
Condition Names
• 01 TRAN-CODE PIC X.
88 GOOD VALUE ‘G’.
88 BAD VALUE ‘B’.
88 INDIFFERENT VALUE ‘I’.
…
SET GOOD TO TRUE
…
IF (GOOD) …
Equivalent to MOVE ‘G’ TO TRAN-CODE
Equivalent to IF TRAN-CODE = ‘G’
Level 88
Condition Names
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
USAGE Clause
• Specifies the format in which data is stored in
memory
• Normally, the phrase “USAGE IS” is omitted
01 COST USAGE IS PACKED-DECIMAL PIC S9(5).
01 COST PACKED-DECIMAL PIC S9(5).
01 FIRST-NAME USAGE IS DISPLAY PIC X(20).
01 FIRST-NAME PIC X(20).
DATA DIVISION
We define data used in input-output operations.
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
Older terms: Modern terms:
• COMPUTATIONAL BINARY
• COMP BINARY
• COMP-1 FLOATING POINT
• COMP-2 FLOATING POINT
• COMP-3 PACKED-DECIMAL
• COMP-4 BINARY
• COMP-5 BINARY (NATIVE)
05 XDATA PIC S9(5) PACKED-DECIMAL.
05 YDATA PIC S9(4) BINARY.
EBCDIC
• EBCDIC is an IBM format for storing alphanumeric
characters
A - X’C1’ J - X’D1’
B - X’C2’ K - X’D2’ S – X’E2’
C - X’C3’ L - X’D3’ T – X’E3’
D - X’C4’ M - X’D4’ U – X’E4’
E - X’C5’ N - X’D5’ V – X’E5’
F - X’C6’ O - X’D6’ W – X’E6’
G - X’C7’ P - X’D7’ X – X’E7’
H - X’C8’ Q - X’D8’ Y – X’E8’
I - X’C9’ R - X’D9’ Z – X’E9’
EBCDIC
• EBCDIC is an IBM format for storing alphanumeric
characters
0 - X’F0’ SPACE – X’40’
1 – X’F1’ . - X’4B’
2 - X’F2’ , - X’6B’
3 – X’F3’ * - X’5C’
4 - X’F4’ - - X’60’
5 – X’F5’
6 - X’F6’
7 – X’F7’
8 – X’F8’
9 – X’F9’
BINARY DATA
• Stored in 2’s 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 1’s to 0’s and 0’s to 1’s.) Add 1. The
result is the additive complement
BINARY DATA
• 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 2’s complement format.
• 01 X-FIELD PIC S9(4) BINARY VALUE -1.
• X-FIELD will contain
1111111111111111 = X’FFFF’.
• 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.
• 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 X’023D’
• Most business arithmetic occurs in packed decimal.
Packed No-Sign Data
• Packed no-sign data is a non-native data
type that was created to save space on a
disk when storing dates
• If the digits in a date like 10/23/89 were
stored in a packed field, the field would
require 4 bytes: 01|02|38|9C
• By removing the sign, the date fits in 3
bytes: 10|23|89
Packed No-Sign Data
• These type fields require special handling
in Cobol
• Program PKNOSIGN illustrates how a
displayable date can be recovered from a
packed no-sign field.
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 X’F0F3D2’.
ZONED-DECIMAL DATA
• Z-FIELD PIC S999 VALUE -32.
produces a 3 byte field containing X’F0F3D2’.
• Z-FIELD PIC S999 VALUE 32.
produces a 3 byte field containing X’F0F3C2’.
• W-FIELD PIC 999 VALUE 0.
MOVE -32 TO W-FIELD
produces a 3 byte field containing X’F0F3C2’.
DATA DIVISION
Define the data needed for internal processing in the
WORKING-STORAGE SECTION.
Storage is statically allocated and exists for the life of the
run unit.
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
PACKED-
DECIMAL
CHARACTER or
ALPHANUMERIC
ZONED-
DECIMAL
DATA DIVISION
• Describe data that exists in another program,
or storage you want to associate with a
symbolic name in the LINKAGE SECTION.
LINKAGE SECTION.
01 LK-DATA-AREA
05 NAME PIC X(40).
05 AGE PIC 999.
DATA DIVISION
The LOCAL-STORAGE SECTION is used to have
storage allocated each time a program is
entered, and deallocated on return from the
program. Used for compatibility with C or Java.
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.
Initialization of Storage
• For the duration of the run unit, WORKING-STORAGE
items persist in their last-used state. Exceptions are:
1) A program with INITIAL specified in the PROGRAM-
ID paragraph In this case, WORKING-STORAGE data
items are reinitialized each time the program is entered.
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN IS INITIAL.
...
Initialization of Storage
• For the duration of the run unit, WORKING-STORAGE
items persist in their last-used state. Exceptions are:
2) 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.
MOVE ‘PROG23’ TO PROGID
CALL PROGID
CANCEL PROGID
CALL PROGID
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.
MOVE MONTH(3) TO MONTH-OUT
REDEFINES
05 AMOUNT PIC ZZ9.9-.
05 AMOUNTX REDEFINES AMOUNT
PIC X(6).
10 XFIELD PIC 9(5).
10 YFIELD REDEFINES XFIELD.
20 A PIC X(3).
20 B PIC X(2).
Literals
• String Literals enclosed in quotes (single
or double)
MOVE "INVALID" To CUST-NAME
• Numeric literals without quotes
MOVE 19 TO CUST-AGE
Literals
• Hexadecimal literals with X’…’
MOVE X’AF3B’ TO CUST-CODE
Constants
• A constant is a data item that has only one value and it
can never change
• Unfortunately, COBOL does not define a construct
specifically for constants
• Moral: All values are subject to change
Data Division.
01 Report-Header pic x(50)
value "Company Report".
01 Interest pic 9v9999
value 1.0265.
Figurative Constants
There are some figurative constants supplied by
the language:
• ZERO - an appropriate form of 0
• SPACE - x’40’
• HIGH-VALUES - binary 1’s
• LOW-VALUES - binary 0’s
• QUOTE - a single quote
• NULL - binary 0’s used for pointers
• ALL - Technically not a figurative
constant: X PIC X(5) VALUE ALL ‘3’.
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.
Referencing a Table
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.
COBOL tables are 1-indexed
Some 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.
01 MYTABLE.
05 ITEM PIC X(3) OCCURS 10 TIMES.
01 I PIC 9(4) BINARY.
...
MOVE 1 TO I
MOVE “ABC” TO ITEM(I)
• Subscripts are numeric fields – choose BINARY fields for
efficiency, although packed and zoned fields also work
Subscripts vs Indexes
• Subscripts can be easily printed
01 MYTABLE.
05 ITEM PIC X(3) OCCURS 10 TIMES.
01 I PIC 9(4) BINARY.
...
MOVE 1 TO I
MOVE “ABC” TO ITEM(I)
DISPLAY I
Subscripts vs Indexes
• Subscripts represent an occurrence number, 1 is
the first occurrence, 2 is the second, …
01 MYTABLE.
05 ITEM PIC X(3) OCCURS 10 TIMES.
01 I PIC 9(4) BINARY.
...
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
DISPLAY ITEM(I)
END-PERFORM
Subscript Program
Subscripts vs Indexes
• Indexes are created when a table is defined
01 MYTABLE.
10 LETTERVALS PIC X(10) VALUE 'ABCDEFGHIJ'.
10 LETTER REDEFINES LETTERVALS
PIC X(1) OCCURS 10 TIMES
INDEXED BY I.
• Indexes are manipulated with SET statements and
automatically altered by PERFORM statements
SET I TO 1
MOVE LETTER(I) TO CHAROUT
Subscripts vs Indexes
• Indexes are generally more efficient than subscripts
• Indexes represent offsets from the beginning of the table
SET I TO 1
Causes I to have the binary value 0 internally.
• It takes a bit of work to print them
Index Program
Tables with Two Dimensions
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.
A Testy Program
• This program displays “You Chose Paper”.
• Why?
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!”
.
The Evils of Coding Periods
• Periods have proven troublesome in the
procedure division, and a new style of coding
has evolved to deal with them
• The period is a statement terminator but we
want to think of it as a paragraph terminator only
• We will code in a “period-less” style
• Only use periods to end a paragraph name
PROCEDURE DIVISION
• To resolve ambiguity caused by not using
periods, we will use statement delimiters:
END-IF
END-PERFORM
END-COMPUTE
...
DISPLAY
DISPLAY
• Handy for debugging and simple report
creation
• DISPLAY X Y Z
• DISPLAY "A = " A
• Data is written to SYSOUT
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
• To move data from one field to another field, the two
fields should be “compatible” but don’t have to be
identically pictured
• Alphanumeric - PIC X(10)
• Numeric - PIC 999v99
• Numeric-Edited - PIC 999.99-
Compatible moves:
-Alphanumeric to Alphanumeric
-Numeric to Numeric
-Numeric to Numeric edited
MOVE STATEMENT
• Compatible moves:
-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
MOVE STATEMENT
• Compatible moves:
-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 0’s
in a numeric move:
01 X PIC S9(3) VALUE 123.
01 Y PIC S9(5) VALUE 0.
MOVE X TO Y
RESULT: Y = X’F0F0F1F2C3’
MOVE STATEMENT
• If the receiving field is larger than the sending
field, the receiving field is filled with trailing
spaces in a alphanumeric move.
01 X PIC X(3) VALUE “ABC”.
01 Y PIC X(5) VALUE SPACES.
MOVE X TO Y
RESULT: Y = X’C1C2C34040’
MOVE STATEMENT
• 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
01 X PIC S9(5) VALUE 12345.
01 Y PIC S9(3) VALUE 0.
01 A PIC X(5) VALUE ‘ABCDE’
01 B PIC X(3) VALUE SPACES.
MOVE X TO Y
MOVE A TO B
RESULT: Y = X’F3F4F5’
B = X’C1C2C3’
Use Move for Assignment
01 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 Can Cause
Conversions
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 Zoned to Numeric-edited
MOVE A TO C Zoned to Packed-decimal
MOVE CORRESPONDING
MOVE CORRESPONDING identifier-1 TO identifier-2
CORR
• Usually a bad idea
• 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
• W to W, X to X, Y to Y
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
• W to W, X to X
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) PACKED-DECIMAL.
05 DISCOUNT PIC V9(2).
05 UNIT-CODE PIC XX.
05 SALES-PRICE PIC S9(4) BINARY.
. . .
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
ADD…GIVING 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 left-to-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=2
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 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
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
05 X PIC S9(4)V9 PACKED DECIMAL.
COMPUTE X ROUNDED = (A + B) / 2.3
ON SIZE ERROR
DISPLAY “X WAS TRUNCATED”
END-COMPUTE
Arithmetic Operators
Parentheses provide precedence.
Always parenthesize!
((X + Y) * ( Z ** 3))
Operation Operator
+ Addition
- Subtraction
* Multiplication
/ Division
** Exponentiation
Locate Mode I/O
Input Buffers Output Buffers
Your Program
Region
Move Mode I/O
Input Buffers Output Buffers
READ MYFILE INTO
MYREC
…
WRITE RECOUT
FROM MYREC
Region
01 MYREC PIC X(80).
QSAM FILE OPERATIONS
ENVIRONMENT DIVISION.
INPUT-OUTPUT-SECTION.
FILE-CONTROL.
SELECT MY-INPUT-FILE
ASSIGN TO MASTER
FILE STATUS IS MAST-STAT.
• 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 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).
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 Input 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 Output File Operations
• Write a record!
• WRITE MY-RECORD (locate mode)
• WRITE MY-RECORD FROM REC-BUFF
END-WRITE (move mode)
• CLOSE MY-OUTPUT-FILE
• CLOSE MY-INPUT-FILE
Sequential File Reading Pattern
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
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
with 4 DIGITS & 2 DECIMALS
• BFIELD – PACKED DECIMAL
with 7 DIGITS & 3 DECIMALS
• CFIELD - PACKED DECIMAL
with 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 two
Italian mathematicians, Boehm and Jacopini, that states
that only 3 control structures are required to write any
program:
• Sequence - Do this, now do this, now do this, …
• Selection - If something is true do this, else do that
• Repetition – While something is true, do this
• Practice has shown that being able to create procedures
is helpful in overcoming complexity, but they aren’t
strictly necessary
• One implication of this result is that GO TO statements
aren’t needed 
FLOW OF CONTROL
?
T F
F
T
IF
IF
• The condition is tested and either the true
or false blocks are selected for execution
• Don’t use NEXT SENTENCE if you are
using END-IF as the delimiter (and you
should). Use of NEXT SENTENCE causes
execution to continue with the next closest
period, which is probably the end of the
paragraph.
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 and 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" 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.
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
• PERFORM paragraph name THRU paragraph name
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 so why do I need to code it explicitly?
Perform Thru (Let it Die)
• I view use of PERFORM…THRU as an older,
unnecessary style, caused by a compiler problem that
existed many years ago. Using PERFORM THRU was a
way to address this ancient problem. The problem has
been fixed for many years now, yet old habits die hard.
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 can’t 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 an explicit exit from a
paragraph or a program.
• There is an implicit exit at the end of each paragraph
• 100-PARA.
DISPLAY X
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 (any?) of this statement is unnecessary and leads to
spaghetti code
• Don’t even think of using the alternate forms of GO TO !
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 DECS
• Create a table of 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 SEARCH for tables with 20 items or less
• DEPENDING ON field must contain the number of table entries
01 RECCOUNT PIC 9(2).
01 SALES-TAX.
05 TAB-ENTRIES OCCURS 20 TIMES
DEPENDING ON RECCOUNT
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 BY KEY!
• No SET necessary (the whole table is searched)
• RECCOUNT must contain the number of table entries.
01 RECCOUNT PIC 999 PACKED-DECIMAL.
01 SALES-TAX.
05 TAB-ENTRIES OCCURS 100 TIMES
DEPENDING ON RECCOUNT
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
DEPENDING ON RECCOUNT
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 fields
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 alphanumeric
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
9’s, 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
• 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(1:3)  “ABC”
FIELDA(2:2)  “BC”
FIELDA(4: )  “DEFG”
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 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).
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 can’t 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 RECSIZE 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 RECSIZE
variable before the WRITE is issued.
• When reading a variable length record, the
length of the record is delivered into the
RECSIZE 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 the 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
… …
VSAM File Processing
Virtual Storage Access Method
VSAM File Types
• ESDS – Entry Sequenced Data Set
– Allows sequential processing
• RRDS – Relative Record Data Set
– Allows sequential or random access by
relative record number
• KSDS – Key-Sequenced Data Set
– Allows sequential, skip sequential, and
random processing by key
VSAM
• VSAM data sets are known as Clusters
• For ESDS or RRDS the cluster consists of
a data component
• For KSDS the cluster consists of a data
component and an index component
• VSAM data is stored on DASD in control
intervals which are grouped into control
areas
VSAM
• The Control Interval (CI) is the unit of data
that transfers between the disk and virtual
storage
• CI sizes are multiples of 2K with 4k being
common
• CI’s can be constructed with free space to
accommodate additions to the file
• Control Areas (CA) can be constructed
with free space to accommodate additions
VSAM
• VSAM dynamically manages the file by
maintaining information in each CI and CA
• When a CI becomes too “full” the data it
contains is split into two CI’s
• When a CA becomes too “full” the data it
contains is split into two CA’s
• VSAM tries to keep records that are
logically close together, physically close as
well
VSAM Indexes
VSAM Components
Access Method Services (AMS)
• AMS is a VSAM utility that provides numerous
options
– DEFINE CLUSTER
– PRINT
– REPRO
– LISTCAT
– DELETE
– DEFINE ALTERNATEINDEX
– DEFINE PATH
– BLDINDEX
VSAM JCL
• Unlike QSAM files, VSAM files are usually
allocated in a separate job step before
data can be written to the file
• A VSAM cluster is usually created by
deleting and then defining the cluster
• After the cluster is defined, a job can run
which writes data to the file
VSAM JCL
• Parameters:
– INDEXED –KSDS
– NONINDEXED – ESDS
– NUMBERED – RRDS
– KEYS ( len off) – primary key info
– CISZ (size) – control interval size
– FREESPACE (ci ca) – free space %’s
MAKEKSDS
• 000100 //TSYSAD2C JOB 'YOUR NAME',USER=TSYSAD2,REGION=2048K,MSGCLASS=V
• 000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2
• 000300 //DEFINE EXEC PGM=IDCAMS
• 000400 //SYSPRINT DD SYSOUT=*
• 000500 //SYSIN DD *
• 000600 DELETE TSYSAD2.PAYROLL.MASTER
• 000700 DEFINE CLUSTER -
• 000800 (NAME(TSYSAD2.PAYROLL.MASTER) -
• 000900 INDEXED -
• 001000 RECORDSIZE(31 31) -
• 001100 KEYS(5 0) -
• 001200 MGMTCLAS(STANDARD) -
• 001210 FREESPACE(0 0) -
• 001220 SHAREOPTIONS (3 3)) -
• 001230 DATA (NAME(TSYSAD2.PAYROLL.MASTER.DATA) -
• 001240 TRK(1 1) -
• 001250 CONTROLINTERVALSIZE(4096)) -
• 001260 INDEX (NAME(TSYSAD2.PAYROLL.MASTER.INDEX) -
• 001270 TRK(1 1))
• 001280 /*
IDCAMS PRINT
000100 //TSYSAD2P JOB
'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V
000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2
000210 //* THIS IS AN IDCAMS PRINT
000220 //PRINT EXEC PGM=IDCAMS
000230 //SYSPRINT DD SYSOUT=*
000240 //SYSIN DD *
000250 PRINT INFILE(IFILE) -
000251 DUMP
000252 /*
000253 //IFILE DD DSN=TSYSAD2.PAYROLL.MASTER,DISP=SHR
000254 //
IDCAMS REPRO
• 000100 //TSYSAD2R JOB 'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V
• 000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2
• 000210 //* THIS AN IDCAMS REPRO
• 000220 //REPRO EXEC PGM=IDCAMS
• 000230 //FILEIN DD DSN=TSYSAD2.PGM1.RESULTS,DISP=SHR
• 000240 //FILEOUT DD DSN=TSYSAD2.I10.PGM1.RESULTS,DISP=(NEW,CATLG,DELETE),
• 000250 // UNIT=SYSDA,DCB=(RECFM=FB,LRECL=80),
• 000251 // SPACE=(TRK,(1,1),RLSE)
• 000252 //SYSIN DD *
• 000253 REPRO -
• 000254 INFILE(FILEIN) -
• 000255 OUTFILE(FILEOUT)
• 000256 /*
• 000257 //AMSDUMP DD SYSOUT=*
• 000258 //
Creating a VSAM File
• 000100 IDENTIFICATION DIVISION.
• 000200 PROGRAM-ID. VSAM1.
• 000300 ENVIRONMENT DIVISION.
• 000400 INPUT-OUTPUT SECTION.
• 000500 FILE-CONTROL.
• 000600 SELECT PAYROLL-MASTER-OUT ASSIGN TO PAYMASTO
• 000610 ORGANIZATION IS INDEXED
• 000620 ACCESS IS SEQUENTIAL
• 000630 RECORD KEY IS ID-OUT
• 000640 FILE STATUS IS PM-STATUS.
• 000700 SELECT PAYROLL-MASTER-IN ASSIGN TO PAYMASTI.
Creating a VSAM File
• 004410 01 PM-STATUS.
• 004430 05 PM-STAT1 PIC X.
• 004440 05 PM-STAT2 PIC X.
• 004441 PROCEDURE DIVISION.
• 004450 OPEN INPUT PAYROLL-MASTER-IN
• 004460 OPEN OUTPUT PAYROLL-MASTER-OUT
• 004461 IF PM-STATUS NOT = '00'
• 004462 PERFORM 300-PRINT-STATUS
• 004463 END-IF
• 004470 PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
• 004480 READ PAYROLL-MASTER-IN
• 004490 AT END
• 004500 MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
• 004600 NOT AT END
• 004700 PERFORM 200-READ-MODULE
• 004800 END-READ
• 004900 END-PERFORM
• 005000 CLOSE PAYROLL-MASTER-IN
• 005100 PAYROLL-MASTER-OUT
• 005110 GOBACK
Creating a VSAM File
• 005130 200-READ-MODULE.
• 005410 MOVE ID-IN TO ID-OUT
• 005420 MOVE NAME-IN TO NAME-OUT
• 005430 MOVE HOURS-IN TO HOURS-OUT
• 005440 MOVE RATE-IN TO RATE-OUT
• 005500 WRITE MASTER-REC-OUT
• 005510 IF PM-STATUS NOT = '00'
• 005520 PERFORM 300-PRINT-STATUS
• 005530 END-IF
• 005600 .
• 005700 300-PRINT-STATUS.
• 005800 DISPLAY 'FILE STATUS CODE:' PM-STATUS
• 005900 GOBACK
• 006000 .
VSAM Error Strategy
• VSAM returns a status code after each
operation
• It is imperative that you check each status
code after each operation to insure that
the program is proceeding normally
• The status code is a two byte field
OPEN
• OPEN INPUT file-name …
• OPEN OUTPUT file-name …
• OPEN I-O file-name …
• OPEN EXTEND file-name …
For EXTEND, access mode must be
sequential
Reading for Sequential Access
READ file-name [NEXT] [RECORD]
[INTO data-name]
[AT END imperative stmt]
[NOT AT END imperative stmt]
[END-READ]
Specify NEXT if access is DYNAMIC and you want
sequential processing
Can be omitted when access is SEQUENTIAL
INTO provides move mode I/O
Omitting INTO provides locate mode I/O
Reading for Random Access
READ file-name [RECORD]
[INTO data-name]
[INVALID KEY imperative stmt]
[NOT INVALID KEY imperative
stmt]
[END-READ]
Be sure to set the key of the record you wish
to read beforehand
Writing
WRITE record-name [FROM data-
name]
[INVALID KEY imperative stmt]
[NOT INVALID KEY imperative
stmt]
[END-WRITE]
KSDS FILE CREATION
SELECT INVMAST
ASSIGN TO INVMAST
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
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 doesn’t
exist, print a message “Not Found”
Nested Programs
• COBOL programs can be nested. There are many
advantages for doing this:
1) The monolithic working storage of most COBOL
programs leads to difficulty in debugging because all
data is global
2) Nested programs break the working storage into
smaller areas that can only be accessed by programs
that need access.
3) Nested programs provide for parameter passing by
techniques found in all modern languages (by value,
by reference)
4) 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.

More Related Content

Similar to COBOL1.ppt

COMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docx
COMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docxCOMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docx
COMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docx
donnajames55
 
Fortran & Link with Library & Brief Explanation of MKL BLAS
Fortran & Link with Library & Brief Explanation of MKL BLASFortran & Link with Library & Brief Explanation of MKL BLAS
Fortran & Link with Library & Brief Explanation of MKL BLAS
Jongsu "Liam" Kim
 
Chapter 1SyllabusCatalog Description Computer structu
Chapter 1SyllabusCatalog Description Computer structuChapter 1SyllabusCatalog Description Computer structu
Chapter 1SyllabusCatalog Description Computer structu
EstelaJeffery653
 
Mainframe refresher-part-1
Mainframe refresher-part-1Mainframe refresher-part-1
Mainframe refresher-part-1
vishwas17
 
Data Engineering Data warehousing Pentaho
Data Engineering  Data warehousing  PentahoData Engineering  Data warehousing  Pentaho
Data Engineering Data warehousing Pentaho
PraveenHegde20
 

Similar to COBOL1.ppt (20)

Whats new
Whats newWhats new
Whats new
 
CAD STANDARDS
CAD STANDARDSCAD STANDARDS
CAD STANDARDS
 
COMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docx
COMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docxCOMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docx
COMP 2213X2 Assignment #2 Parts A and BDue February 3 in cla.docx
 
Fortran & Link with Library & Brief Explanation of MKL BLAS
Fortran & Link with Library & Brief Explanation of MKL BLASFortran & Link with Library & Brief Explanation of MKL BLAS
Fortran & Link with Library & Brief Explanation of MKL BLAS
 
Simplified instructional computer
Simplified instructional computerSimplified instructional computer
Simplified instructional computer
 
Kirby, Fabro
Kirby, FabroKirby, Fabro
Kirby, Fabro
 
Chapter 1SyllabusCatalog Description Computer structu
Chapter 1SyllabusCatalog Description Computer structuChapter 1SyllabusCatalog Description Computer structu
Chapter 1SyllabusCatalog Description Computer structu
 
EC8691-MPMC-PPT.pptx
EC8691-MPMC-PPT.pptxEC8691-MPMC-PPT.pptx
EC8691-MPMC-PPT.pptx
 
Programming 8051 with C and using Keil uVision5.pptx
Programming 8051 with C and using Keil uVision5.pptxProgramming 8051 with C and using Keil uVision5.pptx
Programming 8051 with C and using Keil uVision5.pptx
 
Cobol
CobolCobol
Cobol
 
XML features in DB2 11 for z/OS
XML features in DB2 11 for z/OSXML features in DB2 11 for z/OS
XML features in DB2 11 for z/OS
 
Feature Engineering
Feature EngineeringFeature Engineering
Feature Engineering
 
embedded C.pptx
embedded C.pptxembedded C.pptx
embedded C.pptx
 
Introduction to C programming
Introduction to C programmingIntroduction to C programming
Introduction to C programming
 
Cobol performance tuning paper lessons learned - s8833 tr
Cobol performance tuning paper   lessons learned - s8833 trCobol performance tuning paper   lessons learned - s8833 tr
Cobol performance tuning paper lessons learned - s8833 tr
 
Skillwise - Cobol Programming Basics
Skillwise - Cobol Programming BasicsSkillwise - Cobol Programming Basics
Skillwise - Cobol Programming Basics
 
MIC PROJECT.pdf
MIC PROJECT.pdfMIC PROJECT.pdf
MIC PROJECT.pdf
 
Mainframe refresher-part-1
Mainframe refresher-part-1Mainframe refresher-part-1
Mainframe refresher-part-1
 
Data Engineering Data warehousing Pentaho
Data Engineering  Data warehousing  PentahoData Engineering  Data warehousing  Pentaho
Data Engineering Data warehousing Pentaho
 
IPv6 Address Planning
IPv6 Address PlanningIPv6 Address Planning
IPv6 Address Planning
 

Recently uploaded

Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
FIDO Alliance
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
FIDO Alliance
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
panagenda
 
Revolutionizing SAP® Processes with Automation and Artificial Intelligence
Revolutionizing SAP® Processes with Automation and Artificial IntelligenceRevolutionizing SAP® Processes with Automation and Artificial Intelligence
Revolutionizing SAP® Processes with Automation and Artificial Intelligence
Precisely
 

Recently uploaded (20)

Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptx
 
Syngulon - Selection technology May 2024.pdf
Syngulon - Selection technology May 2024.pdfSyngulon - Selection technology May 2024.pdf
Syngulon - Selection technology May 2024.pdf
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - Questionnaire
 
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
 
ADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptxADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptx
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cf
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
 
Event-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream ProcessingEvent-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream Processing
 
WebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM PerformanceWebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM Performance
 
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
 
How we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdfHow we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdf
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overview
 
ERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage Intacct
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
 
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
 
Revolutionizing SAP® Processes with Automation and Artificial Intelligence
Revolutionizing SAP® Processes with Automation and Artificial IntelligenceRevolutionizing SAP® Processes with Automation and Artificial Intelligence
Revolutionizing SAP® Processes with Automation and Artificial Intelligence
 

COBOL1.ppt

  • 1. Enterprise COBOL Concepts Dr. David Woolbright woolbright_david@columbusstate.edu 2013
  • 2. Why Cobol? • Billions of lines of existing code with more added each year • Designed for business • Great compilers • Runs fast • Relatively simple to learn • The language keeps evolving
  • 3. Enterprise Cobol for zOS IBM COBOL: • http://www-01.ibm.com/software/awdtools/cobol/zos/ IBM COBOL Documentation: • http://www-01.ibm.com/software/awdtools/cobol/zos/library/ Languagage Reference • http://publibfp.boulder.ibm.com/epubs/pdf/igy3lr50.pdf Programming Guide • http://publibfp.boulder.ibm.com/epubs/pdf/igy3pg50.pdf
  • 4. Program Organization • Program – Organized like a book • Division – Identification, Environment, Data, Procedure • Section • Paragraph • Sentence • Clause • Phrase • Word
  • 5. 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
  • 6. Coding Rules • Cols 1-6 – left blank. Compiler fills in with sequence numbers • Col 7 – Usually blank,* means comment line, - is continuation, D for debugging lines • Cols 8-11 – “A” margin or Area A • Cols 12-72 – “B” margin or Area B • Cols 73-80 – unused • 1 2 3 4 5 6|7| 8 9 10 11|12 13 …71 71 | Seq Nos | | Area A | Area B |
  • 7. Continuation of Statements • Statements can be continued on the next line in Area B
  • 8. Continuation of Literals • Continue the constant through column 71 • Put a “-” in column 7 • Continue constant with a ‘ OR “ • Continue constant in area B
  • 9. 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
  • 10. Things That Go in Area B Area B items: • Entries, sentences, statements, and clauses • Continuation lines
  • 11. Things That Go in A or B • Area A or B • Level-numbers • Comment lines • Compiler-directing statements • Debugging lines • Pseudo-text
  • 12. Structure of a Program
  • 13. IDENTIFICATION DIVISION IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. AUTHOR. JOE SMITH. INSTALLATION. TSYS. DATE-WRITTEN. 12/03/2011. DATE-COMPILED. 12/03/2011. • Only PROGRAM-ID is required • Some interesting parms can be coded on the PROGRAM-ID
  • 14. ENVIRONMENT DIVISION This division connects external DD file names with internal file names. 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. Internal File Name External DD File Name
  • 15. DATA 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 • Alphabetic is seldom used
  • 16. Level Numbers • Group item – a subdivided field • Elementary item – a non-subdivided field • 01 – Group or independent item • Higher numbers indicate subordinate fields
  • 17. Level Numbers • 66, 77, 88 have special significance • 66 – Used to rename (no longer used) • 77 – An independent item (choose 01) • 88 – Condition name
  • 18. Level Numbers 01 XXX. 05 YYY. 10 AAA PIC X. 10 BBB PIC X. 05 ZZZ PIC X(20). 77 AAA PIC 999V99.
  • 19. Condition Names • 01 TRAN-CODE PIC X. 88 GOOD VALUE ‘G’. 88 BAD VALUE ‘B’. 88 INDIFFERENT VALUE ‘I’. … SET GOOD TO TRUE … IF (GOOD) … Equivalent to MOVE ‘G’ TO TRAN-CODE Equivalent to IF TRAN-CODE = ‘G’
  • 22. 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
  • 23. 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)
  • 24. Numeric Edited Fields • XXXBXXBXXXX • 99/99/99 • ZZ,ZZZ.99DB • ***,***.99 • ----.99 • $$$9.99 • 99999.99
  • 25. USAGE Clause • Specifies the format in which data is stored in memory • Normally, the phrase “USAGE IS” is omitted 01 COST USAGE IS PACKED-DECIMAL PIC S9(5). 01 COST PACKED-DECIMAL PIC S9(5). 01 FIRST-NAME USAGE IS DISPLAY PIC X(20). 01 FIRST-NAME PIC X(20).
  • 26. DATA DIVISION We define data used in input-output operations. 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).
  • 27. Data Formats Older terms: Modern terms: • COMPUTATIONAL BINARY • COMP BINARY • COMP-1 FLOATING POINT • COMP-2 FLOATING POINT • COMP-3 PACKED-DECIMAL • COMP-4 BINARY • COMP-5 BINARY (NATIVE) 05 XDATA PIC S9(5) PACKED-DECIMAL. 05 YDATA PIC S9(4) BINARY.
  • 28. EBCDIC • EBCDIC is an IBM format for storing alphanumeric characters A - X’C1’ J - X’D1’ B - X’C2’ K - X’D2’ S – X’E2’ C - X’C3’ L - X’D3’ T – X’E3’ D - X’C4’ M - X’D4’ U – X’E4’ E - X’C5’ N - X’D5’ V – X’E5’ F - X’C6’ O - X’D6’ W – X’E6’ G - X’C7’ P - X’D7’ X – X’E7’ H - X’C8’ Q - X’D8’ Y – X’E8’ I - X’C9’ R - X’D9’ Z – X’E9’
  • 29. EBCDIC • EBCDIC is an IBM format for storing alphanumeric characters 0 - X’F0’ SPACE – X’40’ 1 – X’F1’ . - X’4B’ 2 - X’F2’ , - X’6B’ 3 – X’F3’ * - X’5C’ 4 - X’F4’ - - X’60’ 5 – X’F5’ 6 - X’F6’ 7 – X’F7’ 8 – X’F8’ 9 – X’F9’
  • 30. BINARY DATA • Stored in 2’s 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 1’s to 0’s and 0’s to 1’s.) Add 1. The result is the additive complement
  • 31. BINARY DATA • 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.
  • 32. BINARY DATA • Declaring a data field as BINARY causes the data to be stored in 2’s complement format. • 01 X-FIELD PIC S9(4) BINARY VALUE -1. • X-FIELD will contain 1111111111111111 = X’FFFF’. • Binary data is processed in a register
  • 33. 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. • 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 X’023D’ • Most business arithmetic occurs in packed decimal.
  • 34. Packed No-Sign Data • Packed no-sign data is a non-native data type that was created to save space on a disk when storing dates • If the digits in a date like 10/23/89 were stored in a packed field, the field would require 4 bytes: 01|02|38|9C • By removing the sign, the date fits in 3 bytes: 10|23|89
  • 35. Packed No-Sign Data • These type fields require special handling in Cobol • Program PKNOSIGN illustrates how a displayable date can be recovered from a packed no-sign field.
  • 36. 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 X’F0F3D2’.
  • 37. ZONED-DECIMAL DATA • Z-FIELD PIC S999 VALUE -32. produces a 3 byte field containing X’F0F3D2’. • Z-FIELD PIC S999 VALUE 32. produces a 3 byte field containing X’F0F3C2’. • W-FIELD PIC 999 VALUE 0. MOVE -32 TO W-FIELD produces a 3 byte field containing X’F0F3C2’.
  • 38. DATA DIVISION Define the data needed for internal processing in the WORKING-STORAGE SECTION. Storage is statically allocated and exists for the life of the run unit. 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.
  • 40. DATA DIVISION • Describe data that exists in another program, or storage you want to associate with a symbolic name in the LINKAGE SECTION. LINKAGE SECTION. 01 LK-DATA-AREA 05 NAME PIC X(40). 05 AGE PIC 999.
  • 41. DATA DIVISION The LOCAL-STORAGE SECTION is used to have storage allocated each time a program is entered, and deallocated on return from the program. Used for compatibility with C or Java. LOCAL-STORAGE SECTION. 01 CUST-NO PIC X(3). 01 COST PIC 9(5)V99.
  • 42. 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.
  • 43. Initialization of Storage • For the duration of the run unit, WORKING-STORAGE items persist in their last-used state. Exceptions are: 1) A program with INITIAL specified in the PROGRAM- ID paragraph In this case, WORKING-STORAGE data items are reinitialized each time the program is entered. IDENTIFICATION DIVISION. PROGRAM-ID. MAIN IS INITIAL. ...
  • 44. Initialization of Storage • For the duration of the run unit, WORKING-STORAGE items persist in their last-used state. Exceptions are: 2) 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. MOVE ‘PROG23’ TO PROGID CALL PROGID CANCEL PROGID CALL PROGID
  • 45. 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).
  • 46. REDEFINES 01 MONTH-NAMES. 05 STRING-1 PIC X(15) VALUE “JANFEBMARAPRMAY’. 05 MONTH REDEFINES STRING-1 OCCURS 5 TIMES PIC XXX. MOVE MONTH(3) TO MONTH-OUT
  • 47. REDEFINES 05 AMOUNT PIC ZZ9.9-. 05 AMOUNTX REDEFINES AMOUNT PIC X(6). 10 XFIELD PIC 9(5). 10 YFIELD REDEFINES XFIELD. 20 A PIC X(3). 20 B PIC X(2).
  • 48. Literals • String Literals enclosed in quotes (single or double) MOVE "INVALID" To CUST-NAME • Numeric literals without quotes MOVE 19 TO CUST-AGE
  • 49. Literals • Hexadecimal literals with X’…’ MOVE X’AF3B’ TO CUST-CODE
  • 50. Constants • A constant is a data item that has only one value and it can never change • Unfortunately, COBOL does not define a construct specifically for constants • Moral: All values are subject to change Data Division. 01 Report-Header pic x(50) value "Company Report". 01 Interest pic 9v9999 value 1.0265.
  • 51. Figurative Constants There are some figurative constants supplied by the language: • ZERO - an appropriate form of 0 • SPACE - x’40’ • HIGH-VALUES - binary 1’s • LOW-VALUES - binary 0’s • QUOTE - a single quote • NULL - binary 0’s used for pointers • ALL - Technically not a figurative constant: X PIC X(5) VALUE ALL ‘3’.
  • 52. 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.
  • 53. Referencing a Table 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. COBOL tables are 1-indexed Some valid References with subscripts: TABLE-ENTRY(SUB) TABLE NUM(SUB) NAME(SUB) ITEM(SUB1,SUB2)
  • 54. Subscripts vs Indexes • Subscripts are defined separately from the table definitions. 01 MYTABLE. 05 ITEM PIC X(3) OCCURS 10 TIMES. 01 I PIC 9(4) BINARY. ... MOVE 1 TO I MOVE “ABC” TO ITEM(I) • Subscripts are numeric fields – choose BINARY fields for efficiency, although packed and zoned fields also work
  • 55. Subscripts vs Indexes • Subscripts can be easily printed 01 MYTABLE. 05 ITEM PIC X(3) OCCURS 10 TIMES. 01 I PIC 9(4) BINARY. ... MOVE 1 TO I MOVE “ABC” TO ITEM(I) DISPLAY I
  • 56. Subscripts vs Indexes • Subscripts represent an occurrence number, 1 is the first occurrence, 2 is the second, … 01 MYTABLE. 05 ITEM PIC X(3) OCCURS 10 TIMES. 01 I PIC 9(4) BINARY. ... PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 DISPLAY ITEM(I) END-PERFORM
  • 58. Subscripts vs Indexes • Indexes are created when a table is defined 01 MYTABLE. 10 LETTERVALS PIC X(10) VALUE 'ABCDEFGHIJ'. 10 LETTER REDEFINES LETTERVALS PIC X(1) OCCURS 10 TIMES INDEXED BY I. • Indexes are manipulated with SET statements and automatically altered by PERFORM statements SET I TO 1 MOVE LETTER(I) TO CHAROUT
  • 59. Subscripts vs Indexes • Indexes are generally more efficient than subscripts • Indexes represent offsets from the beginning of the table SET I TO 1 Causes I to have the binary value 0 internally. • It takes a bit of work to print them
  • 61. Tables with Two Dimensions 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)
  • 62. 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.
  • 63. A Testy Program • This program displays “You Chose Paper”. • Why?
  • 64. 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!” .
  • 65. The Evils of Coding Periods • Periods have proven troublesome in the procedure division, and a new style of coding has evolved to deal with them • The period is a statement terminator but we want to think of it as a paragraph terminator only • We will code in a “period-less” style • Only use periods to end a paragraph name
  • 66. PROCEDURE DIVISION • To resolve ambiguity caused by not using periods, we will use statement delimiters: END-IF END-PERFORM END-COMPUTE ...
  • 68. DISPLAY • Handy for debugging and simple report creation • DISPLAY X Y Z • DISPLAY "A = " A • Data is written to SYSOUT
  • 69. MOVE
  • 70. 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
  • 71. MOVE STATEMENT • To move data from one field to another field, the two fields should be “compatible” but don’t have to be identically pictured • Alphanumeric - PIC X(10) • Numeric - PIC 999v99 • Numeric-Edited - PIC 999.99- Compatible moves: -Alphanumeric to Alphanumeric -Numeric to Numeric -Numeric to Numeric edited
  • 72. MOVE STATEMENT • Compatible moves: -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
  • 73. MOVE STATEMENT • Compatible moves: -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
  • 74. 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
  • 75. MOVE STATEMENT • If the receiving field is larger than the sending field, the receiving field is filled with leading 0’s in a numeric move: 01 X PIC S9(3) VALUE 123. 01 Y PIC S9(5) VALUE 0. MOVE X TO Y RESULT: Y = X’F0F0F1F2C3’
  • 76. MOVE STATEMENT • If the receiving field is larger than the sending field, the receiving field is filled with trailing spaces in a alphanumeric move. 01 X PIC X(3) VALUE “ABC”. 01 Y PIC X(5) VALUE SPACES. MOVE X TO Y RESULT: Y = X’C1C2C34040’
  • 77. MOVE STATEMENT • 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 01 X PIC S9(5) VALUE 12345. 01 Y PIC S9(3) VALUE 0. 01 A PIC X(5) VALUE ‘ABCDE’ 01 B PIC X(3) VALUE SPACES. MOVE X TO Y MOVE A TO B RESULT: Y = X’F3F4F5’ B = X’C1C2C3’
  • 78. Use Move for Assignment 01 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
  • 79. Assignment Can Cause Conversions 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 Zoned to Numeric-edited MOVE A TO C Zoned to Packed-decimal
  • 80. MOVE CORRESPONDING MOVE CORRESPONDING identifier-1 TO identifier-2 CORR • Usually a bad idea • 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 • W to W, X to X, Y to Y
  • 81. 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 • W to W, X to X
  • 83. 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.
  • 84. INITIALIZE 01 PRICE-FIELDS. 05 UNIT-PRICE PIC 9(5)V9(2) PACKED-DECIMAL. 05 DISCOUNT PIC V9(2). 05 UNIT-CODE PIC XX. 05 SALES-PRICE PIC S9(4) BINARY. . . . INITIALIZE PRICE-FIELDS
  • 85. ADD
  • 86. 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
  • 87. 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
  • 89. ADD…GIVING 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
  • 91. 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 left-to-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
  • 93. 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=2
  • 95. 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
  • 97. 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
  • 99. 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
  • 100. DIVIDE
  • 101. 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
  • 102. DIVIDE
  • 103. DIVIDE • 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
  • 104. DIVIDE
  • 105. 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
  • 107. COMPUTE • 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
  • 108. Arithmetic Operators Parentheses provide precedence. Always parenthesize! ((X + Y) * ( Z ** 3)) Operation Operator + Addition - Subtraction * Multiplication / Division ** Exponentiation
  • 109. Locate Mode I/O Input Buffers Output Buffers Your Program Region
  • 110. Move Mode I/O Input Buffers Output Buffers READ MYFILE INTO MYREC … WRITE RECOUT FROM MYREC Region 01 MYREC PIC X(80).
  • 111. QSAM FILE OPERATIONS ENVIRONMENT DIVISION. INPUT-OUTPUT-SECTION. FILE-CONTROL. SELECT MY-INPUT-FILE ASSIGN TO MASTER FILE STATUS IS MAST-STAT. • 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.
  • 112. 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).
  • 113. 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
  • 114. 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
  • 115. OPEN
  • 116. CLOSE
  • 117. READ
  • 118. QSAM Input 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
  • 119. 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
  • 120. QSAM Output File Operations • Write a record! • WRITE MY-RECORD (locate mode) • WRITE MY-RECORD FROM REC-BUFF END-WRITE (move mode) • CLOSE MY-OUTPUT-FILE • CLOSE MY-INPUT-FILE
  • 121. Sequential File Reading Pattern 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 CONTINUATION READ
  • 122. File Status Codes • 00 – normal • 10 – end of file • 2x – invalid key • 3x – permanent i/o error • 4x – logic error • 9x – unsuccessful operation
  • 123. Exercise #1 • Create a file of 80 byte records • Each record has 3 fields • AFIELD – ZONED DECIMAL with 4 DIGITS & 2 DECIMALS • BFIELD – PACKED DECIMAL with 7 DIGITS & 3 DECIMALS • CFIELD - PACKED DECIMAL with 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.
  • 124. FLOW OF CONTROL • There is a theoretical result in Computer Science by two Italian mathematicians, Boehm and Jacopini, that states that only 3 control structures are required to write any program: • Sequence - Do this, now do this, now do this, … • Selection - If something is true do this, else do that • Repetition – While something is true, do this • Practice has shown that being able to create procedures is helpful in overcoming complexity, but they aren’t strictly necessary • One implication of this result is that GO TO statements aren’t needed 
  • 126. IF
  • 127. IF • The condition is tested and either the true or false blocks are selected for execution • Don’t use NEXT SENTENCE if you are using END-IF as the delimiter (and you should). Use of NEXT SENTENCE causes execution to continue with the next closest period, which is probably the end of the paragraph.
  • 128. 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
  • 129. 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 and terminate all if statements with END-IF
  • 131. 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.
  • 132. EVALUATE 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.
  • 133. 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.
  • 134. 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
  • 135. 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
  • 137. 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.
  • 138. PERFORM THRU • PERFORM paragraph name THRU paragraph name 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 so why do I need to code it explicitly?
  • 139. Perform Thru (Let it Die) • I view use of PERFORM…THRU as an older, unnecessary style, caused by a compiler problem that existed many years ago. Using PERFORM THRU was a way to address this ancient problem. The problem has been fixed for many years now, yet old habits die hard.
  • 141. PERFORM x TIMES MOVE 5 TO COUNT PERFORM COUNT TIMES DISPLAY “XXX” END-PERFORM PERFORM 100-DISPLAY COUNT TIMES
  • 143. 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
  • 145. Inline Perform PERFORM VARYING X FROM 1 BY 1 UNTIL X > 100 DISPLAY X END-PERFORM PRINTS: 1 2 3 … 100
  • 146. Inline PERFORM PERFORM VARYING X FROM 5 BY -1 UNTIL X =0 DISPLAY X END-PERFORM PRINTS: 5 4 3 2 1 0
  • 147. Inline PERFORM MOVE 10 TO X PERFORM WITH TEST AFTER UNTIL X = 0 DISPLAY X SUBTRACT 1 FROM X END-PERFORM
  • 148. PERFORM PARAGRAPH PERFORM 100-RTN WITH TEST AFTER VARYING X FROM 1 BY 1 UNTIL X = 100 … 100-RTN. ….
  • 149. 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
  • 150. 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 …
  • 151. 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
  • 152. 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
  • 153. Manipulating Indexes • Indexes can’t 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
  • 154. CONTINUE Used to indicate that no operation is present.
  • 155. EXIT • Sometimes used to provide an explicit exit from a paragraph or a program. • There is an implicit exit at the end of each paragraph • 100-PARA. DISPLAY X EXIT .
  • 156. STOP • Usually used to permanently halt execution of a program • Can be used to temporarily halt execution and require operator intervention
  • 157. 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
  • 158. 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 (any?) of this statement is unnecessary and leads to spaghetti code • Don’t even think of using the alternate forms of GO TO !
  • 159. 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 DECS • Create a table of the file data using subscripts. • Sort the table with a bubble sort on customer name. • Print the sorted table: Last Name First Name Balance
  • 160. Exercise #3 • Repeat Exercise #2 using indexes
  • 162. SEARCH • Search performs a sequential search with an index • Rule of thumb: Use SEARCH for tables with 20 items or less • DEPENDING ON field must contain the number of table entries 01 RECCOUNT PIC 9(2). 01 SALES-TAX. 05 TAB-ENTRIES OCCURS 20 TIMES DEPENDING ON RECCOUNT 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
  • 163. 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.
  • 165. SEARCH ALL • SEARCH ALL performs a binary search with an index • ENTRIES MUST BE IN ORDER BY KEY! • No SET necessary (the whole table is searched) • RECCOUNT must contain the number of table entries. 01 RECCOUNT PIC 999 PACKED-DECIMAL. 01 SALES-TAX. 05 TAB-ENTRIES OCCURS 100 TIMES DEPENDING ON RECCOUNT 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
  • 166. 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
  • 167. SEARCH ALL Constraints • Table must indicate ASCENDING or DESCENDING KEY 01 TABLE. 05 CUST-REC OCCURS 40 TIMES DEPENDING ON RECCOUNT ASCENDING KEY CUST INDEXED BY K. 10 CUST PIC 9(4). 10 RATE PIC V999.
  • 168. 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 fields 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.
  • 169. STRING
  • 170. STRING • Used to build string expressions by concatenation (blanks not stored) STRING FNAME DELIMITED BY “ “ MNAME DELIMITED BY “ “ LNAME DELIMITED BY “ “ INTO NAME-OUT
  • 171. 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
  • 172. STRING
  • 174. UNSTRING • Separates a string into several component strings • Sending field must be alphanumeric UNSTRING NAME DELIMITED BY “,” INTO LNAME FNAME MI END-UNSTRING
  • 175. UNSTRING UNSTRING JCL-DATA DELIMITED BY ALL SPACES OR ALL ',' INTO WS-DATE-REQUESTED WS-DATE1 WS-DATE2 END-UNSTRING
  • 176. Exercise #6 • Read the file BCST.SICCC01.PDSLIB(STRINGS) • Print the first name, middle initial, and last names in columns
  • 177. Exercise #7 • Read the file BCST.SICCC01.PDSLIB(STRINGS1) • Print the digits followed by the letters. Use “/” as the delimiter of the two fields.
  • 178. CALL
  • 179. 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
  • 180. Calling Other Programs Statically CALL literal program name USING identifier-1, … Examples CALL ‘CUST1030’ USING X,Y CALL ‘PROG1000’
  • 181. 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 .
  • 182. 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.
  • 183. 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
  • 184. 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
  • 185. 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
  • 186. NUMERIC Class Test • Before using a “suspect” field that has a PIC of 9’s, 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
  • 187. 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
  • 189. 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
  • 191. 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"
  • 193. INSPECT (CONVERTING) INSPECT TEXTLINE CONVERTING "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ" INSPECT FIELDA CONVERTING “1234567890” TO “ABCDEFGHIJ”
  • 194. REFERENCE 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(1:3)  “ABC” FIELDA(2:2)  “BC” FIELDA(4: )  “DEFG”
  • 195. 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
  • 196. 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.
  • 197. 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.
  • 198. 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
  • 199. 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.
  • 200. 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
  • 201. 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.
  • 202. 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.
  • 203. 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…
  • 204. 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’.
  • 205. 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.
  • 206. 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
  • 207. 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
  • 208. Files 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).
  • 209. 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 can’t 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
  • 211. Variable Length Records • The RECORD IS VARYING IN SIZE clause specifies a file containing variable length records.
  • 212. Variable Length Records • The RECSIZE 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.
  • 213. Variable Length Record Processing • When writing a variable length record, the size of the record must be placed in the RECSIZE variable before the WRITE is issued. • When reading a variable length record, the length of the record is delivered into the RECSIZE variable. • The 01 Record description must be long enough to accommodate the largest record
  • 214. 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)
  • 215. 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 the record!
  • 216. 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
  • 217. 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
  • 218. 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
  • 219. 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
  • 220. 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 … …
  • 221. VSAM File Processing Virtual Storage Access Method
  • 222. VSAM File Types • ESDS – Entry Sequenced Data Set – Allows sequential processing • RRDS – Relative Record Data Set – Allows sequential or random access by relative record number • KSDS – Key-Sequenced Data Set – Allows sequential, skip sequential, and random processing by key
  • 223. VSAM • VSAM data sets are known as Clusters • For ESDS or RRDS the cluster consists of a data component • For KSDS the cluster consists of a data component and an index component • VSAM data is stored on DASD in control intervals which are grouped into control areas
  • 224. VSAM • The Control Interval (CI) is the unit of data that transfers between the disk and virtual storage • CI sizes are multiples of 2K with 4k being common • CI’s can be constructed with free space to accommodate additions to the file • Control Areas (CA) can be constructed with free space to accommodate additions
  • 225. VSAM • VSAM dynamically manages the file by maintaining information in each CI and CA • When a CI becomes too “full” the data it contains is split into two CI’s • When a CA becomes too “full” the data it contains is split into two CA’s • VSAM tries to keep records that are logically close together, physically close as well
  • 228. Access Method Services (AMS) • AMS is a VSAM utility that provides numerous options – DEFINE CLUSTER – PRINT – REPRO – LISTCAT – DELETE – DEFINE ALTERNATEINDEX – DEFINE PATH – BLDINDEX
  • 229. VSAM JCL • Unlike QSAM files, VSAM files are usually allocated in a separate job step before data can be written to the file • A VSAM cluster is usually created by deleting and then defining the cluster • After the cluster is defined, a job can run which writes data to the file
  • 230. VSAM JCL • Parameters: – INDEXED –KSDS – NONINDEXED – ESDS – NUMBERED – RRDS – KEYS ( len off) – primary key info – CISZ (size) – control interval size – FREESPACE (ci ca) – free space %’s
  • 231. MAKEKSDS • 000100 //TSYSAD2C JOB 'YOUR NAME',USER=TSYSAD2,REGION=2048K,MSGCLASS=V • 000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2 • 000300 //DEFINE EXEC PGM=IDCAMS • 000400 //SYSPRINT DD SYSOUT=* • 000500 //SYSIN DD * • 000600 DELETE TSYSAD2.PAYROLL.MASTER • 000700 DEFINE CLUSTER - • 000800 (NAME(TSYSAD2.PAYROLL.MASTER) - • 000900 INDEXED - • 001000 RECORDSIZE(31 31) - • 001100 KEYS(5 0) - • 001200 MGMTCLAS(STANDARD) - • 001210 FREESPACE(0 0) - • 001220 SHAREOPTIONS (3 3)) - • 001230 DATA (NAME(TSYSAD2.PAYROLL.MASTER.DATA) - • 001240 TRK(1 1) - • 001250 CONTROLINTERVALSIZE(4096)) - • 001260 INDEX (NAME(TSYSAD2.PAYROLL.MASTER.INDEX) - • 001270 TRK(1 1)) • 001280 /*
  • 232. IDCAMS PRINT 000100 //TSYSAD2P JOB 'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V 000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2 000210 //* THIS IS AN IDCAMS PRINT 000220 //PRINT EXEC PGM=IDCAMS 000230 //SYSPRINT DD SYSOUT=* 000240 //SYSIN DD * 000250 PRINT INFILE(IFILE) - 000251 DUMP 000252 /* 000253 //IFILE DD DSN=TSYSAD2.PAYROLL.MASTER,DISP=SHR 000254 //
  • 233. IDCAMS REPRO • 000100 //TSYSAD2R JOB 'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V • 000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2 • 000210 //* THIS AN IDCAMS REPRO • 000220 //REPRO EXEC PGM=IDCAMS • 000230 //FILEIN DD DSN=TSYSAD2.PGM1.RESULTS,DISP=SHR • 000240 //FILEOUT DD DSN=TSYSAD2.I10.PGM1.RESULTS,DISP=(NEW,CATLG,DELETE), • 000250 // UNIT=SYSDA,DCB=(RECFM=FB,LRECL=80), • 000251 // SPACE=(TRK,(1,1),RLSE) • 000252 //SYSIN DD * • 000253 REPRO - • 000254 INFILE(FILEIN) - • 000255 OUTFILE(FILEOUT) • 000256 /* • 000257 //AMSDUMP DD SYSOUT=* • 000258 //
  • 234. Creating a VSAM File • 000100 IDENTIFICATION DIVISION. • 000200 PROGRAM-ID. VSAM1. • 000300 ENVIRONMENT DIVISION. • 000400 INPUT-OUTPUT SECTION. • 000500 FILE-CONTROL. • 000600 SELECT PAYROLL-MASTER-OUT ASSIGN TO PAYMASTO • 000610 ORGANIZATION IS INDEXED • 000620 ACCESS IS SEQUENTIAL • 000630 RECORD KEY IS ID-OUT • 000640 FILE STATUS IS PM-STATUS. • 000700 SELECT PAYROLL-MASTER-IN ASSIGN TO PAYMASTI.
  • 235. Creating a VSAM File • 004410 01 PM-STATUS. • 004430 05 PM-STAT1 PIC X. • 004440 05 PM-STAT2 PIC X. • 004441 PROCEDURE DIVISION. • 004450 OPEN INPUT PAYROLL-MASTER-IN • 004460 OPEN OUTPUT PAYROLL-MASTER-OUT • 004461 IF PM-STATUS NOT = '00' • 004462 PERFORM 300-PRINT-STATUS • 004463 END-IF • 004470 PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO ' • 004480 READ PAYROLL-MASTER-IN • 004490 AT END • 004500 MOVE 'NO ' TO ARE-THERE-MORE-RECORDS • 004600 NOT AT END • 004700 PERFORM 200-READ-MODULE • 004800 END-READ • 004900 END-PERFORM • 005000 CLOSE PAYROLL-MASTER-IN • 005100 PAYROLL-MASTER-OUT • 005110 GOBACK
  • 236. Creating a VSAM File • 005130 200-READ-MODULE. • 005410 MOVE ID-IN TO ID-OUT • 005420 MOVE NAME-IN TO NAME-OUT • 005430 MOVE HOURS-IN TO HOURS-OUT • 005440 MOVE RATE-IN TO RATE-OUT • 005500 WRITE MASTER-REC-OUT • 005510 IF PM-STATUS NOT = '00' • 005520 PERFORM 300-PRINT-STATUS • 005530 END-IF • 005600 . • 005700 300-PRINT-STATUS. • 005800 DISPLAY 'FILE STATUS CODE:' PM-STATUS • 005900 GOBACK • 006000 .
  • 237. VSAM Error Strategy • VSAM returns a status code after each operation • It is imperative that you check each status code after each operation to insure that the program is proceeding normally • The status code is a two byte field
  • 238. OPEN • OPEN INPUT file-name … • OPEN OUTPUT file-name … • OPEN I-O file-name … • OPEN EXTEND file-name … For EXTEND, access mode must be sequential
  • 239. Reading for Sequential Access READ file-name [NEXT] [RECORD] [INTO data-name] [AT END imperative stmt] [NOT AT END imperative stmt] [END-READ] Specify NEXT if access is DYNAMIC and you want sequential processing Can be omitted when access is SEQUENTIAL INTO provides move mode I/O Omitting INTO provides locate mode I/O
  • 240. Reading for Random Access READ file-name [RECORD] [INTO data-name] [INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-READ] Be sure to set the key of the record you wish to read beforehand
  • 241. Writing WRITE record-name [FROM data- name] [INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-WRITE]
  • 242. KSDS FILE CREATION SELECT INVMAST ASSIGN TO INVMAST ORGANIZATION IS INDEXED ACCESS IS SEQUENTIAL 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).
  • 243. 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]
  • 244. 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
  • 245. KSDS File Statements START file-name KEY IS = data-name > >= [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-START]
  • 246. KSDS File Statements DELETE file-name RECORD [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-DELETE]
  • 247. 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.
  • 248. 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 doesn’t exist, print a message “Not Found”
  • 249. Nested Programs • COBOL programs can be nested. There are many advantages for doing this: 1) The monolithic working storage of most COBOL programs leads to difficulty in debugging because all data is global 2) Nested programs break the working storage into smaller areas that can only be accessed by programs that need access. 3) Nested programs provide for parameter passing by techniques found in all modern languages (by value, by reference) 4) There is no execution degradation because of nested programs. In fact, calling a nested program is more efficient than calling a separately compiled program.
  • 250. 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
  • 251. Nested Programs PROGRAM-ID. MAIN. PROGRAM-ID. SUB1. END PROGRAM SUB1. PROGRAM-ID. SUB2 END PROGRAM SUB2. END PROGRAM MAIN.
  • 252. 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.
  • 253. COBOL Pointers IF PTR1 NOT = NULL AND PTR1 NOT = PTR2 PERFORM 2730-SOMETHING END-IF
  • 254. 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.