START 后 READ 文件状态 23
File status 23 on READ after START
我的问题与文件状态 23 有关,根据 MicroFocus 这意味着在我尝试从 .DAT 文件 READ
时:
"Indicates no record found."
或
"Indicates a duplicate key condition. Attempt has been made to store a
record that would create a duplicate key in the indexed or relative
file or a duplicate alternate record key that does not allow
duplicates."
我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复。
我感到困惑的原因是我使用 START
导航到我的 .DAT 文件中的记录,当我在 [= 之后执行 READ
12=] 定位了我的文件指针,我得到文件状态 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
块,然后下一行执行并且我的读取为空。如果我的备用密钥 (INST-NAME-REC
) 实际上在 .DAT 中找到,这怎么可能?
我已经确保我的FD图片子句在ISAM Build程序和本程序(阅读程序)中完全匹配。
您显示的第二个原因被排除在外,不是因为您允许重复键,而是因为具有该文件状态的错误消息是针对 WRITE
,而您的失败是在 READ
上。
这是你的问题:
READ INST-MST
修复方法如下:
READ INST-MST NEXT
在 COBOL 85 中,READ 语句有两种格式。格式 1 用于顺序读取,格式 2 用于键控(随机)读取。
不幸的是,顺序读取和键控读取的最小读取语法是:
READ file-name
这意味着如果您使用 READ 文件名,编译器将根据您的 SELECT
语句将其隐式视为格式 1 或格式 2。
READ file-name NEXT RECORD
等同于 READ file-name NEXT
。
请查阅您的实际文档以获取供应商可能的语言扩展的完整解释和发现。如果您仔细查阅,READ file-name
没有进一步选项的行为取决于文件的类型。对于键控文件,默认值为键控读取。你的关键字段(幸运的是)不包含存在的关键,所以你得到 23.
即使不是那样,不使用 NEXT 这个词又有什么意义呢?编译器总是知道你告诉它的是什么(有时不是你认为你告诉它的),但在这种情况下,人类 reader 可能非常不确定。当 bug 搜寻中断时,您最不想做的事情是查看手册以准确发现它的行为方式,然后如果该行为是原始编码人员所寻求的行为,则尝试使用它。错误?错误?有意但草率的代码?没有人愿意花那个时间,你看,即使是现在,也是你。
对您的代码的一些评论。
查找 SELECT 的 FILE STATUS 子句。用它。每个文件一个字段。每次 IO 后检查。它会让你免于悲伤。
使用 FILE STATUS 后,放弃 IO 语句的命令部分(something/NOT 某些东西)并替换为文件状态字段的测试(使用 88s)。
您似乎一直在打开和关闭查找文件。请不要。 OPEN 和 CLOSE 可能非常繁重且耗时,因此每个程序每个文件都执行一次。如果您因为某个问题而这样做,请找到该问题的正确解决方案,不要使用 hack。
删除 full-stops/periods 除非需要它们。这是 COBOL 85,这意味着 30 年来,程序部门中 full-stops/periods 所需的 数量已大大减少。变得现代,并利用这一点,它会在你编写 copy/paste 代码时避免 Gotcha!s,留下不应该存在的代码并改变程序的行为方式。
我的问题与文件状态 23 有关,根据 MicroFocus 这意味着在我尝试从 .DAT 文件 READ
时:
"Indicates no record found."
或
"Indicates a duplicate key condition. Attempt has been made to store a record that would create a duplicate key in the indexed or relative file or a duplicate alternate record key that does not allow duplicates."
我已经消除了后者是我的问题的事实,因为在这种情况下我允许重复。
我感到困惑的原因是我使用 START
导航到我的 .DAT 文件中的记录,当我在 [= 之后执行 READ
12=] 定位了我的文件指针,我得到文件状态 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
块,然后下一行执行并且我的读取为空。如果我的备用密钥 (INST-NAME-REC
) 实际上在 .DAT 中找到,这怎么可能?
我已经确保我的FD图片子句在ISAM Build程序和本程序(阅读程序)中完全匹配。
您显示的第二个原因被排除在外,不是因为您允许重复键,而是因为具有该文件状态的错误消息是针对 WRITE
,而您的失败是在 READ
上。
这是你的问题:
READ INST-MST
修复方法如下:
READ INST-MST NEXT
在 COBOL 85 中,READ 语句有两种格式。格式 1 用于顺序读取,格式 2 用于键控(随机)读取。
不幸的是,顺序读取和键控读取的最小读取语法是:
READ file-name
这意味着如果您使用 READ 文件名,编译器将根据您的 SELECT
语句将其隐式视为格式 1 或格式 2。
READ file-name NEXT RECORD
等同于 READ file-name NEXT
。
请查阅您的实际文档以获取供应商可能的语言扩展的完整解释和发现。如果您仔细查阅,READ file-name
没有进一步选项的行为取决于文件的类型。对于键控文件,默认值为键控读取。你的关键字段(幸运的是)不包含存在的关键,所以你得到 23.
即使不是那样,不使用 NEXT 这个词又有什么意义呢?编译器总是知道你告诉它的是什么(有时不是你认为你告诉它的),但在这种情况下,人类 reader 可能非常不确定。当 bug 搜寻中断时,您最不想做的事情是查看手册以准确发现它的行为方式,然后如果该行为是原始编码人员所寻求的行为,则尝试使用它。错误?错误?有意但草率的代码?没有人愿意花那个时间,你看,即使是现在,也是你。
对您的代码的一些评论。
查找 SELECT 的 FILE STATUS 子句。用它。每个文件一个字段。每次 IO 后检查。它会让你免于悲伤。
使用 FILE STATUS 后,放弃 IO 语句的命令部分(something/NOT 某些东西)并替换为文件状态字段的测试(使用 88s)。
您似乎一直在打开和关闭查找文件。请不要。 OPEN 和 CLOSE 可能非常繁重且耗时,因此每个程序每个文件都执行一次。如果您因为某个问题而这样做,请找到该问题的正确解决方案,不要使用 hack。
删除 full-stops/periods 除非需要它们。这是 COBOL 85,这意味着 30 年来,程序部门中 full-stops/periods 所需的 数量已大大减少。变得现代,并利用这一点,它会在你编写 copy/paste 代码时避免 Gotcha!s,留下不应该存在的代码并改变程序的行为方式。