我刚刚进入大型机开发,请原谅任何无知,但有没有办法确定哪个地图正在显示或最后发送到终端?
例如,我有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 **
我不确定这是否有效,但我想知道是否已经有了这方面的命令或更好的方法。
答案 0 :(得分:4)
当您将地图发送到屏幕并存储在CURRENT-MAP-SCREEN
中时,假设DFHCOMMAREA
设置为指示正在发送的地图,这就是我通常看到它完成的方式。
通常,写入伪对话CICS事务的初始程序的方式是检查EIBCALEN = 0
,这表明这是事务的初始调用。 EIBCALEN
(CALEN是Communication Area LENgth的缩写)是EIB
(执行接口块)中的一个字段,它自动传递给您事务的初始程序({{1}然后由预编译器或协处理器(无论您使用哪个)插入DFHEIBLK
。 Linkage Section
包含许多描述交易背景的字段。
如果您EIB
初始化EIBCALEN = 0
,请发送初始地图,存储您在WS-COMMAREA
和CURRENT-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询问其地址。