0

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

4

2 回答 2

1

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

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

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

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

DFSORT 对可变长度短记录的处理(“短”在这种情况下意味着在指定的控制字段之前结束)由参数 VLSCMP 和 VLSHRT 控制。

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

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

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

超高速中继

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

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 中也有它们,那么您还有第二个位置来维护它们。

于 2015-07-12T13:29:36.040 回答
1

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

   00000000001
and
   00000000005

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

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

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

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


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

于 2015-07-12T23:21:34.567 回答