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

时间:2014-12-11 17:28:49

标签: cobol mainframe

事实:

  1. 使用VMWARE
  2. 使用Micro Focus COBOL
  3. 必须使用Enterprise COBOL for z / OS编译方言
  4. 输入是可变长度文件
  5. 获取各种未解决的错误
  6. 我似乎找不到合适的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(腐败索引文件)。

1 个答案:

答案 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只是一个示例名称,使您的文件与文件相关。)