在JCL

时间:2015-10-03 16:52:24

标签: jcl dfsort

在一份工作中,我会处理两种类型的文件。我需要按大小选择文件,因为无论哪个程序都去了一个程序。

目前,我每天都会收到EDITRAN长度为200个职位(LREC = 200,FB)的文件,但现在我可以获得200或400个职位。我希望在我的链条中有所不同,无论是一种尺寸还是其他尺寸,都可以像往常一样使用它或新程序。

选择应该是jcl。有谁知道怎么做?

感谢您的帮助

1 个答案:

答案 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消息进行该测试。