You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:27:01