我正在开发一个项目,将当前用HLASM编写的大型机CICS应用程序转换为COBOL。我有许多将继续使用的实用程序 - 其中一个是"文件访问"通过CICS LINK访问的实用程序。此实用程序获取必要的输入参数(在commarea中传递)以生成CICS文件请求以从指定文件中读取记录,并在同一个commarea中传回存储区域的地址和检索到的记录的长度。在汇编程序中,很容易将该地址加载到寄存器中,然后通过USING
指令将该寄存器与记录映射(DSECT)相关联。
但是如何在COBOL中做得最好?我是否使用在commarea中传回的地址并以某种方式将其与COBOL记录布局相关联,以便我可以直接在COBOL程序中引用记录字段?如果是这样,怎么样?
或者我是否必须以某种方式将数据移动到本地工作存储区域?然后将其移回以反映COBOL计划可能进行的任何更新?如果是这样,怎么样?
答案 0 :(得分: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 .....
这会创建布局但不会分配任何布局
存储到它。从实用程序返回后,使用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 Channels和Contaners进行此类调查。