Cobol 启动后读取时的文件状态23

Cobol 启动后读取时的文件状态23,cobol,Cobol,我的问题与文件状态23有关,根据,这意味着在我尝试从.DAT文件中读取时: “表示找不到记录。” 或 “指示重复的密钥条件。已尝试存储 将在索引或相对数据库中创建重复键的记录 文件或重复的备用记录密钥不允许 复制品。” 我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复 我被难住的原因是,我正在使用START导航到.DAT文件中的记录,当我在START定位文件指针后执行READ时,我得到文件状态23 这是我的密码: 900-GET-INST-ID. OPEN INPUT INST-MS

我的问题与文件状态23有关,根据,这意味着在我尝试从.DAT文件中读取
时:

“表示找不到记录。”

“指示重复的密钥条件。已尝试存储 将在索引或相对数据库中创建重复键的记录 文件或重复的备用记录密钥不允许 复制品。”

我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复

我被难住的原因是,我正在使用
START
导航到.DAT文件中的记录,当我在
START
定位文件指针后执行
READ
时,我得到文件状态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
成功运行并进入
notinvalid KEY
块,然后执行下一行,我的读取为空。如果我的备用键(
INST-NAME-REC
)实际位于.DAT中,这怎么可能


我已确保我的FD picture子句在ISAM构建程序和该程序(读取程序)中完全匹配。

您显示的第二个原因被排除,不是因为您允许重复密钥,而是因为该文件状态的错误消息是针对
写入的,而您的失败是在
读取的过程中

这是你的问题:

READ INST-MST
下面是您如何修复它的:

READ INST-MST NEXT
在COBOL85中,READ语句有两种格式。格式1用于顺序读取,格式2用于键控(随机)读取

不幸的是,顺序读取和键控读取的最低读取语法为:

READ file-name
这意味着,如果使用读取文件名,编译器将根据
SELECT
语句隐式地将其视为格式1或格式2

读取文件名下一条记录
读取文件名下一条记录
相同

请参阅您的实际文档,从供应商处获得可能的语言扩展的完整解释和发现。如果仔细查看,则不带其他选项的
读取文件名的行为取决于文件的类型。对于键控文件,默认为键控读取。您的密钥字段(幸运的是)不包含存在的密钥,因此您得到23

即使它不是那样工作的,下一步不使用这个词又有什么意义呢?编译器总是知道你告诉它什么(有时不是你认为你告诉它的),但在这种情况下,人类读者可能非常不确定。当bug搜索停止时,您最不想做的事情是查看手册,以准确地了解它的行为,然后尝试使用它,如果该行为是原始程序员所寻求的。虫子?虫子?有意但草率的代码?没有人愿意花时间,看,即使现在,也是你

对代码的一些注释

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

使用文件状态后,放弃IO语句的命令部分(something/notsomething)并替换为测试文件状态字段(使用88s)

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


删除句号/句号,除非需要。这是COBOL 85,这意味着30年来,程序部门所需的完整停止/周期的数量大大减少。变得现代,并充分利用这一点,它将拯救你,明白了!s当您复制/粘贴代码时,留下不应该存在的代码,并更改程序的行为方式。

非常感谢!我曾经在某一点上读过INST-MST NEXT记录,我认为我没有看到结果上的差异,在(NEXT)和(NEXT记录)之间有差异吗?@Webs更新了答案。读取时的单词记录仅供人类使用,它对读取生成的代码没有影响。读取读取指定文件名上的记录。在那些档案里除了记录什么都没有。你不是第一个被这种阅读行为抓住的人,也不会是最后一个。如果您总是指定
NEXT
KEY
,那么您就不会再有问题,并且作为一个额外的好处,您的程序将更加清晰。双赢。