如何在Micro Focus COBOL中为可变长度文件编码
事实: 使用VMWARE 使用微焦点COBOL 必须使用Enterprise COBOL for z/OS编译方言 输入是一个可变长度的文件 获取各种开放错误 我似乎找不到正确的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
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).