Transcript Slide 1
®
IBM Software Group
Enterprise COBOL Education Using Rational Developer for System Z
COBOL Report Writing Patterns
Jon Sayles, IBM Software Group, Rational EcoSystems Team
© 2006 IBM Corporation
IBM Trademarks and Copyrights
© Copyright IBM Corporation 2007,2008. All rights reserved.
The information contained in these materials is provided for informational purposes
only, and is provided AS IS without warranty of any kind, express or implied. IBM
shall not be responsible for any damages arising out of the use of, or otherwise
related to, these materials. Nothing contained in these materials is intended to, nor
shall have the effect of, creating any warranties or representations from IBM or its
suppliers or licensors, or altering the terms and conditions of the applicable license
agreement governing the use of IBM software. References in these materials to IBM
products, programs, or services do not imply that they will be available in all countries
in which IBM operates.
This information is based on current IBM product plans and strategy, which are
subject to change by IBM without notice. Product release dates and/or capabilities
referenced in these materials may change at any time at IBM’s sole discretion based
on market opportunities or other factors, and are not intended to be a commitment to
future product or feature availability in any way.
IBM, the IBM logo, the on-demand business logo, Rational, the Rational logo, and
other IBM Rational products and services are trademarks or registered trademarks of
the International Business Machines Corporation, in the United States, other
countries or both. Other company, product, or service names may be trademarks or
service marks of others.
2
Course Contributing Authors
Thanks to the following individuals, for assisting with this course:
Bill Klein, Stephen Heffner/Pennington Associates
3
Purpose of This Document
Course Name: COBOL Foundation Training - with RDz
Course Description: Learn the COBOL language, RDz and learn z/OS terms, concepts and development skills in
this course.
Pre-requisites: Some experience in a 3rd or 4th Generation Language is expected. SQL is also recommended.
Course Length: 10 days
Topics (Agenda)
Getting Started - installing and configuring RDz - and the course materials, and using Eclipse to edit COBOL
COBOL General Language Rules
Basic COBOL Statements
Advanced record and table handling
Debugging Programs - Note: Deep dive on using RDz for common COBOL programming errors (001, 0C4, 0C7, infinite loops, fall-thru, etc.)
Input/Output and Report Writing Patterns
COBOL Subprograms and the Linkage Section
Structured Programming Concepts, professional COBOL development practices and Coding Patterns
Advanced Character Manipulation, COBOL Intrinsic Functions, Date and Time coding patterns, and Language Environment calls
OS/390 Concepts and JCL - Compile/Link & Run Procs on the mainframe
Indexed file Coding Patterns
Sort/Merge, Sequential File Match/Merge and Master File Update Coding Patterns
Accessing DB2 Data and DB2 Stored Procedures
COBOL in the Real World:
– CICS - lecture only
– IMS (DL/I and TM) - ditto
– Batch processing - ditto
– Java calling COBOL
– COBOL and XML Statements
– SOA and COBOL - creating and calling Web Services
– Web 2.0 using Rich UI
4
Course Details
Audience
This course is designed for application developers who have programmed in
some language before, and who wish to learn COBOL.
Prerequisites
This course assumes that the student has the basic knowledge of IS
technologies, data processing, software and have programmed for at least
two or more years in a language such as: Java, VB, RPG, PL/1, Pascal, or
some 4th Generation Language or tool.
Knowledge of SQL (Structured Query Language) for database access is
assumed as well.
Basic PC and mouse-driven development skills is also assumed.
Finally, it is assumed that you have been following along in this course, and
have successfully completed the learning modules in sequence.
Or have the equivalent COBOL background obtained through some other form of
COBOL study or on-the-job work.
5
Unit
COBOL Report Writing Patterns
Topics:
Report Writing Concepts
COBOL Print and Report Layouts
COBOL Control Break Reports
Appendices
6
COBOL Reporting – a Little History
Since its inception (the late 1950's) COBOL has been the dominant language of
business application development
For the first 30-40 years (yes, a COBOL application's shelf-life measure in decades what
some application languages aspire towards, measured in years) businesses founded on
COBOL used the language for:
Data capture and storage – using:
Sequential files
Indexed files
Hierarchical databases
Networked (CODASYL) and other pointer-based
databases (such as Model 204)
Relational databases
Object databases
Reporting applications – both broad and deep, used in every aspect of the business world
Online applications
Batch (non-reporting) applications – data consolidation, computationally intensive
applications, etc
Internet application
Now in its 6th decade, COBOL applications still do all of the above – but certainly
not in the same ratio and proportion they did in the 70's, 80's and 90's
In fact, one type of COBOL business application that is only marginally as important as it was
in the past is the reporting application – specifically traditional print reports or "green bar"
reports (See Slides)
7
Why Learn About COBOL Reporting Applications
Traditional reporting applications consumed a large portion of early COBOL
practitioner time and attention
The COBOL language even has a REPORT SECTION – in the DATA DIVISION that
provides special keyword vocabulary for creating reports
Business reports in fact were so critical to commercial shops that throughout the
1970's 1990's dozens of high-quality reporting products emerged on the market
to simplify and streamline report development
Some by IBM
Many, many, many others – by 3rd Party IBM Business Partners *** See Slide Notes
The reason for these non-COBOL/3rd Party products was that essentially, Reporting
Applications written in any general-purpose 3rd generation computing language:
Are time-consuming and labor-intensive to create
Can be built from special-purpose tools and using proprietary report-programming languages:
Quickly
Cost-effectively
Often are time-dependent, in that unlike data, which has intrinsic and lasting value to organizations,
reports are essential "the original" U.I. of business applications
And U.I.s have changed drastically since 1960 – haven't they
While the production source-code assets represented by the 3rd Party products have not
necessarily maintained their position, you will still most likely find the knowledge of how create
COBOL reports useful for the following reasons:
You may end up writing a "quick-and-dirty" report against production data (these are sometimes called
"one-offs"
You will most likely have to maintain and/or support COBOL reporting applications still running in
production.
8
COBOL Reporting Applications – Big Picture
The figure below shows a typical COBOL reporting application, which contains the
following elements:
A sorted sequential data source – one of the following:
On the mainframe a QSAM file – on the PC a "flat file" or sequential file
One the mainframe a VSAM or off the mainframe an indexed file – read sequentially
A database (IMS-DL/I, CA-IDMS, DB2, or other) read sequentially
A program that processes records from the data source:
Read file – usually sequentially, until end-of-file
Validate/Compute each record, move fields
Write report – that there are a few new COBOL WRITE clauses specific to reporting applications
A report – or report file, that is laid out according to precise U.I. record descriptions
And quite possibly a file of error records, produced by the COBOL program's validation routine
COBOL Program
Business Logic
9
Record Buffer
Sorted
Sequential
File
Record Buffer
We continue by looking at each part of the above
Error Report
Sequential Input Files – For COBOL Reporting Applications
If you've been following along in this course
you've already done a bit of work with Sequential
Files.
Which are simple data structures that store records
serially
Such that the records are read one after another
These records can be sorted or un-sorted.
Sequential File – Sorted
Sequential File - Unsorted
RECORD1………………………….
RECORD5………………………….
RECORD2………………………….
RECORD2………………………….
RECORD3………………………….
RECORD6………………………….
RECORD4………………………….
RECORD4………………………….
RECORD5………………………….
RECORD5………………………….
RECORD6………………………….
RECORD1………………………….
…
…
We will cover sorting in an upcoming unit
COBOL Reports will just about always require the data to be sorted, and we will
discuss various means of doing that in subsequent course sections:
COBOL internal sort
Operating System (JCL) sort
3rd Party Sort packages
The data in the sorted sequential file records will be read into 01 record structures
Typically READ <fileName> INTO <ws-RecordName>.
The input record layouts correspond to the input data – which you've seen a number
of times now
01 records
Group fields (levels 05 and higher)
– Elementary fields, 88 levels, etc.
10
A Simple Report
Have a look at this report
1.
2.
3.
Let's break down the output
or report-specific elements
4.
1.
Page Heading
This line should be at the top of each page
Question … how will we know when to do a "Page Break"?
2.
Answer: A page break should occur when the total # of lines written exceeds the max-lines-per-page print
specification
Column Headings
These lines (sometimes the faux-underlines are there…sometimes they're not) should be just under the
Page Heading
3.
Detail Rows
We will format one row of output/detail report values for each input record
4.
Report Footer
This line is displayed at the end of the entire report.
It would typically include additional report totals, counters and accumulators – although we have not
coded for this in our example
11
Working Storage for the Simple Report
From the code shown here
Match each of the 01s to the
output shown (below)
One 01 is not shown in the
report
You will add this in, when you do
your work
Answer the following questions:
Why the VALUE SPACES next to
the FILLER fields?
Are the report columns lined up?
What do you think the input for
this report looks like?
12
Input Data and Record Layout for the Simple Report*** See Slide Notes
From the graphic below, note the input fields in the input file (Sorted
Sequential File).
Map each field to its respective variable in CustomerRec
Answer the following questions:
How many fields are there (total) – not counting the 10-level break out of the date field?
Are any of the fields packed decimal or binary data?
Is the data as shown, sorted?
What "key" (what input field variable) is it sorted on
Ascending or Descending sort?
Error Report
Sorted
Sequential
File
*** Slide Notes
COBOL Program
Business Logic
13
Procedure Division for the Simple Report
So – as this example is primarily:
Read Move to output file Write
we can assume the logic is relatively
straightforward
And? It is.
Read the code shown here, and follow the
flow of control. Note the following:
File OPEN/CLOSE statements
Initial report heading and file read
statements
Logic to perform the main business logic
and report production paragraph until no
more data. Within that paragraph:
Check for page break condition
Move statements from the input to the
output variables
Write detail line:
– AFTER ADVANCING LINE
forces
the printer to skip # lines between
Read next input record
Final Print Headings
14
Workshop – Sequential File Processing
– 1 of 7
1.
As you have done several times so far, Create a
new, Workstation Local, COBOL project
Name it: chapter4
Be sure to select COBOL Sample Property Group
2.
In the chapter4 Project, create a new cobol folder
(as shown)
3. Copy the COBOL source code from the Notes
section of the slide
4. Create a new file in the chapter4 project, in the
cobol folder, named: rpt1.cbl
5. Paste the code in the editor
6. Do a Local Syntax check of the program
7. Right-click and Nominate rpt1 as the Entry Point
8. Rebuild the chapter4 project
9. Expand the BuildOutput folder, right-click and
select Debug As > Debug Configurations
10. Setup a new Debug Configuration as shown
11. Debug the program
Step to understand the code flow
Resume (run) to end of program
12. Look at the output file produced
(probably: c:\customerOut.dat)
15
Workshop – Sequential File Processing – 2 of 7 – Maintenance Specs
Let's throw in some new specs for a "maintenance" workshop. To complete the work required,
you will need to:
Edit the input records read. Only allow records with:
Valid numeric CustomerIDs
The year-in (YYYY) between 1990 and the current year
– You will have to ACCEPT the CURRENT DATE into an 8-byte date format (see code example in
upcoming slide for an example of this)
All records in error should be written to a new error output file – unformatted
Add counters for:
# of error records found
# of Good error records written
Total # of input records read – the sum of this should equal the # of error records + the number of
good records*** See Notes
Change Page Break to occur after 10 records
Fix the bug in the Active/Inactive output value – currently it's only writing I or A,
and should write out Inactive or Active
See the next slide for an example new report
Use the values in the slide notes for new input test records
Sometimes known as test cases
Please read through all of the Workshop Slides before beginning to code. Note
the use of PERFORM … THRU EXIT – which simplifies modifying logic
16
Workshop – 3 of 7
– Output Report
Note the following:
Page #s at the bottom of each page
Statistics
17
Workshop – 4 of 7 – Environment and Data Division
Note the following:
New file Select/Assign and FD for the Error
records
Redefinition of CustomerID – in order to do a
numeric Class test on it
18
Workshop – 5 of 7 – Data Division and
Procedure Division
Note the following:
New value for PageBrkReq
New counters for records read/written, good,
bad, indifferent, etc.
Current-Date variable and Aceppt statement
New file open/close/read/write
Added EXIT statements to the 100paragraph, to simplify maintaining the code
19
Workshop – 6 of 7
Note the following:
Code for adding to the various record
counters
New routine for handling the error
records – inline within the current logic
New input edit sample
Note the use of the following logic
pattern:
Find an error
Deal with the error
Skip to the end of the function
20
Workshop – Sequential File Processing – 7 of 7
Suggested course of action:
Code the ENVIRONMENT, and DATA Division elements
Syntax check and Build the Project
Code the remaining PROCEDURE DIVISION logic
Use Content Assist to help you code references to the fields and records
– This is why you'll do the data variable coding first
Syntax check
Build the Project
Debug your program
Run your program – and verify your work by reviewing the output files
If time permits, add the following new requirements:
Additional Working Storage and output variables that count the # of Active and
Inactive accounts
Add the current date to the top right-hand corner of the page, in ISO format
Move the page # to the top-left of each page
21
Unit
COBOL Report Writing Patterns
Topics:
Report Writing Concepts
COBOL Print and Report Layouts
COBOL Control Break Reports
Appendices
22
COBOL Report Writing Statements – WRITE AFTER ADVANCING Options
The SPECIAL-NAMES paragraph:
Relates IBM-specified environment-names to userdefined mnemonic-names.
Relates alphabetic-names to character sets or
collating sequences.
Relates class names to sets of characters.
Specifies a substitute character for the currency
sign.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370-168.
OBJECT-COMPUTER. IBM-370-168.
SPECIAL-NAMES.
C01 IS TO-TOP-OF-PAGE.
…
01
01
In this example C01 is a "special name" that is used
with the WRITE I/O verb, to skip to the top of the
next page when the output file is attached to a
printer that accepts files formatted for printing (i.e.
with special characters for advancing to the next
physical page, etc.).
01
HEADER-1.
05 FILLER
05 FILLER
05 FILLER
05 DATE-OUT
05 FILLER
HEADER-2.
05 FILLER
05 FILLER
05 FILLER
HEADER-3.
05 FILLER
05 FILLER
05 FILLER
05 FILLER
PIC
PIC
PIC
PIC
PIC
X(12) Value
X(21) VALUE
X(03) Value
99/99/99.
X(02) Value
PIC X(08)
PIC X(19)
PIC X(17)
Spaces.
'ANNUAL INCOME STATEMENT'.
Spaces.
Spaces.
VALUE 'EMPLOYEE'.
Value Spaces.
VALUE 'ANNUAL TAKE HOME'.
PIC X(02) VALUE SPACES.
PIC X(08) VALUE 'EMP-ID'.
PIC X(24) VALUE SPACES.
PIC X(03) VALUE 'SALARY'.
…
700-WRITE-REPORT-HEADING-LINES.
WRITE EMPL-REPORT-REC FROM HEADER-1
AFTER ADVANCING n LINES
Is a clause of the WRITE statement, that directs
the printer to advance the next physical line in the
report paper
Can specify AFTER or BEFORE
LINES is optional
Note the use of BEFORE ADVANCING 0 LINES –
executed multiple times.
This is used to make a header or bold on a report
23
AFTER ADVANCING TO-TOP-OF-PAGE.
WRITE EMPL-REPORT-REC FROM HEADER-2
AFTER ADVANCING 2 LINES.
WRITE EMPL-REPORT-REC FROM HEADER-3
AFTER ADVANCING 1.
…
WRITE EMPL-REPORT-REC FROM TOTAL-LINE
BEFORE ADVANCING 0 LINES.
WRITE EMPL-REPORT-REC FROM TOTAL-LINE
BEFORE ADVANCING 0 LINES.
WRITE EMPL-REPORT-REC FROM TOTAL-LINE
BEFORE ADVANCING 0 LINES.
Workshop – Open Ended
One more maintenance assignment. We now have to account for four
quarters worth of taxes (this program is run at end-of-year).
Replace the existing c:\customerIn.dat data, with the records in the Slide Notes
Recode the input file's layout to match the new test case values
Create an output report that matches the next slide's screen capture
Add in one more statistic kept:
Average annual taxes paid (see next slide for snapshot of result)
You will have to be cognizant of:
Numeric output formatted fields
Lining up the columns of the report and the final average value
24
Workshop – Open Ended
25
Workshop Coding Solution
There is a coding solution to this
simple report programming
problem in the slide notes.
Considerations:
This is only one interpretation of
how to do this workshop
It is offered here as
– Caveat Emptor
If you choose to use this, we
recommend you rename the
program
So that if you want to finish your
own version of this workshop you
won't have to rename files, etc.
Optional
Add the State values into the
output print (Rpt-Detail-Hdg-1 and
Rpt-Detail-Hdg-2) lines
26
Unit
COBOL Report Writing Patterns
Topics:
Report Writing Concepts
COBOL Print and Report Layouts
COBOL Control Break Reports
Appendices
27
What Are Control Breaks?
A "Control Break" in COBL program vernacular, refers to a change in a
control field value – typically in a sequential file, such that, upon successive
reads when the value changes? A processing change happens in the
program – and you would perform a routine that prints a control-break line
containing: Summary values, sub-totals and/or statistics:
Lines counted – for all of the records since the last control break
Accumulators - numeric values such as: Number of items sold, Total expenses, etc.
Statistics – average, min, max salaries, etc.
The pre-requirement for Control Break functionality is for the sequential file
to be sorted on the values in the control break field
Or there would be random control breaks in the output processing
Control Break reports are common in COBOL applications. They expose
summary values and statistics, and help turn raw data into the information
necessary to run a business.
Show me the total sales for our retail stores broken out by:
State
Store Departments
Months of the year
Individual stores
28
Single-Level Control Break Report – Example Break on U.S. State Values
Note that the
"control
break"
occurs:
Each time
the State
changes
And at the
end of the
report (an
implied final
control
break)
29
What Are Control Breaks?
The pseudo-code for a
single-level Control
Break report is as
follows
Note that this logic could
be divided up into COBOL
paragraphs sections or
simply inline routines –
depending on the
complexity and scope of
each element
Do Initial Process
Do Process All Records until end-of-file
Do End-of-Program Process
Initial Process
Write headers
Process first record
Move control break field to a hold-area (for comparison)
Process All Records
Edit – or Do Edit Routine
If good record
– If Current control-break-value <> hold-control-break-value
– Do Control Break Process
– Process Detail Record
– Read next input record
Process Detail Record
Add to hold fields and accumulators
Move fields to output fields
Write Detail Record
Control Break Process
Move hold control break values to output fields
Write Control Break Record
Zero out control break hold areas
Move Current control-break-value to hold-control-break-value
End-of-Program Process
Do final control break
Do final output report processing
30
COBOL Program to do Control Break – DATA DIVISION Areas – 1 of 3
2.
Here's a completed example of a
Control Break program. Note the
following:
1.
2.
3.
4.
Input record with two new fields for
control break values (we will use only
StateCode for this first part of the unit)
The Control Break report line
Hold areas for the Control Break
interim-values
The Control Break "hold keys" – that
will be used to as comparison values
with each new record read, to
determine if there has been a "control
break" in the file
…more fields…
3.
…more fields…
1.
4.
31
COBOL Program to do Control Break –
Procedure Division – 2 of 3
5.
6.
5.
Driver Logic (from our pseudo-code)
Process All Records – which includes
PERFORM statements to paragraphs on the next
slide
7.
6.
Control Break Process – note the detailed logic
in the comments
7.
Note that this is actually the same program we
have been working with all along in this unit,
just better structured
32
8.
COBOL Program to do Control Break –
Final Paragraphs – 3 of 3
Process Detail Records – note the additional
code to add to the Control Break hold areas
9. Initial Process paragraph – to setup the
report, do the priming file read, and initialize
the control break values
10. End-of-Program Process – which does the
final control break, and writes out the
standard end-of-job report summary lines
8.
10.
9.
33
Note also that we've made the Read Routine
into a separately performed paragraph. This
is a "best practice"
Workshop – Control Break Reports – 1 of 4
1.
2.
From the slide notes, copy all of the new data records – that contain the State code, and paste
them into c:\customerIn.dat – replacing the existing records
View the state values in the file – note that they are sorted from low to high (from California to
Hawaii).
34
Workshop – Control Break Reports – 2 of 4
1.
From the slide notes, copy the program source (all of the COBOL statements)
2.
3.
4.
5.
6.
7.
8.
Create a new file in the chapter4 project, in the cobol folder, named: rpt2.cbl
Paste the code in the editor
Do a Local Syntax check of the program – ensure no errors
Right-click over rpt2, and Nominate as Entry Point
Rebuild the chapter4 project
Expand the BuildOutput folder, right-click and select
Debug As > Debug Configurations
Setup a new Debug Configuration as shown
9.
Debug the program
Step to understand the code flow
Resume (run) to end of program
10. Look at the output file produced
(probably: c:\customerOut.dat)
Unless you've changed the file
Return to z/OS Project Perspective
35
Workshop – Control Break Reports – 3 of 4 – Development Specs
Let's throw in some new specs for a brand new control break program that
produces a listing of employee salaries by state. Using the data in the Slide Notes,
create: c:\employee.dat. (see screen capture)
Note – these are well-paid employees. Probably hedge fund managers.
It will line up the with the EMPLOYEE-RECORD layout shown below
Using the Control Break pattern from rpt3.cbl – create a program in the chapter4
cobol folder that produces the Control Break report shown on the next slide
There are no edit errors in this file, so you can just concentrate on coding the
Control Break logic pattern
Break on
EMPLOYEE-STATE
value change
c:\employee.dat
36
Workshop – Control Break Reports – 4 of 4 – Development Specs
The employee salary
Control Break Report
Optional workshop
functionality includes:
A report header
With the current date
And page#
And edit routine for:
Valid numeric salary
A more realistic salary
range for employees
(who are not hedge fund
managers)
37
What About Multi-Level Control Break Reports?
As common as single-level control break functionality in COBOL business
applications are multi-level control break reports, that have:
Major key
Middle key
– Minor key
Or more levels of control break, and that process data in files that is sorted on the same key sequence.
Consider this example of a (fictitious) grocery store report
Major Key
Middle Key
Minor Key
Note keys of: State, City, Store#
And coincidentally, note that additional data control breaks would be possible (probable?) along the lines
of Store Department and SKU
At the risk of repeating ourselves, control break processing turns data into information
38
Data For a Two-Level Control Break Report
If you're going to break on
two control fields, you need
to columns of data, both
sorted, in a
Parent Child, or
Master Detail sequence:
Sort on Parent key
values
Within the Parent key,
sort on Child key values
Note the following – in our
current customerIn.dat file:
Master/Parent Key data:
State code
Detail/Child Key data:
Territory code
Find both sets of values in
this screen capture
Question: So if we have our data arranged by this two-level control break sequence, what elements in our
program do you think we'll have to change?
Answer:
Output report lines
A Parent/Master control break test and processing paragraph
A Child/Detail control break test and processing paragraph
The various hold areas, counters and accumulators coded for both Parent and Child control breaks
This will be clearer if we have a look at the output produced (next slide)
39
A Two-Level Control Break Report
Note the following:
Detail/Child control
break line
Master/Parent control
break line
Let's have a look at the
actual COBOL code
used to produce this.
40
COBOL Code For a Two-Level Control Break – 1 of 2
We're going to reuse the rpt2.cbl
program for this example.
We will enhance it to add:
A Control Break output line for
Territory Control Breaks
Hold fields for Territory values
…more fields…
Note that we will have to rename
the generically-named State
fields
…more fields… and begin Procedure Division
In the PROCEDURE DIVISION
we see the key logic
modification
Test for a Major/Parent key
control break … then …
Test for a Minor/Child key control
break
– In that order
41
COBOL Code For a Two-Level Control Break – 2 of 2
We will need a new Minor/Child control
break processing paragraph – that will
eerily resemble the Major/Parent control
break process.
With a few exceptions:
The Parent control break will perform the
child control break
Note that this could happen for any #
of intermediate levels as well –
following the data sort key
relationships from highest to lowest
sort-key
What's important is that the Perform
of lower-level control breaks happen
BEFORE the upper-level control
breaks.
The Child control break will print out
the Territory line – and re-initialize
the counters and accumulators
42
Workshop – A Two-Level Control Break Program
Return to your single-level Control
Break program.
You will use the new data records
for c:\employee.dat
They are in the Slide Notes
Enhance the program to produce
the report shown on the next slide
43
Workshop – A Two-Level Control Break Program
Note the Sub-Totals
and total values.
44
Unit
COBOL Report Writing Patterns
Topics:
Report Writing Concepts
COBOL Print and Report Layouts
Simple COBOL Reports
Control Break Reports
Appendices
45