IBM DFSORT, 11 3 dòng 71, 72 hoặc 80 ký tự
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)
Hai câu trả lời với định dạng đầu ra cột đã đứng trước thử thách của thời gian. Điều đó mang lại cho tôi một "vòng lặp", loại, trong đó trên OUTFIL REPEAT = sao chép bản ghi hiện tại nhiều lần.
Kỹ thuật khác nhau để đạt được giá trị, có vẻ dài hơn nhưng ngắn hơn vì tôi không thể tìm ra bất kỳ cách vô điều kiện nào để xử lý bản ghi thứ 12 trong năm sau và biến nó thành phương tiện có điều kiện bao gồm IFTHEN=(WHEN=
, hai lần và một số nội dung khác. Đạt được sự thay đổi (đầu tháng là cách đơn giản nhất để làm điều đó) mất rất nhiều trên các vòng xuyến (yêu cầu cú pháp cụ thể).
Điều này sử dụng chức năng sẵn có (tất cả các chức năng trong DFSORT đều có sẵn) để tìm ngày cuối cùng của tháng. Sau đó thêm một ngày (chức năng) để đến đầu tháng sau và sử dụng chức năng PREVDSUN để lấy Chủ nhật trước đó (sẽ luôn là Chủ nhật cuối cùng của tháng trước, như trước).
Khi biến năm (đầu vào) thành một ngày hợp lệ, số thứ tự hai chữ số được sử dụng cho tháng và giá trị đó cũng được sao chép cho cả ngày, vì điểm bắt đầu không quan trọng miễn là hợp lệ, như chúng ta sau ngày cuối cùng của tháng đầu tiên: 5,2
ngắn hơn C'01'
.
Đây là chi tiết:
TÙY CHỌN SAO CHÉP - sao chép tệp đầu vào vào đầu ra
OUTFIL - để cho phép nhiều tệp đầu ra, với lựa chọn và định dạng khác nhau, tạo báo cáo được định dạng. Được sử dụng trong sở thích ngắn hơn INREC
vì sử dụng REPEAT=
.
REPEAT = 12 - tạo ra 12 bản sao của mỗi bản ghi. Trong ví dụ này, chỉ có thể có một bản ghi đầu vào (không giống như phiên bản trước) vì SEQNUM.
5: - bắt đầu từ cột 5 trong hồ sơ.
SEQNUM, 2, ZD - số thứ tự, mặc định bắt đầu ở một, hai chữ số, "thập phân được khoanh vùng" (đối với dấu không dấu, chúng sẽ giống như ký tự).
1,8 - sao chép byte 1 cho chiều dài 8 đến vị trí hiện tại (9). Điều này là do Y4T cần phải xem 8, nếu không, một định dạng ngày khác sẽ được sử dụng.
Y4T - ngày định dạng ccyymmdd (do số 8 ngay trước nó).
LASTDAYM - Ngày cuối cùng của tháng (cũng có thể là Tuần, Quý và Năm).
TOJUL = - chuyển đổi ngày đầu ra cho các hàm ngày (TOJUL là một ký tự nhỏ hơn TOGREG)
9,7 - bây giờ là 7, Y4T sẽ là CCYYDĐD.
ĐỊA CHỈ - thêm một số ngày, tự động điều chỉnh nếu đi vào tháng / năm tiếp theo (cũng có thể là ĐỊA CHỈ và THÊM)
PREVDSUN - ngày Julian đến, Chủ nhật trước được đặt, TOGREG để có được định dạng đầu ra chính xác, với bộ tách biệt "-" (có thể là bất cứ thứ gì bạn thích làm dấu phân cách)
12X - khoảng trống để dọn dẹp mớ hỗn độn đã cho phép chúng tôi làm điều đó một cách ngắn gọn như vậy
Đầu ra từ năm 2014, là:
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
Một cái gì đó được yêu cầu để nói với SORT phải làm gì. Không có mặc định. OPTION COPY
là ngắn nhất, SORT FIELDS=COPY
tương đương nhưng dài hơn.
Bản thân công việc được thực hiện lần này OUTFIL
(để cho phép sử dụng REPEAT). Mã làm việc được cho là bất kỳ 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) hoặc 138 (70 + 68) (không bao gồm các khoảng trống hàng đầu, tiếp tục bắt buộc và khoảng trống theo sau).
Cho rằng người nhận sẽ phải biết họ đang làm gì, tôi nghĩ rằng tôi có thể nói rằng mã DFSORT để liệt kê Chủ nhật cuối cùng của mỗi tháng cho bất kỳ năm nào từ năm 1900 (sẽ chạy từ năm 0001, nhưng tôi tránh nghiên cứu như tốt) lên đến 9999 (mặc dù DFSORT hỗ trợ số năm lên tới 9999, giải pháp trước đó sẽ không hoạt động vào năm 9999 kể từ ngày thứ 12 đi vào năm sau) có thể được Tweet.
Tại sao mã quá dài, nếu có các hàm inbuilt đặc biệt?
Định nghĩa trường là phù du. Một trường chỉ được xác định là một vị trí cụ thể trong dữ liệu (là bản ghi) để sử dụng ngay lập tức. Nói cách khác, các trường không được xác định như vậy, nhưng được xác định cho mỗi lần sử dụng và chỉ để sử dụng. Các hàm ngày cần phải biết (trong số nhiều) định dạng ngày được sử dụng cho nguồn và đầu ra phải ở định dạng ngày, do đó phải được chỉ định.
Bây giờ chúng ta có một ngày Julian .... 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)
Cần một số JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
Và một tệp đầu vào (một dòng khác của JCL và ba mục dữ liệu trong luồng):
//SORTIN DD *
2014
1900
2000
Sản xuất:
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
Sẽ thực sự hoạt động đến năm 9999.
DFSORT là sản phẩm sắp xếp Mainframe của IBM. Dữ liệu có thể bị thao túng, nhưng vì việc sắp xếp là chính và các loại thường lớn và lâu dài, thẻ điều khiển DFSORT không có cấu trúc lặp, vì vậy chúng ta không thể đặt SORT vào một vòng lặp. Làm cho mọi thứ hơi dài dòng cho các nhiệm vụ như Golf.
Tại sao để đăng câu trả lời, là vì DFSORT có PREVDday
chức năng. Vì vậy, chủ nhật tuần trước trong một tháng thật dễ dàng. Hôm nay là Chủ nhật (PREVDSUN) đến ngày đầu tiên của tháng tiếp theo.
Thật thú vị khi thực hiện nó trong một "toán hạng" (TỔNG QUAN), giống như thực hiện tất cả trong sprintf
hoặc tương tự.
Đây là vô căn cứ:
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)
Mặc dù không hoàn toàn lạm dụng, nhưng thông thường sẽ cố gắng nhồi nhét tất cả những thứ này vào một LƯỢT, và có một số thứ dường như không cần thiết để cho phép tất cả đi vào một LƯỢT. Có một số chỗ để chơi gôn, nhưng vì nó sẽ chỉ loại bỏ tối đa một dòng, tôi không bị cám dỗ.
INREC được xử lý cho mỗi hồ sơ.
TỔNG QUAN cho phép thay đổi nội dung của một bản ghi hiện có. Nếu bản ghi được mở rộng vượt quá độ dài của nó trong quá trình, đó không phải là vấn đề.
1,4 là năm sắp tới. Nó có một chữ là 0201 được thêm vào, và sau đó 1,8 giây liên tiếp lặp lại 11 lần để tạo ra một mâm cặp dài 96 byte,
Năm thứ 12 trong hồ sơ hiện tại mở rộng được thêm 1 vào đó và tháng được thực hiện thành 1 (tháng 1).
10 tháng còn lại được đổi thành 3 đến 11.
Sau đó, có 12, theo thứ tự ngược lại (do QUÁ TRÌNH) của loại điều này:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
Số n: là số cột trong hồ sơ. X chèn một khoảng trống. 89,8 lấy dữ liệu từ cột / độ dài đó, Y4T coi đó là ngày CCYYMMDD, PREVDSUM hoạt động vào Chủ nhật trước đó, TOGREG = Y4T (-) xuất ra dưới dạng ngày CCYY-MM-DD của Gregorian.
Bởi vì bạn nhận được rác nếu nguồn và mục tiêu của một phần cụ thể của TỔNG QUAN chồng chéo lên nhau một cách triệt để, cuối cùng 11:X,18,120,6X)
sắp xếp lại và che dấu một chút lộn xộn.
Hướng dẫn và giấy tờ có thể được tìm thấy tại: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , và bao gồm Hướng dẫn lập trình ứng dụng DFSORT hơn 900 trang.
Như với tất cả các sản phẩm của IBM, tất cả các hướng dẫn đều có sẵn miễn phí (ngoại trừ một lượng rất nhỏ những thứ rất đắt tiền mà chỉ một số rất ít người trên thế giới thậm chí còn giả vờ hiểu).
Tất cả các thẻ kiểm soát DFSORT phải bắt đầu bằng một khoảng trống. Cột 72 chỉ được sử dụng để tiếp tục (mọi trường hợp không trống sẽ làm, nhưng * là thông thường). Cột 72 được theo sau bởi một khu vực số thứ tự bị bỏ qua, làm cho mỗi bản ghi 80 byte.
Một vài giải pháp sắp tới, có thể.