views:

317

answers:

1

I'm working in COBOL with a double control break to print a hospital record. The input is one record per line, with, hospital info first, then patient info. There are multiple records per hospital, and multiple services per patient.

The idea is, using a double control break, to print one hospital name, then all the patients from that hospital. Then print the patient name just once for all services, like the below.

I'm having trouble with my output, and am hoping someone can help me get it in order.

I am using AccuCobol to compile
experts-exchange does not allow .cob and .dat so the extentions were changed to .txt
The files are: the .cob lab5b.cob
the input / output: lab5bin.dat, lab5bout.dat

The assignment: http://www.cse.ohio-state.edu/~sgomori/314/lab5.html

Hospital Number: 001
Hospital Name: Mount Carmel

00001       Griese, Brian              Ear Infection                    08/24/1999 300.00
                                                    Diaper Rash                     09/05/1999 25.00
                                                    Frontal Labotomy             09/25/1999 25,000.00
                                                    Rear Labotomy                09/26/1999 25,000.00
                                                    Central Labotomy             09/28/1999 24,999.99

  The total amount owed for this patient is: $..........

(End of Hospital)

The total amount owed for this hospital is: $.........

enter code here

IDENTIFICATION DIVISION.
PROGRAM-ID. LAB5B.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
     SELECT FILE-IN  ASSIGN TO 'lab5bin.dat'
            ORGANIZATION IS LINE SEQUENTIAL.
     SELECT FILE-OUT  ASSIGN TO 'lab5bout.dat'
            ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD  FILE-IN.
01  HOSPITAL-RECORD-IN.
    05  HOSPITAL-NUMBER-IN     PIC 999.
    05  HOSPITAL-NAME-IN       PIC X(20).
    05  PATIENT-NUMBER-IN      PIC 99999.
    05  PATIENT-NAME-IN        PIC X(20).
    05  SERVICE-IN             PIC X(30).
    05  DATE-IN                PIC 9(8).
    05  OWED-IN                PIC 9(7)V99.

FD  FILE-OUT.
01  REPORT-REC-OUT                  PIC X(100).

WORKING-STORAGE SECTION.
01  WS-WORK-AREAS.
    05  WS-HOLD-HOSPITAL-NUM   PIC 999  VALUE ZEROS.
    05  WS-HOLD-PATIENT-NUM    PIC 99999  VALUE ZEROS.
    05  ARE-THERE-MORE-RECORDS  PIC XXX   VALUE 'YES'.
        88  MORE-RECORDS                  VALUE 'YES'.
        88  NO-MORE-RECORDS               VALUE 'NO '.
    05  FIRST-RECORD            PIC XXX   VALUE 'YES'.
    05  WS-PATIENT-TOTAL        PIC 9(9)V99  VALUE ZEROS.
    05  WS-HOSPITAL-TOTAL       PIC 9(9)V99  VALUE ZEROS.
    05  WS-PAGE-CTR             PIC 99       VALUE ZEROS.

01  WS-DATE.
    05  WS-YR      PIC 9999.
    05  WS-MO      PIC 99.
    05  WS-DAY     PIC 99.

01  HL-HEADING1.
    05                   PIC X(49)  VALUE SPACES.
    05                   PIC X(14)  VALUE 'OHIO INSURANCE'.
    05                   PIC X(7)  VALUE SPACES.
    05  HL-PAGE          PIC Z9.
    05                   PIC X(14)  VALUE SPACES.
    05  HL-DATE.
        10  HL-MO        PIC 99.
        10               PIC X  VALUE '/'.
        10  HL-DAY       PIC 99.
        10               PIC X  VALUE '/'.
        10  HL-YR        PIC X  VALUE '/'.


01  HL-HEADING2.
    05     PIC XXXXXXXXXX  VALUE 'HOSPITAL: '.
    05  HL-HOSPITAL        PIC 999.

01  HL-HEADING3.
    05                 PIC X(7)   VALUE "Patient".
    05                 PIC X(3)  VALUE SPACES.
    05                 PIC X(7)   VALUE "Patient".
    05                 PIC X(39)  VALUE SPACES.
    05                 PIC X(7)   VALUE "Date of".
    05                 PIC X(3)   VALUE SPACES.
    05                 PIC X(6)   VALUE "Amount".

01  HL-HEADING4.
    05                 PIC X(6)  VALUE "Number".
    05                 PIC X(4)  VALUE SPACES.
    05                 PIC X(4)  VALUE "Name".
    05                 PIC X(18)  VALUE SPACES.
    05                 PIC X(10)  VALUE "Service".
    05                 PIC X(14)  VALUE SPACES.
    05                 PIC X(8)  VALUE "Service".
    05                 PIC X(2)  VALUE SPACES.
    05                 PIC X(5)  VALUE "Owed".


