首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在COBOL中将链接段数据传递给另一个程序的链接段

如何在COBOL中将链接段数据传递给另一个程序的链接段
EN

Stack Overflow用户
提问于 2016-08-15 13:47:54
回答 1查看 3.3K关注 0票数 6

我正在开发一个包装程序/桥COBOL程序,它处理程序调用并执行交叉操作,如日志记录、安全检查等。主要的动机是检查消费者程序的安全访问权限,不管它是否有权调用生产者程序。

让桥COBOL程序是B1,生产者程序P1和消费者(客户端) C1。

当C1想要调用P1时,它必须给B1打个电话。然后,B1检查可访问性。如果C1具有访问权限,那么B1使用C1的数据调用P1。

代码语言:javascript
复制
C1 -> B1 -> P1 

在这里,B1和P1的连接部分是相同的。程序正在使用EXEC CICS链接相互调用。

委员会,

代码语言:javascript
复制
COMMAREA1 (DataSet Name)

01 COMMAREA-STRUCT, 
   03 a-field
   03 another-field      
    ...

客户;

代码语言:javascript
复制
IDENTIFICATION DIVISION.
PROGRAM-ID.  Client.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY COMMAREA1
PROCEDURE DIVISION

 /* fill CommareaStruct with some values. */
 ....
 /* call B1 Bridge */ 
   EXEC CICS LINK PROGRAM  (B1Bridge)      NOHANDLE
     COMMAREA (COMMAREA-STRUCT) 
     LENGTH (LENGTH OF COMMAREA-STRUCT) 
    END-EXEC
 ....

大桥,

代码语言:javascript
复制
IDENTIFICATION DIVISION.
PROGRAM-ID.  B1Bridge.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COPY COMMAREA1
PROCEDURE DIVISION
 ...
 /* access control */
 /* logging */
 ...
 /* pass data to P1*/
    EXEC CICS LINK PROGRAM  (P1)      NOHANDLE
       COMMAREA (COMMAREA-STRUCT) 
       LENGTH (LENGTH OF COMMAREA-STRUCT) 
     END-EXEC
....

生产者;

代码语言:javascript
复制
IDENTIFICATION DIVISION.
PROGRAM-ID.  P1
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COPY COMMAREA1
PROCEDURE DIVISION
....

*doing some business with data in COMMAREA1 
...

当我在上面尝试时,我收到了桥程序B1的编译时警告;“COMMAREA或它的一个下属被引用了,但是COMMAREA是一个链接部分项,没有可寻址性。这个引用在执行时不会被成功地解析。”

什么意思?如何将B1的连接部分传递给P1的链接部分?

当我尝试这样做时,我在运行时得到了EIBRESP:22和EIBRESP2: 26 (逗区长度错误)。

-编辑--

我想我应该给出更多的细节;

主要动机;实际上有两家公司是COM1和COM2公司。COM2几年来一直是COM1的附属公司。COM1和COM2分别具有CICS1和CICS2。COM2客户端程序使用COM1生产者程序。COM2客户端从不直接调用COM1生产者。COM2客户端将数据放入COMMAREA,并远程调用通用Cobol程序(让它成为GCP)。COMMAREA-STRUCT也有“生产者程序名称”字段,GCP指出要调用哪个程序。因此,GCP将来自COMMAREA的数据和地图输出到生产者的领域.GCP通过寻址动态地执行映射操作(对于每个生产者来说并不特殊)。生产者执行后,GCP获取结果并通过COMMAREA-STRUCT返回给客户端。这个系统几年前就这样设计了。COM2有成千上万的客户和成千上万的COM1生产商。

现在,COM2想要脱离COM1。因此,COM1不希望再完全访问所有COM1资源(生产者)。因此,COM1希望在CICS1前面放置一个新的cics,它将是一个只在本地运行B1桥程序的处理程序CICS。这也与网络安全和公司政治决策有关。

要在一段时间内将公司分开,既不应影响客户,也不应影响生产商。因此,在GCP-桥层中需要解决的问题.

这就是为什么B1桥应该像GCP一样运行到COM2客户端,应该检查可访问性(不知怎么地,我们应用了它),并且应该将来自客户端的所有数据传递给GCP,而不进行任何修改。

当前,日志记录操作没有任何优先级。我们很快就会把注意力集中在公司的一部分上。

所以我非常感谢你的专家意见。

*我们不能使用CALL,因为B1将在另一个CICS上,并且不能访问LOADLIB1 of COM1,这就是为什么B1应该通过EXEC链接远程调用GCP。

*通过通道而不是经过公共区域,这对我来说听起来不错。我们会讨论这件事。

*顺便说一句,我会检查整字-半字的冲突。你是正确的。

*为了进行安全检查,我们将讨论"EXEC CICS查询安全性“。

*如上文所述,我们不能修改复制本。只有我们才能改变,

代码语言:javascript
复制
 EXEC CICS LINK PROGRAM (GCP) 

代码语言:javascript
复制
 EXEC CICS LINK PROGRAM (B1) 

对客户进行查找和替换。因为有成千上万的客户。我们不想换一本书去碰他们。

鉴于这些细节,我认为问题变得更容易理解。

EN

回答 1

Stack Overflow用户

发布于 2016-08-15 14:57:30

在通过EXEC CICS LINK调用的COBOL程序中,链接节必须包含具有名称DFHCOMMAREA的01级别结构。预编译器或COBOL编译器的CICS协处理器将为过程分区生成适当的USING,因此程序具有对DFHCOMMAREA结构的可寻址性。

DFHCOMMAREA将包含在对目标程序进行LINK时所调用的COMMAREA-STRUCT的内容。

处理发现自己的情况的一种方法是修改文案以删除01级别的结构名称,并要求所有客户端在COPY语句之前对自己的01层结构名称进行编码。在桥和生产者程序中,这个01层的结构名将是DFHCOMMAREA

处理这种情况的另一种方法是避免使用LINK,而改用动态CALL。您必须将DFHEIBLK作为CALL的第一个参数。

处理这种情况的另一种方法是避免使用一个或多个CICS容器的公共区域。与其传递LINK上的逗号区域,不如传递一个通道,该通道将有一个或多个容器挂起,其中包含希望传递的数据。

需要注意的是,您正在使用LENGTH OF特殊寄存器来表示您的逗号区域长度。特殊寄存器是一个完整字,但逗号长度参数是一个半字。我怀疑这会给您带来痛苦,除非IBM生成代码来拦截特定的成语,并将特殊寄存器移动到一个临时的半字(不太可能,但可能)。

更新:

从您的附加信息中可以看出,您的任务是为现有的程序( GCP)编写一个“插入替换”。

一种实用的方法可能是创建一个新的文案,我们称之为COMAREA2,它是COMAREA1的副本,但没有嵌入的01层结构名称。将COPY COMAREA2语句紧接在DFHCOMMAREA 01结构名称之后放置在B1程序中。

这并不理想,因为某些地方的文档必须清楚地表明,对COMAREA1抄写簿的更改必须反映在COMAREA2中。当然,像这样的手动处理会引入错误的可能性,但它确实让您不必修改任何C1或P1程序。

如果它对你有效的话,更优雅的做法是试着.

代码语言:javascript
复制
COPY COMAREA1 REPLACING == 01 COMMAREA-STRUCT== BY ==*01 COMMAREA-STRUCT==.

...in您的B1程序。这将消除对上面提议的COMAREA2文案的需求。如果这样做有效,您只需将COPY语句放在DFHCOMMAREA 01结构级别名称之后。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38956306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档