Book Read Free

Michael Coughlan

Page 59

by Beginning COBOL for Programmers-Apress (2014) (pdf)


  34 $17,614.20

  35 Sales for sales agent 104 = $35,619.62

  36

  37 Total sales for Alaska $93,687.89

  38 Base salary for Alaska $1,536.00

  39 ----------------------------------------------------------

  40

  41

  42 Arizona 23 $4,237.72

  43

  44

  45

  46

  47

  48

  49 Programmer - Michael Coughlan Page : 1

  Report Writer Tasks

  To get a feel for what the Report Writer can do, let’s examine in some detail what it has to do to produce this report:

  • Print the report heading lines (lines 01–02). These are printed, once only, at the beginning of

  the report.

  • Print the subject heading lines (page headings). These are printed at the top of each page—on

  lines 04–05 on the first page and lines 01–02 on subsequent pages.

  • Print a footer at the bottom of each page (showing the name of the programmer and a page

  number: line 49). To print the page number, the Report Writer must keep a page count.

  • Keep a line count, and change the page when the count is greater than 42 (unless the next thing

  to print is a sales agent total line, a state total line, a base salary line, or the final total line).

  • Print the details of a sales agent’s sales (for example, as shown for sales agent 38 on lines 06–08).

  Because the sales file only contains a state number, the Report Writer must get the state name

  from a lookup table.

  • Suppress the sales agent number and state name after their first occurrence (but restore them

  if there is a change of page, sales agent, or state name: see lines 06, 12, 22, 28, 33, 42).

  • When the sales agent number changes, print the total sales accumulated for the sales agent

  (lines 15, 25, 35)

  479

  Chapter 18 ■ the COBOL repOrt Writer

  • When the state number changes, print the total sales accumulated for the state (lines 17, 37).

  • When the state number changes, get the base salary for the state from a lookup table, and print

  it (lines 18, 38).

  • When the state number changes, print a line of hyphens to separate this state from the next

  (lines 19, 39).

  Accumulate all the sales values, and print them as a final total at the end of the report (not shown on the example page).

  Report Writer PROCEDURE DIVISION

  If you had to create the Solace Solar Solutions sales report using the approach shown in Chapter 8 (that is, using a control-break program and the WRITE verb), you would probably write a program that had a PROCEDURE DIVISION

  with more than 100 lines of code. It is interesting to discover that the Report Writer can do all this work in just the 10

  COBOL statements shown in Example 18-2.

  Example 18-2. PROCEDURE DIVISION That Produces the Sales Report

  PROCEDURE DIVISION.

  Begin.

  OPEN INPUT SalesFile.

  OPEN OUTPUT PrintFile.

  READ SalesFile

  AT END SET EndOfFile TO TRUE

  END-READ.

  INITIATE SolaceSalesReport.

  PERFORM PrintSalaryReport

  UNTIL EndOfFile.

  TERMINATE SolaceSalesReport.

  CLOSE SalesFile, PrintFile.

  STOP RUN.

  PrintSalaryReport.

  GENERATE DetailLine.

  READ SalesFile

  AT END SET EndOfFile TO TRUE

  END-READ.

  So Much Work, So Little Code

  How can so much work be done in so little PROCEDURE DIVISION code? How does the Report Writer know that page headings or page footers are required? If you wrote a program to print this report using WRITE statements, you would need a control-break program with a PERFORM UNTIL StateNum NOT EQUAL TO PrevStateNum loop to process each

  state and an inner loop PERFORM UNTIL SalesAgentNum NOT EQUAL TO PrevSalesAgentNum to process the sales for each sales agent. Without those loops, how does the Report Writer know it is time to print the sales agent totals or the state totals, and how does it accumulate those totals in the first place?

  To achieve so much in so little PROCEDURE DIVISION code, the Report Writer uses a declarative approach to

  programming rather than the imperative (procedural) approach familiar to most programmers. In imperative

  programming, you tell the computer how to do what you want done. In declarative programming, you tell the

  computer what you would like done, and the computer works out how to do it. When you use the Report Writer, you 480

  Chapter 18 ■ the COBOL repOrt Writer

  declare what to print when a page heading, page footer, sales agent total, state total, or final total is required, and the Report Writer works out when to print these items. In keeping with the adage that “there is no such thing as a free lunch,” the PROCEDURE DIVISION of a Report Writer program is short because most of the work is done in the (greatly expanded) DATA DIVISION.

  How the Report Writer Works

  The Report Writer works by recognizing that many reports take (more or less) the same shape. There may be headings at the beginning of the report and footers at the end. There may be headings at the top of each page and footers at the bottom. Headings or footers may need to be printed whenever there is a control break (that is, when the value in a specified field changes, such as when the sales agent number or state number changes in Example 18-1). In addition, the detail lines that display the information summarized in control-break totals also need to be printed.

  The Report Writer calls these different report items report groups. Reports are organized around report groups.

  The Report Writer recognizes the seven types of report group shown in Example 18-3; the indentation shows their relative importance/order of execution.

  Example 18-3. Report Group Types

  REPORT HEADING or RH group

  - printed once at the beginning of the report

  PAGE HEADING or PH group

  - printed at the top of each page

  CONTROL HEADING or CH group

  - printed at the beginning of each control break

  DETAIL or DE group

  - printed each time the GENERATE statement is executed

  CONTROL FOOTING or CF group

  - printed at the end of each control break

  PAGE FOOTING or PF group

  - printed at the bottom of each page

  REPORT FOOTING or RF group

  - printed once at the end of the report.

  For each report, there must be a Report Description (RD) entry in the REPORT SECTION of the DATA DIVISION that fully describes the report. The report groups that describe the report are defined as records in the RD entries. Most groups are defined once for each report, but control groups are defined for each control-break item. For instance, in the example program, control footings are defined on SalesAgentNum, StateNum, and FINAL. FINAL is a special control group that is invoked before or after the normal control groups (before if CONTROL HEADING FINAL is used, and after if CONTROL FOOTING FINAL is used).

  Ordinary control groups are defined on a control-break data item. The Report Writer monitors the contents of the designated data item, and when the value changes, a control break is automatically initiated. When the control break is initiated, the CONTROL FOOTING group of the breaking item (if there is one) and the CONTROL HEADING group of the next item are printed.

  Writing a report program consists of a number of tedious tasks such as keeping track of the line count to ensure that page headings or footers are printed when required, or simply moving data values into their corresponding items in the print line. In addition, when you write a report according to a program specification, you often h
