Select 个 JCL 中的文件(按大小)

Select files by size in JCL

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

目前,我每天通过 EDITRAN 获取一个长度为 200 个位置 (LREC=200,FB) 的文件,但现在我可以获得 200 或 400 个位置。我想改变我的链条大小,以便像往常一样使用它或使用新程序。

selection 应该与 jcl 一起使用。有人知道怎么做吗?

感谢您的帮助

好的,必须完成,所以确保安全...

第一步:

//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 symbols/SYMNAMES 进行编码,以使其更易于理解。在您的 JCL 中,您需要:

//SYMNAMES DD DISP=SHR,DSN=yourpdsforsymnames(yourmem)
//SYMNOUT DD SYSOUT=yoursitestandard

成员包含源符号,输出列表显示源符号以供参考,以及 DFSORT 如何在应用它们之前对其进行规范化。

有四个输出数据集,SORTOUT 将包含上一步的 SYSOUT 副本(此步骤的输入文件)和一条消息(如果发生错误)。其他三个都可以设置为 DUMMY,因为只有 RC 是相关的:RC=0 表示 Record-length of 400,RC=4 表示 record-length of 200,RC=16 表示不好,可能是控制卡错误,可能是文件错误(不是 200 或 400),您应该停止该过程并进行调查。

这是代码,对 SYMNAMES 和 SORTIN 和 SYSOUT=* 使用 DD * 而不是虚拟测试:

//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 

record-length 的 PARSE,即使当前记录可能不包含该信息。

使用 WHEN=GROUP,使用 BEGIN 标识包含长度的消息,以便每个后续记录都包含长度(对最终记录很重要)。

如果不是长度记录,则破坏原始长度字段(PARSEd 值仍然是分开的)。

然后 OUTFIL 开始行动,在提取的 record-length 上使用 INCLUDE=(也可以是 PUSHed record-length,没关系)。

SORTOUT 复制输入,并在最终记录到达时(按消息编号)检查是否找到了正确记录的有效长度,否则也会输出一条消息(您可以更改文本)。

CHECK 与 SORTOUT 中的检查相同,只是通过不写入数据来确保 RC=16。

使用 SORT,设置 RC 的唯一方法是使用空输出数据集(SORTOUT empty 使用 OPTION NULLOUT... 而 OUTFIL 使用 NULLOFL)。

请注意,第二步控制卡中的一个简单错误将也会得到一个 RC=16。


方法错误

A 生成一个包含 200 字节记录的文件。 B 生成一个包含 400 字节记录的文件。 (A和B可以是同一个程序,没关系)。

如果 A 有 运行,则应该使用该事实来确定哪个程序处理该文件。同样,如果 B 有 运行.

如果你只是看文件,并根据 record-length 来决定,那么你就会让自己敞开心扉去处理一个坏文件,仅仅因为你找到了一个 200-byte-record 的文件,即使虽然 B 实际上 运行.

执行此操作的最佳方法是在文件中添加 Header 记录。 header 记录应包含唯一标识符、data-date(文件的有效业务日期)、它来自的环境(例如 PROD,或用于系统测试的 SYST 或其他)和逻辑文件的名称,这对于两种类型的记录是不同的,或者是差异的进一步指示符。它还可能包含其他信息。任何有用的东西。

header 应作为 A 或 B 生成数据的过程的一部分写入,而不是稍后添加(除非允许类似检查所添加的 header 实际上属于数据) .

应检查 header 上的所有信息,如果所有信息都符合预期,则应由正确的接收程序处理文件。

如果在实施之前需要临时解决方案:

使用 DFSORT,使用 OPTION STOPAFT=1 进行复制;将该步骤的 SYSOUT 发送到数据集;在第二步中处理 sysout 以识别 ICE088I 消息,并提取 LRECL,它将是 200 或 400;使用三个 OUTFIL,其中一个用于将输入复制到 SYSOUT 数据集(这样您就可以在 JOB 输出中看到它,尽管要晚一步);另一个 OUTFIL 如果它是 200,则写入消息;第三个OUTFIL如果是400则写记录的地方;将 NULLOFL=RC4 用于 "length" OUTFIL 之一;该步骤将以一个长度的 RC=0 和另一个长度的 RC=4 终止;如果文件既不是 200 也不是 400,您应该进一步编码以给出 RC=16;所以四个 OUTFIL - 使用 ICE052I 消息进行该测试。