IBM DFSORT, 11 71, 72 veya 80 karakterlik 3 satır
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)
Sütunlu çıktı formatı ile verilen iki cevap zaman testini geçmiştir. Bu bana bir "döngü", bir tür, OUTFIL REPEAT = geçerli kayıt birçok kez kopyalar verir.
Değere ulaşmak için farklı teknik, daha uzun gibi görünüyor ama ertesi yıl 12. kayıt ile başa çıkmak için koşulsuz bir yol çalışamam ve IFTHEN=(WHEN=
iki kez ve diğer bazı şeyler dahil koşullu araçlar yapmak gibi daha kısa . Salıncaklarda kazanç (ilk ay bunu yapmanın en basit yoludur) kavşaklarda (belirli sözdizimi gereksinimleri) ağır bir şekilde kaybeder.
Bu, ayın son gününü bulmak için dahili bir işlev kullanır (DFSORT'daki tüm işlevler yerleşiktir). Ardından, bir sonraki ayın ilk gününe ulaşmak için bir gün (işlev) ekler ve önceki Pazar günü almak için PREVDSUN işlevini kullanır (önceki gibi her zaman önceki ayın son Pazar günü olur).
Yılı (giriş) geçerli bir tarihe çevirirken, ay için iki basamaklı bir sıra numarası kullanılır ve başlangıç değeri bizim kadar önemli olmadığı için bu değer gün için de kopyalanır başlangıçta ayın son gününden sonra: 5,2
daha kısadır C'01'
.
İşte detay:
OPTION COPY - giriş dosyasını çıktıya kopyala
OUTFIL - farklı seçim ve biçimlendirmelere sahip birden çok çıktı dosyasının biçimlendirilmiş raporlar üretmesine izin vermek için. Tercihen daha kısa kullanılması INREC
nedeniyle kullanılır REPEAT=
.
REPEAT = 12 - her kaydın 12 kopyasını üretir. Bu örnekte, SEQNUM nedeniyle yalnızca bir giriş kaydı olabilir (önceki sürümden farklı olarak).
5: - kayıttaki 5. sütundan başlayın.
SEQNUM, 2, ZD - sıra numarası, varsayılan olarak bir, iki basamaklı, "zoned ondalık" olarak başlatır (imzasız için, karakterle aynı olacaktır).
1,8 - 8 uzunluk için bayt 1'i geçerli konuma (9) kopyalayın. Bunun nedeni, Y4T'nin 8'i görmesi gerektiğidir, aksi takdirde farklı bir tarih biçimi kullanılır.
Y4T - ccyymmdd biçiminde tarih (hemen önünde 8 nedeniyle).
LASTDAYM - Ayın son günü (Hafta, Çeyrek ve Yıl da mümkündür).
TOJUL = - tarih işlevleri için çıktı tarih dönüşümü (TOJUL, TOGREG değerinden bir karakter daha az)
9,7 - şimdi 7 uzun olduğu için Y4T CCYYDDD olacak.
EKLEME - bir sonraki güne / yıla girilirse otomatik olarak ayarlanan birkaç gün ekler (ayrıca EKLE ve EKLEME olabilir)
PREVDSUN - Jülyen tarihi gelir, önceki Pazar bulunur, doğru çıktı formatını almak için TOGREG, "-" ayırıcıyla (ayırıcı olarak istediğiniz herhangi bir şey olabilir)
12X - bu kadar kısa bir şekilde yapmamıza izin veren karışıklığı gidermek için boşluklar
2014 yılı için yukarıdakilerden çıktı:
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'a ne yapacağını söyleyecek bir şey gerekiyor. Varsayılan yok. OPTION COPY
en kısa, SORT FIELDS=COPY
eşdeğer ama daha uzundur.
Bu kez yaptığı işin kendisi OUTFIL
(REPEAT kullanımına izin vermek için). Çalışma kodu tartışmalı olarak 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) veya 138 (70 + 68) 'den herhangi biridir (önde gelen boşluklar, zorunlu devam ve sondaki boşluklar hariç).
Alıcının ne yaptıklarını bilmek zorunda kalacağı göz önüne alındığında, DFSORT kodunun 1900'den itibaren herhangi bir yılın her ayının son Pazar gününü listelemesini söyleyebilirim (0001 yılından itibaren çalışacak, ancak araştırmadan kaçınıyorum 9999'a kadar (DFSORT 9999'a kadar olan yılları desteklese de, 12. çözüm bir sonraki yıla girdiği için 9999 yılında önceki çözüm işe yaramayacaktır) Tweetlenebilir.
Özellikle uygun dahili fonksiyonlar varsa, kod neden bu kadar uzun?
Alan tanımları kısa ömürlüdür. Bir alan, hemen kullanımı için verilerdeki (bu bir kayıttır) belirli bir konum olarak tanımlanır. Başka bir deyişle, alanlar bu şekilde tanımlanmaz, ancak her kullanım için ve yalnızca kullanım için tanımlanır. Tarih işlevlerinin kaynak için hangi (birçok) tarih biçiminin kullanıldığını bilmesi gerekir ve çıktının belirtilmesi gereken bir tarih biçiminde olması gerekir.
Şimdi bir Julian randevumuz var .... 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)
Biraz ihtiyacı var JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
Ve bir girdi dosyası (başka bir JCL satırı ve üç veri içi veri):
//SORTIN DD *
2014
1900
2000
üretir:
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
Aslında 9999 yılına kadar çalışacak.
DFSORT, IBM'in Mainframe sınıflandırma ürünüdür. Veriler manipüle edilebilir, ancak sıralama anahtar olduğundan ve türler genellikle büyük ve uzun süredir çalıştığından, DFSORT kontrol kartlarının döngü yapıları yoktur, bu nedenle bir SORT'u bir döngüye koyamayız. Golf gibi görevler için işleri biraz uzun soluklu yapar.
Yanıtın neden gönderilmesinin nedeni, DFSORT'ın bir PREVDday
işlevi olmasıdır. Yani geçen Pazar bir ay içinde kolay. Bu, bir önceki ayın ilk günü olan PREVDSUN Pazar günüdür.
Bunu bir "işlenen" (OVERLAY) içinde yapmak biraz eğlenceliydi, biraz içinde sprintf
veya benzeri yapmak gibi .
İşte çözülmemiş:
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)
Oldukça kötüye kullanılmasa da, tüm bunları bir OVERLAY'a sıkıştırmaya çalışmak normal olmazdı ve hepsinin bir OVERLAY'a girmesine izin vermek için gerekli olan bazı gereksiz şeyler var. Golf için bir yer var, ama sadece bir satırı en fazla kaldıracağından, cazip değilim.
INREC her kayıt için işlenir.
OVERLAY mevcut bir kaydın içeriğinin değiştirilmesine izin verir. Kayıt, işlemdeki uzunluğunun ötesine uzatılırsa, bu bir sorun değildir.
1,4, gelen yıl. 0201 değerinde bir değişmez değeri eklenmiş ve ardışık 1,8'ler 96 baytlık uzun bir ayna vermek için 11 kez tekrar ediyor,
Genişletilmiş cari kayıtta 12. yıl 1 eklenir ve ayı 1 (Ocak) olur.
Kalan 10 ay 3'ten 11'e değiştirildi.
Sonra bu tür şeylerin tersi sırada (OVERLAY nedeniyle) 12 vardır:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
N: kayıttaki bir sütun numarasıdır. X bir boşluk ekler. 89,8 verileri bu sütun / uzunluktan alır, Y4T bunu bir CCYYMMDD tarihi olarak kabul eder, PREVDSUM önceki Pazar günü çalışır, TOGREG = Y4T (-) bunu bir Gregoryen CCYY-AA-GG tarihi olarak verir.
Bir OVERLAY'in belirli bir bölümünün kaynağı ve hedefi yıkıcı bir şekilde çakışırsa çöp alırsınız, son 11:X,18,120,6X)
yeniden dağınıklığı yeniden düzenler ve maskeler.
Kılavuzlar ve belgeler şu adreste bulunabilir: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 ve 900+ sayfalık DFSORT Uygulama Programlama Kılavuzu'nu içerir.
Tüm IBM ürünlerinde olduğu gibi, tüm kılavuzlar ücretsiz olarak mevcuttur (yalnızca çok az sayıda insanın anlamayı bile düşüneceği çok az miktarda çok pahalı olanlar hariç).
Tüm DFSORT Kontrol Kartları bir boşlukla başlamalıdır. Sütun 72 sadece devam için kullanılır (boş olmayan herhangi bir işlem yapılır, ancak * gelenekseldir). Sütun 72'yi, her bir kaydı 80 bayt yapan yok sayılan bir sıra numarası alanı izler.
Belki gelecek birkaç çözüm daha.