COBOL - 打开具有相对和动态选项的顺序数据集时的文件状态 37

Posted

技术标签:

【中文标题】COBOL - 打开具有相对和动态选项的顺序数据集时的文件状态 37【英文标题】:COBOL - File Status 37 when opening sequential dataset with relative & dynamic options 【发布时间】:2018-11-08 17:43:12 【问题描述】:

我正在尝试打开一个顺序数据集。

我得到文件状态 37,IBM 说:

试图对不支持的文件执行 OPEN 语句 在 OPEN 语句中指定的打开模式。可能的违规行为是:

指定了 EXTEND 或 OUTPUT 短语,但文件不支持写入操作。 指定了 I-O 短语,但文件不支持允许的输入和输出操作。 指定了 INPUT 短语,但文件不支持读取操作。

我怀疑第三个,因为我的程序的相关部分是:

  *----------------------
   INPUT-OUTPUT SECTION.
  *----------------------

   FILE-CONTROL.

 *    input file 1
      SELECT INPUT-1-FILE
         ASSIGN TO EXAMPLE
         ORGANIZATION IS RELATIVE
         ACCESS MODE IS DYNAMIC
         RELATIVE KEY IS INPUT-1-ACCESS-KEY
         FILE STATUS IS INPUT-1-FS
         .


  ****************
   DATA DIVISION.
  ****************

  *--------------
   FILE SECTION.
  *--------------

  * fichier 1
   FD INPUT-1-FILE
       .
   01 INPUT-1-LINE.
     05 filler                     PIC X(300).


  *-------------------------
   WORKING-STORAGE SECTION.
  *-------------------------

   77 INPUT-1-ACCESS-KEY           PIC 9(3) comp value 1.

   01 INPUT-1-FS                   PIC 99 value 00.


  *********************
   PROCEDURE DIVISION.
  *********************

       OPEN INPUT INPUT-1-FILE
       DISPLAY INPUT-1-FS

我的 JCL 中的 DD 卡看起来像:

EXAMPLE DD DISP=SHR,DSN=MY.DATASET.NAME

我们使用的是 COBOL v5,所以我检查了 IBM 的 relevant docs,但找不到任何原因导致我的文件无法在输入模式下打开。

以下是我的数据集的特征:

VSAM listcat 的结果:

【问题讨论】:

您提供的参考是针对 iSeries 的,如果您在 z/OS 上运行,您需要 mainframe reference。它与您为此错误引用的内容相同,但仅供将来参考... 该文件是 KSDS 还是 RRDS VSAM 文件? ESDS,我想。是这个问题吗? 我不确定,我从未做过 ESDS,但documentation 似乎在谈论相对和索引文件而没有具体提及 ESDS。 清除一些缺失点...首先,RRDS 的非 VSAM 模拟是 BDAM,但 IBM COBOL 不再提供 BDAM 支持(如果您想在 COBOL 中使用 BDAM)。BDAM 具有高效的面向块的直接访问,与 RRDS 非常相似。为了填补另一个空白,关于 VSAM 的一个很酷的事情是可以通过不同的方式访问给定的文件......通常任何 VSAM KSDS 或 ESDS 也可以通过相对记录号打开和处理,就好像它是一个 RRDS。如果您想了解详细信息,请参阅“使用数据集的 z/OS DFSMS”中的所有内容。 【参考方案1】:

在您的程序中,ORGANIZATION IS RELATIVE 表示输入文件必须是相对记录数据集 (RRDS) VSAM 文件,可以使用IDCAMS DEFINE 命令定义。可能发生的情况是,如果您打开的文件是顺序文件,则文件状态为 37。IBM 红皮书“VSAM Demystified”第 1.5.3 节“Relative record data set”中提到了有关IDCAMS DEFINE 的更多信息。

您可以使用以下内容将输入文件设为 VSAM 文件:

