You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:24:04