使用 SORT 进行大型机 JCL 记录转置
Posted
技术标签:
【中文标题】使用 SORT 进行大型机 JCL 记录转置【英文标题】:Mainframes JCL Record transposing using SORT 【发布时间】:2015-07-29 14:14:01 【问题描述】:我想使用 SORT(snycsort 或 DFSORT)将记录转置到列中。它应该可以扩展到任意数量的记录。这可能吗?
DE001XYX A CD100000 B CD200000 C DE001KKK A CD100000 B DE003ZZZ A DE001XYX A CD100000 B CD200000 C DE001KKK A CD100000 B ...........转置
DE001XYX CD100000 CD200000 DE001KKK CD100000 DE003ZZZ DE001XYX CD100000 CD200000 DE001KKK CD100000 ......【问题讨论】:
请告诉我们您使用的是哪种 SORT 产品:DFSORT、Syncsort 等,并将这些标签添加到您的问题中。 它如何扩展到任意数量的记录?您只有 26 个字母,并且您有记录长度的最大值。输出顺序是否重要(因为数据至少需要排序一次)? 只有三个 Key,即 A B C .A 与以 DE 开头的记录一起使用,B 与以 CD1 开头的记录一起使用,C 与以 CD2 开头的记录一起使用。每个 DE 记录都与它下面的记录相关,即 CD1 和 CD2 记录。 如果您仍在解决这个问题,为什么不使用 REXX? 【参考方案1】:这是我很喜欢的一个问题,并且很长一段时间以来都渴望自己解决这个问题。经过一些研究和尝试,我刚刚想出了一个解决方案。
更新: 即兴方法如下。它在 1 遍中解决了问题,而最初的方法需要 3 遍。
即兴方法: 不需要3遍。
***************************** Top of Data ******************************
//JOBNAME JOB ('ACCOUNT INFORMATION'),'TRANSPOSE',
// CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID
//STEP1 EXEC PGM=SORT
//SORTIN DD *
DE001XYX A
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
DE003ZZZ A
DE001XYX A
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(30,1,CH,A)
INREC IFTHEN=(WHEN=GROUP,BEGIN=(12,1,CH,EQ,C'A'),
END=(12,1,CH,EQ,C'C'),PUSH=(14:ID=1)),
IFTHEN=(WHEN=(12,1,CH,EQ,C'A'),BUILD=(1:1,8,19Z,28:12,1,
30:14,1)),
IFTHEN=(WHEN=(12,1,CH,EQ,C'B'),
BUILD=(1:9Z,10:1,8,18:10Z,28:12,1,30:14,1)),
IFTHEN=(WHEN=(12,1,CH,EQ,C'C'),
BUILD=(1:18Z,19:1,8,28:12,1,30:14,1))
SUM FIELDS=(1,8,10,8,19,8),FORMAT=BI
OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)
**************************** Bottom of Data ****************************
结果与 OP 在他/她的问题中显示的相同。
初步方法:
第 1 步:
我将WHEN=GROUP
与BEGIN
、END
和PUSH
参数一起使用。
//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',
// CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID
//STEP1 EXEC PGM=SORT
//SORTIN DD *
DE001XYX A
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
DE003ZZZ A
DE001XYX A
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
OUTREC IFTHEN=(WHEN=GROUP,BEGIN=(12,1,CH,EQ,C'A'),
END=(12,1,CH,EQ,C'C'),PUSH=(14:ID=1))
PUSH=(14:ID=1)
表示位置 14 表示 1 是每个组递增的标识符。每个 A 表示一个新组,无论前一个组是否以 C 终止。当一个新组开始时,标识符是 +1 的。
注意:由于我们只允许一个字符作为 ID,所以当 ID 计数器达到 10 时,位置 14 将出现一个“0”。您也可以为身份证。
第 1 步的输出:
********************************* TOP OF DATA **********************************
DE001XYX A 1
CD100000 B 1
CD200000 C 1
DE001KKK A 2
CD100000 B 2
DE003ZZZ A 3
DE001XYX A 4
CD100000 B 4
CD200000 C 4
DE001KKK A 5
CD100000 B 5
******************************** BOTTOM OF DATA ********************************
步骤2: 取步骤1的输出。分别根据A、B、C三个键修改DE、CD1、CD2记录的位置。
//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',
// CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID
//STEP1 EXEC PGM=SORT
//SORTIN DD *
DE001XYX A 1
CD100000 B 1
CD200000 C 1
DE001KKK A 2
CD100000 B 2
DE003ZZZ A 3
DE001XYX A 4
CD100000 B 4
CD200000 C 4
DE001KKK A 5
CD100000 B 5
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
OUTREC IFTHEN=(WHEN=(12,1,CH,EQ,C'A'),BUILD=(1:1,8,19Z,28:12,1,
30:14,1)),
IFTHEN=(WHEN=(12,1,CH,EQ,C'B'),
BUILD=(1:9Z,10:1,8,18:10Z,28:12,1,30:14,1)),
IFTHEN=(WHEN=(12,1,CH,EQ,C'C'),
BUILD=(1:18Z,19:1,8,28:12,1,30:14,1))
/*
注意:在其间插入二进制零作为占位符,以便在第 3 步中填充数据。
第 2 步的输出:
********************************* TOP OF DATA **********************************
DE001XYX A 1
CD100000 B 1
CD200000 C 1
DE001KKK A 2
CD100000 B 2
DE003ZZZ A 3
DE001XYX A 4
CD100000 B 4
CD200000 C 4
DE001KKK A 5
CD100000 B 5
******************************** BOTTOM OF DATA ********************************
打开十六进制模式,您将能够看到二进制零 (X'00)。
***************************** Top of Data ******************************
DE001XYX A 1
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450017870000000000000000000101000000000000000000000000000000000000000000
-----------------------------------------------------------------------
CD100000 B 1
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000201000000000000000000000000000000000000000000
-----------------------------------------------------------------------
CD200000 C 1
000000000000000000CCFFFFFF4C4F444444444444444444444444444444444444444444
000000000000000000342000000301000000000000000000000000000000000000000000
-----------------------------------------------------------------------
DE001KKK A 2
CCFFFDDD0000000000000000000C4F444444444444444444444444444444444444444444
450012220000000000000000000102000000000000000000000000000000000000000000
-----------------------------------------------------------------------
CD100000 B 2
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000202000000000000000000000000000000000000000000
-----------------------------------------------------------------------
DE003ZZZ A 3
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450039990000000000000000000103000000000000000000000000000000000000000000
-----------------------------------------------------------------------
DE001XYX A 4
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450017870000000000000000000104000000000000000000000000000000000000000000
-----------------------------------------------------------------------
CD100000 B 4
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000204000000000000000000000000000000000000000000
-----------------------------------------------------------------------
CD200000 C 4
000000000000000000CCFFFFFF4C4F444444444444444444444444444444444444444444
000000000000000000342000000304000000000000000000000000000000000000000000
DE001KKK A 5
CCFFFDDD0000000000000000000C4F444444444444444444444444444444444444444444
450012220000000000000000000105000000000000000000000000000000000000000000
-----------------------------------------------------------------------
CD100000 B 5
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000205000000000000000000000000000000000000000000
-----------------------------------------------------------------------
**************************** Bottom of Data ****************************
步骤 3: 将步骤 2 的输出作为输入,使用 SUM FIELDS
组合组的 DE、CD1 和 CD2 记录,SORT FIELDS
在第 30 位的 ID
字段中.
//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',
// CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID
//STEP1 EXEC PGM=SORT
//SORTIN DD *
DE001XYX A 1
CD100000 B 1
CD200000 C 1
DE001KKK A 2
CD100000 B 2
DE003ZZZ A 3
DE001XYX A 4
CD100000 B 4
CD200000 C 4
DE001KKK A 5
CD100000 B 5
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(30,1,CH,A)
SUM FIELDS=(1,8,10,8,19,8),FORMAT=BI
OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)
/*
使用OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)
,将 DE、CD1 和 CD2 字段之间的二进制零替换为空格。
第 3 步的输出:开始!
***************************** Top of Data ******************************
DE001XYX CD100000 CD200000
DE001KKK CD100000
DE003ZZZ
DE001XYX CD100000 CD200000
DE001KKK CD100000
**************************** Bottom of Data ****************************
有关SUM FIELDS
的更多详细信息(带有二进制零):
二进制加法对两个位模式进行操作。让我们考虑以下记录(十六进制模式已打开,因为我想展示如何对十六进制值执行二进制加法)。
****** ********
000001 DE001XYX
CCFFFEEE
45001787
---------------
000002
00000000
00000000
第一个字节的十六进制值 X'C4' 与第二条记录的第一个字节中的二进制零相加。
C4
+00
--
C4
X'C4' 表示 EBCDIC 中的字母 'D'
如果我们将第一个字节中的二进制零更改为二进制一 (X'01'),结果会有所不同。
C4
+01
--
C5
X'C5' 表示 EBCDIC 中的字母“E”。
使用二进制零,我们可以对字母数字数据项(EBCDIC 字符 a-z、A-Z、0-9)执行SUM FIELDS
,以将它们分组到一个记录中。
【讨论】:
非常感谢您的努力。事实上,Inposted这个并忘记了。我找到了解决这个问题的方法。但我已经通过 JCL 和 BTEQ terdata querires 实现了这一点。 嗨@user2959433 很高兴知道您找到了解决方案。由于 Syncsort 被标记为问题,我考虑使用它来找到解决方案。这是相当具有挑战性的,并发掘了新的可能性。以上是关于使用 SORT 进行大型机 JCL 记录转置的主要内容,如果未能解决你的问题,请参考以下文章