在一份工作中,我会处理两种类型的文件。我需要按大小选择文件,因为无论哪个程序都去了一个程序。
目前,我每天都会收到EDITRAN长度为200个职位(LREC = 200,FB)的文件,但现在我可以获得200或400个职位。我希望在我的链条中有所不同,无论是一种尺寸还是其他尺寸,都可以像往常一样使用它或新程序。
选择应该是jcl。有谁知道怎么做?
感谢您的帮助
答案 0 :(得分:0)
好的,必须要做,所以要保证安全......
第一步:
//GETSYSL EXEC PGM=SORT
//SORTOUT DD DUMMY
//SYSOUT DD DISP=(,PASS),DSN=&&SOUT,
// UNIT=SYSDA,SPACE=(TRK,1)
//SORTIN DD DISP=SHR,DSN=yourinputdsn
//SYSIN DD *
OPTION COPY,STOPAFT=1
这会将输入数据集的第一条记录复制到SORTOUT
,在JCL中设置为DUMMY
。由STOPAFTer引起的一条记录。
步骤的重点是在SYSOUT中,DFSORT将列出输入文件的LRECL。
因此将SYSOUT输出到数据集(可以是永久性的,我使用临时测试)。
然后处理数据集中的sysout:
我使用DFSORT符号/ SYMNAMES编码,以便更容易理解。在您的JCL中,您需要:
//SYMNAMES DD DISP=SHR,DSN=yourpdsforsymnames(yourmem)
//SYMNOUT DD SYSOUT=yoursitestandard
成员包含源符号,输出列表显示要引用的源符号,以及DFSORT在应用它们之前如何对它们进行规范化。
有四个输出数据集,SORTOUT将包含上一步中SYSOUT的副本(此步骤的输入文件)以及发生错误的消息。其他三个都可以设置为DUMMY,因为它只是相关的RC:RC = 0表示记录长度为400,RC = 4表示记录长度为200,RC = 16表示不好,可能是错误在控制卡中,可能是文件错误(不是200或400),你应该暂停这个过程并进行调查。
这里是代码,使用DD *表示SYMNAMES,SORTIN和SYSOUT = *而不是虚拟表示我的测试:
//DETLEN EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYMNAMES DD *
INP-RECORD,*,129,CH
INP-CC,=,1,CH
INP-DATA,*,120,CH
EXTENDED-INPUT-RECORD,*,1
EXT-LENGTH,=,4,CH
EXT-PUSH-LENGTH,*,4,CH
POSITION,INP-DATA
INP-MESSAGE-CODE,=,8,CH
POSITION,INP-DATA
SKIP,119
LAST-OF-DATA,*,1,CH
ICE088I-WITH-LENGTH,C'ICE088I '
ICE088I-END-MESSAGE,C'ICE052I '
EQUALS-BLANK-BEFORE-LEN,C'= '
COMMA-AFTER-LENGTH,C','
LENGTH-200,C'200 '
LENGTH-400,C'400 '
EXTRACTED-LENGTH,%00
HEADING-FOR-SYSOUT,C'SYSOUT FROM STEP TO DETERMINE LENGTH'
//SYMNOUT DD SYSOUT=*
//IS200 DD SYSOUT=*
//IS400 DD SYSOUT=*
//CHECK DD SYSOUT=*
//SORTIN DD DSN=&&SOUT,DISP=(OLD,PASS)
//SYSIN DD *
OPTION COPY
INREC IFTHEN=(WHEN=INIT,
PARSE=(EXTRACTED-LENGTH=(STARTAFT=EQUALS-BLANK-BEFORE-LEN,
ENDBEFR=COMMA-AFTER-LENGTH,
FIXLEN=4)),
OVERLAY=(EXT-LENGTH:
EXTRACTED-LENGTH)),
IFTHEN=(WHEN=GROUP,
BEGIN=(INP-MESSAGE-CODE,
EQ,
ICE088I-WITH-LENGTH),
PUSH=(EXT-PUSH-LENGTH:EXT-LENGTH)),
IFTHEN=(WHEN=(INP-MESSAGE-CODE,
NE,
ICE088I-WITH-LENGTH),
OVERLAY=(EXT-LENGTH:4X))
OUTFIL HEADER1=(HEADING-FOR-SYSOUT),
IFTHEN=(WHEN=(INP-MESSAGE-CODE,
EQ,
ICE088I-END-MESSAGE,
AND,
(EXT-PUSH-LENGTH,NE,LENGTH-200,
AND,
EXT-PUSH-LENGTH,NE,LENGTH-400)),
BUILD=(INP-RECORD,
/,
C'SOMETHING WICKED THIS WAY COMES',
EXT-PUSH-LENGTH,
LAST-OF-DATA:X))
OUTFIL FNAMES=IS200,
INCLUDE=(EXT-LENGTH,EQ,LENGTH-200),
NULLOFL=RC4
OUTFIL FNAMES=IS400,
INCLUDE=(EXT-LENGTH,EQ,LENGTH-400),
NULLOFL=RC0
OUTFIL FNAMES=CHECK,
INCLUDE=(INP-MESSAGE-CODE,EQ,ICE088I-END-MESSAGE,
AND,
(EXT-PUSH-LENGTH,EQ,LENGTH-200,
OR,
EXT-PUSH-LENGTH,EQ,LENGTH-400)),
NULLOFL=RC16
记录长度的PARSE,即使当前记录可能不包含该信息。
使用WHEN = GROUP,BEGIN识别包含长度的消息,以便每个后续记录包含长度(对于最终记录很重要)。
Clobbers原始长度字段,如果不是长度记录(PARSEd值仍然是单独的)。
然后OUTFIL开始行动,在提取的记录长度上使用INCLUDE =(也可能是PUSHed记录长度,这没关系)。
SORTOUT复制输入,并在最终记录到达时(通过消息编号)检查是否找到了正确记录的有效长度,否则也会发出消息(您可以更改文本)。
CHECK与SORTOUT中的检查相同,除了通过不写数据确保RC = 16。
使用SORT,设置RC而非错误的唯一方法是使用空输出数据集(SORTOUT为空,使用OPTION NULLOUT ...而OUTFIL使用NULLOFL)。
注意,第二步控制卡中的一个简单错误也得到RC = 16.
方法错了。
A生成一个包含200字节记录的文件。 B生成一个包含400字节记录的文件。 (A和B可能是同一个程序,但并不重要)。
如果A已运行,则应使用该事实来确定哪个程序处理该文件。同样,如果B已经运行。
如果您只是查看文件,并根据记录长度来决定,那么您就会自行处理坏文件,因为您发现了一个200字节的记录文件,即使B实际运行了。 / p>
执行此操作的最佳方法是在文件上添加标头记录。标头记录应包含唯一标识符,数据日期(文件的有效营业日期),来自的环境(例如,PROD,或系统测试的SYST或其他)以及文件的逻辑名称,两种类型的记录是不同的,或者是差异的进一步指示。它也可能包含其他信息。任何有用的东西。
标题应该作为产生数据的A或B过程的一部分写入,而不是稍后添加(除非允许类似的检查,实际添加的标题属于数据)。
如果所有信息都符合预期,则应检查标题上的所有信息,并通过正确的接收程序处理文件。
如果您需要临时解决方案,可以实施:
使用DFSORT,使用OPTION STOPAFT = 1进行复制;将该步骤的SYSOUT发送到数据集;在第二步中处理sysout以识别ICE088I消息,并提取LRECL,它将是200或400;使用三个OUTFIL,一个将输入复制到SYSOUT数据集(这样你就可以在JOB输出中看到它,虽然稍后一步);另一个OUTFIL,如果是200则写入消息;写入记录的第三个OUTFIL,如果是400;使用NULLOFL = RC4作为"长度"之一OUTFILs;该步骤将以RC = 0终止一个长度,RC = 4终止另一个长度;如果文件既不是200或400,你应该进一步编码给RC = 16;所以四个OUTFILs - 使用ICE052I消息进行该测试。