Question

I have three VSAM Files. One for customers, videos, and rentals. In these VSAM files each customer, video and rental has an id. Below is an example of the customer file:

300, Bob, 315-123-1414

301, Ryan, 315-213-2617

302, Smith, 315-123-1234

303, Roberta, 212-125-1234

The video file and the rental file are set up the same way.

What I need to do is write a cobol program that will read these VSAM files and then lists the customers, videos, and which videos the customer rented. I plan on doing this by having one ID number per customer and then putting that id number with the rented videos.

The cobol code I have so far is below:

ID DIVISION.
    PROGRAM-ID. PROG3

    ENVIRONMENT DIVISION.
    CONFIGURATION SECTION.
    SOURCE-COMPUTER. IBM-Z10.
    OBJECT-COMPUTER. IBM-Z10.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
         SELECT CUR-FILE ASSIGN TO MYFILE1
         ORGANIZATION INDEXED ACCESS IS SEQUENTIAL
         RECORD KEY IS EMP-NO FILE STATUS IS F13.

    DATA DIVISION.
    FILE SECTION.
    FD  CUR-FILE
        RECORD CONTAINS 80 CHARACTERS
        DATA RECORD IS CUR-REC.
      01 CUR-REC.
        02 EMP-NO      PIC X(6).
        02 EMP-NAME    PIC X(24).
        02 EMP-ADDRESS PIC X(50).
      WORKING-STORAGE SECTION.
      77 F13 PIC 99 VALUE ZEROS.


      PROCEDURE DIVISION.
      0001-MAIN.
          DISPLAY ' I M IN MAIN '.
          DISPLAY ' I M IN MAIN '.
          OPEN OUTPUT CUR-FILE. IF F13 = 00
          DISPLAY ' I M OPENED SUCCESSFULLY ' ELSE
          DISPLAY 'OPEN-ERROR ' F13 STOP RUN.
          MOVE '822655' TO EMP-NO.
          DISPLAY EMP-NO.
          MOVE 'MUSADDIQ USMAN' TO EMP-NAME.
          MOVE 'P-5/01 STEEL TOWN' TO EMP-ADDRESS.
          DISPLAY CUR-REC.
          WRITE CUR-REC.
          IF F13 = 00 DISPLAY 'WRITE SUCCESSFUL' ELSE
          DISPLAY 'WRITE ERROR ' F13 STOP RUN.
          CLOSE CUR-FILE.
          STOP RUN.

Below I am adding the Read program I think this will help you help me hopefully:

ID DIVISION.
    PROGRAM-ID. RDVSAM.

    ENVIRONMENT DIVISION.
    CONFIGURATION SECTION.
    SOURCE-COMPUTER. IBM-Z10.
    OBJECT-COMPUTER. IBM-Z10.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
         SELECT CUR-FILE ASSIGN TO MYFILE1
         ORGANIZATION INDEXED ACCESS IS SEQUENTIAL
         RECORD KEY IS EMP-NO FILE STATUS IS F13.

    DATA DIVISION.
    FILE SECTION.
    FD  CUR-FILE
        RECORD CONTAINS 80 CHARACTERS
        DATA RECORD IS CUR-REC.
      01 CUR-REC.
        02 EMP-NO PIC 9(6).
        02 EMP-NAME PIC X(24).
        02 EMP-ADDRESS PIC X(50).
    WORKING-STORAGE SECTION.
    77 F13 PIC 99 VALUE ZEROS.

    PROCEDURE DIVISION.
    0001-MAIN.
       OPEN INPUT CUR-FILE. IF F13 = 00
       DISPLAY ' I M OPENED SUCCESSFULLY ' ELSE
       DISPLAY 'OPEN-ERROR ' F13 STOP RUN.
    REAd-FILE.
       READ CUR-FILE AT END GO TO CLOSE-UP.
       DISPLAY EMP-NO ' ' EMP-NAME ' ' EMP-ADDRESS.
       GO TO READ-FILE.
    CLOSE-UP.
       CLOSE CUR-FILE.
       STOP RUN.

