1

我正在尝试按索引打开文件,但不断收到以下错误。从我能找到的所有 COBOL 代码示例中,我看不到我的错误在哪里。

我能够按顺序打开文件就好了。这似乎是试图以索引方式打开它。

错误:

project2.cbl:119: libcob: Permanent file error (STATUS = 30) File : 'customers.dat'

系统:

OS X

GnuCOBOL

OpenCobolIDE
Version: 4.7.3

代码:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. PROJECT-2.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.

       SELECT CUST-FILE ASSIGN TO "customers.dat"
           ORGANIZATION IS INDEXED
           ACCESS IS RANDOM
           RECORD KEY IS CUST-ID.

       SELECT INV-FILE ASSIGN TO "inventory.dat"
           ORGANIZATION IS INDEXED
           ACCESS IS RANDOM
           RECORD KEY IS ITEM-ID.

       SELECT TRANS-FILE ASSIGN TO "transactions.dat"
           ORGANIZATION IS LINE SEQUENTIAL.

       SELECT SORTED-TRANS-FILE ASSIGN TO "sorted-transactions.dat"
           ORGANIZATION IS LINE SEQUENTIAL.

       SELECT WORK-TRANS-FILE ASSIGN TO "work-transaction.dat".

   DATA DIVISION.
   FILE SECTION.

   FD  CUST-FILE.
   01  CUST-RECORD.
       05  CUST-ID         PIC 9(10).
       05  NAME            PIC A(23).
       05  STREET          PIC X(23).
       05  CITY            PIC A(13).
       05  STATE           PIC A(12).
       05  AMT-DUE         PIC 9(3).99.

   FD  INV-FILE.
   01  INV-RECORD.
       05  ITEM-ID         PIC 9(11).
       05  DESC            PIC A(24).
       05  OH              PIC 9(7).
       05  MIN-STK         PIC 9(7).
       05  PRICE           PIC 9(2).99.

   FD  TRANS-FILE.
   01  TRANS-RECORD.
       05  CUST            PIC 9(10).
       05  ITEM            PIC 9(12).
       05  QTY             PIC 9(6).
       05  SALE-CD         PIC X(1).
           88  10-OFF      VALUE "A".
           88  20-OFF      VALUE "B".
           88  25-OFF      VALUE "C".
           88  3-GET-1     VALUE "D".
           88  1-GET-1     VALUE "E".
           88  NO-DISC     VALUE "Z".

   FD  SORTED-TRANS-FILE.
   01  SORTED-TRANS-RECORD.
       05  S-CUST          PIC 9(10).
       05  S-ITEM          PIC 9(12).
       05  S-QTY           PIC 9(6).
       05  S-SALE-CD       PIC X(1).
           88  10-OFF      VALUE "A".
           88  20-OFF      VALUE "B".
           88  25-OFF      VALUE "C".
           88  3-GET-1     VALUE "D".
           88  1-GET-1     VALUE "E".
           88  NO-DISC     VALUE "Z".

   SD  WORK-TRANS-FILE.
   01  WORK-TRANS-RECORD.
       05  W-CUST          PIC 9(10).
       05  W-ITEM          PIC 9(12).
       05  W-QTY           PIC 9(6).
       05  W-SALE-CD       PIC X(1).
           88  10-OFF      VALUE "A".
           88  20-OFF      VALUE "B".
           88  25-OFF      VALUE "C".
           88  3-GET-1     VALUE "D".
           88  1-GET-1     VALUE "E".
           88  NO-DISC     VALUE "Z".

   WORKING-STORAGE SECTION.
   01  SWITCHES.
       05 C-EOF-SWITCH     PIC X VALUE "N".
       05 I-EOF-SWITCH     PIC X VALUE "N".
       05 T-EOF-SWITCH     PIC X VALUE "N".
       05 S-EOF-SWITCH     PIC X VALUE "N".

   01  COUNTERS.
       05 REC-COUNTER-C    PIC 9(3) VALUE 0.
       05 REC-COUNTER-I    PIC 9(3) VALUE 0.
       05 REC-COUNTER-T    PIC 9(3) VALUE 0.
       05 REC-COUNTER-S    PIC 9(3) VALUE 0.

   PROCEDURE DIVISION.
   MAIN-PROCEDURE.

       PERFORM 100-INITIALIZE.
       PERFORM 200-SORT-TRANSACTIONS.
       PERFORM 300-CUSTOMER-INVOICE
           UNTIL S-EOF-SWITCH = "Y".
       PERFORM 900-TERMINATE.

       STOP RUN.

   100-INITIALIZE.
       OPEN I-O CUST-FILE.
       READ CUST-FILE
           AT END
               MOVE "Y" TO C-EOF-SWITCH
           NOT AT END
               COMPUTE REC-COUNTER-C = REC-COUNTER-C + 1
       END-READ.

       OPEN I-O INV-FILE.
       READ INV-FILE
           AT END
               MOVE "Y" TO I-EOF-SWITCH
           NOT AT END
               COMPUTE REC-COUNTER-I = REC-COUNTER-I + 1
       END-READ.

       OPEN INPUT TRANS-FILE.
       READ TRANS-FILE
           AT END
               MOVE "Y" TO T-EOF-SWITCH
           NOT AT END
               COMPUTE REC-COUNTER-T = REC-COUNTER-T + 1
       END-READ.

   200-SORT-TRANSACTIONS.
       SORT WORK-TRANS-FILE ON ASCENDING W-CUST
       USING  TRANS-FILE
       GIVING SORTED-TRANS-FILE.

   300-CUSTOMER-INVOICE.

       DISPLAY S-CUST.
       DISPLAY S-ITEM.
       DISPLAY S-QTY.
       DISPLAY S-SALE-CD.
       DISPLAY " ".

       READ SORTED-TRANS-FILE
           AT END
               MOVE "Y" TO S-EOF-SWITCH
           NOT AT END
               COMPUTE REC-COUNTER-S = REC-COUNTER-S + 1
       END-READ.

   900-TERMINATE.
       DISPLAY "Number of Customers: " REC-COUNTER-C.
       DISPLAY "Number of Transactions: " REC-COUNTER-T.
       DISPLAY "Number of Inventory Items: " REC-COUNTER-I.
       CLOSE CUST-FILE.
       CLOSE INV-FILE.
       CLOSE TRANS-FILE.

   END PROGRAM PROJECT-2.

