我试图对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。
答案 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文件的有用信息。