我正在尝试操作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等效)。
答案 0 :(得分:2)
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,或......)
答案 1 :(得分:0)
看起来你的READ_POS:标签需要向上移动一行吗?
如果你想向后读表,我建议用降序编写另一个逻辑/索引,然后只读前进