目前正在显示哪个地图?

时间:2017-09-21 17:35:48

标签: cobol mainframe cics 3270

我刚刚进入大型机开发,请原谅任何无知,但有没有办法确定哪个地图正在显示或最后发送到终端?

例如,我有MAP1&地图集MAP2中的MAPS。通过按PF键(PF7/PF8),地图将交替显示。在每个地图上,用户可以输入要由程序(SLCTOPTI)评估的值。是否有正确的方法来确定从用户接收时应评估哪个地图?

以下是我目前要尝试的内容:

** some code before **

WHEN DFHENTER                                            
 +0103                                                                          

%+0104                               IF CURRENT-MAP-SCREEN = 1                 

%+0104                                    EXEC CICS RECEIVE                   
%+0104                                         MAP ('MAP1')                     
%+0104                                         INTO (MAP1I)                     
%+0104                                         RESP (WS-RESP)                   
%+0104                                    END-EXEC                              
%+0104                               ELSE                                       
%+0104                                    EXEC CICS RECEIVE                     
%+0104                                         MAP ('MAP2')                     
%+0104                                         INTO (MAP2I)                     
%+0104                                         RESP (WS-RESP)                   
%+0104                                    END-EXEC                              
%+0104                               END-IF                                     
 +0103                                                                          
%+0104                               EVALUATE SLCTOPTI                          
 +0103                                                                          
%+0104                                   WHEN ' 1'                              
%+0104                                   WHEN '01'                              
%+0104                                   WHEN '1'                               
 +0103                                                                          
%+0104                                         MOVE 'XXXX' TO WS-START-TRAN     
%+0104                                                                          
%+0104                                   WHEN ' 2'                              
%+0104                                   WHEN '02'                              
%+0104                                   WHEN '2'                                
 +0103                                                                          
%+0104                                         MOVE 'XXXX' TO WS-START-TRAN     

** some code after **

我不确定这是否有效,但我想知道是否已经有了这方面的命令或更好的方法。

2 个答案:

答案 0 :(得分:4)

当您将地图发送到屏幕并存储在CURRENT-MAP-SCREEN中时,假设DFHCOMMAREA设置为指示正在发送的地图,这就是我通常看到它完成的方式。

通常,写入伪对话CICS事务的初始程序的方式是检查EIBCALEN = 0,这表明这是事务的初始调用。 EIBCALEN(CALEN是Communication Area LENgth的缩写)是EIB(执行接口块)中的一个字段,它自动传递给您事务的初始程序({{1}然后由预编译器或协处理器(无论您使用哪个)插入DFHEIBLKLinkage Section包含许多描述交易背景的字段。

如果您EIB初始化EIBCALEN = 0,请发送初始地图,存储您在WS-COMMAREACURRENT-MAP-SCREEN发送的地图的指标。

您的交易的初始程序也会自动传递指向EXEC CICS RETURN TRANSID(EIBTRNID) COMMAREA(WS-COMMAREA) LENGTH(...)的指针,也会由预编译器或协处理器(无论您使用哪个)自动插入DFHCOMMAREA。在您的事务调用之间,CICS会代表您保留Linkage Section

如果您DFHCOMMAREA知道EIBCALEN NOT = 0,请MOVE DFHCOMMAREA TO WS-COMMAREA查看CURRENT-MAP-SCREEN的地图。

当您RECEIVE向CICS提供要保留的数据并在下次调用时将其传递回事务的EXEC CICS RETURN TRANSID(EIBTRNID) COMMAREA(WS-COMMAREA) LENGTH(...)初始程序。 DFHCOMMAREA发生后,为工作存储和本地存储分配的内存将被释放。

人们常常EXEC CICS RETURN然后使用其工作存储中的数据副本。如果您MOVE DFHCOMMAREA TO WS-COMMAREA当然没有这样做,那么就无法移动数据。

一些商店试图在程序和地图之间建立1:1的关系,以消除跟踪当前显示的地图的需要。

希望在您的学习后期,您的讲师将讨论使用频道和容器而不是EIBCALEN = 0。后者是几十年来CICS应用程序的构建方式,因此您肯定会看到以这种方式编写的代码,前者是更新的功能。

答案 1 :(得分:0)

系统编程接口(SPI)在“ INQUIRE TERMINAL COMMAND”中具有MAPNAME和MAPSETNAME选项。您的四个字符的终端标识符可在EXEC接口块(EIB)中作为EIBTRMID字段获得。

在CICS中运行的每个任务都可以使用任务的EIB,在大多数语言中都可以直接使用它,并且可以直接使用名称来使用字段,尽管在C中,您必须使用EXEC CICS ADDRESS EIB向CICS询问其地址。