【问题标题】:Sorting a variable-length record, blocked, dataset对可变长度记录、阻塞、数据集进行排序
【发布时间】:2015-07-12 10:16:50
【问题描述】:

我已尝试对 VB 文件进行排序。

文件数据为:
00000000002 AAA
00000000001
00000000003 BBB
00000000004 CCC
00000000005

我用于排序的 JCL 如下:

//STEP1  EXEC PGM=SORT                                       
//SYSOUT   DD  SYSOUT=*                                        
//SYSUDUMP DD  SYSOUT=*                                        
//SORTWK01 DD  UNIT=SYSTF,SPACE=(01000,(006980,001425),,,ROUND)
//SYSIN    DD  *                                               
 SORT FIELDS=(17,3,CH,A)                                       
/*                                                             
//SORTIN   DD  DSN=TEST.INPUT.FILE1,                            
//             DISP=SHR                                        
//SORTOUT  DD  DSN=TEST.OUTPUT.FILE2,                            
//             DISP=(NEW,CATLG,DELETE),                        
//             DCB=(RECFM=VB,LRECL=80,BLKSIZE=0),              
//             UNIT=SYSSF,                                     
//             SPACE=(CYL,(5,5),RLSE)       

此 JCL 无法使用 VB 文件,但可以正常使用 FB 文件。但是,如果我添加以下排序卡,它也适用于 VB 文件。

 SORT FIELDS=(17,3,CH,A) 
 OPTION VLSHRT           

我正在寻找原因,为什么这适用于 FB,但不适用于 VB。

【问题讨论】:

    标签: mainframe dfsort


    【解决方案1】:

    对于 FB 数据集,所有记录的长度相同(与数据集的 LRECL 相同)。

    对于 VB 数据集,任何记录都可以是理论上的(LRECL-4)。实际上,最短记录取决于数据集中数据的上下文,最长记录可能与 LRECL 相同。

    这对 SORT 意味着,VB 数据集中记录引用的任何给定字段可能存在也可能不存在,但实际上直到运行时才知道。

    理想情况下,如果您对数据进行排序,您会期望所有记录都存在指定的控制字段。但是,有时会有不同的要求。

    DFSORT 对可变长度短记录的作用(在这种情况下,“短”表示在指定的控制字段之前结束)由参数 VLSCMP 和 VLSHRT 控制。

    VLSCMP 用于通过 INCLUDE/OMIT 语句控制短记录的行为。

    VLSHRT 被描述为 DFSORT 应用程序编程指南

    临时覆盖 VLSHRT 安装选项,该选项指定是否 DFSORT 将继续处理“短”变长 SORT/MERGE 找到控制字段、INCLUDE/OMIT 比较字段或 SUM 汇总字段。 有关详细信息,请参阅 VLSHRT 和 NOVLSHRT 的讨论 第 173 页的“OPTION 控制语句”中的选项。

    VLSHRT

    指定如果短控制字段或 找到比较字段。

    NOVLSHRT

    指定如果短控制字段或比较,则 DFSORT 终止

    另请注意,如果您的数据位于 VB 数据集上,则不能使用相同的起始位置。在可变长度记录上,数据从位置 5 开始,因为前四个字节被 记录描述符字 (RDW) 占用(在此上下文中,字仅表示四个字节)。因此,对于可变长度记录,您需要在所有字段的所有起始位置添加四个。 已找到字段。

    这也意味着当您为 VB 指定 80 的 LRECL 时,如您的示例所示,每条记录实际上最多只能包含 76 个字节的数据(76 + RDW 的长度 = 80)。

    另外请注意,将 LRECL 和 RECFM 放在 EXEC PGM=SORT 或 EXEC PGM=ICETOOL 的输出数据集上并不是一件好事。 SORT/ICETOOL 将准确指定 LRECL 和 RECFM。如果您在 JCL 中也有它们,那么您还有第二个位置来维护它们。

    【讨论】:

      【解决方案2】:

      Bill 是正确的,但我会尝试给出一个更简单的答案。 在给出的示例中,您有 2 条记录:

         00000000001
      and
         00000000005
      

      没有排序键。当您将它们复制到固定宽度的文件时,它们会被空格(x'40')或十六进制零填充(取决于您复制文件的方式)。记录现在有一个空格(或十六进制零)的排序键,即它们变成

         00000000001____
         00000000005____    where _ represents a space (x'40') or Hex zero (x'00')
      

      FB 排序现在可以工作,而 VB 排序将失败,因为有些记录没有排序键。

      VLSHRT 参数告诉排序程序将丢失的排序键视为十六进制零,排序现在可以工作。


      看看比尔的回答,里面有很多关于 FB 和 VB 文件的有用信息。

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 2017-07-19
        • 2017-04-02
        相关资源
        最近更新 更多