//[YOURID]  JOB ,
// MSGCLASS=S,REGION=0M,COND=(9,LT),NOTIFY=&SYSUID,TIME=(1,1)
//*********************************************************************
//* Create a VSAM
//*********************************************************************
//S1IDCAMS   EXEC  PGM=IDCAMS
//SYSPRINT DD  SYSOUT=*
//SYSIN    DD  *
DELETE   ([YOURID].P00695.VSAMRRDS) CLUSTER PURGE
DEFINE CLUSTER (NAME([YOURID].P00695.VSAMRRDS)   -
           NUMBERED                                -
           RECORDSIZE(80 80)                      -
           BUFFERSPACE(2048)                       -
           SHAREOPTIONS(4 3)                       -
           VOLUMES(SYS162))                        -
   DATA    (NAME([YOURID].P00695.VSAMRRDS.DATA) -
           TRACK(1,1)                              -
           CISZ (1024))
/*
//S2REPRO    EXEC  PGM=IDCAMS
//SYSPRINT DD  SYSOUT=*
//VSAM  DD DISP=SHR,DSN=[YOURID].P00695.VSAMRRDS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO OUTFILE(VSAM) INFILE(INREC)
/*
//INREC  DD *
XXXXXXX060ALISONALISONALISONALISONALISONALISONALISONALISONAL        ISONALIS
XXXXXXX060ALISONALISONALISONALISONALISONALISONALISONALISONAL        ISONALIS
/*

【讨论】:

我认为这可行,但我使用了更简单的解决方案(请参阅我的答案)。您是否认为有任何规范或技术原因可以改为使用您的? 您的示例似乎也可以正常工作。很高兴事情成功了!【参考方案2】:

在问题中链接的 IBM 文档(第 126 页:FILE-CONTROL 段落)中,据说相对访问模式仅适用于 VSAM 文件:

问题:输入文件当前不是 VSAM 文件。

解决方案:将输入文件设为 VSAM 文件。

这行得通:

创建输入文件时JCL中的DD卡:

//FOO      DD DISP=(NEW,CATLG,DELETE),
//         SPACE=(TRK,(1000,1000),RLSE),
//         LRECL=300,
//         RECORG=RR,
//         DSN=MY.DATASET.NAME

RECORG parameter 使数据集成为 RRDS。这些行没有容易定义的密钥,所以我不能使用 KSDS,我需要随机访问,所以也没有 ESDS。

用于读取数据集的DD卡:

//BAR      DD DISP=SHR,DSN=MY.DATASET.NAME

然后在 COBOL 程序中(FILE-CONTROL):

       SELECT INPUT-FILE
         ASSIGN TO BAR
         ORGANIZATION IS RELATIVE
         ACCESS MODE IS DYNAMIC
         RELATIVE KEY IS INPUT-FILE-KEY
         FILE STATUS IS INPUT-FILE-STATUS
         .

【讨论】:

【参考方案3】:

如果您想打开一个顺序数据集进行读取,您需要打开它以进行输入(完成!),在 JCL 中使用 DISP=SHR(您可以尝试使用 OLD,但不需要它),并且访问是连续的。

如其他用户所述,ACCESS IS RELATIVE 仅适用于 VSAM,并且您的 IDCAMS 输出显示这不是 VSAM 文件。如果它只是一个顺序数据集,你也不需要密钥。

【讨论】:

我同意,但我需要随机访问。 我认为您不能对顺序的非 VSAM 文件进行随机访问,它只是 READ READ READ。如果你知道你想要的格式,你总是可以忽略记录或我想的东西。它不会很有效,但会起作用。

以上是关于COBOL - 打开具有相对和动态选项的顺序数据集时的文件状态 37的主要内容,如果未能解决你的问题,请参考以下文章

cobol数组赋值

静态游标

多个 Cobol 子程序可以在同一个模块中吗

在django模板中按id的顺序显示查询集及其外键

如何接受部分变量(字符串)作为cobol中的动态值?

在现有元素上应用属性集