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