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 消息进行该测试。
在一份工作中我会处理两种类型的文件。我需要按大小 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 消息进行该测试。