2016-07-13 7 views
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 
+1

Simon Sobisch прав. вы можете представить текстовый файл из редактора (или любого другого источника) в программу COBOL и использовать его в качестве проиндексированного файла, просто указав INDEXED на SELECT. Предполагая, что вы указали поддержку вашей установки GnuCOBOL, создав индексированный файл в одной программе COBOL, а ее использование в другом - это тривиальное упражнение. Откройте два файла (один вход, один вывод), прочитайте текст, напишите индексированный, продолжайте до конца, закройте оба файла. Теперь у вас есть индексный файл. –

+0

@ BillWoodger Спасибо за объяснение недостатка магии, и насколько тривиальным и простым является преобразование файла. Это было очень конструктивно. – defaultNINJA

+0

Да, я забыл очень важный бит «текстовый файл должен быть уже в ключевой последовательности» :-) –

ответ

6

Последовательный файл не может быть открыт как индексированный файл. Это совершенно другой тип файла.

Возможно, вы захотите, чтобы OPEN OUTPUT CUST-FILE, читайте ваших клиентов из последовательного файла и WRITE CUST-FILE FROM seq-record. Впоследствии ваш OPEN INPUT CUST-FILE будет работать (в зависимости от того, чего вы хотите достичь, может быть лучше прочитать данные во временную и упорядоченную таблицу, затем используйте SEARCH ALL, чтобы получить конкретную запись.

+0

Простите мое невежество по этому поводу, но что определяет файл как последовательный и не проиндексированный? Сам файл является важным текстовым файлом, созданным стандартным редактором. Я опубликую содержимое, о котором идет речь. – defaultNINJA

+2

Для текстового файла вы должны использовать параметр Line-Sequential при определении файла в Cobol. Индексированный файл состоит из файлов данных Data-File + one (или, возможно, больше). Индексные файлы содержат указатели Keys + для записи в файл данных. См. B-Tree: https://en.wikipedia.org/wiki/B-tree –

+0

@BruceMartin Спасибо за объяснение. Я сейчас в процессе преобразования файла. Я ценю конструктивный комментарий. – defaultNINJA