按顺序读取文件中的特定记录然后显示它

时间:2015-02-06 22:21:52

标签: cobol

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

3 个答案:

答案 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.,而是从该部分返回并允许您的主流控制首先打开,然后读取主文件。

答案 1 :(得分: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

答案 2 :(得分:0)

布鲁斯马丁是对的。执行此操作的唯一合理方法是在每次输入后显示信息,并使用索引文件。

但是,您可能需要使用顺序文件完成练习。

首先,您需要一个程序来驱动您的程序,在这种情况下是用户输入。这应该是该计划的主要循环。

对于除终端之外的每个用户输入,您打开文件,循环读取文件直到文件结束,并在该循环中测试用户输入的数据对照主文件上的数据,在匹配时生成输出。 IF语句可能就是您将使用的语句。

如果能完成任务,那么就忘掉这个"技术"完全,除了记住"我不能再这样做了。首先设计,然后编程。"

一些提示:看看如何使用和使用FILE STATUS;程序部门中具有最少全停/周期数的代码;如果使用数字作为段落名称的前缀,不要在程序测试之前将它们打开,它会为你保存重新编号或将它们留在无用的纠结中;了解88个条件的名称,并使用它们;我从未在真实的节目中见过PIC A,它的好处是微不足道的,缺乏对它的了解会引起混乱;不要做更多的事情,但也不要做得更少。

最后一个例子是:

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

0或者比喻常数ZERO(或ZEROS或ZEROES)不必给出长度。编译器对其进行排序。

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

那是一样的。但这更好:

   MOVE 1                              TO TR-CODE
   .

更容易理解(没有人会问,"为什么他们移动ZERO然后添加1?"),更容易编码,维护和减少对CPU的压力。