I am stuck and don't know how to list all of the information.

Thank you

Was it helpful?

Solution

See http://opencobol.add1tocobol.com/#does-opencobol-support-isam for an example than scans through INDEXED files, and maybe http://opencobol.add1tocobol.com/#relative (different file org)

Note: that this is just for hints. Look to START and READ NEXT for clues

OCOBOL >>SOURCE FORMAT IS FIXED
      *> ***************************************************************
      *><* ================
      *><* indexing example
      *><* ================
      *><* :Author:    Brian Tiffin
      *><* :Date:      17-Feb-2009
      *><* :Purpose:   Fun with Indexed IO routines
      *><* :Tectonics: cobc -x indexing.cob
      *> ***************************************************************
       identification division.
       program-id. indexing.

       environment division.
       configuration section.

       input-output section.
       file-control.
          select optional indexing
          assign to "indexing.dat"
          organization is indexed
          access mode is dynamic
          record key is keyfield of indexing-record
          alternate record key is splitkey of indexing-record
              with duplicates
          .

      *> ** OpenCOBOL does not yet support split keys **
      *>  alternate record key is newkey
      *>      source is first-part of indexing-record
      *>                last-part of indexing-record
      *>      with duplicates

       data division.
       file section.
       fd indexing.
       01 indexing-record.
          03 keyfield          pic x(8).
          03 splitkey.
             05 first-part     pic 99.
             05 middle-part    pic x.
             05 last-part      pic 99.
          03 data-part         pic x(54).

       working-storage section.
       01 display-record.
          03 filler            pic x(4)  value spaces.
          03 keyfield          pic x(8).
          03 filler            pic xx    value spaces.
          03 splitkey.
             05 first-part     pic z9.
             05 filler         pic x     value space.
             05 middle-part    pic x.
             05 filler         pic xx    value all "+".
             05 last-part      pic z9.
          03 filler            pic x(4)  value all "-".
          03 data-part         pic x(54).

      *> control break
       01 oldkey               pic 99x99.

      *> In a real app this should well be two separate flags
       01 control-flag         pic x.
          88 no-more-duplicates          value high-value
             when set to false is              low-value.
          88 no-more-records             value high-value
             when set to false is              low-value.

      *> ***************************************************************
       procedure division.

      *> Open optional index file for read write
       open i-o indexing

      *> populate a sample database
       move "1234567800a01some 12345678 data here" to indexing-record
       perform write-indexing-record
       move "8765432100a01some 87654321 data here" to indexing-record
       perform write-indexing-record
       move "1234876500a01some 12348765 data here" to indexing-record
       perform write-indexing-record
       move "8765123400a01some 87651234 data here" to indexing-record
       perform write-indexing-record

       move "1234567900b02some 12345679 data here" to indexing-record
       perform write-indexing-record
       move "9765432100b02some 97654321 data here" to indexing-record
       perform write-indexing-record
       move "1234976500b02some 12349765 data here" to indexing-record
       perform write-indexing-record
       move "9765123400b02some 97651234 data here" to indexing-record
       perform write-indexing-record

       move "1234568900c13some 12345689 data here" to indexing-record
       perform write-indexing-record
       move "9865432100c13some 98654321 data here" to indexing-record
       perform write-indexing-record
       move "1234986500c13some 12349865 data here" to indexing-record
       perform write-indexing-record
       move "9865123400c13some 98651234 data here" to indexing-record
       perform write-indexing-record

      *> close it ... not necessary, but for the example
       close indexing

      *> clear the record space for this example
       move spaces to indexing-record

      *> open the data file again
       open i-o indexing

      *> read all the duplicate 00b02 keys
       move 00 to first-part of indexing-record
       move "b" to middle-part of indexing-record
       move 02 to last-part of indexing-record

      *> using read key and then next key / last key compare
       set no-more-duplicates to false
       perform read-indexing-record
       perform read-next-record
           until no-more-duplicates

      *> read by key of reference ... the cool stuff
       move 00 to first-part of indexing-record
       move "a" to middle-part of indexing-record
       move 02 to last-part of indexing-record

      *> using start and read next
       set no-more-records to false
       perform start-at-key
       perform read-next-by-key
           until no-more-records

      *> read by primary key of reference
       move "87654321" to keyfield of indexing-record

      *>
       set no-more-records to false
       perform start-prime-key
       perform read-previous-by-key
           until no-more-records

      *> and with that we are done with indexing sample
       close indexing

       goback.
      *> ***************************************************************

      *><* Write paragraph
       write-indexing-record.
         write indexing-record
             invalid key
                 display
                     "rewrite key: " keyfield of indexing-record
                 end-display
                   rewrite indexing-record
                       invalid key
                           display
                               "really bad key: "
                               keyfield of indexing-record
                           end-display
                   end-rewrite
         end-write
       .

      *><* read by alternate key paragraph
       read-indexing-record.
           display "Reading: " splitkey of indexing-record end-display
           read indexing key is splitkey of indexing-record
         invalid key
             display
                "bad read key: " splitkey of indexing-record
             end-display
               set no-more-duplicates to true
           end-read
       .

      *><* read next sequential paragraph
       read-next-record.
           move corresponding indexing-record to display-record
           display display-record end-display
           move splitkey of indexing-record to oldkey

           read indexing next record
               at end set no-more-duplicates to true
               not at end
                   if oldkey not equal splitkey of indexing-record
                       set no-more-duplicates to true
                   end-if
           end-read
       .

      *><* start primary key of reference paragraph
       start-prime-key.
           display "Prime < " keyfield of indexing-record end-display
           start indexing
              key is less than
                  keyfield of indexing-record
              invalid key
                  display
                      "bad start: " keyfield of indexing-record
                  end-display
                  set no-more-records to true
              not invalid key
                  read indexing previous record
                      at end set no-more-records to true
                  end-read
           end-start
       .

      *><* read previous by key of reference paragraph
       read-previous-by-key.
           move corresponding indexing-record to display-record
           display display-record end-display

           read indexing previous record
               at end set no-more-records to true
           end-read
       .
      *><* start alternate key of reference paragraph
       start-at-key.
           display "Seeking >= " splitkey of indexing-record end-display
           start indexing
              key is greater than or equal to
                  splitkey of indexing-record
              invalid key
                  display
                      "bad start: " splitkey of indexing-record
                  end-display
                  set no-more-records to true
              not invalid key
                  read indexing next record
                      at end set no-more-records to true
                  end-read
           end-start
       .

      *><* read next by key of reference paragraph
       read-next-by-key.
           move corresponding indexing-record to display-record
           display display-record end-display

           read indexing next record
               at end set no-more-records to true
           end-read
       .
       end program indexing.

OTHER TIPS

OK, IBM Cobol Manuals, I assume IBM due to VSAM, are available online. Search for "Language Reference" and "Programming Guide" for your Compiler version (which is as the top page of every compile listing).

You will need READ with a KEY to find an individual record, or, if you had group of records you could also use READ with key/START and READ NEXT. If you only have a partial key, you use START and READ NEXT. This has already been suggested by Brian.

Are you learning Cobol? You should put work in to avoiding GO TO and formatting your program differently, only one verb per line, helps you further reduce full-stops/periods as well (look at Brian's example for the "full-stop only" line at the end of each paragraph, that's the most full-stops you need except after paragraphs/SECTIONS and the PROCEDURE DIVISION statement itself, and to end the program if you have no paragraphs/SECTIONS.

There is one thing you should not copy from Brian's code, which is an "environment" thing. On the mainframe, if you access a record area before a file is open or after it is closed you'll get an S0C4 abend (unless it is a QSAM file which has APPLY WRITE ONLY, either directly or through AWO compile option).

There is no need to set a record-area to an initial value before reading.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top