Я пытаюсь открыть файл с индексированием, но продолжаю получать следующую ошибку. Из всех примеров кода 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 и использовать его в качестве проиндексированного файла, просто указав INDEXED на SELECT. Предполагая, что вы указали поддержку вашей установки GnuCOBOL, создав индексированный файл в одной программе COBOL, а ее использование в другом - это тривиальное упражнение. Откройте два файла (один вход, один вывод), прочитайте текст, напишите индексированный, продолжайте до конца, закройте оба файла. Теперь у вас есть индексный файл. –
@ BillWoodger Спасибо за объяснение недостатка магии, и насколько тривиальным и простым является преобразование файла. Это было очень конструктивно. – defaultNINJA
Да, я забыл очень важный бит «текстовый файл должен быть уже в ключевой последовательности» :-) –