在 CLLE 中重新定位文件
Re positioning file in CLLE
我正在尝试在 CL 中操作文件。 RCVF 循环运行,我想重新定位文件以开始。我尝试了 CLOF->OVRDBF->OPNDBF->POSDBF(*START)。随后的 RCVF 到达文件末尾。请指教我的错误。
PGM
DCLF FILE(LGLLISTP) OPNID(LGL)
DCL VAR(&FILENAME) TYPE(*CHAR) LEN(10)
DSPDBR FILE(EMPMSTP) OUTPUT(*OUTFILE) +
OUTFILE(QTEMP/LGLLISTP)
CLOF OPNID(LGL)
OVRDBF FILE(LGLLISTP) SHARE(*YES)
OPNDBF FILE(LGLLISTP) OPTION(*INP) OPNID(LGL)
POSDBF OPNID(LGL) POSITION(*START)
READ_POS: RCVF OPNID(LGL)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(READ_EXT))
CHGVAR VAR(&FILENAME) VALUE(&LGL_WHREFI)
GOTO READ_POS
READ_EXT: RCVF OPNID(LGL)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(READ_END))
CHGVAR VAR(&FILENAME) VALUE(&LGL_WHREFI)
GOTO READ_EXT
READ_END: CLOSE OPNID(LGL)
ENDPGM
也可以在 CL 编程中进行基于密钥的读取和反转读取(相当于 RPGLE READP)。
看起来像你的 READ_POS: 标签需要上移一行?
此外,如果您想向后阅读 table,我建议实施另一个 logical/index,记录按降序排列,然后向前阅读
CL 的文件 I/O 功能非常有限...
基本上你能做的就是从头读到尾。在 6.1 之前,您无法在开始时重新启动。在 6.1 中,IBM 添加了一个 CLOSE 命令,允许您关闭文件并从头开始读取。
以下循环遍历一个文件两次。在 6.1 之前,这是不可能的。 6.1 中添加的 CLOSE 命令使之成为可能。
dlcf myfile opnid(f1)
loop1:
rcvf opnid(f1)
momsg cpf(CPF0864) exec(goto loop1_end)
goto loop1
loop1_end:
close opnid(f1)
loop2:
rcvf opnid(f1)
momsg cpf(CPF0864) exec(goto pgm_end)
goto loop2
pgm_end:
endpgm
如果您需要 READP、CHAIN 等...然后使用 RPGLE(或 C,或 Java,或...)
我正在尝试在 CL 中操作文件。 RCVF 循环运行,我想重新定位文件以开始。我尝试了 CLOF->OVRDBF->OPNDBF->POSDBF(*START)。随后的 RCVF 到达文件末尾。请指教我的错误。
PGM
DCLF FILE(LGLLISTP) OPNID(LGL)
DCL VAR(&FILENAME) TYPE(*CHAR) LEN(10)
DSPDBR FILE(EMPMSTP) OUTPUT(*OUTFILE) +
OUTFILE(QTEMP/LGLLISTP)
CLOF OPNID(LGL)
OVRDBF FILE(LGLLISTP) SHARE(*YES)
OPNDBF FILE(LGLLISTP) OPTION(*INP) OPNID(LGL)
POSDBF OPNID(LGL) POSITION(*START)
READ_POS: RCVF OPNID(LGL)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(READ_EXT))
CHGVAR VAR(&FILENAME) VALUE(&LGL_WHREFI)
GOTO READ_POS
READ_EXT: RCVF OPNID(LGL)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(READ_END))
CHGVAR VAR(&FILENAME) VALUE(&LGL_WHREFI)
GOTO READ_EXT
READ_END: CLOSE OPNID(LGL)
ENDPGM
也可以在 CL 编程中进行基于密钥的读取和反转读取(相当于 RPGLE READP)。
看起来像你的 READ_POS: 标签需要上移一行?
此外,如果您想向后阅读 table,我建议实施另一个 logical/index,记录按降序排列,然后向前阅读
CL 的文件 I/O 功能非常有限...
基本上你能做的就是从头读到尾。在 6.1 之前,您无法在开始时重新启动。在 6.1 中,IBM 添加了一个 CLOSE 命令,允许您关闭文件并从头开始读取。
以下循环遍历一个文件两次。在 6.1 之前,这是不可能的。 6.1 中添加的 CLOSE 命令使之成为可能。
dlcf myfile opnid(f1)
loop1:
rcvf opnid(f1)
momsg cpf(CPF0864) exec(goto loop1_end)
goto loop1
loop1_end:
close opnid(f1)
loop2:
rcvf opnid(f1)
momsg cpf(CPF0864) exec(goto pgm_end)
goto loop2
pgm_end:
endpgm
如果您需要 READP、CHAIN 等...然后使用 RPGLE(或 C,或 Java,或...)