如何在CL程序中重置文件指针?

时间:2011-12-14 12:39:45

标签: file-io ibm-midrange control-language

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

其次是写两个程序。第一个执行任何所需的覆盖,然后调用第二个程序进行读取循环。返回第一个程序后,CPF0864将被清除。可以应用新的覆盖,然后可以再次调用第二个程序。由于它是一个新的调用,它可以再次读取同一个文件而没有问题。

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

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

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