我的问题与文件状态23有关,根据MicroFocus表示我尝试从.DAT文件中READ
:
"表示未找到记录。"
或
"表示重复的键条件。已经尝试存储了一个 记录将在索引或相对中创建重复键 文件或不允许的重复备用记录密钥 重复"
我已经消除了后者是我的问题,因为我在这种情况下允许重复。
我难以理解的原因是我使用START
导航到我的.DAT文件内部的记录,当我执行READ
之后START
已定位我的文件指针,我得到文件状态23.
这是我的代码:
900-GET-INST-ID.
OPEN INPUT INST-MST.
MOVE FALL-IN-INST TO INST-NAME-REC.
START INST-MST
KEY EQUAL TO INST-NAME-REC
INVALID KEY
DISPLAY "RECORD NOT FOUND"
NOT INVALID KEY
READ INST-MST
MOVE INST-ID-REC TO WS-INST-ID
END-START.
CLOSE INST-MST.
因此,当我运行此代码时,START
成功运行并进入NOT INVALID KEY
块,然后执行下一行并且我的读取为空。如果在.DAT中实际找到我的备用密钥(INST-NAME-REC
),那该怎么办?
我确保我的FD图片条款完全符合ISAM Build程序和此程序(阅读程序)。
答案 0 :(得分:4)
您展示的第二个原因排除不是因为您允许重复密钥,而是因为该文件状态的错误消息是WRITE
,而您的失败是READ
。
这是你的问题:
READ INST-MST
以下是解决问题的方法:
READ INST-MST NEXT
在COBOL 85中,READ语句有两种格式。格式1用于顺序读取,格式2用于键控(随机)读取。
不幸的是,顺序读取和键控读取的最小READ语法是:
READ file-name
这意味着如果您使用READ文件名,编译器将隐式将其视为格式1或格式2,具体取决于您的SELECT
语句。
READ file-name NEXT RECORD
与READ file-name NEXT
相同。
有关供应商可能的语言扩展的完整说明和发现,请参阅实际文档。如果您仔细查阅,READ file-name
没有进一步选项的行为取决于文件类型。使用键控文件,默认为键控READ。您的关键字段(幸运的是)不包含存在的密钥,因此您将获得23。
即使它没有像那样工作,不使用NEXT这个词有什么意义呢?编译器总是知道你告诉它什么(有时候你不会告诉它),但在这种情况下,人类读者可能非常不确定。在寻找漏洞时,你想要做的最后一件事是查看手册以确切地发现它的行为,然后尝试使用它,如果该行为是原始编码器所寻求的行为。错误?一个bug?代号是什么,但是草率的?没有人愿意花那么多时间,看起来,即使是现在,也是你。
对您的代码提出几点意见。
查找SELECT的FILE STATUS子句。用它。每个文件一个字段。每次IO后检查。它会让你感到悲伤。
使用文件状态后,抛弃IO语句的必要部分(某些东西/某些东西)并替换为文件状态字段的测试(使用88s)。
看起来您一直在打开和关闭查找文件。请不要。 OPEN和CLOSE可能非常繁重且耗时,因此每个程序每个文件执行一次。如果您因为某个问题而这样做,请找到解决该问题的正确方法,不要使用黑客。
删除全站/句号,除非需要它们。这是COBOL 85,这意味着30年后,程序部门中所需的全部停止/期限的数量已大大减少。变得现代化,并利用它,它会在您复制/粘贴代码时保留您的知识,留下不应该存在的代码并改变程序的行为方式。