【发布时间】:2016-07-13 16:00:58
【问题描述】:
我正在尝试以索引方式打开文件,但不断收到以下错误。从我能找到的所有 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
【问题讨论】:
-
Simon Sobisch 是正确的。没有什么魔法可以让您将来自编辑器(或任何其他来源)的文本文件呈现给 COBOL 程序,并将其用作索引文件,只需在 SELECT 上说 INDEXED。假设您已经为安装 GnuCOBOL 提供了索引支持,那么在一个 COBOL 程序中创建一个索引文件并在另一个程序中使用它是一个简单的练习。打开两个文件(一个输入,一个输出)读取文本,写入索引,继续直到结束,关闭两个文件。现在你有了一个索引文件。
-
@BillWoodger 感谢您解释缺乏魔法以及转换文件是多么微不足道和简单。这是非常有建设性的。
-
是的,好吧,我忘记了“文本文件必须已经在键序列中”这一非常重要的部分:-)
标签: cobol file-access indexed gnucobol