gpt4 book ai didi

cobol - 隐式关闭文件

转载 作者:行者123 更新时间:2023-12-01 01:03:47 26 4
gpt4 key购买 nike

我编写了以下 COBOL 程序:

*************************************************************
* VERKOOP
*************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. VERKOOP.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRODUCTEN ASSIGN TO "BESTANDEN/PRODUCTEN"
ACCESS MODE IS RANDOM
ORGANIZATION IS INDEXED
RECORD KEY IS PRODUCTID
FILE STATUS IS WS-FILE-STATUS.

DATA DIVISION.
FILE SECTION.
FD PRODUCTEN BLOCK CONTAINS 10 RECORDS.
01 PRODUCT.
02 PRODUCTID PIC X(6).
02 LEVERANCIERID PIC X(6).
02 AANTAL PIC 9(6).
WORKING-STORAGE SECTION.
77 FOUT PIC X.
88 PRODUCT-NIET-GEVONDEN VALUE 1.
77 WS-PRODUCTID PIC X(6).
77 WS-AANTAL PIC 9(6).
77 WS-FILE-STATUS PIC XX.
LINKAGE SECTION.
01 LS-PRODUCTID PIC X(6).
01 LS-AANTAL PIC 9(6).
PROCEDURE DIVISION.
* USING LS-PRODUCTID, LS-AANTAL.

MAIN.
PERFORM INITIALISEER
PERFORM LEES-PRODUCT-IN
PERFORM LEES-BESTAND
PERFORM SLUIT-BESTAND
STOP RUN.

INITIALISEER.
MOVE ZEROS TO PRODUCT
OPEN I-O PRODUCTEN.
* DISPLAY WS-FILE-STATUS..

LEES-PRODUCT-IN.
* MOVE LS-PRODUCTID TO WS-PRODUCTID
* MOVE LS-AANTAL TO WS-AANTAL.
DISPLAY "GEEF PRODUCTID OP: "
ACCEPT WS-PRODUCTID
DISPLAY "GEEF AANTAL OP: "
ACCEPT WS-AANTAL.

LEES-BESTAND.
* DISPLAY "LEES-BESTAND"
MOVE WS-PRODUCTID TO PRODUCTID
* DISPLAY PRODUCTID
READ PRODUCTEN INVALID KEY SET PRODUCT-NIET-GEVONDEN TO TRUE
END-READ
DISPLAY "END-READ" WS-FILE-STATUS
IF PRODUCT-NIET-GEVONDEN PERFORM FOUTJE
ELSE
MOVE WS-PRODUCTID TO PRODUCTID
SUBTRACT WS-AANTAL FROM AANTAL
PERFORM UPDATE-PRODUCT
END-IF.


UPDATE-PRODUCT.
REWRITE PRODUCT INVALID KEY PERFORM FOUTJE.

SLUIT-BESTAND.
* DISPLAY "SLUIT-BESTAND"
CLOSE PRODUCTEN.

FOUTJE.
DISPLAY "ER IS EEN FOUT OPGETREDEN"
* DISPLAY WS-FILE-STATUS
STOP RUN.

这个想法是我通过文件 PRODUCTEN.dat 中的 productid 找到一个产品,然后用给定的数字减去数量 (aantal)。但是,每次运行它时,我都会收到以下错误:警告 - PRODUCTEN <"BESTANDEN/PRODUCTEN"> 的隐式关闭。我真的没有看到问题,WS-FILE-STATUS 行甚至给了我一个 00 状态。我 100% 确定产品在文件中,所以我不会试图从不存在的产品或任何东西中减去。

更新:我通过将 PRODUCTEN 分配给新声明的文件来修复它,因为最后一个(不知何故)已损坏并且以意外方式运行。

最佳答案

要获得该隐式关闭消息,您必须在关闭文件之前停止运行。

在文件关闭之前,您在 FOUTJE 段中有一个 STOP RUN ,因此正在使用 FOUTJE 段。

当 PRODUCT-NIET-GEVONDEN 为真时,您在 PERFORM 中使用段落 FOUTJE。

PRODUCT-NIET-GEVONDEN 在 READ 的 INVALID KEY 上设置为 true。

所以 INVALID KEY 是真的。

你得到零的文件状态。出乎意料,但符合你所呈现的。

我没有 COBOL-IT,也不知道您使用的是什么操作系统。

我也不知道在您的设置中,没有明确引用 key 的 key 文件的 READ 是什么。

我不知道在任何设置中,因为我不这样做。如果我进行键控读取,我总是指定键。

我没有将数据放入文件的 key 中。我使用 WORKING-STORAGE 字段作为 key 。

为什么,嗯,编译器依赖于实现,但是除非您的文件是 OPEN 并且除非文件上有当前记录,否则文件记录的内容,甚至地址是/可以是(依赖于实现的)未定义的。

就我而言,SELECT 上的 KEY 是定义文件上的键的存在。您用来读取文件的 key 显然来自其他地方。

所以,我会删除这些:

       MOVE ZEROS TO PRODUCT

MOVE WS-PRODUCTID TO PRODUCTID

我会将其更改为包含 WS-PRODUCTID 的 KEY
   READ PRODUCTEN INVALID KEY SET PRODUCT-NIET-GEVONDEN TO TRUE

我不会使用 INVALID KEY,我只会使用 WS-FILE-STATUS 的值,我希望它是“23”,表示“未找到”。我会用 88 进行测试。无论如何,您都不需要“标志”(FOUT 和 PRODUCT-NIET-GEVONDEN)。在每个 IO 之后检查 FILE STATUS 字段。这一次你拼错了你的文件名,另一次你不会,你可能会浪费更多的时间来追逐你的尾部。

使用一致的缩进,这将使您的程序更易于阅读,对您和其他任何人来说都是如此。

如果要使用 DISPLAY 来验证逻辑路径,则需要 DISPLAY 用于确定逻辑路径的值(在本例中为 FOUT)。

READ 语句有两种“格式”。一种用于顺序读取,一种用于使用键读取。当每个都减少到其强制性内容时,它们是相同的。因此,对于每个编译器,哪种类型的 READ 是默认的(非显式时)或何时是默认的(每个文件)尚不清楚。所以我总是明确表示:
READ PRODUCTEN KEY IS WS-PRODUCTID

然后,我将使用 FILE STATUS 字段来确定 key 是否已读取(状态为 00)或未找到(23)或其他内容(其他内容)。

注意:只有在一切都如您所描述的那样时,此答案才能解决您的问题。进一步的信息可能会使本答复作为决议无效。

The Answer 确实可以作为一种更清晰(因此更好)的方式来编写 COBOL 程序。

原来是一个疑似损坏的文件。这可能导致 INVALID KEY 和 FILE STATUS 之间的差异,但在正常的事件过程中不会发生。这是唯一符合所有证据的东西,但这是一个异常(exception)情况,如果没有完全相同的文件损坏,则可能无法复制,并且在一般情况下,为什么给定程序无法运行的原因可能是捕获了这根稻草恶棍的第一个避难所。

关于cobol - 隐式关闭文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20827836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com