ave to adhere to the report layout specified in a print layout form such as that shown in Figure 18-1. When you have to adhere to such a form, it can be tricky to get the vertical and horizontal placement of printed items correct. Counting characters to figure out what size to make each of the fields that define a print line is tedious and time consuming.

  481

  Chapter 18 ■ the COBOL repOrt Writer

  Figure 18-1. Print layout form showing the layout required for a report

  The Report Writer makes it easier to write report programs by

  • Allowing simple vertical and horizontal placement of printed items using the LINE IS and

  COLUMN IS phrases in the data declaration

  • Automatically moving data values to output items using the SOURCE phrase

  • Keeping a line count, and automatically generating report and page headers and footers at the

  appropriate times

  • Keeping a page count that can be referenced in the report declaration

  • Recognizing control breaks, and automatically generating the appropriate control headings

  and footers

  • Automatically accumulating totals, subtotals, and final totals

  Writing a Report Program

  Let’s see how to write a report program using the Report Writer. I start with a simplified version of the program that produced the report in Example 18-1. Succeeding examples add to it to demonstrate additional Report Writer facilities. The final example demonstrates even more than the report in Example 18-1.

  482

  Chapter 18 ■ the COBOL repOrt Writer

  Modifying the Specification

  This first example program creates a report program that does the following:

  • Prints a report heading

  • Prints a heading and a footer on each page

  • For each sale record, prints the state name (obtained from a table), the sales agent number,

  and the value of the sale

  • Prints the total value of the sales made by each sales agent

  • Prints a line of hyphens at the end of each state to separate the states from one another

  The first page of the report produced by this program is shown in Example 18-4 (line numbers have been added).

  The program that produces the report is shown in Listing 18-1.

  Example 18-4. Simplified Version of the Report Showing Only Sales Agent Totals

  01 Solace Solar Solutions

  02 Sales Agent - Sales and Salary Report Monthly Report

  03

  04 State Agent Value

  05 Name Number Of Sales

  06 Alabama 38 $9,325.14

  07 Alabama 38 $11,839.19

  08 Alabama 38 $19,102.61

  09 Sales for sales agent 38 = $40,266.94

  10

  11

  12 Alabama 73 $4,503.71

  13 Alabama 73 $11,659.87

  14 Alabama 73 $19,540.19

  15 Sales for sales agent 73 = $35,703.77

  16 ----------------------------------------------------------

  17

  18

  19 Alaska 55 $18,981.84

  20 Alaska 55 $3,065.97

  21 Alaska 55 $10,686.92

  22 Sales for sales agent 55 = $32,734.73

  23

  24

  25 Alaska 89 $11,187.72

  26 Alaska 89 $14,145.82

  27 Sales for sales agent 89 = $25,333.54

  28

  29

  30 Alaska 104 $18,005.42

  31 Alaska 104 $17,614.20

  32 Sales for sales agent 104 = $35,619.62

  33 ----------------------------------------------------------

  34

  35

  483

  Chapter 18 ■ the COBOL repOrt Writer

  36 Arizona 23 $4,237.72

  37 Arizona 23 $13,315.00

  38 Sales for sales agent 23 = $17,552.72

  39

  40

  41 Arizona 90 $2,078.93

  42 Arizona 90 $17,228.88

  43 Arizona 90 $8,929.96

  44 Sales for sales agent 90 = $28,237.77

  45 ----------------------------------------------------------

  46

  47

  48

  49 Programmer - Michael Coughlan Page : 1

  Listing 18-1. Simplified Report Program

  IDENTIFICATION DIVISION.

  PROGRAM-ID. Listing18-1.

  AUTHOR. Michael Coughlan.

  ENVIRONMENT DIVISION.

  INPUT-OUTPUT SECTION.

  FILE-CONTROL.

  SELECT SalesFile ASSIGN TO "Listing18-1-Sales.DAT"

  ORGANIZATION IS LINE SEQUENTIAL.

  SELECT PrintFile ASSIGN TO "Listing18-1.Rpt".

  DATA DIVISION.

  FILE SECTION.

  FD SalesFile.

  01 SalesRecord.

  88 EndOfFile VALUE HIGH-VALUES.

  02 StateNum PIC 99.

  02 SalesAgentNum PIC 999.

  02 ValueOfSale PIC 9(5)V99.

  FD PrintFile

  REPORT IS SolaceSalesReport.

  WORKING-STORAGE SECTION.

  01 StateNameTable.

  02 StateNameValues.

  03 FILLER PIC X(14) VALUE "Alabama".

  03 FILLER PIC X(14) VALUE "Alaska".

  03 FILLER PIC X(14) VALUE "Arizona".

  03 FILLER PIC X(14) VALUE "Arkansas".

  03 FILLER PIC X(14) VALUE "California".

  03 FILLER PIC X(14) VALUE "Colorado".

  03 FILLER PIC X(14) VALUE "Connecticut".

  03 FILLER PIC X(14) VALUE "Delaware".

  03 FILLER PIC X(14) VALUE "Florida".

  03 FILLER PIC X(14) VALUE "Georgia".

  484

  Chapter 18 ■ the COBOL repOrt Writer

  03 FILLER PIC X(14) VALUE "Hawaii".

  03 FILLER PIC X(14) VALUE "Idaho".

  03 FILLER PIC X(14) VALUE "Illinois".

  03 FILLER PIC X(14) VALUE "Indiana".

  03 FILLER PIC X(14) VALUE "Iowa".

  03 FILLER PIC X(14) VALUE "Kansas".

  03 FILLER PIC X(14) VALUE "Kentucky".

  03 FILLER PIC X(14) VALUE "Louisiana".

  03 FILLER PIC X(14) VALUE "Maine".

  03 FILLER PIC X(14) VALUE "Maryland".

  03 FILLER PIC X(14) VALUE "Massachusetts".

  03 FILLER PIC X(14) VALUE "Michigan".

  03 FILLER PIC X(14) VALUE "Minnesota".

  03 FILLER PIC X(14) VALUE "Mississippi".

  03 FILLER PIC X(14) VALUE "Missouri".

  03 FILLER PIC X(14) VALUE "Montana".

  03 FILLER PIC X(14) VALUE "Nebraska".

  03 FILLER PIC X(14) VALUE "Nevada".

  03 FILLER PIC X(14) VALUE "New Hampshire".

  03 FILLER PIC X(14) VALUE "New Jersey".

  03 FILLER PIC X(14) VALUE "New Mexico".

  03 FILLER PIC X(14) VALUE "New York".

  03 FILLER PIC X(14) VALUE "North Carolina".

  03 FILLER PIC X(14) VALUE "North Dakota".

  03 FILLER PIC X(14) VALUE "Ohio".

  03 FILLER PIC X(14) VALUE "Oklahoma".

  03 FILLER PIC X(14) VALUE "Oregon".

  03 FILLER PIC X(14) VALUE "Pennsylvania".

  03 FILLER PIC X(14) VALUE "Rhode Island".

  03 FILLER PIC X(14) VALUE "South Carolina".

  03 FILLER PIC X(14) VALUE "South Dakota".

  03 FILLER PIC X(14) VALUE "Tennessee".

  03 FILLER PIC X(14) VALUE "Texas".

  03 FILLER PIC X(14) VALUE "Utah".

  03 FILLER PIC X(14) VALUE "Vermont".

  03 FILLER PIC X(14) VALUE "Virginia".

  03 FILLER PIC X(14) VALUE "Washington".

  03 FILLER PIC X(14) VALUE "West Virginia".

  03 FILLER PIC X(14) VALUE "Wisconsin".

  03 FILLER PIC X(14) VALUE "Wyoming".

  02 FILLER REDEFINES StateNameValues.

  03 State OCCURS 50 TIMES.

  04 StateName PIC X(14).


  REPORT SECTION.

  RD SolaceSalesReport

  CONTROLS ARE StateNum

  SalesAgentNum

  PAGE LIMIT IS 54

  FIRST DETAIL 3

  LAST DETAIL 46

  FOOTING 48.

  485

  Chapter 18 ■ the COBOL repOrt Writer

  01 TYPE IS REPORT HEADING NEXT GROUP PlUS 1.

  02 LINE 1.

  03 COLUMN 20 PIC X(32)

  VALUE "Solace Solar Solutions".

  02 LINE 2.

  03 COLUMN 6 PIC X(51)

  VALUE "Sales Agent - Sales and Salary Report Monthly Report".

  01 TYPE IS PAGE HEADING.

  02 LINE IS PLUS 1.

  03 COLUMN 2 PIC X(5) VALUE "State".

  03 COLUMN 16 PIC X(5) VALUE "Agent".

  03 COLUMN 32 PIC X(8) VALUE "Value".

  02 LINE IS PLUS 1.

  03 COLUMN 2 PIC X(4) VALUE "Name".

  03 COLUMN 16 PIC X(6) VALUE "Number".

  03 COLUMN 31 PIC X(8) VALUE "Of Sales".

  01 DetailLine TYPE IS DETAIL.

  02 LINE IS PLUS 1.

  03 COLUMN 1 PIC X(14)

  SOURCE StateName(StateNum).

  03 COLUMN 17 PIC ZZ9

  SOURCE SalesAgentNum.

  03 COLUMN 30 PIC $$$,$$$.99 SOURCE ValueOfSale.

  01 SalesAgentGrp

  TYPE IS CONTROL FOOTING SalesAgentNum NEXT GROUP PLUS 2.

  02 LINE IS PLUS 1.

  03 COLUMN 15 PIC X(21) VALUE "Sales for sales agent".

  03 COLUMN 37 PIC ZZ9 SOURCE SalesAgentNum.

  03 COLUMN 43 PIC X VALUE "=".

  03 TotalAgentSales COLUMN 45 PIC $$$$$,$$$.99 SUM ValueOfSale.

  01 StateGrp TYPE IS CONTROL FOOTING StateNum NEXT GROUP PLUS 2.

  02 LINE IS PLUS 1.

  03 COLUMN 1 PIC X(58) VALUE ALL "-".

  01 TYPE IS PAGE FOOTING.

  02 LINE IS 49.

  03 COLUMN 1 PIC X(29) VALUE "Programmer - Michael Coughlan".

  03 COLUMN 55 PIC X(6) VALUE "Page :".

  03 COLUMN 62 PIC ZZ9 SOURCE PAGE-COUNTER.

  PROCEDURE DIVISION.

  Begin.

  OPEN INPUT SalesFile.

  OPEN OUTPUT PrintFile.

  READ SalesFile

  AT END SET EndOfFile TO TRUE

  END-READ.

  486

  Chapter 18 ■ the COBOL repOrt Writer

  INITIATE SolaceSalesReport.

  PERFORM PrintSalaryReport

  UNTIL EndOfFile.

  TERMINATE SolaceSalesReport.

 

‹ Prev