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

COBOL - File Status 37 when opening sequential dataset with relative & dynamic options

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

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

An OPEN statement was attempted on a file that would not support the open mode specified in the OPEN statement. Possible violations are:

  • The EXTEND or OUTPUT phrase was specified but the file would not support write operations.
  • The I-O phrase was specified but the file would not support the input and output operations permitted.
  • The INPUT phrase was specified but the file would not support read operations.

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

  *----------------------
   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's relevant docs,但我找不到我的文件无法在输入模式下打开的任何原因。

这是我的数据集的特征:

VSAM listcat 的结果:

在问题中链接的 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
         .

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

您可以使用如下内容将输入文件设为 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
/*

如果你想打开一个顺序数据集进行读取,你需要打开它进行输入(完成!),将它放在 JCL 中,DISP=SHR(你可以尝试使用 OLD,但不需要它), 并具有 ACCESS IS SEQUENTIAL。

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