事实:
我似乎找不到合适的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:
// DLBL SYSUT1,'VDE.TAPE.PLUMW',0
// DLBL SYSUT2,'TCP380.PLUMDATA',0
// EXEC T3E2A380
更新的代码:
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(腐败索引文件)。
答案 0 :(得分:0)
这有效:
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数据集(你不需要在BLOCK CONTAINS上有这么多零,零是零,但它没有伤害。
但是,我无法访问z / VSE或模拟该操作系统的Micro Focus Workbench。
您有一个简单,平坦的顺序文件,因此您无法获得该文件的损坏索引。
您需要立即检查您的文件。你能"看看"该文件的内容在某种程度上?否则,找一个实用程序,例如SORT,并尝试将该文件用作输入。
如果您遇到故障,请尝试使用其他已知数据的VB文件(即使您必须创建一个)。如果可行,请尝试为您的程序创建一个新文件。
如果您仍然无处可去,那么您的技术支持人员就是其中之一。如果需要,他们将联系Micro Focus。
您的文件定义(SELECT和FD)现在可以工作,我可以在COBOL程序中打开,读取和关闭。
您的问题现在特定于文件(它可能已损坏,虽然真正的操作系统会知道这一点,但Micro Focus仿真可能没有)或者您的环境存在更广泛的问题。
如今,在Micro Focus仿真下运行z / VSE将非常少见。我不认为你会从SO那里得到更多。
您最新信息的第一件事是您没有使用z / OS,至少在您运行程序时没有。那是DOS
JCL,因此目标操作系统很可能是z / VSE。无论如何,这可能是一件令人意外的事情。这些天不要看DOS JCL。
如前所述,现在很简单。你的数据集是VB,你的LRECL是256(这是四字节的RDW plue 252字节的数据)你已经在FD下的01中定义了256字节的数据。将其更改为252。
以下是IBM的企业COBOL对文件状态39的看法(对于在z / VSE下运行的COBOL将是相同的):
OPEN声明未成功,因为发生了冲突 在固定文件属性和
之间检测到 在程序中为该文件指定的属性。这些 属性包括文件的组织
(顺序,相对或索引),主记录键, 备用记录键,代码集,最大记录大小, 记录类型(固定或变量)和阻塞 因素。
Micro Focus&n; JCL中实际文件的描述与程序中文件的描述不符。该消息涵盖了各种各样的情况,只知道代码中的内容以及实际文件的定义方式可以解决问题。
最可能的事情是"一个文件是固定长度的记录,另一个是可变长度的记录"或者"一个文件认为最大长度是X而另一个认为它是Y"。
对于记录的最大长度,请记住,正如您应该已经阅读过的那样,COBOL程序应该只定义数据部分的长度(不包括RDW),但JCL必须定义最大值长度包括 RDW。即最大值应该是四个字节不同。如果LRCLL在JCL中不是显式的,则从数据集的商品目录条目中获取。
你应该在你的" workbench"确定文件的特征,并确保它们与程序中的定义匹配(记住不要在程序中包含RDW)。
有三种方法可以向COBOL表明您有一个可变长度记录文件。所有人都认为你在RECORDING MODE V
中指定了FD
,但这还不够。
如果文件包含多个记录布局,其中至少有一个与其他记录布局的长度不同,那么只需在FD下定义记录就会告诉COBOL您的文件包含可变长度记录。
FD ....
01 RECORD-1 PIC X.
02 RECORD-2 PIC XX.
在IBM大型机上,每个可变长度记录前面都有一个记录描述符字(RDW)。作为一个实现细节(它是如何实现的,不在COBOL标准中规定),不包括在记录布局中。您的实际文件将具有LRECL(逻辑记录长度),其中 包括RDW的长度(W表示Word,这意味着四个字节)。
在上面的例子中,LRECL可能是6(RDW +最大可能的记录长度)。
如果您的文件包含单个记录类型,但由于OCCURS中包含的项目数量,该记录的长度可能不同,那么仅使用OCCURS ... DEPENDING ON
包含记录布局就足够了。
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).
如果您的记录没有特定的固定结构(文本,XML,等等),那么您需要这个。
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).
最小长度和最大长度是数据的实际数字。
当您READ
该文件时,字段NUMBER-OF-BYTES-OF-DATA将收到记录中数据字节数的计数(不包括RDW)。
如果你想要WRITE
一条记录,你可以将NUMBER-OF-BYTES-OF-DATA设置为WRITE之前的数据字节数,一切顺利(NUMBER-OF-BYTES-OF -DATA只是一个示例名称,使您的文件与文件相关。)