Последовательное чтение определенной записи в файле и ее отображение.

INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT MASTER-FILE ASSIGN TO "MASTER-PRODUCT-FILE.DAT"
       ORGANIZATION IS SEQUENTIAL
       ACCESS MODE IS SEQUENTIAL.

       SELECT TRANSACTION-FILE ASSIGN TO "INVENTORY-FILE.DAT"
       ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   FILE SECTION.
   FD MASTER-FILE.
   01 MASTER-RECORDS.
       05 PR-CODE                  PIC 9(7).
       05 PR-NAME                  PIC X(30).
       05 PR-PRICE                 PIC 9(5)V99.
       05 PR-QUANTITY              PIC S9(6).

   FD TRANSACTION-FILE.
   01 TRANSACTION-RECORDS.
       05 TR-CODE                  PIC 9(6).
       05 TR-DATE.
           10 DATE-YEAR            PIC 9(4).
           10 DATE-MONTH           PIC 99.
           10 DATE-DAY             PIC 99.
       05 TR-PRODCODE              PIC 9(7).
       05 TR-PRODNAME              PIC X(30).
       05 TR-PRODPRICE             PIC 9(5).
       05 TR-PRODQUANTITY          PIC S9(6).
       05 TR-PRODSALES             PIC 9(6)V99.

 WORKING-STORAGE SECTION.
  *Current Date
   01 CDate.
       05 CYear                    PIC 9(4).
       05 CMonth                   PIC 99.
       05 CDay                     PIC 99.
  *Current Time
   01 CTime.
       05 CHour                    PIC 99.
       05 CMinute                  PIC 99.
*End of File
   01 EOF                          PIC A(1).
  *Input Product Code
   01 WS-PR-CODE                   PIC 9(7).

PROCEDURE DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   0000-MAIN.
       PERFORM 1000-INCREMENT.
       PERFORM 2000-INTRO.
       PERFORM 3000-DATA-ENTRY-PR-CODE.
       PERFORM 4000-OPEN-FILE.
       PERFORM 5000-READ-MASTER-FILE.
       PERFORM 6000-CLOSE-FILE.
  *-----------------------------------------------------------------
   1000-INCREMENT.
  *Increment the transaction code to 1
       MOVE 000000 TO TR-CODE
       ADD 1 TO TR-CODE.
  *-----------------------------------------------------------------
   2000-INTRO.
  *Current date and time validation
       ACCEPT  CDate FROM DATE YYYYMMDD.
       ACCEPT  CTime FROM TIME.
  *System's header
       DISPLAY SPACES.
       DISPLAY "--------------------------------------------------".
       DISPLAY "|                  INVENTORY SYSTEM              |".
       DISPLAY "--------------------------------------------------".
       DISPLAY SPACES.
       DISPLAY "         TRANSACTION NUMBER : "TR-CODE
       DISPLAY "         TRANSACTION DATE   : "CMonth"/"CDay"/"CYear
       DISPLAY "         TRANSACTION TIME   : "CHour":"CMinute
       DISPLAY SPACES.
       DISPLAY "      **** PLEASE ENTER PRODUCT DETAILS ****      ".
  *-----------------------------------------------------------------
   3000-DATA-ENTRY-PR-CODE.
       DISPLAY "PRODUCT CODE    : " WITH NO ADVANCING.
       ACCEPT WS-PR-CODE.

       PERFORM 5000-READ-MASTER-FILE.
  *-----------------------------------------------------------------
   4000-OPEN-FILE.
       OPEN I-O MASTER-FILE
       OPEN OUTPUT TRANSACTION-FILE.
  *-----------------------------------------------------------------
   5000-READ-MASTER-FILE.
       PERFORM UNTIL EOF = "Y"
           READ MASTER-FILE INTO WS-PR-CODE
               AT END MOVE "Y" TO EOF
               NOT AT END DISPLAY MASTER-RECORDS
           END-READ
       END-PERFORM.
  *-----------------------------------------------------------------     
   6000-CLOSE-FILE.
       CLOSE MASTER-FILE.
       CLOSE TRANSACTION-FILE.
       STOP RUN.

Как я могу это исправить? Моя проблема в том, что при вводе кода продукта он не отображает информацию о продукте. Ошибка READ/START не допускается. Можете ли вы научить меня, как найти конкретную запись в файле? Сначала я вручную создал файл.DAT, вставил несколько записей в соответствии с типами данных и форматом. Пожалуйста, смотрите файл.DAT здесь.

