Sei sulla pagina 1di 246

Advanced COBOL

Dr. David E. Woolbright


2011
Documentation
IBM Enterprise COBOL for z/OS

http://www-306.ibm.com/software/awdtools/cobol/zos/library/

Especially helpful for programmers:


Language Reference Manual
Programming Guide
Course Outline
• QSAM File Processing
- Defining files
- Dynamic File processing in COBOL
• Subprograms
– CALL
– Parameter passing techniques
– CANCEL
– Nested programs
– Recursion
• Tables
– Single Dimension
– Multi-Dimension
– Subscripts and Indexes
– Searching
Course Outline
• Debugging
– Basics
– Dumps
• XML and COBOL
– Introduction to XML
– Parsers
– Cobol Features
– Parsing
– Events
Course Outline
• Files with Variable Length Records
• Strings
– STRING
– UNSTRING
– INSPECT
– Reference modification
• Pointers
• VSAM File Processing
Course Outline
• Files with Variable Length Records
• Strings
– STRING
– UNSTRING
– INSPECT
– Reference modification
• Pointers
• VSAM File Processing
QSAM File Processing

Queued Sequential Access


Method
QSAM Files
• Unkeyed, Sequentially created and processed
• Records cannot change length or position
• QSAM files on direct access storage can be modified
with REWRITE
• ENVIRONMENT DIVISION.
• FILE-CONTROL paragraph
SELECT
• I-O-CONTOL paragraph
APPLY WRITE-ONLY
• DATA DIVISION
• FILE SECTION
FD
Environment Division - File Control
SELECT file-name1
OPTIONAL

ASSIGN assignment-name
TO
Environment Division
File-CONTROL
• Optional – used for files opened in I-O, INPUT,
or EXTEND. File doesn’t have to be present
when the program is executed.
• File-name1 – identifies an FD entry (internal file
name)
• Assignment-name – identifies the external file. If
name component of the SELECT clause is found
in the JCL it is treated as a DD name. If not
found in the JCL, then “name” is treated an an
environment variable
QSAM File Name
name
label- S-
• Label – documents for the programmer the device and device class to
which the file is assigned. No effect on execution. Must end with a dash
• S – Optional. Indicates sequential organization
Environment Variables
Exercise A (Dynamic Files)
• Statically allocate and read
BCST.SICCC01.TESTPDS(DYNAMDAT)
• This file contains member names of other members in
BCST.SICCC01.TESTPDS
• Dynamically Read each member that is listed and
display the records in each member
• After you can display all the records, try writing out the
records to a dynamically allocated file
• Use BCST.SICCC01.PDSLIB(DYNAM2) to help you
read a file dynamically
• Use BCSC.SICCC01.PDSLIB(DYNAM1) to help you
write a file dynamically
Environment Variables
• Defined as WORKING-STORAGE fields
using value clauses

01 FILE-ENV-VAR PIC X(39)


VALUE “DYNFILE=DSN(INPUT.FILE) SHR”.
• Can be used to access QSAM files or
existing VSAM clusters.
Reserve Clause (optional)

RESERVE integer
AREA
AREAS
RESERVE Clause
• Specifies the number of I/O buffers
allocated the file at run-time
• If omitted, the number of buffers is taken
from the DD statement. If none are
specified, the system default is taken
QSAM Buffering
• QSAM buffers can be allocated above the 16 MB line if
all of the following are true:
- Enterprise COBOL
- z/OS Language Environment
- the programs are compiled with RENT and DATA(31)
or
compiled with NORENT and | RMODE(ANY)
- the program is executing in AMODE 31
- the program is executing on MVS
- the ALL31(ON) run-time option is used (for
EXTERNAL files)
ORGANIZATION Clause (optional)
• ORGANIZATION IS SEQUENTIAL
• Other non-QSAM options: INDEXED,
RELATIVE, LINE SEQUENTIAL
• Records are read and written in a serial
manner
PADDING Clause
PADDING data name
CHARACTER IS literal

Specifies a character for block padding on sequential files


Data name – a one character field
Literal – a one character alphanumeric literal or national symbol
ACCESS MODE Clause
ACCESS SEQUENTIAL
MODE IS

Default mode is SEQUENTIAL


Options for other types of files include RANDOM and DYNAMIC
FILE STATUS Clause
STATUS dname1
FILE IS dname2

- The operating system moves a value to dname1 and possibly dname2 after
each I/O operation.
-dname1 - a two character alphanumeric or national field
-dname2 – used for VSAM
Environment Division
I-O-CONTROL
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT …
I-O-CONTROL.
APPLY WRITE-ONLY ON MYFILE.

(Used for sequential variable blocked files.)


Defining QSAM Files and Records
FILE-CONTROL.
SELECT CUSTOMER-MASTER
ASSIGN TO CUSTMAST
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS RC.
DATA DIVISION
FILE SECTION - Sequential
DATA DIVISION
FILE SECTION - FD
EXTERNAL
• The EXTERNAL clause specifies that a
file connector is external, permitting file
sharing between two programs in the
same run unit
GLOBAL
• GLOBAL clause specifies the file-
connector name is available to the
declaring program and all programs
contained directly or indirectly
• Used for nested programs
BLOCK CONTAINS
• BLOCK CONTAINS 0 RECORDS
• If this clause is omitted, records are unblocked
by default!
• Allows the blocksize to be specified in the JCL or
by the operating system
• Code this Statement! (TSYS Standard)
RECORD Clause
• Specifies the number of bytes in a record (fixed
or variable)
• When omitted, the compiler determines lengths
based on record descriptions.
• RECORD CONTAINS 80 CHARACTERS
• RECORD CONTAINS 50 TO 80 CHARACTERS
• RECORD IS VARYING IN SIZE
FROM 40 TO 60 CHARACTERS
DEPENDING ON REC-COUNT.
RECORDING MODE
• Specifies the format of physical records in
a QSAM file (ignored for VSAM)
• F – fixed size, V – variable size, U –
unblocked, fixed or variable, S – spanned,
large records that span a block
• RECORDING MODE IS F
• RECORDING MODE IS V
• RECORDING MODE IS U
• RECORDING MODE IS S
DATA RECORD Clause
• DATA RECORD clause identifies the data
areas associated with the file
• Syntax checked but is only documentation

DATA RECORD IS INPUT-AREA.


DATA RECORDS ARE INPUT-AREA1
INPUT-AREA2
FD Example
FD IN-FILE IS GLOBAL
RECORDING MODE F
BLOCK CONTAINS 0 RECORDS
LABEL RECORDS ARE STANDARD
RECORD CONTAINS 80 CHARACTERS
DATA RECORD IS IN-AREA.
01 IN-AREA.
05 …
LABEL RECORDS
• Label records are records written at the
beginning and end of DASD and Tape files
that provide information about file
• Enterprise COBOL only supports standard
labels
LABEL RECORDS ARE STANDARD
LABEL RECORDS ARE OMITTED
Subprograms
Calling a Subprogram
• Syntax for CALL
CALL “subprog name”
[ USING [BY REFERENCE | BY CONTENT]
ident1 …]
END-CALL
• The subprog name usually refers to an 8 byte
field that contains the program name to be
called
• Static call is made when subprogram name is
hard-coded and compiler option = NODYNAM
• Subprogram can be written in any supported
language
Calling a Subprogram
• CALL variable-name
[ USING [BY REFERENCE |
BY CONTENT |
BY CONTENT LENGTH OF |
BY CONTENT ADDRESS OF ]
ident1 …]
END-CALL
• The variable-name usually refers to an 8 byte
field that contains the program name to be
called
• Names can be longer with Enterprise COBOL
• The variable-name can be modified as the
program is running to call different programs
Calling a Subprogram
• Linking to the called program is dynamic
• At TSYS, all calls are dynamic ( DYNAM
compiler option)
• BY REFERENCE is the default
• BY REFERENCE provides the subprogram with
access to a main program variable. The
receiving variable is an alias for the passed
variable
• BY CONTENT provides the subprogram with
access to a copy of a main program variable
Calling a Subprogram
• BY CONTENT ADDRESS OF provides a
copy of the address of the passed variable
(must be a linkage area name)
• BY CONTENT LENGTH provides a copy
of the length of a variable
Example Parameters
The Called Program
• Specifies the names of the receiving variables with a USING
statement in the PROCEDURE DIVISION statement or in an
ENTRY statement
PROCEDURE DIVISION USING A.
Or
ENTRY “COMPUTE” USING COST RESULT.
Or
PROCEDURE DIVISION USING A COST RESULT.
• The variables in the using statement are 01 group items defined in
the LINKAGE SECTION or 77 items
LINKAGE SECTION.
01 A PIC X(8).
O1 COST PIC S9(5) PACKED-DECIMAL.
01 RESULT PIC S9(5) BINARY.
The Called Program
• The called program can return values to
the calling program by modifying variables
that are passed by reference
PROCEDURE DIVISION USING
COST.

