Cobol 启动后读取时的文件状态23
我的问题与文件状态23有关,根据,这意味着在我尝试从.DAT文件中读取Cobol 启动后读取时的文件状态23,cobol,Cobol,我的问题与文件状态23有关,根据,这意味着在我尝试从.DAT文件中读取时: “表示找不到记录。” 或 “指示重复的密钥条件。已尝试存储 将在索引或相对数据库中创建重复键的记录 文件或重复的备用记录密钥不允许 复制品。” 我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复 我被难住的原因是,我正在使用START导航到.DAT文件中的记录,当我在START定位文件指针后执行READ时,我得到文件状态23 这是我的密码: 900-GET-INST-ID. OPEN INPUT INST-MS
时:
“表示找不到记录。”
或
“指示重复的密钥条件。已尝试存储
将在索引或相对数据库中创建重复键的记录
文件或重复的备用记录密钥不允许
复制品。”
我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复
我被难住的原因是,我正在使用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
,那么您就不会再有问题,并且作为一个额外的好处,您的程序将更加清晰。双赢。