使用DFSORT统计JES2作业输出按分组计算记录数的方案咨询
DFSORT单步实现JES2作业维度统计的解决方案
实现思路
你需要的按作业维度的汇总不需要将统计值推送到所有明细行,直接用DFSORT内置的SECTIONS分组聚合能力,单步COPY处理即可输出你要的结果,不需要生成多个中间文件。
完整SYSIN参考代码
//SYSIN DD * * 第一步:生成全局行号、作业ID、作业内序号、推送作业名到组内所有行 INREC OVERLAY=(135:SEQNUM,6,ZD,START=1,INCR=1) INREC IFTHEN=(WHEN=GROUP, BEGIN=(21,6,CH,EQ,C'J E S 2 '), PUSH=(142:ID=6, * 作业ID 156:28,8, * 需调整为你JES2头行中JOBNAME的实际起始位置和长度 HIT=NEXT)), IFTHEN=(WHEN=GROUP, BEGIN=(21,6,CH,EQ,C'J E S 2 '), PUSH=(149:SEQ=6)) * 作业内行号 * 不需要重排原始顺序,直接COPY处理 SORT FIELDS=COPY * 按作业ID分组输出,每个作业只输出一行汇总 OUTFIL REMOVECC, SECTIONS=(142,6, * 按142位开始的6位作业ID分组 HEADER3=(156,8, * 取组内第一行的JOBNAME X, 135,6, * 取组内第一行的全局行号作为首行f_row X, T1=(135,6,ZD,LAST), * 取组内最后一行的全局行号作为末行l_row X, T2=(149,6,ZD,LAST), * 取组内最后一行的作业内行号作为总行数rowcnt /)), NODETAIL * 不输出原始明细行,只输出分组汇总行 /*
参数说明
- 你原有生成全局行号、作业ID、作业内行号的逻辑完全保留,仅新增了JOBNAME的推送逻辑,需要根据你实际JES2头行中作业名的位置调整
156:28,8的起始位置和长度 SECTIONS=(142,6)指定按作业ID进行分组HEADER3定义每个分组的输出格式,其中带LAST修饰符的字段会自动取分组最后一条记录的对应值NODETAIL参数会过滤所有原始明细行,仅输出每个分组的一行汇总结果,和你要求的输出样例完全匹配
扩展:如果需要将统计值推送到所有明细行
如果你后续处理需要每个作业的所有行都带上f_row、l_row、rowcnt字段,可采用倒序二次分组的方案:
//SYSIN DD * * 原有逻辑生成全局行号、作业ID、作业内行号、JOBNAME INREC OVERLAY=(135:SEQNUM,6,ZD,START=1,INCR=1) INREC IFTHEN=(WHEN=GROUP, BEGIN=(21,6,CH,EQ,C'J E S 2 '), PUSH=(142:ID=6, 156:28,8, HIT=NEXT)), IFTHEN=(WHEN=GROUP, BEGIN=(21,6,CH,EQ,C'J E S 2 '), PUSH=(149:SEQ=6)) * 第一次排序:按全局行号倒序 SORT FIELDS=(135,6,ZD,D) * 倒序后按作业ID分组,推送末行、总行数到组内所有行 INREC IFTHEN=(WHEN=GROUP, BEGIN=(142,6,CH,NE,142,6,CH,NEXT), PUSH=(164:135,6, * l_row = 倒序后组首行的全局行号 170:149,6)) * rowcnt = 倒序后组首行的作业内行号 * 第二次排序:按全局行号升序恢复原始顺序 SORT FIELDS=(135,6,ZD,A) * 输出时每个行都包含JOBNAME、f_row、l_row、rowcnt字段 OUTFIL BUILD=(1,134,156,8,X,135,6,X,164,6,X,170,6) /*
内容的提问来源于stack exchange,提问作者Jules
相关产品推荐
相关产品推荐

