2015-02-06 3 views
0
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 here.Последовательно прочитайте определенную запись в файле, затем отобразите ее

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

enter image description here

ответ

0

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

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

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

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

Если это заработает ваше задание, то забудьте об этой «технике» целиком, кроме как помнить «Я не должен повторять это снова. Дизайн сначала, программа после».

Некоторые советы: посмотрите, как использовать и использовать FILE 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 
    . 

Легче понять (никто не будет когда-либо спросить, «почему они MOVE ZERO затем добавить 1?»), Проще код, поддерживать и меньше напряжения на процессоре.

+0

Я бы попробовал это. Спасибо за предложения. Пальцы вверх! –

0

Давайте посмотрим на ваш контроль потока. Во-первых, этот раздел:

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

+0

Ох. Понимаю. Благодарю. Я попробую. –

+0

Eric J. Он зафиксировал чтение файла, но отображает все записи. Как читать и отображать SPECIFIC-запись на основе введенного кода продукта пользователя? –

+0

Не уверен ... прошло 20 лет с тех пор, как я запрограммировал в COBOL. –

0

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

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

Индексированный файл будет определенно что-то вроде (взятое из Index file processing:

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

Это site имеет несколько индексов последовательных примеров, также google it

Смежные вопросы