在CLLE中重新定位文件

时间:2016-11-29 12:33:25

标签: ibm-midrange rpgle

我正在尝试操作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等效)。

2 个答案:

答案 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:标签需要向上移动一行吗?

如果你想向后读表,我建议用降序编写另一个逻辑/索引,然后只读前进