2016-07-04 2 views
0

입력 파일이 있는데,이 파일의 세 번째 필드는 숫자입니다. 이 번호는 대개 같은 필드에서 약 30-40 개의 레코드로 반복됩니다.이 필드에 다른 값을 가진 레코드가 읽힐 때 다음 레코드의 첫 번째 위치에 인쇄하려면 숫자 '1'이 필요합니다. 예 :JCL SORT를 사용하여 다른 레코드의 동일한 필드를 비교해야합니다.

  7226184019519  317786762 0000000000001POP160 
      7226184019522  317786762 0000000000001POP160 
1   7226139045234  326446460 0000000000001POP160 
      7226139045242  326446460 0000000000001POP160 
      7226139045274  326446460 0000000000001POP160 
      7226139045277  326446460 0000000000001POP160 
      7226139045280  326446460 0000000000001POP160 

내가 좋아하는 '섹션'를 사용하여 시도했다 :

SORT FIELDS=COPY 
    OUTFIL FNAMES=SORTOUT, 
    SECTIONS=(26,9,HEADER3= (1:'1')) 

그러나 이것은 별도의 줄에 수를 '1'을 출력 할 것이다 :

  7226184019519  317786762 0000000000001POP160 
      7226184019522  317786762 0000000000001POP160 
1   
      7226139045234  326446460 0000000000001POP160 
      7226139045242  326446460 0000000000001POP160 
      7226139045274  326446460 0000000000001POP160 
      7226139045277  326446460 0000000000001POP160 
      7226139045280  326446460 0000000000001POP160 

내가 오버레이와 같은 뭔가가 필요 하지만 'SECTIONS'와 함께 사용하는 방법을 잘 모르겠습니다.
참고 : 수 위, 내가 처음 위치로 일을 이동하는 방법을 알아 냈어요

위치에 317,786,762 시작 26


개정 (코드 아래) . 이 SORT를 완료하기위한 요구 사항은 30 레코드마다 또는 POS 26,9의 번호가 변경 될 때 '1'을 위치 1 에 인쇄하는 것입니다.

//SYSIN  DD * 
    SORT FIELDS=COPY 
    INREC IFTHEN=(WHEN=INIT,OVERLAY=(101:SEQNUM,8,ZD, 
     RESTART=(26,9))), 
     IFTHEN=(WHEN=(101,8,ZD,EQ,30), 
     OVERLAY=(1:C'1')) 
/* 

이 코드는 POS 1018에 일련 번호를 설정합니다. 그런 다음 26,9에 새 값이 있으면 Seqnum 을 다시 시작합니다. SEQUUM의 값이 30 일 때 을 다시 시작하려면 Sequence 번호가 필요합니다. 그러나 Restart는 필드 값이 변경된 경우에만 작동합니다. 논리 표현식을 사용할 수 없습니다.

내 질문은 순차 파일을 읽고 30 레코드마다 또는 특정 필드에서 새 값을 찾은 후 위치 1에 '1'을 인쇄하는 SORT를 작성하는 방법을 아는 사람이 있습니까?

답변

1

귀하의 기록은 고정 길이라고 생각합니다.

IFTHEN = (WHEN = INIT ...)으로 INREC을 사용하면 시퀀스 번호를 포함하도록 레코드를 임시로 확장 할 수 있습니다. 시퀀스 번호는 그룹에있을 수있는 최대 레코드 수를) 당신의 시퀀스 번호에 RESTART =를 사용하고 키 필드를 지정하십시오.

그런 다음 다른 최근 질문에서와 같이 IFTHEN = (WHEN = (logicalexpression) (시퀀스가 하나임) 및 1 열의 OVERLAY C'1 '

원래 레코드 길이로 IFOUTLEN =을 사용하여 레코드를 원래 크기로 되돌립니다 .IFOUTLEN은 "IFTHEN 처리 완료 후 , record-length를 this로 설정하십시오. " 임시 확장을 삭제하기 위해 BUILD를 수행하지 않아도됩니다.

절차는 가변 길이 레코드의 경우 약간 씩 다릅니다 (첫 번째 데이터 위치 인 5로 확장하고 크기로 돌아가려면 BUILD가 있어야 함).

+0

감사합니다. 올바른 것 같습니다. 나는 지금 시험해 볼 것이다. –

+0

안녕하세요 Bill, 제 질문에 대한 수정안을 추가했습니다.당신이 제안한 것이 진전을 도왔지만 여전히 약간의 문제가 있습니다. –

0

WHEN = GROUP이 도움이됩니까? 아니면 TRAILERn일까요?

관련 문제