START后文件状态23在READ上

时间:2015-04-14 20:38:27

标签: cobol

我的问题与文件状态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程序和此程序(阅读程序)。

1 个答案:

答案 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 RECORDREAD file-name NEXT相同。

有关供应商可能的语言扩展的完整说明和发现,请参阅实际文档。如果您仔细查阅,READ file-name没有进一步选项的行为取决于文件类型。使用键控文件,默认为键控READ。您的关键字段(幸运的是)不包含存在的密钥,因此您将获得23。

即使它没有像那样工作,使用NEXT这个词有什么意义呢?编译器总是知道你告诉它什么(有时候你不会告诉它),但在这种情况下,人类读者可能非常不确定。在寻找漏洞时,你想要做的最后一件事是查看手册以确切地发现它的行为,然后尝试使用它,如果该行为是原始编码器所寻求的行为。错误?一个bug?代号是什么,但是草率的?没有人愿意花那么多时间,看起来,即使是现在,也是你。

对您的代码提出几点意见。

查找SELECT的FILE STATUS子句。用它。每个文件一个字段。每次IO后检查。它会让你感到悲伤。

使用文件状态后,抛弃IO语句的必要部分(某些东西/某些东西)并替换为文件状态字段的测试(使用88s)。

看起来您一直在打开和关闭查找文件。请不要。 OPEN和CLOSE可能非常繁重且耗时,因此每个程序每个文件执行一次。如果您因为某个问题而这样做,请找到解决该问题的正确方法,不要使用黑客。

删除全站/句号,除非需要它们。这是COBOL 85,这意味着30年后,程序部门中所需的全部停止/期限的数量已大大减少。变得现代化,并利用它,它会在您复制/粘贴代码时保留您的知识,留下不应该存在的代码并改变程序的行为方式。