MOVE ITEM-COST TO COST
Exercise #1
• Create a main program that calls a
subprogram
• Print “I am in the main program” in the
main program
• Call the subprogram
• Print “I am in the subprogram” in the
subprogram
• Print “I am back in the main program” in
the main.
Exercise #2
• Create a two variables X and Y in the main program (you
pick the type and value).
• Print the values of X and Y in the main program
• Pass X BY REFERENCE and Y BY CONTENT to the
subprogram
• Print the variables in the subprogram
• Change the values of each variable in the subprogram
• Print the length of x by passing the length using BY
CONTENT LENGTH (Receiving variable PIC S9(8)
BINARY)
• Print the values of the variables again in the main
program
Canceling a Subprogram
• CANCEL syntax
CANCEL literal
CANCEL identifier
• Canceling a program means the program will be
in its initial state if the program is called again
• Canceling a program closes all files associated
with an internal file connector of the canceled
program
• No action is taken when canceling a previously
canceled program or one that has not been
dynamically called
Exercise #3
• Have the main program call a subprogram
four times.
• Create a local numeric variable Z in the
subprogram with initial value 1.
• Each time the program is called, print Z
and then add 1 to it.
• Repeat the experiment after adding “IS
INITIAL” to the PROGRAM-ID
PROGRAM-ID. MYPROG IS INITIAL.
Subprograms
• Subprograms remain in their last used
state when they terminate with EXIT
PROGRAM or GOBACK
• A program that is coded with INITIAL will
always be called with its initial state
Exercise #4
• Repeat Exercise #3, canceling each
program after each subprogram call
Return Codes
• Use the RETURN-CODE special register
to test and transmit return codes through
register 15
• After calling a subprogram, test RETURN-
CODE to see if the subprogram completed
normally
• At the end of a suprogram, set RETURN-
CODE to indicate the results of the call
Exercise #5
Write a main program that passes a numeric
parameter, say X, to a subprogram. If the
parameter is negative have the subprogram set
a return code of 4. If the parameter is non-
negative, the subprogram should set the return
code to 0. Have the main program test the
return code after the subprogram has
completed. The main program should print a
message indicating the type of number the
subprogram received. Try running the main
program passing negative and non-negative
values for X.
External Files
• Files can be shared by multiple programs in the
same run unit.
• Each program declares the file to be
“EXTERNAL”
FD MYFILE IS EXTERNAL
RECORD CONTAINS 80 CHARACTERS
RECORDING MODE IS F.
01 MY-RECORD.

External Files
• Each program has the same SELECT
statement:
SELECT MY-FILE
ASSIGN TO MYFILE
FILE STATUS IS MYSTATUS
ORGANIZATION IS SEQUENTIAL.
Reading Records
• READ MYFILE INTO MY-RECORD
– Move mode IO – Data flows from an I/O buffer
into working storage.
• READ MYFILE
– Locate mode I/O – Data remains in an I/O
buffer. Efficient processing technique
– TSYS standard
External Files
• Make the file status field external so there
is only one shared field for all programs.
Each program declares:
01 MYSTATUS PIC 99 EXTERNAL.
• Be sure to work in locate-mode.
Exercise #6
• Write a main program that opens a sequential
file and calls a subprogram each time it needs a
record. Write a subprogram that reads a single
record and returns to the main program. Have
the main program print all the records in the
sequential file and then close the file.
• Share the same file between the two programs
by making the file external with a shared file
status field.
PROCEDURE
DIVISION…RETURNING
• An alternate form of passing information
back to a calling program is provided:
PROCEDURE DIVISION RETURNING dataname
• To call a “Function” the invocation is:
CALL program-name RETURNING dataname
• Avoid this alternative in favor of Pass By
Reference.
Nested Programs
• Avoided in production programs at TSYS
• Convenient for developing (one file, one
compilation)
• Nested programs can be separated easily
into regular programs after debugging
• Can be used instead of PERFORM
• CALL to a nested program is as efficient
as a PERFORM
• Each program ends with END PROGRAM
Nested Program Structure
ID DIVISION.
PROGRAM-ID. X.
PROCEDURE DIVISION.
CALL “X1”
GOBACK
.
ID DIVISION. PROGRAM X
PROGRAM-ID. X1.
PROCEDURE DIVISION. PROGRAM
DISPLAY “I AM IN X1”
X1
GOBACK
.
END PROGRAM X1.
END PROGRAM X.
Exercise #7
• Convert one of your main programs and
subprograms to a nested program version
• Canceling only makes sense for
dynamically called programs
• Cause an abend in your subprogram.
Look at the storage dump and error
information. Is it any harder to debug than
a regular program?
COBOL is Recursive Now
• A COBOL program can call itself
• To make a program recursive, add “IS
RECURSIVE” to the PROGRAM-ID
statement
PROGRAM-ID. SUBPROG IS RECURSIVE.
• Nested programs cannot be recursive
Passing a Parm with JCL
• A parm can be coded on the EXEC statement in order to
pass a parameter to the program that is being executed:
// EXEC PGM=PROGNAME,PARM=‘HI there!'
• The COBOL program will receive the parm through the
LINKAGE SECTION
• Code a LINKAGE SECTION description similar to this:
01 PARM-BUFF.
05 PARM-LEN PIC S9(4) BINARY.
05 PARM-DATA PIC X(256).
• Code a using statement on the PROCEDURE DIVISION
PROCEDURE DIVISION USING PARM-BUFF.
Passing a Parm with JCL
• The parm field is variable in length
• Use the length field and reference
modification to move variable length data
MOVE PARM-DATA(1:PARM-LEN)TO PARMO
Exercise #8
• Try coding a main program that receives a
parm and prints it out
• Run the program with the following EXEC
statements:
• // EXEC PGM=PROGNAME,PARM=‘HI!‘
• // EXEC PGM=PROGNAME,PARM=‘HI THERE!‘
• // EXEC PGM=PROGNAME,PARM=‘ABCDEFGHIJKLMNOPQRSTUV'
Omitted Parameters
• You can leave out some arguments when
coding a CALL statement by coding OMITTED in
place of the passed variable
CALL “THATPROG” USING P1,OMITTED,P3
• Test for the OMITTED parameter by checking to
see if the address of the received parm is NULL.
PROCEDURE DIVISION USING X Y Z.

IF ADDRESS OF Y = NULL
DISPLAY “PARM Y WAS NOT PASSED”
END-IF
Exercise 8A
• Write a main program that passes three
parameters to a subprogram. The
subprogram detects and prints the passed
parameters.
• Try calling the subprogram with each
parameter omitted.
Tables
Creating A Single Dimension Table
• Build a storage area with list of data
values defined with multiple picture
clauses
• Redefine the storage area as a single
dimension table by defining a typical table
entry as an “occuring” item.
Creating A Single Dimension Table
01 DAY-TABLE-VALUES.
05 PIC X(9) VALUE 'SUNDAY '.
05 PIC X(9) VALUE 'MONDAY '.
05 PIC X(9) VALUE 'TUESDAY '.
05 PIC X(9) VALUE 'WEDNESDAY'.
05 PIC X(9) VALUE 'THURSDAY '.
05 PIC X(9) VALUE 'FRIDAY '.
05 PIC X(9) VALUE 'SATURDAY '.

