如何在Micro Focus COBOL中为可变长度文件编码

如何在Micro Focus COBOL中为可变长度文件编码,cobol,mainframe,Cobol,Mainframe,事实: 使用VMWARE 使用微焦点COBOL 必须使用Enterprise COBOL for z/OS编译方言 输入是一个可变长度的文件 获取各种开放错误 我似乎找不到正确的COBOL代码组合来处理该文件 从我的程序: SELECT SYSUT1-FILE ASSIGN TO SYSUT1 ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS SYSUT1-STATUS. FD SYSUT1-FILE D

事实:

使用VMWARE 使用微焦点COBOL 必须使用Enterprise COBOL for z/OS编译方言 输入是一个可变长度的文件 获取各种开放错误 我似乎找不到正确的COBOL代码组合来处理该文件

从我的程序:

SELECT SYSUT1-FILE ASSIGN TO SYSUT1 ORGANIZATION IS SEQUENTIAL 
ACCESS MODE IS SEQUENTIAL FILE STATUS IS SYSUT1-STATUS. 

FD SYSUT1-FILE DATA RECORD IS SYSUT1-RECORD RECORDING MODE is V 
   RECORD IS VARYING IN SIZE from 1 to 256 DEPENDING ON WS-RECORD-SIZE. 
01 SYSUT1-RECORD PIC X(256). 
文件的DCB信息:DS组织:PS代码集:EBCDIC LRECL:256 BLKSIZE:00000 RECFM:VB

JCL:

更新代码:

   FD  SYSUT1-FILE
       BLOCK CONTAINS 00000
       DATA RECORD    IS SYSUT1-RECORD
       RECORDING MODE is V
       RECORD IS VARYING IN SIZE from 1 to 256
       DEPENDING ON WS-RECORD-SIZE.

   01  SYSUT1-RECORD                      PIC X(256).
当我使用上述代码时,我得到了一个打开的文件状态39

然后我用252字节对它进行了测试,并在打开时得到了一个File-Status-9/00041损坏的索引文件。

FD  SYSUT1-FILE
    BLOCK CONTAINS 00000
    DATA RECORD    IS SYSUT1-RECORD
    RECORDING MODE is V
    RECORD IS VARYING IN SIZE from 1 to 252
    DEPENDING ON WS-RECORD-SIZE.

01  SYSUT1-RECORD                      PIC X(252).
我刚刚编译并运行了一个程序,读取了一个RECFM=VB,LRECL=256的数据集,你不需要在块中包含太多的零,零是零,但这并不有害

然而,我还没有访问z/VSE或模拟该操作系统的Micro Focus工作台

您有一个普通的、平面的、连续的文件,因此您不能有该文件的损坏索引

你现在需要检查你的文件。你能以某种方式查看该文件的内容吗?否则,找到一个实用程序,例如排序,并尝试使用该文件作为输入

如果你失败了,试着使用不同的VB文件,即使你必须制作一个你知道有数据的文件。如果可行,尝试创建一个新文件供程序使用

如果你仍然一事无成,那就是你的技术支持人员。如果需要,他们将联系Micro Focus

您的文件定义SELECT和FD现在可以工作了,我可以在COBOL程序中打开、读取和关闭

您现在的问题是特定于文件的,它可能已损坏,尽管真正的操作系统可能知道这一点,但Micro Focus仿真可能不知道,或者您的环境存在更广泛的问题

如今,在微焦点仿真下运行z/VSE将非常罕见。我认为你不会从中得到更多

从您的最新信息来看,第一件事是您没有使用z/OS,至少在运行程序时没有。这就是DOS JCL,因此目标操作系统可能是z/VSE。可能没关系,只是意外而已。最近没有看到太多的DOS JCL

如前所述,它现在很简单。您的数据集是VB,LRECL是256,即四字节RDW加上252字节的数据,并且您在FD下的01中定义了256字节的数据。换成252

以下是IBM的企业COBOL对文件状态的看法,对于在z/VSE下运行的COBOL,39将是相同的:

OPEN语句未成功,因为存在冲突 在固定文件属性和 在程序中为该文件指定的属性。这些 属性包括文件的组织 顺序、相对或索引、主记录键、 备用记录键、代码集、最大记录大小、, 记录类型为固定或可变,以及阻塞 因素

Micro Focus的JCL中实际文件的描述与程序中文件的描述不匹配。该消息涵盖了各种各样的情况,只有知道代码中的内容以及实际文件是如何定义的,才能找到解决方案

最可能的情况是,一个文件是固定长度的记录,另一个是可变长度的记录,或者一个文件认为最大长度是X,而另一个文件认为最大长度是Y

对于记录的最大长度,请记住,正如您应该已经阅读了下面的内容一样,COBOL程序应该将数据部分的长度定义为最大长度(不包括RDW),但JCL必须定义包括RDW的最大长度。即最大值应相差四个字节。如果LRECL在JCL中不显式,则从数据集的目录条目中获取

您应该在工作台中有某种方法来确定文件的特征,并确保它们与程序中的定义相匹配,记住不要在程序中包含RDW

有三种方法可以向COBOL表明您有一个可变长度记录的文件。所有人都假定您在FD中指定了录制模式V,但这还不够

如果文件包含多个记录布局,其中至少一个记录布局的长度与其他记录布局不同,那么只需在FD下定义记录,即可告诉COBOL文件包含可变长度的记录

FD ....
01  RECORD-1 PIC X.
02  RECORD-2 PIC XX.
在IBM大型机上,每个可变长度记录前面都有一个记录描述符单词RDW。作为一个实现细节,它是如何实现的并没有在COBOL标准中规定,也没有包含在记录布局中。您的实际文件将有一个LRECL逻辑记录长度,其中包括RDW的长度,W表示字,表示四个字节

在上述示例中,LRECL可以是6rdw+最大可能记录长度

如果您的文件包含单一记录类型,但由于项目数的不同,该记录可能具有不同的长度
FD ....
01  RECORD-1 PIC X.
02  RECORD-2 PIC XX.
FD ....
01  RECORD-1.
    05  SOME-FIXED-LENGTH-DATA PIC X(200).
    05  NUMBER-OF-ITEMS BINARY PIC 9(4).
    05  FILLER 
        OCCURS 1 TO 10 TIMES
        DEPENDING ON NUMBER-OF-ITEMS.
        10  FIXED-DATA-IN-VARIABLE-AMOUNTS PIC X(10). 
FD  ... RECORD IS VARYING FROM minimum-length TO maximum-length
        DEPENDING ON NUMBER-OF-BYTES-OF-DATA.
01  RECORD-1                     PIC X(maximum-length).
...
WORKING-STORAGE SECTION.
01  NUMBER-OF-BYTES-OF-DATA BINARY PIC 9(4).