Последовательное чтение определенной записи в файле и ее отображение.
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.
Я бы вернулся из этого раздела и позволил бы вашему основному управлению потоком сначала открыть, а затем прочитать мастер-файл.