01 DAY-TABLE REDEFINES DAY-TABLE-VALUES.


05 WEEKDAY PIC X(9) OCCURS 7 TIMES.
“Fat” Single-Dimension Tables
01 EMPLOYEE-TABLE.
05 EMPLOYEE-REC OCCURS 100 TIMES.
15 EMP-NO PIC X(5).
15 NAME PIC X(20).
15 LOC-CODE.
25 TERR-NO PIC XX.
25 OFFICE-NO PIC XX.
Employee Table
EMPLOYEE-REC(1)

12345 Joe Brown 10 20

12345
54321 Joe
Betty
Brown
Smith 10
30 20
40

54555 Joy Dokes 31 45

54321 Jim Doyle 32 90

LOC-CODE(3)
NAME(3)
EMP-NO(4)
Exercise #9
• Implement a single dimension table of
days. Print the table from beginning to
end
• Turn the table into a “fat” table by adding a
column with the number of letters in each
day name.
• Print each day name and the number of
letters it contains.
Multi-Dimension Tables
• COBOL supports up to 7 dimensions in
tables
• Use OCCURS within OCCURS to add
multiple dimensions
• 01 EMP-TABLE
05 EMPLOYEE OCCURS 100 TIMES.
10 NAME PIC X(30).
10 HOURS PIC S99 OCCURS 7 TIMES.
Multi-Dimension Table
• 01 EMP-TABLE.
05 EMPLOYEE OCCURS 3 TIMES.
10 NAME PIC X(30).
10 HRS PIC S99 OCCURS 3 TIMES.

NAME(1) HRS(1,1) HRS(1,2) HRS(1,3)

NAME(2) HRS(2,1) HRS(2,2) HRS(2,3)

NAME(3) HRS(3,1) HRS(3,2) HRS(3,3)

EMPLOYEE(3)
Exercise #10
• Create a table of integers with 4 rows and
5 columns.
• Print the table row by row
• Print the table column by column
• Compute and print the sum of each row
• Compute and print the sum of each
column
• Compute and print the sum of all entries in
the table
Creating Tables with Indexes
• 01 EMPLOYEE –TABLE.
05 EMPLOYEE OCCURS 100 TIMES
INDEXED BY I,J.
• 01 SALES-TABLE.
05 MONTH-RECORD OCCURS 12 TIMES
INDEXED BY M.
10 NAME PIC X(30).
2O AMOUNT PIC 9(5)V99 PACKED-DECIMAL
OCCURS 31 TIMES
INDEXED BY D.
Subscripts vs Indexes
• Subscripts
– Represent an occurrence number
– User defined as a numeric field – best to
choose USAGE IS BINARY
– Printable (since they are numeric)
– Can use relative subscripts J+1 or J-3
– Manipulated with PERFORM loops,
assignments, and arithmetic commands
Subscripts vs Indexes
• Indexes
– Represent a displacement value from the start
of a table.
– More efficient than subscripts
– Created automatically when a table is defined
with indexes
– Not really designed to be printed
– Manipulated with PERFORM loops, and SET
statements
SET Statements
• Examples
– SET J TO K
– SET J TO 1
– SET K UP BY 1
– SET K DOWN BY 1
– SET K TO K + 1
Exercise #11
• Convert Exercise #10 so that you are
using indexes instead of subscripts
Sequential Search
• COBOL provides a SEARCH command
that provides a sequential search for
tables that have indexes
• Table entries do not have to be sorted
• AT END clause provides code in the
situation that the search is unsuccessful
• Searching starts with the current index
value
SEARCH
Sequential Searching
• 01 EMPLOYEE-TABLE.
05 EMPLOYEE OCCURS 100 TIMES
INDEXED BY I-NDX.
10 EMP-NO PIC 9(5).
10 EMP-RANK PIC X(5).

SET I-NDX TO 1
SEARCH EMPLOYEE
AT END
DISPLAY ‘NOT FOUND’
WHEN EMP-NO(I-NDX) = 12345
DISPLAY EMP-RANK(I-NDX)
END-SEARCH
Sequential Searching
• 01 EMPLOYEE-TABLE.
05 EMPLOYEE OCCURS 100 TIMES
INDEXED BY I-NDX.
10 EMP-NO PIC 9(5).
10 EMP-RANK PIC X(5).

