你有:
SORT FIELDS=COPY
OUTREC FIELDS=(1:SEQNUM,4,ZD,X,6:1,5,ZD,ADD,+1,EDIT=(TTTTT),
X,12:7,69)
简化:
OPTION COPY
INREC BUILD=(SEQNUM,4,ZD,
X,
1,5,ZD,
ADD,+1,
EDIT=(TTTTT),
X,
7,69)
OUTREC 在 SORT/MERGE 之后运行。INREC 在 SORT/MERGE 之前运行。由于您没有执行 SORT 或 MERGE(您正在执行 COPY),这并不重要,但 INREC 是更合乎逻辑的选择。
FIELDS 过载(请查阅文档以确认),并且由于 BUILD 的存在,INREC 或 OUTREC 上不需要 FIELDS(OUTFIL 上不需要 OUTREC),因为 BUILD 执行相同的工作但不会造成混淆(BUILD 是同义词对于 INREC 和 OUTREC 上的 FIELDS 以及 OUTFIL 上的 OUTREC - 已经很复杂了,不考虑 SUM 上的 FIELDS,REFORMAT...)。
如果位置只是自然排列,则不要指定列位置(如 1:)。你只是在维护。
BUILD(甚至丑陋的 FIELDS)的默认起点是 1:。下一个字段的默认值紧跟在当前字段之后。您已使用 X 作为列间距,因此所有数据都与之前的数据相邻。使用列只会使它复杂化。
注意:你有 X,7,69。您可以考虑将其更改为仅 6,69,因为您输入的位置 6 为空白。
注意:您“丢失”了 80 字节记录中的 6 个字节。如果您的输入保证有十二个尾随空格(或您不需要的其他数据,即使用该文件的任何程序都不关心该丢失),那没关系,但我们无法从您的描述中看出。
尝试使您的 SORT 控制卡更易于阅读(尝试使所有内容更易于阅读)。它将节省时间并减少错误。这意味着更便宜。时间就是金钱。
假设您的意思是 SORT,并且您的“列”不适用于 DB2....
对于固定长度的记录:
OPTION COPY
INREC BUILD=(5X,1,your-lrecel)
BUILD 将创建一个新的当前记录,替换原来的记录。它将以五个空白(5X)开始,但您可以将任何您喜欢的任何尺寸放在那里(在产品的限制范围内,它们很大)。将 your-lrecl 更改为实际的 LRECL 值。
对于可变长度记录:
OPTION COPY
INREC BUILD=(1,4,5X,5)
1,4是记录描述符字,在创建新的当前记录时总是需要复制一个RDW。复制后,SORT 将确保前两个字节(记录长度)中包含的值是正确的。然后是新列,在示例中也是五个空白,然后是可变长度记录的其余部分,它通过使用起始位置(此处为五个,用于获取数据的第一个字节)简单地指定,并且隐含地继续到记录结束。
在您的实际 JCL 中(以上都不是 JCL,它是 SORT 控制卡),确保您没有为 SORTOUT 指定任何 DCB 信息。这意味着您不能对那个 DD 使用 LIKE,请记住添加数据会使新的 LRECL 有所不同。也不要在 JCL 中编码新的 LRECL。如果不指定,SORT 将插入正确的值,并且只有一个位置来维护它。