3

我目前正在开发一个需要从文件中读取一些记录的 CL 程序。该文件被其成员之一覆盖为自身。然后有一些 RCVF 操作来检索该特定成员的记录。当收到文件结束消息时,将删除覆盖的文件。然后使用此文件中的不同成员执行另一个 OVRDBF。这一次,当执行 RCVF 操作时,它会立即到达文件末尾——在它之后立即收到消息。无论如何要重置文件指针,以便后续的 RCVF 操作可以检索第二个成员中的内容?

4

2 回答 2

3

您必须使用 OPNDBF 手动打开文件并使用CLOF关闭它,并在RCVF命令上指定打开的文件标识符。

            PGM

            DCLF       FILE(TESTFILE) OPNID(TESTFILE)

            /* CRTSRCPF   FILE(QTEMP/TESTFILE) */
            /* ADDPFM     FILE(QTEMP/TESTFILE) MBR(MBR1) */
            /* ADDPFM     FILE(QTEMP/TESTFILE) MBR(MBR2) */

            OPNDBF     FILE(TESTFILE) OPTION(*INP) MBR(MBR1)
MBR1:       RCVF       OPNID(TESTFILE)
            MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(MBR2))
            GOTO       CMDLBL(MBR1)

MBR2:       CLOF       OPNID(TESTFILE)
            OPNDBF     FILE(TESTFILE) OPTION(*INP) MBR(MBR2)
LOOP:       RCVF       OPNID(TESTFILE)
            MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDPGM))
            GOTO       CMDLBL(LOOP)

ENDPGM:     ENDPGM
于 2011-12-14T13:48:05.913 回答
2

历史上有两种方法可以在 CL 中重新读取文件。

首先是使用RTVMBRD 来检索成员中的记录数。循环遍历文件计数记录并在记录计数达到最后一条记录时停止。这样可以避免抛出 CPF0864,从而避免了该问题。

二是写两个程序。第一个执行任何需要的覆盖,然后调用第二个程序来执行读取循环。返回第一个程序后,CPF0864 被清除。可以应用新的覆盖,然后可以再次调用第二个程序。由于这是一个新的调用,它可以再次读取同一个文件而不会出现问题。

在 V5R3 中,通过在单个 CL 程序中允许最多五个 DCLF 来提供部分解决方案。这很容易适用于这种情况。只需对第一个成员使用一个 DCLF,对另一个成员使用第二个 DCLF。它也可以用来重读同一个成员。(如果需要五个以上的成员,这将无济于事。)

但是,它仍然没有清除特定 DCLF 的 CPF0864 条件。

但在 i 6.1 中,提供了更完整的解决方案。添加了 CLOSE 命令,它将清除 CPF0864。它执行完全关闭,因此文件可以轻松地在单个 CL 程序中重用。

于 2014-04-05T13:04:07.697 回答