SET I-NDX TO 1
SEARCH EMPLOYEE
AT END
DISPLAY ‘NOT FOUND’
WHEN EMP-NO(I-NDX) < 10000
DISPLAY EMP-RANK(I-NDX)
WHEN EMP-NO(I-NDX) > 2000
DISPLAY EMP-RANK(I-NDX)
END-SEARCH
Sequential Search
• Search can be continued in a loop after
setting index value up or down
SET I-NDX TO 1
PERFORM UNTIL …
SEARCH EMPLOYEE
AT END
DISPLAY ‘NOT FOUND’
WHEN EMP-NO(I-NDX) = 12345
DISPLAY EMP-RANK(I-NDX)
SET I-NDX UP BY 1
END-SEARCH
END-PERFORM
Exercise #12
• Create a fat single dimension table with
the data in the file DATA1. Read the file
and store the second (Item #) and third
fields (Item name) in the table.
• Assume a fixed size table of 40 items.
• Sequentially search the table for item #s in
the range 400 to 450. Print out the results
of the search.
Binary Searching
• Entire table is searched. No need to initialize an
index
• Table must have an ASCENDING or
DESCENDING KEY IS clause. Table must be
sorted.
• Only one WHEN clause allowed. The WHEN
clause is comprised of one or more “equal” tests
joined by AND operators
• AT END clause is invoked if the WHEN clause is
never satisfied
Binary Search
Binary Searching
• 01 EMPLOYEE-TABLE.
05 EMPLOYEE OCCURS 100 TIMES
ASCENDING KEY IS EMP-NO
INDEXED BY I-NDX.
10 EMP-NO PIC 9(5).
10 EMP-RANK PIC X(5).

SEARCH ALL EMPLOYEE
AT END
DISPLAY ‘NOT FOUND’
WHEN EMP-NO(I-NDX) = 12345
DISPLAY EMP-RANK(I-NDX)
END-SEARCH
SEARCH ALL
• SEARCH ALL performs a binary search with an index
• ENTRIES MUST BE IN ORDER
• No SET necessary (whole table searched)
01 SALES-TAX.
05 TAB-ENTRIES OCCURS 100 TIMES
ASCENDING KEY ZIPCODE
INDEXED BY K.
10 ZIPCODE PIC 9(5).
10 RATE PIC V999.

SEARCH ALL TAB-ENTRIES


AT END MOVE 0 TO TAX
WHEN ZIPCODE(K) = ZIPIN
COMPUTE TAX = RATE(K) * AMOUNT
END-SEARCH
SEARCH ALL CONSTRAINTS
• The condition following WHEN must test
for equality
• Compound conditions with ANDs not Ors
• Only one WHEN clause
• VARYING not allowed
• OCCURS item and its index must appear
on the left of the equal sign
– WHEN TEMP(K) = 80
SEARCH ALL Constraints
• Table must indicate ASCENDING or
DESCENDING KEY
01 TABLE.
05 CUST-REC OCCURS 40 TIMES
ASCENDING KEY CUST
INDEXED BY K.
10 CUST PIC 9(4).
10 RATE PIC V999.
Exercise #13
• Convert Exercise #12 to a binary search.
Variable Length Tables
• Storage for variable length tables is
statically created
• To create a variable length table, use an
alternative version of OCCURS
Example: OCCURS 1 TO 100 TIMES
• To create a variable length table add a
DEPENDING ON clause to the table
definition
Example: DEPENDING ON REC-COUNT
Variable Length Tables
• After loading the table with entries, set the index
to point at the last item. Move the index to the
DEPENDING ON field
• 01 CUST-TABLE.
05 CUSTOMER OCCURS 1 TO 50 TIMES
DEPENDING ON C-COUNT
ASCENDING KEY IS AGE
INDEXED BY I.
10 NAME PIC X(20).
10 AGE PIS S999.
Exercise #14
• Convert Exercise #12 to a variable length
table.
• Assume you don’t know how many items
will be in the table, but the range is 30 to
100 items.
Intrinsic Functions
• MEAN ( ARG1, ARG2,…)
• MEDIAN (ARG1, ARG2…)
• STANDARD-DEVIATION(ARG1,ARG2,…)
• VARIANCE (ARG1,ARG2, …)
• RANGE (ARG1, ARG2, …)
• MAX (ARG1, ARG2, …)
• MIN (ARG1, ARG2, …)
• ORD-MIN (ARG1,ARG2,…)
• ORD-MAX (ARG1,ARG2,…)
• SUM (ARG1, ARG2, …)
Intrinsic Functions
• CURRENT-DATE
• UPPER-CASE (ARG)
• LOWER-CASE(ARG)
• ANNUITY(RATE,NO-OF-PAYMENTS)- returns a
decimal fraction that when multiplied by
loan amount produces the payment. Rate
must be consistent with payment period.
• PRESENT-VALUE(RATE,AMT1,AMT2,…) – returns
the present value of future payments
Intrinsic Functions
• SQRT(ARG)
• REM(ARG1,ARG2) –returns the remainder of
arg1 divided by arg2
• MOD(ARG1,ARG2)- similar to REM but with
integer arguments
• INTEGER(ARG) – the greatest integer less
than or equal to ARG
• INTEGER-PART(ARG) – the integer part of
ARG
• NUMVAL(ARG) – the numeric value of an
argument that contains leading spaces,
sign, or decimal point
Intrinsic Function Syntax
• FUNCTION function-name [(arg1 …]
• Arguments can be literals, variables,
expressions, other functions
• Functions can operate on tables by using
the word ALL for the subscript
COMPUTE X = FUNCTION SUM(SALARY(ALL))
COMPUTE Y = FUNCTION SUM(PRICE(1 ALL))

• Usually used with COMPUTE or MOVE


Exercise #15
• Using Exercise #10 and intrinsic functions,
compute the minimum value of each row
and the mean of the entire array.
Reconsidering Tables
• With vast amounts of main storage today, you
should consider the types of file operations you
are using and whether or not an application
could benefit by pulling an entire file (or part of a
file) into main storage. Working directly with
records in memory is very efficient and can
speed up an application greatly
• Most of the time spent in an application is in I/O.
Files with Variable Length
Records
Variable Length Records

FD CUSTFILE
RECORD IS VARYING IN SIZE
FROM 50 TO 80 CHARACTERS
DEPENDING ON RECSIZE.
When a record is read from a file defined with the RECORD IS
VARYING IN SIZE.. DEPENDING ON identifier phrase, the size of
the record read into the buffer is moved into the data-item identifier

To write to a file defined with the RECORD IS VARYING IN SIZE..


DEPENDING ON identifier phrase, the size of the record to be
written must first be moved to the identifier data-item, and then the
WRITE statement must be executed.
Exercise #16
• Use program WRITEVAR as a model.
Run the program to create a variable
length record file.
• Write a program READVAR that reads the
file and prints out the total sales for each
person
Strings
String
• The STRING command is used combine
one or more strings into a single
concatenated result
Joining Strings
• Use STRING to join multiple parts of
strings into an entirely new string
STRING ident1 DELIMITED ident2
literal BY literal
size
INTO ident3
POINTER ident4
WITH
OVERFLOW imperative stmt
ON
Joining Strings

NOT OVERFLOW imperative stmt END-STRING


Delimited By
• The characters in ident1 or literal1 are
used to build a new string
• Only the characters up to the delimiter are
transferred
• ”ABCDEF” DELIMITED BY ”D” transfers
”ABC”
• “JOE BOB SMITH” DELIMITED BY “ “
(two spaces) transfers ”JOE BOB”
Delimited By
• DELIMITED BY SIZE causes the entire
identifier or literal to be transferred
STRING INTO
• The INTO clause indicates the target
variable where the concatenation occurs
• Only one target can be indicated
• If the target is too small to handle the
concatenation, the ON OVERFLOW
condition is executed
With Pointer
• The WITH POINTER clause indicates a
variable that contains the position within
the target field where the next character
will be placed
• The pointed is incremented each time a
character is transferred
• At the end, the pointer points to the
location following the last transferred
character
On Overflow
• The ON OVERFLOW clause is executed if
the target is too small to handle the
concatenated result
• The ON OVERFLOW clause is also
executed whenever the pointer points to a
location outside of the target field
Example String Operation
STRING ID-1 DELIMITED BY “*”
ID-2 ID-3 DELIMITED BY SIZE
INTO ID-4 WITH POINTER PTR
END-STRING

ID-1 ID-2 ID-3 PTR


ABC*DE 1234*5 XYZ 13

ID-4 (Assume PIC X(20) Assume PTR is


ABC1234*5XYZ Initially 1
STRING
STRING Operation
• Unlike MOVE, STRING does not replace
rightmost character with spaces
• The POINTER field is a numeric field that
afterwards contains the position of the
next byte in the receiving field that would
have been processed. (Max = string length
+ 1)
Exercise #17
• Read the file DATA1.
• Create three fields in the input record:
1) cols 1 – 11
2) cols 15-18
3) cols 40-65
Remove the first part of field 1 up to the *.
Remove all of field 2.
Remove all of field 3 up to the first space
String these three fields together. For example the first
record would produce
“66660066PEANUT”
Print the results of each record.
UNSTRING
• The UNSTRNG command is used to pull
apart a single string into one or more
component strings
UNSTRING
UNSTRING
• Extracts a field into multiple strings and stores
them into one or more fields
• DELIMITED BY indicates how each subfield
ends
• If ALL is specified for a delimiter, successive
occurrences of the delimiter are treated as one
UNSTRING ADDRESS DELIMITED BY ALL “ “
INTO STATE ZIP
WITH POINTER PTR
END-UNSTRING
Delimiter In
• The DELIMITER IN phrase is used when
you need to save the delimiter that was
used for a given field
UNSTRING NAME-FIELD
DELIMITED BY ”*” OR ”#”
INTO N1 DELIMITER IN D1
N2 DELIMITER IN D2
END-UNSTRING
Count In
• The COUNT IN phrase is used to capture
the number of characters sent to a given
field
UNSTRING NAME-FIELD
DELIMITED BY ”*” OR ”#”
INTO N1 COUNT IN C1
N2 COUNT IN C2
END-UNSTRING
UNSTRING
• UNSTRING copies Characters from the source
string to the destination strings according to the
rules for alphanumeric moves.
• UNSTRING uses space filling.
• The DELIMITED BY clause causes data
movement from the source string to the current
destination string to end when
1) a delimiter is encountered in the source string
2) the end of the source string is reached.
UNSTRING
• If DELIMITED BY is not used, data movement
terminates when
1) the destination string is full
2) the end of the source string is reached
• The UNSTRING terminates when
1) All the characters in the source string have been
processed
2) All the destination strings have been processed
3) An OVERFLOW condition is encountered when the
pointer is pointing outside the source string.
UNSTRING EXAMPLE
UNSTRING ADDRESS DELIMITED BY ALL “ “
INTO STATE COUNT IN STCNT
ZIP COUNT IN ZIPCNT
WITH POINTER PTR
END-UNSTRING
UNSTRING Example
UNSTRING ADDRESS DELIMITED BY ","
INTO LINE(1)
LINE(2)
LINE(3)
Line(4)
TALLYING IN NOLINES
END-UNSTRING.
• Tallying leaves the number of receiving
fields that actually receive data in the
named variable
Exercise #18
• Read the file DATA1.
• For each record in the file, UNSTRING
field 1-11 into two parts (separate at the *).
Print each part.
INSPECT Statement
INSPECT Statement
Formats
INSPECT has four formats:
1) TALLYING: used to count characters in a string.

