我的问题与文件状态 23 有关,根据MicroFocus 的说法,这意味着在我尝试READ从 .DAT 文件时:
“表示没有找到记录。”
或者
“指示重复键条件。已尝试存储将在索引或相关文件中创建重复键的记录或不允许重复的重复备用记录键。”
我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复。
我难住的原因是我正在使用 aSTART导航到我的 .DAT 文件中的记录,当我READ在START定位我的文件指针之后执行 a 时,我得到文件状态 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.
Run Code Online (Sandbox Code Playgroud)
因此,当我运行此代码时,我START成功运行并进入NOT INVALID KEY块,然后执行下一行并且我的读取为空。如果我的备用键 ( INST-NAME-REC) 实际上是在 .DAT 中找到的,怎么会这样?
我已经确保我的 FD 图片子句在 ISAM Build 程序和这个程序(阅读程序)中完全匹配。
您显示的第二个被排除的原因不是因为您允许重复的键,而是因为该文件状态的错误消息针对的是WRITE,而您的失败是在READ。
这是你的问题:
READ INST-MST
Run Code Online (Sandbox Code Playgroud)
修复方法如下:
READ INST-MST NEXT
Run Code Online (Sandbox Code Playgroud)
在 COBOL 85 中,READ 语句有两种格式。格式 1 用于顺序读取,格式 2 用于键控(随机)读取。
不幸的是,顺序读取和键控读取的最小读取语法是:
READ file-name
Run Code Online (Sandbox Code Playgroud)
这意味着如果您使用 READ file-name,编译器将根据您的SELECT语句隐式将其视为格式 1 或格式 2。
READ file-name NEXT RECORD与 相同READ file-name NEXT。
请参阅您的实际文档,以获取供应商可能的语言扩展的完整解释和发现。如果您仔细查阅,就会发现没有更多选项的行为READ file-name取决于文件的类型。对于密钥文件,默认为密钥读取。您的密钥字段(幸运的是)不包含存在的密钥,因此您得到 23。
即使它不能那样工作,不使用 NEXT 这个词还有什么意义呢?编译器总是知道你告诉它的内容(有时并不是你认为你告诉它的内容),但在这种情况下,人类读者可能非常不确定。当寻找 bug 时,你最不想做的一件事就是停下来查看手册来准确地了解它的行为方式,然后尝试解决它(如果该行为是原始编码人员所寻求的行为)。错误?一个错误?有意但草率的代码?没有人愿意花那个时间,看看,即使是现在,也是你。
对您的代码的一些评论。
查找 SELECT 的 FILE STATUS 子句。用它。每个文件一个字段。每次IO后检查。它会拯救你的悲伤。
使用 FILE STATUS 后,放弃 IO 语句的命令部分(something/NOT Something)并用文件状态字段的测试替换(使用 88s)。
看起来您一直在打开和关闭查找文件。请不要。OPEN 和 CLOSE 可能非常繁重且耗时,因此每个程序每个文件执行一次。如果您因为某个问题而这样做,请找到该问题的正确解决方案,而不是使用 hack。
除非需要,否则请删除句号/句号。这就是 COBOL 85,这意味着 30 年来,PROCEDURE DIVISION 中所需的句号/句号数量已大大减少。变得现代化,并利用这一点,它会在您复制/粘贴代码时节省您的麻烦,留下不应该存在的代码并改变程序的行为方式。
| 归档时间: |
|
| 查看次数: |
6327 次 |
| 最近记录: |