如何使用JCL更新输出文件中的Trailer记录计数
如何用JCL更新排序后输出文件的Trailer记录计数
核心思路
利用DFSORT/SYNCSORT的排序控制卡,保留原文件的Header记录、过滤掉旧的Trailer记录,同时统计各类记录(type1-5)的数量,最终生成包含最新计数的新Trailer记录追加到输出文件末尾。
示例JCL及控制卡
//UPDTRAILER JOB (ACCT),'UPDATE TRAILER',CLASS=A,MSGCLASS=X //SORTSTEP EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=YOUR.SORTED.OUTPUT.FILE,DISP=SHR //SORTOUT DD DSN=YOUR.UPDATED.OUTPUT.FILE,DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,5),RLSE),UNIT=SYSDA //SYSIN DD * OPTION COPY OUTFIL REMOVECC, INCLUDE=(1,1,CH,NE,C'9'), // 排除原Trailer记录 HEADER1=(01,80), // 保留原Header记录(取输入首条记录) TRAILER1=(C'9', // 新Trailer的标识位 COUNT=(1,1,CH,EQ,C'1'),ZD,9,LENGTH=9, // Type1计数(占2-10列) COUNT=(1,1,CH,EQ,C'2'),ZD,9,LENGTH=9, // Type2计数(占11-19列) COUNT=(1,1,CH,EQ,C'3'),ZD,9,LENGTH=9, // Type3计数(占20-28列) COUNT=(1,1,CH,EQ,C'4'),ZD,9,LENGTH=9, // Type4计数(占29-37列) COUNT=(1,1,CH,EQ,C'5'),ZD,9,LENGTH=9) // Type5计数(占38-46列) /* //*
关键部分解释
OPTION COPY:基础复制模式,确保输入记录按原顺序传递,仅通过OUTFIL进行过滤和追加操作。INCLUDE=(1,1,CH,NE,C'9'):过滤掉原文件中标识为9的Trailer记录,避免旧计数残留。HEADER1=(01,80):提取输入文件的第一条记录(即Header记录)作为输出文件的开头,保证文件结构不变。TRAILER1:生成新的Trailer记录:- 首列固定为
C'9',符合Trailer的标识规则。 COUNT=(条件):统计输入中符合指定类型的记录数量,ZD,9,LENGTH=9将统计结果转换为9位的十进制格式,刚好匹配原Trailer中每个计数字段的9列长度要求。
- 首列固定为
扩展:保留Trailer的其他固定内容
如果原Trailer记录在计数字段后还有其他固定内容需要保留,可以先将这部分内容临时存储,再追加到新Trailer末尾:
//SYSIN DD * OPTION COPY // 临时保存原Trailer的非计数字段到81位开始的临时区域 INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'9'), OVERLAY=(81:47,34)), // 假设47-80位是Trailer的固定内容,共34位 IFTHEN=(WHEN=NONE, OVERLAY=(81:34X)) // 其他记录填充空格占位 OUTFIL REMOVECC, INCLUDE=(1,1,CH,NE,C'9'), HEADER1=(01,80), TRAILER1=(C'9', COUNT=(1,1,CH,EQ,C'1'),ZD,9,LENGTH=9, COUNT=(1,1,CH,EQ,C'2'),ZD,9,LENGTH=9, COUNT=(1,1,CH,EQ,C'3'),ZD,9,LENGTH=9, COUNT=(1,1,CH,EQ,C'4'),ZD,9,LENGTH=9, COUNT=(1,1,CH,EQ,C'5'),ZD,9,LENGTH=9, 47:81,34) // 还原原Trailer的固定内容 /*
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