文件内容:

01001     Steve Howe             123 Topographic Rd     London       England     000.00
01002     Geddy Lee              4385 Xanadu Ln         Toronto      Canada      058.15
01003     Steve Hackett          16 Serpentine Dr       London       England     134.10
01005     Nancy Wilson           5763 Butterfly St      Seattle      Washington  018.95
01008     Andy Latimer           858 Sasquatch St       Leeds        England     857.44
01015     Dweezil Zappa          86 Yerbouti Blvd       Los Angeles  California  000.00
01019     Roine Stolt            2332 Retropolis        Stockholm    Sweden      069.95
01023     Tal Wilkenfeld         52525 Beck Way         Sydney       Australia   200.00
01044     Todd Rundgren          662 Utopia St          Los Angeles  California  157.21
01088     Mike Rutherford        91 N Broadway          New York     New York    000.00
4

1 回答 1

6

顺序文件不能作为索引文件打开。这是一种完全不同的文件类型。

您可能想要OPEN OUTPUT CUST-FILE,从顺序文件中读取您的客户,然后WRITE CUST-FILE FROM seq-record. 之后您OPEN INPUT CUST-FILE将工作(取决于您想要实现的目标,最好将数据读入临时和有序表,然后用于SEARCH ALL获取特定记录。

于 2016-07-13T18:01:44.667 回答