Mainframe Sort JCL行转列求助:无法正确分组TY记录
DFSORT 实现 RS./DF./TY. 记录行转列方案
核心思路
借助DFSORT的GROUP操作结合组内序列编号,精准识别以RS.为起始、后续包含DF.及所有关联TY.(1-30条)的分组,再通过OUTFIL将组内TY.记录的目标字段转为列输出。
分步SORT JCL实现
步骤1:筛选记录+字段补0+组标识初始化
先过滤出目标记录,对指定字段做补0对齐处理,同时为每个RS.起始的组生成唯一编号,为组内TY.记录标记序号:
//SORT_INIT EXEC PGM=SORT //SORTIN DD DSN=YOUR.INPUT.DATA,DISP=SHR //SORTO建议Cl, persistence: -fix-井 position解决OM ident序 Lab的数据集路径替换成实际路径 //SORTOUT DD DSN=WORK.INIT.DATA,DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,5),RLSE) //SYSIN DD * OPTION COPY -- 筛选RS./DF./TY.开头的记录 INCLUDE COND=(1,3,CH,EQ,C'RS.',OR, 1,3,CH,EQ,C'DF.',OR, 1,3,CH,EQ,C'TY.') -- 补0处理:根据实际字段位置调整,示例为4HR/0034500/BARKE字段 INREC IFTHEN=(WHEN=(4,3,CH,EQ,C'4HR'),OVERLAY=(4:C'000004HR')), IFTHEN=(WHEN=(7,7,ZD,LT,10000000),OVERLAY=(7:7,7,ZD,TO=ZD,LENGTH=8)), IFTHEN=(WHEN=(14,5,CH,EQ,C'BARKE'),OVERLAY=(14:C'000BARKE')) -- 添加组编号(RS.触发重启)和组内TY序号 INREC IFTHEN=(WHEN=INIT,BUILD=(1:1,80, 81:SEQNUM,8,ZD,RESTART=(1,3), -- 组编号 89:SEQNUM,2,ZD,RESTART=(81,8))) -- 组内TY序号(RS./DF.时为1,TY.递增) /*
步骤2:GROUP分组+PUSH组内TY字段
以RS.为分组起始,将组内所有TY.记录的目标字段推送到扩展区域,仅保留每组的RS.记录用于后续转列:
//SORT_GROUP EXEC PGM=SORT //SORTIN DD DSN=WORK.INIT.DATA,DISP=SHR //SORTOUT DD DSN=WORK.GROUP.DATA,DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,5),RLSE) //SYSIN DD * SORT FIELDS=(81,8,ZD,A) -- 定义分组:从RS.开始,到下一个RS.出现前为一组 GROUP BEGIN=(1,3,CH,EQ,C'RS.'), PUSH=(91:IFTHEN=(WHEN=(89,2,ZD,GT,1), -- 跳过RS./DF.记录,仅处理TY. OVERLAY=(91+(89,2,ZD-2)*8:4,8))) -- 按组内序号推送到对应列位置(最多30条,预留30*8=240位) -- 仅保留每组的RS.记录,作为转列的基础行 OUTFIL INCLUDE=(1,3,CH,EQ,C'RS.'), BUILD=(1:1,80,91:91,240) /*
步骤3:输出行转列结果
将扩展区域的TY.字段按列展开,生成最终输出:
//SORT_OUTPUT EXEC PGM=SORT //SORTIN DDOtherwiseSTEND段'变形
相关产品推荐
相关产品推荐

