Проблемы с чтением индексированного файла (COBOL) - PullRequest
1 голос
/ 28 мая 2011

У меня огромная проблема в программе, вращающейся вокруг чтения проиндексированного файла. В то время как программа включает в себя два других чтения, которые работают очень хорошо, это продолжает доставлять мне проблемы. Вот код для всего, что с этим связано:

       SELECT PO-MASTER-FILE
           ASSIGN TO 'PO-INDEXED.DAT'
           ORGANIZATION IS INDEXED
           ACCESS IS RANDOM
           RECORD KEY IS PO-KEY
           FILE STATUS IS FILE-STATUS-CODE.

   DATA DIVISION.
   FILE SECTION.

   FD  PO-MASTER-FILE.
   01  PO-MASTER-RECORD.
       05  PO-KEY.
           10  PO-VEND-NUMBER-M        PIC X(4).
           10  PO-ORDER-ID-M           PIC X(8).

   WORKING-STORAGE SECTION.
       05  PO-KEY-S.
           10  POLI-VEND-NUMBER-S      PIC X(4).
           10  POLI-ORDER-ID-S         PIC X(8).

   SCREEN SECTION.
       05  LINE 07  COLUMN 23  VALUE 'NUMBER:'
               FOREGROUND-COLOR 10.
       05  LINE 07  COLUMN 50          PIC X(4)
               USING POLI-VEND-NUMBER-S
               FOREGROUND-COLOR 15 AUTO.
       05  LINE 08  COLUMN 23  VALUE 'ORDER ID:'
               FOREGROUND-COLOR 10.
       05  LINE 08  COLUMN 50          PIC X(8)
               USING POLI-ORDER-ID-S
               FOREGROUND-COLOR 15 AUTO.

   PROCEDURE DIVISION.
   100-MAIN.
       OPEN I-O   POLI-MASTER-FILE
                  PO-MASTER-FILE
                  ITEM-MASTER-FILE

       PERFORM 120-DISPLAY-SCREEN
           UNTIL FUNCTION-CODE-S = 'END' OR 'end'

           CLOSE  POLI-MASTER-FILE
                  PO-MASTER-FILE
                  ITEM-MASTER-FILE

           EXIT PROGRAM
           STOP RUN.

   120-DISPLAY-SCREEN.

  ****
       MOVE FUNCTION-CODE-S TO SAVE-FUNCTION-CODE

  ****
       MOVE POLI-VEND-NUMBER-S TO SAVE-VEND-NUMBER

  ****
       CALL 'DATETIME' USING DATE-TIME-PASS-AREA

       DISPLAY SCREEN-IMAGE
       ACCEPT SCREEN-IMAGE

       IF FUNCTION-CODE-S = 'END' OR 'end'
           CONTINUE
       ELSE
           PERFORM 200-PROCESS
       END-IF.

   200-PROCESS.
       MOVE SPACES TO ERROR-MESSAGE-S
       EVALUATE TRUE
           WHEN FUNCTION-CODE-S = 'INQ' OR 'inq'
               PERFORM 300-INQUIRY
           WHEN FUNCTION-CODE-S = 'ADD' OR 'add'
               PERFORM 400-ADD
           WHEN FUNCTION-CODE-S = 'CHG' OR 'chg'
               PERFORM 500-CHANGE
           WHEN FUNCTION-CODE-S = 'DEL' OR 'del'
               PERFORM 600-DELETE
           WHEN OTHER
               MOVE 'Invalid Function Code' TO ERROR-MESSAGE-S
       END-EVALUATE.

   400-ADD.
  ****
       PERFORM 900-VALIDATE-THE-FIELDS THRU 999-EXIT
       IF ERROR-MESSAGE-S = SPACES
           PERFORM 420-OK-TO-ADD-THE-RECORD
       ELSE
  ****
           MOVE SPACES TO POLI-DATE-ADDED-S
       END-IF.

   900-VALIDATE-THE-FIELDS.
       MOVE PO-KEY-S TO PO-KEY
       READ PO-MASTER-FILE
           INVALID KEY
               IF FILE-STATUS-CODE = '23'
                   MOVE 'Vendor Number Or Order ID Is Not Found'
                       TO ERROR-MESSAGE-S
                   GO TO 999-EXIT
               ELSE
                   MOVE FILE-STATUS-CODE TO UNEXPECTED-CODE
                   MOVE UNEXPECTED-CODE TO ERROR-MESSAGE-S
               END-IF
       END-READ

После этой точки появляется больше кода проверки, и программа пропускает эту часть, как будто находит файл, даже если я оставляю POLI-VEND-NUMBER-S и POLI-ORDER-ID-S пустыми на экране. Я немного озадачен, если не сказать больше. Любая помощь будет оценена. Спасибо за ваше время.

1 Ответ

1 голос
/ 28 мая 2011

Хорошо, я понял проблему. Кажется, я пропустил некоторые поля, которые были в индексированном файле, потому что они не были нужны в этой части программы. В результате запись не будет загружена и (по какой-то причине) чтение было пропущено. В основном это то, чего не хватало:

   FD  PO-MASTER-FILE.
   01  PO-MASTER-RECORD.
       05  PO-KEY.
           10  PO-VEND-NUMBER-M        PIC X(4).
           10  PO-ORDER-ID-M           PIC X(8).
       05  PO-DATE-ADDED-M.
               10 PO-DA-YEAR-M         PIC X(4).
               10 PO-DA-MONTH-M        PIC XX.
               10 PO-DA-DAY-M          PIC XX.

Спасибо всем, кто посмотрел на это и попытался помочь.

...