2) REPLACING: used to replace a group of characters


in a string with another group of characters.

3) TALLYING…REPLACING: combines both


operations in one statement.

4) INSPECT …CONVERTING: converts each of a set of


characters to its corresponding character in another set
of characters.
TALLYING
INSPECT LINE TALLYING ACOUNT
FOR ALL “A”

INSPECT LINE TALLYING XCOUNT


FOR ALL “X"
AFTER INITIAL “S"
BEFORE INITIAL “E".
TALLYING
INSPECT LINE TALLYING ACOUNT
FOR ALL “A”

INSPECT LINE TALLYING


XCOUNT FOR CHARACTERS
BEFORE “,“
YCOUNT FOR CHARACTERS
AFTER “E".
REPLACING
INSPECT MYSTRING
REPLACING ALL “X” BY “Y"
AFTER INITIAL “A"
BEFORE INITIAL “Z“

INSPECT MYSTRING
REPLACING ALL “XXXX" BY “ABCD“
AFTER INITIAL “A“
BEFORE INITIAL “P"
TALLYING … REPLACING
INSPECT LINE TALLYING ACOUNT
FOR ALL “A”
REPLACING ALL “X” BY “Y"
AFTER INITIAL “A"
BEFORE INITIAL “Z“
CONVERTING
INSPECT MYTEXT
CONVERTING
"abcdefghijklmnopqrstuvwxyz“
TO
"ABCDEFGHIJKLMNOPQRSTUVWXYZ“
Pointers
Creating a Pointer
• 05 PTR USAGE IS POINTER.
• 05 A-PTR POINTER.
• These definitions create 4 byte fullwords
capable of containing addresses of
memory locations
Setting a Pointer
• SET PTR TO ADDRESS OF X
• SET PTR1 TO PTR2
• The interesting point is that Cobol now
allows pointers to reference storage areas
that are inside the program.
• In older versions, Linkage areas could only
reference areas outside the program.
“Dropping a Linkage Area”
• To position a linkage section item onto a
storage area, use SET ADDRESS
Linkage Section.
01 X PIC X(8).
SET ADDRESS OF X TO PTR
Cobol Pointers
• This fundamentally changes how Cobol
can be written
• Data structures can now be supported in
Cobol (stacks, queues)
• Segmented records can be supported
Exercise #19
• Try running programs LINKED and
LINKED1 in BCST.SICCC01.PDSLIB
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 must be
allocated in a separate job step before
data can be written to the file
• VSAM cluster can be 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
• 005450 DISPLAY MASTER-REC-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]
REWRITE
REWRITE record-name [FROM data-name]
[INVALID KEY imperative stmt]
[NOT INVALID KEY imperative stmt]
[END-REWRITE]
A typical scenario is to read the record, modify it
(can’t change the key field), and then rewrite it.
For random and dynamic access, you can
REWRITE a record without first reading it.
DELETE
DELETE file-name [RECORD]
[INVALID KEY imperative stmt]
[NOT INVALID KEY imperative stmt]
[END-DELETE]
• DELETE can only be used for a file in I-O mode
• If file is in sequential mode, the DELETE can
only be used after executing a READ statement
for that record. (Omit INVALID KEY)
• If file is in random or dynamic mode, a DELETE
can be issued without previously reading the
record (specify INVALID KEY)
START
START file-name
KEY IS EQUAL TO data-name
=
GREATER THAN
>
NOT LESS THAN
NOT <
>=
[INVALID KEY imperative stmt]
[NOT INVALID KEY imperative stmt]
[END-START]

• Used for sequential and skip-sequential processing