Вот пример вывода:

3 ответа

Решение

Брюс Мартин прав. Единственный разумный способ сделать это, когда вам необходимо отображать информацию после каждого ввода, - это индексированный файл.

Однако это может быть упражнение, которое вы должны выполнить, используя последовательный файл.

Во-первых, вам нужен один процесс для управления вашей программой, который в данном случае является пользовательским вводом. Это должно быть основным циклом программы.

Для каждого пользовательского ввода, кроме терминального, вы открываете файл, циклически читаете файл до конца файла и в этом цикле проверяете введенные пользователем данные на соответствие данным в мастер-файле, производя вывод когда есть совпадение. IF утверждение, вероятно, что вы будете использовать для этого.

Если это поможет вам выполнить задание, тогда полностью забудьте об этой "технике", кроме как помнить: "Я не должен делать это снова. Сначала проектируй, потом программируй".

Несколько советов: посмотрите, как использовать и использовать FIAT STATUS; код с минимальным количеством полных остановок / периодов в ПРОЦЕДУРЕ РАЗДЕЛА; если вы используете префиксы для имен абзацев с помощью чисел, не надевайте их до тех пор, пока программа не будет протестирована, это избавит вас от нумерации или оставит их в бесполезной путанице; понимать 88-уровневые имена состояний и использовать их; Я никогда не видел PIC A в реальной программе ее польза минимальна, а отсутствие знаний о ней приведет к путанице; не делай больше, чем нужно, но и не делай меньше.

Пример этого последнего:

   MOVE 000000 TO TR-CODE
   ADD 1 TO TR-CODE.

0 или образно-постоянная НОЛЬ (или НУЛИ или НУЛИ) не обязательно должна быть задана длиной. Компилятор разбирается.

   MOVE ZERO                           TO TR-CODE
   ADD 1                               TO TR-CODE
   .

Это то же самое. Но это лучше

   MOVE 1                              TO TR-CODE
   .

Легче понять (никто никогда не спросит: "Почему они ПЕРЕМЕЩАЮТ НУЛЬ, а НЕ ДОБАВЛЯЮТ 1?"), Легче кодировать, поддерживать и меньше загружать ЦП.

Я думаю, что вы должны использовать это индексированный последовательный файл. Используя последовательный файл, вы могли бы * загрузить файл в массив и затем переписать его в конце * Скопировать в индексный файл, затем скопировать обратно * открыть и закрыть файл для каждого обновления (и переписать каждую запись).

ни один из вышеупомянутых вариантов никогда не должен использоваться!!!

Индексированный файл будет определен примерно так (взят из обработки индексного файла:

001600 SELECT VSAM-KSDS-FILE ASSIGN VSAMKSDS 001700 ORGANIZATION IS INDEXED 001800* NOTICE THE RANDOM NEXT 001900 ACCESS MODE IS RANDOM 002000 RECORD KEY IS VSAM-KSDS-RECORD-KEY 000600 FILE STATUS IS VSAM-STATUS-CODE 000700 VSAM-EXTENDED-STATUS-CODE.

и читать Move key to File-record-key READ File INVALID KEY DISPLAY "Read Error :-", FileStatus END-READ

Этот сайт имеет несколько последовательных примеров индекса, также Google это

Давайте посмотрим на ваш контроль потока. Сначала этот раздел:

   PERFORM 3000-DATA-ENTRY-PR-CODE.
   PERFORM 4000-OPEN-FILE.
   PERFORM 5000-READ-MASTER-FILE.

Я предполагаю

Вы имеете в виду, что вы выполняли 3000-DATA-ENTRY-PR-CODE когда вы получили ошибку, которая гласит

3000-DATA-ENTRY-PR-CODE.
   DISPLAY "PRODUCT CODE    : " WITH NO ADVANCING.
   ACCEPT WS-PR-CODE.

   PERFORM 5000-READ-MASTER-FILE.

Обратите внимание, что вы переходите прямо к 5000-READ-MASTER-FILE даже не выполнив 4000-OPEN-FILE, который открывает файл.

Вместо того, чтобы перейти к PERFORM 5000-READ-MASTER-FILE.Я бы вернулся из этого раздела и позволил бы вашему основному управлению потоком сначала открыть, а затем прочитать мастер-файл.

Другие вопросы по тегам