【问题标题】:JCL/DFSORT to split dataset based on header of multi-lined recordsJCL/DFSORT 根据多行记录的标题拆分数据集
【发布时间】:2016-01-05 18:01:02
【问题描述】:

我有一个包含已处理信息的数据集,用于 4 个不同的部门,我需要将其拆分为每个部门的一个数据集。这是一般记录结构:

XXXXXXX = 不相关的字符串

AAA = 3 个字母的字母部门 ID

记录细节无关紧要,行数可变

000001 0000000000000000000000000000000000000XXXXXXXAAA171220150000              
000002 <irrelevant record details>
000003 <irrelevant record details>
000004 999999999999999999999999999999999999900000004000000000005700     
000005 0000000000000000000000000000000000000XXXXXXXBBB171220150000              
000006 <irrelevant record details>
000007 <irrelevant record details>
000008 <irrelevant record details>
000009 <irrelevant record details>
000010 <irrelevant record details>
000011 999999999999999999999999999999999999900000004000000000005700     
000012 0000000000000000000000000000000000000XXXXXXXCCC171220150000              
000013 <irrelevant record details>
000018 999999999999999999999999999999999999900000004000000000005700     

如何使用 DFSORT 和 JCL 完成此任务?

【问题讨论】:

  • 我们在这里帮助您解决代码问题。查看带有 BEGIN、END 和 PUSH 的 WHEN=GROUP 的 ID。四个 OUTFIL,前三个使用 ID (INCLUDE=/OMIT=),最后一个使用 SAVE。
  • 注意:OUTFIL 仅在您事先知道部门* 是什么并为每个部门编写 OUTFIL 语句时才起作用(分配的输出数据集与其一起使用)。从发现部门代码的意义上说,DFSORT 中没有“分桶”。 * 我在这里使用“部门”,因为这是提问者的关键字段。
  • @BillWoodger 我对 DFSORT 不是很熟悉,有一个紧迫的任务要完成,抱歉这个问题。
  • @MartinPacker 如果不是“桶”,您会在 OUTFIL 上调用什么 SAVE?
  • @MartinPacker 我并不是要“分桶”。这些部门以前是已知的。

标签: sorting dataset mainframe jcl dfsort


【解决方案1】:

以下是使用 INREC WHEN=GROUP 的解决方案示例代码,适用于 2 个部门:

//SRT0001    EXEC PGM=SORT
//SYSOUT     DD SYSOUT=*
//SORTIN     DD DSN=DATASET.IN,
//           DISP=SHR
//AAAOUT     DD DSN=DATASET.OUT.DEPAAA,
//           DISP=(,CATLG),AVGREC=U,SPACE=(150,(100,10),RLSE)
//BBBOUT     DD DSN=DATASET.OUT.DEPBBB,
//           DISP=(,CATLG),AVGREC=U,SPACE=(150,(100,10),RLSE)
//SYSIN      DD   *
 SORT FIELDS=COPY
   INREC IFTHEN=(WHEN=GROUP,
     BEGIN=(1,4,CH,EQ,C'0000'),
     END=(1,4,CH,EQ,C'9999'),
     PUSH=(151:45,3))
   OUTFIL FNAMES=AAAOUT,
     INCLUDE=(151,3,CH,EQ,C'AAA'),BUILD=(1,150)
   OUTFIL FNAMES=BBBOUT,
     INCLUDE=(151,3,CH,EQ,C'BBB'),BUILD=(1,150)
/*

【讨论】:

  • 这还不错。摆脱第二个如果。去掉第一个 IFTHEN 中的 AND。如果您知道名称,并且用户永远无法更改它们,则可以这样做。您可以通过 PUSHing 一个 ID 而不是名称,然后更改 INCLUDE 以查找 zeros1 和 zeros2,从而将名称从图片中删除。您使用 ID=N,其中 N 是字段的长度,并且足够长以包含您的组。如果您对数据的描述是准确的,ID=1 就可以了。您可以使用 SAVE 和 BUILD 添加另一个 OUTFIL,然后您的所有输入将出现在某处的一个 OUTFIL 上。
  • @BillWoodger 对 AND 和 IFTHEN 语句的建议非常好。我将使用此改进进行编辑。我保留 PUSH 语句,因为它对来自具有不同 ID 的一个部门(例如 AAA)的记录进行编号(该部门的记录不是连续的)。我不知道我是否在这里遗漏了什么。
  • 不一定缺少什么,这取决于您的要求的细节。提取“名称”的问题在于用户容易更改此类内容。有什么要注意的。您可以查看使用 NULLOFL 为空的 OUTFIL 数据集设置返回代码/条件代码 4。对于不太熟悉 DFSORT 的人来说,您似乎很快就学会了,这很好:-)
  • @BillWoodger 在运行此作业的环境中不可能发生这种用户更改。发送到大型机后,只能由另一位 IT 分析师更改。我只知道排序的基础知识,这是一个巨大的挑战,但由于 IBM 的大量文档和您的提示,这并不难。谢谢!
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多