GNU Cobol使用alternate key读取LOAN索引文件提示键不存在如何解决
问题原因
- START语句未显式指定使用备用键:默认情况下
START语句会使用主键(你定义的LOAN-ID)进行比较,你虽然给LOAN-CUSTOMER赋了目标客户ID,但程序实际是拿这个值去和主键LOAN-ID做匹配,自然找不到对应记录。 - 结束标志重置逻辑错误:你在
READ-LOAN-DATA段落开头每次都把LOAN-FILE-AT-END设为"N",而外层是PERFORM ... UNTIL这个标志为"Y",就算某次读到底了,下一次进入READ-LOAN-DATA又会把标志改回"N",会进入死循环。 - 缺少备用键匹配判断:用备用键读取允许重复的记录时,读到下一个客户的记录就该终止读取,否则会把后续所有客户的借阅记录都读出来。
- 额外注意:如果你的
LOAN文件是在修改SELECT配置增加备用键之前创建的,旧文件的索引结构里没有备用键的相关信息,也会导致读取失败。
修复方案
1. 调整START语句,显式指定备用键
修改START逻辑,明确告诉编译器使用LOAN-CUSTOMER这个备用键做比较:
START LOAN-FILE KEY IS LOAN-CUSTOMER NOT < LOAN-CUSTOMER INVALID KEY MOVE "Y" TO LOAN-FILE-AT-END.
2. 调整结束标志初始化位置
把LOAN-FILE-AT-END的初始化逻辑从READ-LOAN-DATA里移到调用前,只执行一次。
3. 增加备用键匹配校验
读取下一条记录后判断是否还是当前客户的记录,不是就终止读取。
完整修改后代码示例
READ-LOAN-DATA. START LOAN-FILE KEY IS LOAN-CUSTOMER 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 NOT AT END *> 读到其他客户的记录就终止 IF LOAN-CUSTOMER NOT = CUSTOMER-ID MOVE "Y" TO LOAN-FILE-AT-END END-IF. 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. *> 结束标志只在这里初始化一次 MOVE "N" TO LOAN-FILE-AT-END. PERFORM READ-LOAN-DATA UNTIL LOAN-FILE-AT-END = "Y". PERFORM DISPLAY-LOAN-DATA.
额外操作
如果修改代码后还是报错,删除旧的LOANS文件,重新运行写入逻辑生成新的索引文件,确保备用键的索引被正确创建。
内容的提问来源于stack exchange,提问作者eisem
相关产品推荐
相关产品推荐

