在 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,或...)