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 文件。它还显示 LOAN-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 NEXT
和 PERFORM 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 程序中,访问贷款文件时必须捕获无效密钥。
它丢失了,这导致了这个问题。
我有一个自己的应用程序,您可以在其中模拟图书馆(客户可以借出 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 文件。它还显示 LOAN-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 NEXT
和 PERFORM 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 程序中,访问贷款文件时必须捕获无效密钥。
它丢失了,这导致了这个问题。