【问题标题】:Cobol - alternate key not foundCobol - 未找到备用密钥
【发布时间】:2021-09-16 07:20:41
【问题描述】:

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

我有一个 LOAN 文件,其中存储了每笔贷款的 book-id、customer-id、贷款日期和归还日期。

这是我的文件选择:

           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.

问题是我无法读取我的 LOAN 文件。如果我注释掉我的 START 语句的 INVALID-KEY 那么我会收到错误:文件 LOAN-FILE 的记录键不存在。

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

我在 Linux Mint 虚拟机上使用 COBOL。我已将 Visual Studio Code 安装为文本编辑器和 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 文件中读取我的备用密钥,我怎样才能让它与我的数据文件一起使用(在我自己的实现中)?

【问题讨论】:

    标签: cobol gnucobol


    【解决方案1】:

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

               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
    

    旁注:样式问题:您可以使用内联执行,而不是有很多段落并设置/查询附加文件属性:

          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.
    

    【讨论】:

    • 使用 KEY >= LOAN-CUSTOMER 仍然没有帮助。我还尝试了您对内联执行的建议。它仍然抛出错误“文件 LOAN-FILE 的记录密钥不存在”。
    • 再次检查:您在START 收到错误消息,此START 仅执行一次,LOAN-CUSTOMER 包含一个明确存储在文件中的值,如何时所见你只是用一个普通的READ NEXT 遍历文件?
    • 错误信息出现在 START 并且 LOAN-CUSTOMER 在 START 之前有一个值。该值也作为备用键存储在 LOAN-FILE 中。我有另一个程序,我使用我的主键读取我的 LOAN 文件。在那里我看到了相同的价值。但是在 START 处仍然找不到我的备用密钥。
    • 嗯,你介意创建一个示例程序,首先创建一些测试数据OPEN OUTPUT + WRITEs + CLOSE,然后读取数据并共享它,例如通过tutorialspoint.com/compile_cobol_online.php ?这样一来,人们可以轻松检查代码运行并轻松尝试调整。 [或者:可能允许您在将程序缩减为问题时找到问题,至少我不时会发生这种情况......]
    • 是的,我能做到。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 2017-01-25
      • 2014-12-22
      • 2016-10-08
      相关资源
      最近更新 更多