1

我正在做一个项目,将当前用 HLASM 编写的大型机 CICS 应用程序转换为 COBOL。我有许多将继续使用的实用程序——其中之一是通过 CICS LINK 访问的“文件访问”实用程序。此实用程序采用必要的输入参数(在 commarea 中传递)来生成 CICS 文件请求以从指定文件中读取记录,并将存储区域的地址和在同一 commarea 中检索到的记录的长度传回。在汇编程序中,很容易将该地址加载到寄存器中,然后通过USING指令将该寄存器与记录映射 (DSECT) 相关联。

但是如何在 COBOL 中做到最好呢?我是否使用在 commarea 中传回的地址并以某种方式将其与 COBOL 记录布局相关联,以便我可以直接在 COBOL 程序中引用记录字段?如果是这样,怎么做?

还是我必须以某种方式将数据移动到本地工作存储区?然后将其移回以反映 COBOL 程序可能进行的任何更新?再次,如果是这样,如何?

4

1 回答 1

3

在 CICS COMMAREA 中声明一个 POINTER 类型的变量来保存您的实用程序将返回的记录缓冲区的地址。例如:

  01 COMM-CICS.
     02 COMM-SOME-STUFF PIC whatever...
     02 COMM-REC-BUFF-ADDRESS POINTER.
     02 COMM-REC-BUFF-LENGTH  PIC 9(9) BINARY.
     02....

在您的 COBOL 程序中,在 中声明记录布局 LINKAGE SECTION,例如:

  LINKAGE SECTION.
  01 LINK-REC.
     02 LINK-DATA1 PIC X(10).
     02 .....

这会创建布局,但不会为其分配任何存储空间。从实用程序返回后,使用 COBOLSET ADDRESS动词将记录缓冲区的地址分配给记录布局,例如:

  SET ADDRESS OF LINK-REC TO COMM-REC-BUFF-ADDRESS

现在,您的 COBOL 程序应该能够按名称处理文件记录中的任何项目,例如:

  MOVE LINK-DATA1 TO some-other-variable

作为对返回数据区域的检查,您可以使用 COBOL 动词检查缓冲区的长度与 COBOL 记录布局的长度LENGTH OF,例如:

  IF LENGTH OF LINK-REC NOT = COMM-REC-BUFF-LENGTH
     raise an error - buffer length does not match record layout
  END-IF

不过有一个警告...如果 LINK 指向远程计算机,这可能不起作用,因为它们不会共享相同的地址空间。我建议您调查使用 CICS 通道和容器来处理这类事情。

于 2014-05-21T20:34:28.910 回答