Cobol - 找不到备用键

Cobol - alternate key not found

我有一个自己的应用程序,您可以在其中模拟图书馆(客户可以借出 return 本书)。

我有一个贷款文件,我在其中存储每笔贷款的图书 ID、客户 ID、贷款日期和 return-日期。

这是我的文件select:

           SELECT LOAN-FILE
               ASSIGN TO "LOANS"
               ORGANIZATION IS INDEXED
               RECORD KEY IS LOAN-ID 
               ALTERNATE KEY IS LOAN-CUSTOMER WITH DUPLICATES
               ALTERNATE KEY IS LOAN-BOOK
               ACCESS MODE IS DYNAMIC.

这是我的贷款文件的结构:

       FD LOAN-FILE
       LABEL RECORDS ARE STANDARD.
       01 LOAN-RECORD.
           05 LOAN-ID PIC 9(5).
           05 LOAN-CUSTOMER PIC 9(5).
           05 LOAN-BOOK PIC 9(5).
           05 LOAN-DATE PIC 9(8).
           05 LOAN-RETURN-DATE PIC 9(8).

我正在尝试使用备用密钥 LOAN-CUSTOMER 读取文件:

       READ-LOAN-DATA.
           MOVE "N" TO LOAN-FILE-AT-END.

           START LOAN-FILE
               KEY NOT < LOAN-CUSTOMER
               INVALID KEY 
                   MOVE "Y" TO LOAN-FILE-AT-END.
           
           IF LOAN-FILE-AT-END NOT = "Y"
              PERFORM READ-NEXT-LOAN-DATA.

       READ-NEXT-LOAN-DATA.
           READ LOAN-FILE NEXT RECORD 
               AT END 
                   MOVE "Y" TO LOAN-FILE-AT-END.

我在这个程序中使用那个程序:

       FIND-LENT-BOOKS-OF-CUSTOMER.
           PERFORM READ-CUSTOMER-DATA.
           PERFORM DISPLAY-CUSTOMER-DATA.
           PERFORM INIT-DATA. 
           MOVE CUSTOMER-ID TO LOAN-CUSTOMER.
           DISPLAY "Loan customer before calling READ-LOAN-DATA " 
               LOAN-CUSTOMER.
           PERFORM READ-LOAN-DATA
               UNTIL LOAN-FILE-AT-END  = "Y".
           PERFORM DISPLAY-LOAN-DATA.

问题是我无法读取我的贷款文件。如果我注释掉我的 START 语句的 INVALID-KEY 然后我收到错误:文件 LOAN-FILE 的记录密钥不存在。

在另一个 COBOL 程序中,我可以使用主键 LOAN-ID 读取我的 LOAN 文件。它还显示 L​​OAN-ID 和 LOAN-CUSTOMER。但是在这里我想使用 LOAN-CUSTOMER 作为备用键和重复项,当我的贷款文件中有条目时找不到它。

我在 Linux Mint 虚拟机上使用 COBOL。我已经安装了 Visual Studio 代码作为文本编辑器和 cobol 编译器我正在使用 GNU Cobol 3.1.2.0。

所以我的 Cobol 设置很简单。我是 COBOL 新手,对 JCL 或 VSAM 文件没有任何经验。

我的代码有什么问题?我尝试了教程“21 天自学 Cobol”http://testa.roberta.free.fr/My%20Books/Mainframe/Cobol/Teach%20Yourself%20Cobol%20In%2021%20Days%20(2nd%20Ed).pdf(第 445 - 450 页)中的一个示例,它没有任何问题(此代码不同)。 我还尝试了一个类似于教程之一的实现,但该实现中也出现了错误。

那么为什么它不从我的 LOANS 文件中读取我的备用密钥,我怎样才能让它与我的数据文件一起工作(在我自己的实现中)?

我认为你这里有逻辑错误:

           PERFORM READ-LOAN-DATA
               UNTIL LOAN-FILE-AT-END  = "Y".

所以仅此而已:您将始终阅读文件直到结束。 我 猜想 你想沿着 DISPLAY-CUST-LOAN 做一些事情并且在其中有一个 READ NEXTPERFORM DISPLAY-LOAN-DATA.

的循环

然后,从你的笔记中:

           START LOAN-FILE
               KEY NOT < LOAN-CUSTOMER

可能不是你想要的,而是

           START LOAN-FILE
               KEY >= LOAN-CUSTOMER

的阅读循环中进行额外检查
           IF LOAN-CUSTOMER NOT = DATA-CUSTOMER
              MOVE "Y" TO LOAN-FILE-AT-END

旁注:样式问题:您可以可以使用内联函数,而不是有很多段落和setting/query一个额外的文件属性:

      HANDLE-CUSTOMER-ENTRIES SECTION.
           START LOAN-FILE
               KEY >= LOAN-CUSTOMER
               INVALID KEY
                   DISPLAY 'NO DATA FOR CUSTOMER'
                   EXIT SECTION
           END-START
           READ LOAN-FILE NEXT RECORD
      *>   Note: would work without check if not the last entry of the complete file and the one seen with START was deleted in the microseconds between START+READ
           PERFORM FOREVER
              IF LOAN-CUSTOMER NOT = DATA-CUSTOMER
                 EXIT PERFORM
              END-IF
              PERFORM DISPLAY-LOAN-DATA
              READ LOAN-FILE NEXT RECORD
                 AT END EXIT PERFORM
              END-READ
           END-PERFORM
      *>
           CONTINUE.

在创建贷款的 COBOL 程序中,访问贷款文件时必须捕获无效密钥。

它丢失了,这导致了这个问题。