2011-12-14 5 views
3

현재 파일에서 일부 레코드를 읽어야하는 CL 프로그램을 작성 중입니다. 파일은 구성원 중 하나에 대해 자체에 대체됩니다. 그런 다음 특정 구성원의 레코드를 검색하는 일부 RCVF 조작이 있습니다. 파일 끝 메세지가 수신되면 겹쳐 쓰여진 파일은 삭제됩니다. 그런 다음 다른 OVRDBF가이 파일의 다른 구성원과 함 2 수행됩니다. RCVF 작업이 수행되는 이번에는 파일의 끝 부분에 즉시 도달합니다. 메시지는 곧바로 수신됩니다. 어쨌든 파일 포인터를 재설정하여 후속 RCVF 작업이 두 번째 구성원의 내용을 검색 할 수 있습니까?CL 프로그램에서 파일 포인터를 재설정하는 방법은 무엇입니까?

+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 
+0

OPNQRYF가없는 경우에도? –

+0

@God_of_Thunder 작동하는 테스트 케이스로 업데이트했습니다. – jamesallman

+0

이 방법은 OVRDBF와 충돌 할 가능성이 있습니까? 그리고 OPNDBF 전에이 ADDPFM 문을 가져야합니까? –

2

CL에서 파일을 다시 읽는 방법은 역사적으로 두 가지가 있습니다.

먼저 RTVMBRD를 사용하여 구성원의 레코드 수를 검색합니다. 파일 계산 레코드를 반복하고 레코드 수가 마지막 레코드에 도달하면 중지하십시오. 이렇게하면 CPF0864가 던져지는 것을 피할 수 있으므로 문제를 피할 수 있습니다.

두 번째는 두 개의 프로그램을 작성하는 것입니다. 첫 번째는 필요한 모든 재정의를 수행 한 다음 두 번째 프로그램을 호출하여 읽기 루프를 수행합니다. 첫 번째 프로그램으로 돌아 가면 CPF0864가 지워집니다. 새 재정의를 적용 할 수 있으며 두 번째 프로그램을 다시 호출 할 수 있습니다. 새로운 호출이기 때문에 문제없이 동일한 파일을 다시 읽을 수 있습니다.

V5R3에서 단일 CL 프로그램에서 최대 5 개의 DCLF를 허용함으로써 부분 솔루션이 제공되었습니다. 이 경우 쉽게 작동 할 수 있습니다. 첫 번째 구성원에는 하나의 DCLF를 사용하고 다른 구성원에게는 두 번째 DCLF 만 사용하십시오. 동일한 멤버를 다시 읽는데도 사용할 수 있습니다. (5 명 이상의 구성원이 필요한 경우이 도움이되지 않습니다.)

그러나 특정 DCLF에 대한 CPF0864 조건은 여전히 ​​지워지지 않습니다.

그러나 i 6.1에서는 훨씬 더 완벽한 해결책이 제공됩니다. CLOSE 명령이 추가되었으며 CPF0864가 지워집니다. 전체 닫기를 수행하기 때문에 파일을 단일 CL 프로그램에서 쉽게 재사용 할 수 있습니다.