JCL SORT按If Else条件分规则单趟排序实现方案咨询
业务需求实现及SORT排序问题解决方案
一、COBOL字段拼接程序实现
按需求逐行判断ws-Pc字段值后拼接对应字段输出即可,示例代码如下(字段长度需按实际业务规则调整):
IDENTIFICATION DIVISION. PROGRAM-ID. PCASMB. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO INFILE ORGANIZATION IS SEQUENTIAL. SELECT OUTPUT-FILE ASSIGN TO OUTFILE ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-REC. 05 ws-Pc PIC X(01). 05 fieldA PIC X(10). *> 按实际长度调整 05 fieldB PIC X(20). *> 按实际长度调整 05 fieldC PIC X(15). *> 按实际长度调整 05 fieldE PIC X(05). *> 按实际长度调整 05 FILLER PIC X(50). *> 按实际剩余字段长度补全 FD OUTPUT-FILE. 01 OUTPUT-REC PIC X(60). *> 拼接后最大长度,3个字段45/4个字段50,按实际调整 WORKING-STORAGE SECTION. 01 WS-EOF PIC X(01) VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESS. OPEN INPUT INPUT-FILE OUTPUT OUTPUT-FILE. READ INPUT-FILE AT END MOVE 'Y' TO WS-EOF. PERFORM UNTIL WS-EOF = 'Y' IF ws-Pc = '3' MOVE fieldA TO OUTPUT-REC(1:10) MOVE fieldB TO OUTPUT-REC(11:20) MOVE fieldC TO OUTPUT-REC(31:15) ELSE MOVE fieldA TO OUTPUT-REC(1:10) MOVE fieldB TO OUTPUT-REC(11:20) MOVE fieldC TO OUTPUT-REC(31:15) MOVE fieldE TO OUTPUT-REC(46:5) END-IF WRITE OUTPUT-REC READ INPUT-FILE AT END MOVE 'Y' TO WS-EOF END-PERFORM. CLOSE INPUT-FILE OUTPUT-FILE. STOP RUN.
也可以用STRING语句实现拼接,根据个人习惯选择即可。
二、单趟SORT条件排序实现方案
你之前使用OUTREC BUILD未生效是因为逻辑顺序错误,单趟排序可以通过INREC构建临时排序前缀实现条件排序,语法兼容IBM DFSORT和SYNCSORT,示例如下(所有偏移量、长度需按你实际输出文件的记录结构调整):
//SORTRUN EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=你的COBOL输出文件全路径,DISP=SHR //SORTOUT DD DSN=排序后输出文件全路径, // DISP=(NEW,CATLG,DELETE),UNIT=SYSDA, // SPACE=(CYL,(10,5),RLSE),DCB=*.SORTIN //SYSIN DD * * 步骤1:给每条记录前拼接临时排序前缀 INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'3'), *> 判断ws-Pc是否等于3,假设ws-Pc在第1位,长度1 BUILD=(2,10, *> 前缀第1段:fieldA,假设在第2位,长度10 12,20, *> 前缀第2段:fieldB,假设在第12位,长度20 5X, *> 前缀第3段:和fieldE等长的填充值,无特殊需求用空格即可 1,50)), *> 拼接原完整记录,假设原记录长度50,按实际调整 IFTHEN=(WHEN=NONE, *> 其余ws-Pc的情况 BUILD=(2,10, *> 前缀第1段:fieldA 12,20, *> 前缀第2段:fieldB 47,5, *> 前缀第3段:fieldE,假设在第47位,长度5 1,50)) *> 拼接原完整记录 * 步骤2:按临时前缀的三个段排序 SORT FIELDS=(1,10,CH,A, *> 第一排序键:前缀的fieldA段,升序 11,20,CH,A, *> 第二排序键:前缀的fieldB段,升序 31,5,CH,A) *> 第三排序键:前缀的fieldE/填充值段,升序 * 步骤3:截掉临时前缀,输出原记录 OUTREC BUILD=(36,50) *> 临时前缀总长度35=10+20+5,从第36位开始取原记录,长度50 /*
注意事项
- 所有字段的偏移量、长度都需要和你实际的输出文件结构对齐,避免取错字段
- 若需要
ws-Pc=3的同fieldA、fieldB的记录排在非3记录的前面,填充值可改为X'00',需要排在后面改为X'FF' - 单趟排序的资源开销和普通排序几乎一致,不会额外增加作业运行时间
内容的提问来源于stack exchange,提问作者user13766556
相关产品推荐
相关产品推荐

