IBM DFSORT, 11 71, 72 또는 80 자의 3 줄
OPTION COPY
OUTFIL REPEAT=12,OVERLAY=(5:SEQNUM,2,ZD,5,2,1,8,Y4T,LASTDAYM,TOJUL=Y4T*
,9,7,Y4T,ADDDAYS,+1,TOJUL=Y4T,1:16,7,Y4T,PREVDSUN,TOGREG=Y4T(-),12X)
열 출력 형식의 두 가지 대답은 시간의 시험을 견뎌냈습니다. OUTFIL REPEAT =에서 현재 레코드를 여러 번 복사하는 "루프"를 제공합니다.
다음 해에 12 번째 레코드를 다루는 무조건적인 방법으로 해결할 수 없으므로 더 길어 보이지만 더 짧은 값을 얻는 다른 기술 IFTHEN=(WHEN=
, 두 번 및 기타 항목을 다른 기술. 그네에 대한 이익 (첫 번째 방법은 가장 간단한 방법입니다)은 원형 교차로 (특히 구문 요구 사항)를 크게 잃습니다.
이 함수는 내장 함수 (DFSORT의 모든 함수가 내장)를 사용하여 해당 월의 마지막 날을 찾습니다. 그런 다음 하루 (함수)를 추가하여 다음 달의 첫 달에 도달하고 PREVDSUN 함수를 사용하여 이전 일요일 (이전 달과 같이 항상 이전 달의 마지막 일요일이 됨)을 가져옵니다.
연도 (입력)를 유효한 날짜로 전환 할 때 두 자리 시퀀스 번호가 해당 월에 사용되며 시작점은 유효 기간만큼 중요하지 않으므로 해당 값도 해당 날짜에 복사됩니다. 매월 마지막 날 이후 : 5,2
보다 짧습니다 C'01'
.
세부 사항은 다음과 같습니다.
옵션 복사-입력 파일을 출력으로 복사
OUTFIL-선택 및 서식이 다른 여러 출력 파일을 허용하여 형식이 지정된 보고서를 생성합니다. 을 (를) 사용 INREC
하므로 짧을수록 선호됩니다 REPEAT=
.
REPEAT = 12-각 레코드의 12 개 사본을 생성합니다. 이 예에서는 SEQNUM으로 인해 (이전 버전과 달리) 하나의 입력 레코드 만있을 수 있습니다.
5 :-레코드의 5 열에서 시작합니다.
SEQNUM, 2, ZD-시퀀스 번호는 기본적으로 1 자리, 2 자리 숫자, "zoned decimal"(서명되지 않은 경우 문자와 동일)로 시작합니다.
1,8-길이 8의 바이트 1을 현재 위치 (9)에 복사합니다. Y4T가 8을 볼 필요가 있기 때문에 그렇지 않으면 다른 날짜 형식이 사용됩니다.
Y4T-ccyymmdd 형식 날짜 (8 바로 앞에 있음).
LASTDAYM-마지막 날 (주, 분기 및 연도 가능)
TOJUL =-날짜 함수에 대한 출력 날짜 변환 출력 (TOJUL은 TOGREG보다 한 문자 미만 임)
9,7-이제 길이가 7이므로 Y4T는 CCYYDDD가됩니다.
ADDDAYS-다음 달 / 연도에 들어가면 자동으로 조정되는 며칠 추가 (ADDMONS 및 ADDYEARS 일 수 있음)
PREVDSUN- "-"구분 기호를 사용하여 올바른 출력 형식을 얻기 위해 이전 일요일이있는 TOGREG에 율리우스 날짜가 표시됩니다 (구분 기호로 원하는 항목이 될 수 있음)
12X-공백을 제거하여 공백을 제거했습니다.
위의 2014 년 출력은 다음과 같습니다.
2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-23
2014-12-28
SORT에게해야 할 일을 알려주는 것이 필요합니다. 기본값은 없습니다. OPTION COPY
가장 짧고 SORT FIELDS=COPY
같지만 더 깁니다.
이번에 OUTFIL
는 REPEAT를 사용하기 위해 수행 한 작업 자체 . 작업 코드는 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) 또는 138 (70 + 68) 중 하나입니다 (선행 공백, 강제 연속 및 후행 공백 제외).
수신자가 무엇을하고 있는지 알아야한다는 점을 감안할 때 DFSORT 코드는 1900 년부터 1 년 동안 매월 마지막 일요일을 나열한다고 말할 수 있다고 생각합니다. ) 999까지
특히 적절한 내장 함수가있는 경우 코드가 너무 긴 이유는 무엇입니까?
필드 정의는 일시적입니다. 필드는 즉시 사용할 수 있도록 데이터 내의 특정 위치 (레코드)로만 정의됩니다. 달리 말하면, 필드는 그와 같이 정의되지 않지만 각 용도와 용도로만 정의됩니다. 날짜 함수는 소스에 사용되는 날짜 형식 중 많은 형식을 알아야하며 출력은 날짜 형식이어야하므로이를 지정해야합니다.
이제 율리우스 데이트를 했으니 .. TBC?
OPTION COPY
INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8*
,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,14:C'3',22:C'4',30:C'5',38:C'6',*
46:C'7',54:C'8',62:C'9',69:C'10',77:C'11',85:C'12',127:X,89,8,Y4T,PREV*
DSUN,TOGREG=Y4T(-),116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),105:X,73,8,Y4*
T,PREVDSUN,TOGREG=Y4T(-),94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),83:X,57,*
8,Y4T,PREVDSUN,TOGREG=Y4T(-),72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),61:X*
,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),*
39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T*
(-),17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),1:1,8,Y4T,PREVDSUN,TOGREG=Y4T*
(-),11:X,18,120,6X)
일부 필요 JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
입력 파일 (JCL의 또 다른 행과 세 개의 인스 트림 데이터 항목) :
//SORTIN DD *
2014
1900
2000
생산 :
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
실제로 9999 년까지 작동합니다.
DFSORT는 IBM의 메인 프레임 정렬 제품입니다. 데이터는 조작 할 수 있지만 정렬이 중요하고 정렬이 크고 오래 실행되므로 DFSORT 제어 카드에는 루프 구성이 없으므로 SORT를 루프에 넣을 수 없습니다. 골프와 같은 작업에 약간 시간이 오래 걸립니다.
답을 게시해야하는 이유는 DFSORT에 PREVDday
기능 이 있기 때문 입니다. 그래서 지난 일요일 한 달에 쉽습니다. 다음 달의 첫째 날부터 일요일 (PREVDSUN)입니다.
하나의 "오퍼랜드 (operand)"(오버레이) 내에서하는 것도 재미있었습니다 sprintf
.
여기에 골퍼가 없습니다 :
OPTION COPY
INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,
1,8,1,8,1,8,1,8,
1,8,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,
14:C'3',22:C'4',30:C'5',38:C'6',46:C'7',54:C'8',
62:C'9',69:C'10',77:C'11',85:C'12',
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
105:X,73,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
83:X,57,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
61:X,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
1:1,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
11:X,18,120,6X)
상당히 남용하지는 않지만,이 모든 것을 하나의 오버레이에 넣으려고 시도하는 것은 일반적이지 않으며, 모든 것이 하나의 오버레이로 들어가는 데 필요한 겉보기에 불필요한 것들이 있습니다. 골프를 할 여지가 있지만 최대 한 줄만 제거하기 때문에 유혹을받지 않습니다.
INREC는 각 레코드마다 처리됩니다.
OVERLAY를 사용하면 기존 레코드의 내용을 변경할 수 있습니다. 프로세스에서 레코드 길이보다 길어도 문제가되지 않습니다.
1,4는 다가오는 해입니다. 여기에 리터럴 0201이 추가 된 후 연속 1,8은 11 번 반복하여 96 바이트의 긴 척을 제공합니다.
확장 된 현재 레코드의 12 년째에 1이 추가되고 그 달은 1 (1 월)이됩니다.
나머지 10 개월은 3에서 11로 변경됩니다.
그런 다음이 유형의 것의 12 가지가 (오버레이로 인해) 역순으로 있습니다.
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
n :은 레코드의 열 번호입니다. X는 공백을 삽입합니다. 89,8은 해당 열 / 길이에서 데이터를 가져오고 Y4T는이를 CCYYMMDD 날짜로 처리하고, PREVDSUM은 이전 일요일을 처리하고 TOGREG = Y4T (-)는 그 데이터를 Gregorian CCYY-MM-DD 날짜로 출력합니다.
오버레이의 특정 부분의 소스와 대상이 파괴적으로 겹치면 쓰레기가 생길 수 있기 때문에 최종적으로 11:X,18,120,6X)
재정렬되어 약간의 혼란이 가해집니다.
매뉴얼 및 논문은 http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 에서 찾을 수 있으며 900+ 페이지 DFSORT 애플리케이션 프로그래밍 안내서가 포함되어 있습니다.
모든 IBM 제품과 마찬가지로 모든 매뉴얼을 무료로 사용할 수 있습니다 (세계에서 매우 적은 수의 사람들 만이 이해하는 척하는 엄청나게 적은 양의 매우 비싼 매뉴얼 제외).
모든 DFSORT 제어 카드는 공백으로 시작해야합니다. 열 72는 연속 용으로 만 사용됩니다 (공백이 아닌 모든 것이 가능하지만 *는 일반적인 것임). 열 72 다음에는 시퀀스 번호 영역이 무시되며 각 레코드를 80 바이트로 만듭니다.
또 다른 해결책이 올 것입니다.