对可变长度记录进行排序,已阻止,数据集

时间:2015-07-12 10:16:51

标签: mainframe dfsort

我试图对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。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

  

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

     

VLSHRT

     

指定DFSORT如果是短控制字段或继续处理   找到比较字段。

     

NOVLSHRT

     

指定DFSORT在短控制字段或比较

时终止

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

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

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

答案 1 :(得分:1)

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

   00000000001
and
   00000000005

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

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

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

VLSHRT 参数告诉排序程序将缺失的排序键视为Hex-Zeros,排序现在可以正常工作。

看看账单的答案,它有很多关于FB和VB文件的有用信息。