【问题标题】:How to reference passed record address in CICS COBOL program?如何在 CICS COBOL 程序中引用传递的记录地址?
【发布时间】:2014-07-10 15:01:30
【问题描述】:

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

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

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

【问题讨论】:

  • @NealB 的答案是要走的路。在他的示例中,LINK-REC 是您的 DSECT。带有 [USAGE] POINTER 的 COBOL 数据项包含一个地址。只要该存储映射到来自 Assembler 程序的数据地址,SET 就会将数据与 LINKAGE SECTION 数据描述(DSECT 等效项)相关联。

标签: cobol file-access cics


【解决方案1】:

在 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 .....

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

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

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

  MOVE LINK-DATA1 TO some-other-variable

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

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

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

【讨论】:

  • 优秀 - 清晰的解释和示例代码!我想知道它是否是这样的,但找不到任何符合我确切情况的例子。一看就有道理。 :-)
猜你喜欢
  • 2012-05-02
  • 2014-06-12
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多