01  DL-PATIENT-LINE.
    05            PIC X(28)  VALUE SPACES.
    05  DL-PATIENT-NUMBER   PIC XXXXX.
    05            PIC X(21)  VALUE SPACES.
    05  DL-PATIENT-TOTAL    PIC $$$,$$$,$$9.99.

01  DL-HOSPITAL-LINE.
    05            PIC X(47)  VALUE SPACES.
    05            PIC X(16)  VALUE 'HOSPITAL TOTAL: '.
    05  DL-HOSPITAL-TOTAL    PIC $$$,$$$,$$9.99.


PROCEDURE DIVISION.

100-MAIN-MODULE.
    PERFORM 600-INITIALIZATION-RTN
    PERFORM UNTIL NO-MORE-RECORDS
       READ FILE-IN
           AT END
               MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
           NOT AT END
               PERFORM 200-DETAIL-RTN
       END-READ
    END-PERFORM
    PERFORM 400-HOSPITAL-BREAK
    PERFORM 700-END-OF-JOB-RTN
    STOP RUN.

200-DETAIL-RTN.
    EVALUATE TRUE
        WHEN FIRST-RECORD = 'YES'
            MOVE PATIENT-NUMBER-IN TO WS-HOLD-PATIENT-NUM
            MOVE HOSPITAL-NUMBER-IN TO WS-HOLD-HOSPITAL-NUM
            PERFORM 500-HEADING-RTN
            MOVE 'NO ' TO FIRST-RECORD
        WHEN HOSPITAL-NUMBER-IN NOT = WS-HOLD-HOSPITAL-NUM
            PERFORM 400-HOSPITAL-BREAK
        WHEN PATIENT-NUMBER-IN NOT = WS-HOLD-PATIENT-NUM
            PERFORM 300-PATIENT-BREAK
    END-EVALUATE
    ADD OWED-IN TO WS-PATIENT-TOTAL.

300-PATIENT-BREAK.
    MOVE WS-PATIENT-TOTAL TO DL-PATIENT-TOTAL
    MOVE WS-HOLD-PATIENT-NUM TO DL-PATIENT-NUMBER
    WRITE REPORT-REC-OUT FROM DL-PATIENT-LINE
         AFTER ADVANCING 2 LINES
    ADD WS-PATIENT-TOTAL TO WS-HOSPITAL-TOTAL
    IF  MORE-RECORDS
        MOVE ZEROS TO WS-PATIENT-TOTAL
        MOVE PATIENT-NUMBER-IN TO WS-HOLD-PATIENT-NUM
    END-IF.

400-HOSPITAL-BREAK.
    PERFORM 300-PATIENT-BREAK
    MOVE WS-HOSPITAL-TOTAL TO DL-HOSPITAL-TOTAL
    WRITE REPORT-REC-OUT FROM DL-HOSPITAL-LINE
         AFTER ADVANCING 2 LINES
    IF  MORE-RECORDS
        MOVE ZEROS TO WS-HOSPITAL-TOTAL
        MOVE HOSPITAL-NUMBER-IN TO WS-HOLD-HOSPITAL-NUM
        PERFORM 500-HEADING-RTN
    END-IF.

500-HEADING-RTN.
    ADD 1 TO WS-PAGE-CTR
    MOVE WS-PAGE-CTR TO HL-PAGE
    MOVE WS-HOLD-HOSPITAL-NUM TO HL-HOSPITAL
    WRITE REPORT-REC-OUT FROM HL-HEADING1
         AFTER ADVANCING PAGE
    WRITE REPORT-REC-OUT FROM HL-HEADING2
         AFTER ADVANCING 2 LINES.
    WRITE REPORT-REC-OUT FROM HL-HEADING3
         AFTER ADVANCING 2 LINES.

600-INITIALIZATION-RTN.
    OPEN INPUT  FILE-IN
         OUTPUT FILE-OUT
*159
    ACCEPT WS-DATE FROM DATE YYYYMMDD

    MOVE WS-YR TO HL-YR
    MOVE WS-MO TO HL-MO
    MOVE WS-DAY TO HL-DAY.

700-END-OF-JOB-RTN.
    CLOSE FILE-IN
          FILE-OUT.
A: 

The input is one record per line, with, hospital info first, then patient info. There are multiple records per hospital, and multiple services per patient.

Then you should first check if you're still working with the same patient, then if you're still working with the same hospital. This is a common file/program structure, I think it's called "level stucture". Usually all the sort fields including the end-of-file condition are put together in a group field that is moved to a copy before every next read, so that it can easily be compared to see if any one of the levels change.

Albert Visser