• Does not return a record – positions you in the file
File Status Codes
• 00 Operation completed successfully
• 02 Duplicate Key was found
• 04 Invalid fixed length record
• 05 The file was created when opened - Successful Completion
• 07 CLOSE with REEL or NO REWIND executed for non tape
dataset.
• 10 End of File encountered
• 14 Attempted to READ a relative record outside file boundary
• 21 Invalid Key - Sequence error
• 22 Invalid Key - Duplicate Key found
• 23 Invalid key - No record found
• 24 Invalid Key - key outside boundary of file.
File Status Codes
• 30 Permanent I/O Error34 Permanent I/O Error - Record outside file
boundary
• 35 OPEN, but file not found
• 37 OPEN with wrong mode
• 38 Tried to OPEN a LOCKed file
• 39 OPEN failed, conflicting file attributes
• 41 Tried to OPEN a file that is already open
• 42 Tried to CLOSE a file that is not OPEN
• 43 Tried to REWRITE without READing a record first
• 44 Tried to REWRITE a record of a different length
• 46 Tried to READ beyond End-of-file
• 47 Tried to READ from a file that was not opened I-O or INPUT
• 48 Tried to WRITE to a file that was not opened I-O or OUTPUT
• 49 Tried to DELETE or REWRITE to a file that was not opened I-O
File Status Codes
• 91 Password or authorization failed
• 92 Logic Error
• 93 Resource was not available (may be allocated to
CICS or another user)
• 94 Sequential record unavailable or concurrent OPEN
error
• 95 File Information invalid or incomplete
• 96 No DD statement for the file
• 97 OPEN successful and file integrity verified
• 98 File is Locked - OPEN failed
• 99 Record Locked - record access failed.
Exercise #20
• Create a data file of records which is sorted on a
key field (choose a 5 byte key). Creating an 80
byte record in a PDS is easiest. Let some of the
keys be in the 10000 – 19999 range, some in
range 20000 – 29999, some in range 30000 –
39999, and some in range 40000-49999.
(VSAMDATA)
• Read the file and output a fixed size record
VSAM file.
Exercise #21
• Read the VSAM file you created in
Exercise 20 and print out the records (your
choice of format).
Exercise #22
• Create a small file of keys. Some of the
keys should match records in your VSAM
file and some should not. (VSAMKEYS)
• Process the VSAM file randomly. Take
each key, print it, and print the record if it
is on the file, otherwise print a message
indicating the record was not found.
Exercise #23
• Process the VSAM file dynamically with
skip-sequential processing.
• Issue a Start statement and print the
records with keys in the range 20000-
29999. Issue another START and print
the records in the range 40000 – 49999.
Exercise #24
• Create a small file of keys. Some of the
keys should match records in your VSAM
file and some should not.
• Process the VSAM file randomly. Take
each key, read the VSAM file, and delete
each record that is found. If the record is
not found print a message indicating this.
Alternate Indexes
• An alternate index provides a way to
navigate through a VSAM cluster using an
alternate key
• Creating an alternate index is a 3 step
process:
– DEFINE ALTERNATE INDEX
– DEFINE PATH
– BLDINDEX
Define Alternateindex
• //KC02107X JOB 'WOOLBRIGHT',REGION=2M,MSGCLASS=Q,MSGLEVEL=(0,0),
• // NOTIFY=KC02107
• //*----------------------------------------------------------*
• //* VSAM
• //*----------------------------------------------------------*
• //STEPMAKE EXEC PGM=IDCAMS
• //SYSPRINT DD SYSOUT=*
• //SYSIN DD *
• DELETE KC02107.SICCC01.MYVSAM.AIX
• DEFINE ALTERNATEINDEX -
• (NAME (KC02107.SICCC01.MYVSAM.AIX) -
• RELATE (KC02107.SICCC01.MYVSAM) -
• KEYS (20 5) -
• NONUNIQUEKEY -
• UPGRADE -
• REUSE ) -
• DATA (NAME (KC02107.SICCC01.MYVSAM.AIX.DATA) -
• TRACKS(1 1)) -
• INDEX (NAME (KC02107.SICCC01.MYVSAM.AIX.INDEX))
• DEFINE PATH (NAME(KC02107.SICCC01.MYVSAM.PATH) -
• PATHENTRY(KC02107.SICCC01.MYVSAM.AIX) -
• UPDATE )
• //
BLDINDEX
• //KC02107X JOB
'WOOLBRIGHT',REGION=2M,MSGCLASS=Q,MSGLEVEL=(0,0),
• // NOTIFY=KC02107
• //*----------------------------------------------------------*
• //* VSAM BLDNDX CLUSTER *
• //*----------------------------------------------------------*
• //STEPMAKE EXEC PGM=IDCAMS
• //SYSPRINT DD SYSOUT=*
• //SYSIN DD *
• BLDINDEX INDATASET(KC02107.SICCC01.MYVSAM) -
• OUTDATASET(KC02107.SICCC01.MYVSAM.AIX)
• /*
• //
VSAM REPRO
• //KC02107X JOB
'WOOLBRIGHT',REGION=2M,MSGCLASS=Q,MSGLEVEL=(0,0),
• // NOTIFY=KC02107
• //*----------------------------------------------------------*
• //* VSAM REPRO CLUSTER *
• //*----------------------------------------------------------*
• //STEPMAKE EXEC PGM=IDCAMS
• //SYSPRINT DD SYSOUT=*
• //SYSIN DD *
• REPRO INDATASET(KC02107.ASM.DAT(VSAMDATA)) -
• OUTDATASET(KC02107.SICCC01.MYVSAM)
• /*
• //
Debugging
Learn Hex Basics
Decimal:
• 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hexadecimal
• 0123456799 A B C D E F
Learn Binary Basics
• Every digit is a power of 2
• 1 1 1 0 1 0 0 1

128 32 8 2 1
64 16 4
128+64+32+0+8+0+ 0+1 = 233
Binary to Hex
• Conversion rule: Remove blocks of 4
binary digits and replace them with a
single hex digit
• 1101 1100 0011 1011
D C 3 B
• Hex dumps are made of hex digits and
represent binary values that are stored in
memory – a short-hand notation
• 2 HEX DIGITS = 1 BYTE
EBCDIC Characters
CHAR HEX CHAR HEX CHAR HEX CHAR HEX
0 = F0 A = C1 J = D1
1 = F1 B = C2 K = D2 S = E2
2 = F2 C = C3 L = D3 T = E3
3 = F3 D = C4 M = D4 U = E4
4 = F4 E = C5 N = D5 V = E5
5 = F5 F = C6 O = D6 W = E6
6 = F6 G = C7 P = D7 X = E7
7 = F7 H = C8 Q = D8 Y = E8
8 = F8 I = C9 R = D9 Z = E9
9 = F9

SPACE = 40 COMMA = 6B PERIOD = 4B * = 5C


MINUS = 60
Zoned Decimal Format
• Byte = 8 bits
• Leftmost 4 bits = zone part
• Rightmost 4 bits = numeric part
• PIC S9999
• PIC 99 ZONE NUMERIC
• PIC 99V99
• One digit per byte – sign in zone portion of last
byte. Preferred signs – C +, D –
• Signs: A C E F + BD-
Zoned Decimal Format
• PIC S999 VALUE 123 F1F2C3
• PIC 99V99 VALUE 12.34 F1F2F3C4
• PIC S99 VALUE -12 F1D2
• PIC S999 VALUE 0 F0F0C0
Zoned Decimal Data
• Zoned decimal data was designed for data
entry and is an old data format
• No arithmetic can occur in zoned decimal!
• If you perform arithmetic with zoned
decimal fields, they must first be converted
to packed decimal or binary
• This conversion is usually unnecessary
Data Types
• PACKED-DECIMAL (COMP-3) – specify
15 or fewer digits in the PIC clause to
avoid the use of library routines.
• Always code an odd number of digits!
– 01 TOTAL PIC S9(7).
• Always code a sign unless you have a
good reason not to.
• This is a great choice for most business
arithmetic
Packed Decimal Format
• Two decimal digits per byte
• Sign stored in numeric portion of the
rightmost byte 12|34|5C
• Decimal points are implied (not stored)
• Choose packed decimal over zoned
decimal if possible
Packed Decimal
• PIC S999 PACKED-DECIMAL VALUE 123
123C
• PIC S9(3)V99 PACKED-DECIMAL VALUE -123
00123D
• PIC S9(4) PACKED-DECIMAL VALUE -98
00098D (5 digits exist here)
• PIC 9(7) PACKED-DECIMAL VALUE -32
COMPILE ERROR
• PIC 9(7) PACKED-DECIMAL VALUE 32
0000032C
Binary Data
• 1-4 digits = 2 bytes = halfword
• 5-9 digits = 4 bytes = fullword
• 10-18 digits = 8 bytes = doubleword
• PIC S9(4) BINARY = 2 BYTES
• PIC S9(5) BINARY = 4 BYTES
• PIC S9(9) BINARY = 4 BYTES
• PIC 9(8) BINARY = 4 BYTES
Signed Binary
• Signed binary data is stored in 2’s
complement format
• High order bit is a sign 1 is negative, 0 is
positive
• 0001101 = 13 in decimal
• 1110010 = -14
• Conversion rule: Change the 1s to 0s and
0s to 1s, then add 1. This computes the
2s complement
Conversions
• The machine has specific conversion
instructions for changing between types:
1) PACK, UNPK are used to convert
between Zoned and Packed.
2) CVB and CVD between Packed and
Binary.
• Try to minimize the conversions by staying
in packed
Pointers
USAGE IS POINTER – A 4 BYTE
FULLWORD STORED IN BINARY
Signed Binary
• Example: 111111
Changing: 000000
Add 1: 000000 + 1 = 000001
1 is the complement so 111111 is -1

• Example: 110011
Changing: 001100
Add 1: 001100 + 1 = 001101 = 13
110011 = -13
Display
• The answer to all debugging problems is
to gain more information. DISPLAY can
provide it.
Debugging Lines
• It is possible to add debugging lines in
your code that can be logically removed by
commenting one line:
• Add a “WITH DEBUGGING MODE”
Phrase to your program:

ENVIRONMENT DIVISION.
SOURCE COMPUTER. IBM-XXX WITH DEBUGGING MODE.
Debugging Lines
• Put a D in column 7 on each debugging
line:
D IF X NOT = Y
D DISPLAY X
D END-IF

• The lines will execute if “WITH


DEBUGGING MODE” is included
• Otherwise, the lines are treated as
comments
Adding Compiler Options
• Compiler options can be included as the
first line of a COBOL program:
PROCESS options…
or
CBL options
• Compiler options can be included from an
external file:
//SYSOPTF DD DSN= …
A Compiler Option for Debugging

• Use the SSRANGE compiler option while testing to help


detect invalid subscript values
• Is the effective address of an element within the
boundary of a table?
• For variable length data references,Is the actual length
positive and within the max define length of the group
item?
• For reference-modified data references, are the offset
and the length positive? Is the length within the max
length of the data item?
Dump Reading
• Display Filter View Print Options Help
• -------------------------------------------------------------------------------
• SDSF OUTPUT DISPLAY SICCC01A JOB22537 DSID 102 LINE 116 COLUMNS 02- 81
• COMMAND INPUT ===> SCROLL ===> CSR
• Data Division Map
• Data Definition Attribute codes (rightmost column) have the following meanings:
• D = Object of OCCURS DEPENDING G = GLOBAL S =
• E = EXTERNAL O = Has OCCURS clause U =
• F = Fixed-length file OG= Group has own length definition V =
• FB= Fixed-length blocked file R = REDEFINES VB=
• Source Hierarchy and Base Hex-Displac
• LineID Data Name Locator Blk Struc
• 2 PROGRAM-ID BOMB1--------------------------------------------------------
• 6 1 MYTABLE-VALUES. . . . . . . . . . . . . . . . BLW=00000 000
• 7 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 000 0 000
• 8 2 MYPTR1. . . . . . . . . . . . . . . . . . . BLW=00000 010 0 000
• 9 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 014 0 000
• 10 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 024 0 000
• 11 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 034 0 000
• 12 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 044 0 000
• 13 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 054 0 000
• 14 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 064 0 000
• 15 1 X . . . . . . . . . . . . . . . . . . . . . . BLW=00000 078
• 16 1 Y . . . . . . . . . . . . . . . . . . . . . . BLW=00000 080
Data Division Map
• 0Source Hierarchy and Base Hex-Displa
• LineID Data Name Locator Blk Stru
• 2 PROGRAM-ID BOMB1-------------------------------------------------------
• 6 1 MYTABLE-VALUES. . . . . . . . . . . . . . . . BLW=00000 000
• 7 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 000 0 00
• 8 2 MYPTR1. . . . . . . . . . . . . . . . . . . BLW=00000 010 0 00
• 9 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 014 0 00
• 10 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 024 0 00
• 11 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 034 0 00
• 12 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 044 0 00
• 13 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 054 0 00
• 14 2 FILLER. . . . . . . . . . . . . . . . . . . BLW=00000 064 0 00
• 15 1 X . . . . . . . . . . . . . . . . . . . . . . BLW=00000 078
• 16 1 Y . . . . . . . . . . . . . . . . . . . . . . BLW=00000 080
• 17 1 Z . . . . . . . . . . . . . . . . . . . . . . BLW=00000 088
• 18 1 PTR . . . . . . . . . . . . . . . . . . . . . BLW=00000 090
• 20 1 ANIMAL. . . . . . . . . . . . . . . . . . . . BLL=00001 000
• 21 2 NAME. . . . . . . . . . . . . . . . . . . . BLL=00001 000 0 00
• 22 2 NEXT-ANIM . . . . . . . . . . . . . . . . . BLL=00001 010 0 00
Dump Information
• <H1> I B M F A U L T A N A L Y Z E R S Y N O P S I S


• A system abend 0C4 reason code X'4' occurred in module IGZCPAC at offset
• X'3FEB4'.

• A program-interruption code 0004 (Protection Exception) is associated with this
• abend and indicates that:

• An attempt was made to access a protected storage location using an incorrect
• storage access key.

• The cause of the failure was program BOMB1 in module BOMB1. The COBOL source
• code that immediately preceded the failure was:

• Source
• Line #
• ------
• 000027 DISPLAY NAME

Dump Information
• ********************************************************************************
• *********************** P O I N T O F F A I L U R E **********************
• ********************************************************************************

• This is the point where control left program BOMB1 prior to the S0C4 abend.

• COBOL Source Code:

• Source
• Line #
• ------
• -5 05 NEXT-ANIM PIC X.
• -4 PROCEDURE DIVISION.
• -3 SET PTR TO ADDRESS OF MYTABLE-VALUES
• -2 SET ADDRESS OF ANIMAL TO PTR
• -1 PERFORM 7000 TIMES
• 000027 DISPLAY NAME
• +1 SET ADDRESS OF ANIMAL TO ADDRESS OF NEXT-ANIM
• +2 END-PERFORM
• +3 GOBACK
Dump Information
• Load Module Name. . . . . . : BCST.GP5CS4.DOMESTIC.LOADLIB(BOMB1)
• At Address. . . . . . . . : 38B00C38
• Load Module Length. . . . : X'13C8'
• Link-Edit Date and Time . : 2005/05/13 12:36:33

• Program and Entry Point Name: BOMB1
• At Address. . . . . . . . : 38B00C38 (Module BOMB1 offset X'0')
• Program Length. . . . . . : X'77A'
• Program Language. . . . . : COBOL (Compiled using IBM Enterprise COBOL for
• z/OS and OS/390 V3 R3 M1 on 2005/05/13 at
• 12:36:32)

• Machine Instruction . . . . : 05EF BALR R14,R15
• At Address. . . . . . . . : 38B0106E (Program BOMB1 offset X'436')
• AMODE . . . . . . . . . . : 31

• General Purpose Registers:
• R0: 00001364 (Storage invalid)
• R1: 38B00E49 (Module BOMB1 program BOMB1 + X'211')
Dump Information
• WORKING-STORAGE SECTION
• Off Hex Value EBCDIC Value Source (Starting at
• ---- ----------------------------------- ------------------ --------------------
• <H5> BLW=0000 at address 38D500B8
• 01 MYTABLE-VALUES.
• 0 C1C1D9C4 E5C1D9D2 40404040 40 *AARDVARK * 10 PIC X(1
• 10 00000000 *.... * 10 MYPTR1
• 14 C2C5C1E5 C5D94040 40404040 40404040 *BEAVER * 10 PIC X(1
• 24 C3D6D5C4 D6D94040 40404040 40404040 *CONDOR * 10 PIC X(1
• 34 C4C5C5D9 40404040 40404040 40404040 *DEER * 10 PIC X(1
• 44 C5D3C5D7 C8C1D5E3 40404040 40404040 *ELEPHANT * 10 PIC X(1
• 54 C6D6E740 40404040 40404040 40404040 *FOX * 10 PIC X(1
• 64 C7C9D9C1 C6C6C540 40404040 40404040 *GIRAFFE * 10 PIC X(1
• 78 12345D -123.45 01 X PIC S99
• 80 F4F5C6 456+ 01 Y PIC S99
• 88 FFEC -20 01 Z PIC S9(
• 90 38D500B8 *.N.. * 01 PTR POINTER

Dump Information
• LINKAGE SECTION
• BLL=0000 has not been assigned an address
• Off Hex Value EBCDIC Value Source (Starting at
• ---- ----------------------------------- ------------------ -------------------
• <H5> BLL=0001 at address 38D57FF8
• 01 ANIMAL.
• 0 00000000 00000000 00000000 00000000 *................* 05 NAME
• 10 00 *. * 05 NEXT-ANIM

• See "System-Wide Information" - "Storage Areas" - "Hex-Dumped Storage" for
• unformatted storage areas related to this event.


Dump Information
• dress 38D500B8
• 01 MYTABLE-VALUES.
• 9D2 40404040 40 *AARDVARK * 10 PIC X(13) VALUE "AARDVARK
• *.... * 10 MYPTR1 POINTER SYNC.
• 040 40404040 40404040 *BEAVER * 10 PIC X(16) VALUE "BEAVER
• 040 40404040 40404040 *CONDOR * 10 PIC X(16) VALUE "CONDOR
• 040 40404040 40404040 *DEER * 10 PIC X(16) VALUE "DEER
• 5E3 40404040 40404040 *ELEPHANT * 10 PIC X(16) VALUE "ELEPHANT
• 040 40404040 40404040 *FOX * 10 PIC X(16) VALUE "FOX
• 540 40404040 40404040 *GIRAFFE * 10 PIC X(16) VALUE "GIRAFFE
• -123.45 01 X PIC S999V99 PACKED-DECIMAL
• 456+ 01 Y PIC S999 VALUE 456.
• -20 01 Z PIC S9(4) BINARY VALUE -20
• *.N.. * 01 PTR POINTER.
XML and COBOL
XML
• XML = Extensible Markup Language
• Used to expose the structure and content of a
document
• Becoming a universal means of exchanging data
• Tag language
<author>
<firstname>Charles</firstname>
<lastname>Dickens</lastname>
</author>
XML
• Tags are user-defined
• Every start tag has a matching stop tag
<atag> …</atag>
• Sometimes the tags are combined into
one start and stop tag
<media type = “CD” />
• Tags can’t overlap
NO: <a> <b> </a> </b>
XML
• Tags can be nested
<a> <b> </b> </a>

• Documents are tree-structured


a
<a>
<b></b> b c
<c>
<d></d> d
</c>
</a>
XML
• Text based documents
• Case sensitive
• Must contain one root element
• Start with an XML declaration and comments
<?xml version = “1.0”?>
<!– comment line - ->
<a>
</a>
XML
• XML is “Well Formed” if
1) Single root element
2) Start and end tags matching for all
elements
3) Proper nesting
4) Attribute values in quotes
XML Parsers
• An XML parser is a program that can read an XML
document and provide programmatic access to the
document
• Two types of parsers:
1) DOM based – Document Object Model
Constructs a tree that represents the
document
2) SAX based – Simple API for XML
Generates events when parts of the
document are encountered.
• Can also be classified as “push” or “pull” parsers
COBOL Features for Processing
XML Input
• XML PARSE – begins parsing the
document and identifies the processing
procedure in your document
• Processing Procedure – receives and
processes the events that are generated
by the parser
COBOL Features for Processing
XML Input
• Special Registers
– XML-CODE - to determine the status of XML
parsing
– XML-EVENT - to receive the name of the
event
– XML-TEXT – to receive XML document
fragments
Enterprise COBOL
• Contains an event-based parser that allows you
to read XML documents and process them with
COBOL
• XML documents can be retrieved from an MQ
message, CICS TD queue, or IMS message
processing queue
• XML documents that are read from a file must
be brought into storage as a single item.
(Records can be combined using STRING)
Parsing
XML PARSE document
PROCESSING PROCEDURE event-handler-name
ON EXCEPTION …
NOT ON EXCEPTION …
END-XML
• Parsing continues until
1) an END-DOCUMENT event occurs
2) the parser signals EXCEPTION and the procedure
doesn’t reset the XML-CODE register to 0
3) you terminate processing by moving -1 to XML-
CODE
Parsing XML Events
• The XML-EVENT register contains the
event name that the parser passing to the
handler
• The XML-CONTENT register contains the
content for the event
Events
• Some typical events:
START-OF-DOCUMENT
START-OF-ELEMENT
ATTRIBUTE-NAME
END-OF-ELEMENT
CONTENT-CHARACTERS
START-OF-CDATA-SECTION
END-OF-DOCUMENT
Processing Flow
Exercise #25
• Use the file BCST.SICCC01.PDSLIB(XMLDATA2)
• The file structure is similar to the one below:
<?xml version=”1.0” encoding=”ibm-1140” standalone=”yes”?>
<batch>
<trans>
<name>Joe Smith</name>
<amt>12.32</amt>
<amt>5.42</amt>
</trans>
<trans
<name>Tina Louise</name>
<amt>8.99</amt>
</trans>

</batch
Exercise #25
• Write an XML Cobol program that reads the file
and copies it to memory.
• Print out a report that lists each customer name
and a total for each customer.
• Print a grand total for the entire file
Name Amount
Joe Smith 17.74
Tina Louise 8.99
Grand Total 26.73
Exercise #26
• Read the file
BCST.SICCC01.PDSLIB(BOOKLIST)
• Copy the data into memory storing the
data as a Cobol data structure
• Write out the entire file as a single XML file
• Pretty print the XML file
Exercise #26
• The XML file should have the following structure
<booklist>
<book>
<author>Melville</author>
<title>Moby Dick</title>
</book>
….
</booklist>
Compiler Options
• Default compiler options are in effect for
TSYS
• Options can be overridden with a process
statement that precedes the
IDENTIFICATION DIVISION
• Example (Start in column 8 or 1)
PROCESS LIST, AWO
Apply Write Only
• AWO is faster than NOAWO
• Applies to variable length, blocked files
• With AWO the file buffer is written when
there is not enough space for the next
record
• Without AWO the file buffer is written
when the largest size record won’t fit in the
buffer
DATA(24) and DATA(31)
• DATA(31) + RENT relieves some below
the line storage problems. QSAM file
buffers can be placed above the line
• With DATA(24), working storage and FD
record areas are below the line
DYNAM and NODYNAM
• DYNAM causes programs that are called
by their literal names to be called
dynamically
• NODYNAM allows for static calls for calls
made with literal names of programs
NUMPROC
• NUMPROC(PFD) – generates efficient
code for numeric comparisons. Doesn’t fix
up signs
• NUMPROC(NOPFD) – causes sign fix up
for numeric fields
• NUMPROC(MIG) – causes arithmetic
similar to OS/vs Cobol
OPTIMIZE
• OPTIMIZE(STD) and OPTIMIZE(FULL) –
- eliminate unnecessary brancing
- simplifying inefficient branching
- simplifying the code for out-of-line PERFORM, moving
the code in-line
- simplifying calls to nested programs
- eliminating duplicate computations
- eliminating constant computations
- aggregating MOVES
- deleting unreachable code
- deleting unreferenced data items (FULL only)
OPTIMIZE
• NOOPTIMIZE – suppresses optimizations
• Helpful during development to speed
compilations
• Better for testing because code is not
removed
• OPTIMIZE for production
RENT and NORENT
• Causes the compiler to generate code that
makes the program reentrant
• Reentrant programs can be placed in the
Link Pack Area and Extended Link Pack
Area
• LPA is for programs that can be shared
and are heavily used during production
runs. Programs here remain in memory.
RMODE
• RMODE(AUTO) + RENT = RMODE(ANY)
• RMODE(AUTO) + NORENT =
RMODE(24)
• RMODE(24) + NORENT => WS below
the line
• RMODE(ANY) + NORENT => WS is
above the line
SSRANGE and NOSSRANGE
• SSRANGE – causes subscript and index
checking. Reference modifications are
also checked
• Use during program development
• NOSSRANGE – turns off subscript
checking. Use for production code
TEST and NOTEST
• TEST(ALL,SYM) – produces code that
enables the Debug Tool to perform batch
and interactive debugging
• NOTEST – produces more efficient object
modules. Use this option for production
code
TRUNC
• TRUNC(BIN) – Causes base 2 truncation on
some intermediate calculations to insure the
answer conforms to a halfword, fullword, or
doubleword boundary
• TRUNC(STD) – Causes base 10 truncation on
some intermediate calculations
• TRUNC(OPT) – Assumes the data conforms to
the PICTURE and USAGE clauses and
manipulates the result based on the size of the
field in storage
ARITH
• ARITH – controls the number of digits in
decimal numbers (packed, zoned)
• ARITH(EXTEND) is slower than
ARITH(COMPAT)
- COMPAT <= 18 digits
- EXTEND max 31 digits
Performance Issues
• CALLs – Nested faster than static, call
literal faster than dynamic call literal, call
literal faster than dynamic all identifier,
dynamic call literal faster that dynamic call
identifier
• Nested calls are the fastest – and there
are good program design reasons for
using them as well
Performance Issues
• IS INITIAL on PROGRAM-ID can be very
penalizing in terms of time
• QSAM files
- BLOCK CONTAINS 0 RECORDS !
- Experiment with more buffers by modifying
the RESERVE clause of the SELECT statement
or specifying more buffers in JCL (BUFNO)
- Code APPLY WRITE-ONLY or use AWO
compiler option for variable length blocked files
VSAM Performance Issues
• Increase the number of data buffers
(BUFND) for sequential access or (BUFNI)
for random access
• Select an appropriate CI size. Smaller is
faster for random processing at the
expense of inserts
• Larger CI size is more efficient for
sequential processing
• Alternate indexes should be built by AMS
Performance Issues
• Specify SYNCH for BINARY items.
• Use signed data items with 8 or fewer
digits – S9(8) BINARY SYNC
S9(4) BINARY SYNC
• 9 or more digits is slower
• 18 digits is slowest
• Avoid USAGE IS DISPLAY for numeric
fields PIC S99.
Performance Issues
• Use 15 or fewer digits for PACKED-
DECIMAL (COMP-3) fields
• Always code a sign (S) unless you have a
programmatic reason not to. S9(8)
instead of 9(8).
• Indexes are faster than subscripts
• If you choose subscripts code S9(8)
BINARY SYNC or better yet, choose
indexes instead
Performance Issues
• Use PIC S9(8) BINARY fields for loop
control variables
• Packed-decimal fields are slower
• Display fields (PIC 999) are slowest!
• Initialize constants with a value clause and
don’t modify them or pass them by
reference. (Compile will optimize the
constants.)
Performance Issues
• Don’t use PERFORM THRU
• Make appropriate use of in-line
PERFORMS
• Try to use tables so the rightmost
subscript varies the most often. (Compiler
can optimize some subscript calculations)
• Use SEARCH ALL for tables with 100
items or more

Potrebbero piacerti anche