我刚刚进入大型机开发,所以请原谅我的无知,但是有没有办法识别正在显示或最后发送到终端的 map ?
例如,我在 map 集 MAPS
中有 MAP1
和 MAP2
。按下 PF 键(PF7/PF8)
即可交替显示 map 。在每个 map 上,用户可以输入要由程序(SLCTOPTI)
评估的值。是否有正确的方法来确定在从用户接收时应评估哪个 map ?
这是我目前必须尝试的:
** 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 **
我不确定这是否有效,但我想知道是否已经有一个命令或更好的方法来做到这一点。
最佳答案
假设 CURRENT-MAP-SCREEN
设置为指示当您将 map 发送到屏幕时正在发送的 map 并存储在 DFHCOMMAREA
中,这就是方式我通常会看到它完成。
通常,伪 session CICS 事务的初始程序的编写方式是检查 EIBCALEN = 0
,这表明这是事务的初始调用。 EIBCALEN
(CALEN 是通信区域 LENgth 的缩写)是 EIB
(执行接口(interface) block )中的一个字段,它会自动传递到事务的初始程序(如 DFHEIBLK
)并通过预编译器或协处理器(无论您使用哪个)插入到您的链接部分
中。 EIB
包含许多描述您的交易背景的字段。
如果EIBCALEN = 0
您知道初始化您的WS-COMMAREA
,发送您的初始 map ,将您发送的 map 的指示符存储在CURRENT-MAP中-SCREEN
和 EXEC CICS RETURN TRANSID(EIBTRNID) COMMAREA(WS-COMMAREA) LENGTH(...)
。
您的事务的初始程序也会自动传递一个指向 DFHCOMMAREA
的指针,并且由预编译器或协处理器(无论您使用哪个)自动插入到您的链接部分
)。在调用您的事务期间,CICS 会代表您保留 DFHCOMMAREA
。
如果EIBCALEN NOT = 0
,您知道将 DFHCOMMAREA 移动到 WS-COMMAREA
并检查CURRENT-MAP-SCREEN
以查看要使用哪个 map 接收
。
当您EXEC CICS RETURN TRANSID(EIBTRNID) COMMAREA(WS-COMMAREA) LENGTH(...)
时,您正在向CICS提供要保留的数据并传回事务的初始程序下一次调用时的DFHCOMMAREA
。一旦 EXEC CICS RETURN
发生,分配给工作存储和本地存储的内存就会被释放。
人们将 DFHCOMMAREA 移动到 WS-COMMAREA
然后使用其工作存储中的数据副本是很常见的。如果EIBCALEN = 0
您当然不这样做,则没有数据可以移动。
一些商店尝试在程序和 map 之间建立 1:1 的关系,以便无需跟踪当前显示的 map 。
希望在您稍后的学习中,您的讲师将讨论使用 channel 和容器而不是 DFHCOMMAREA
。后者是 CICS 应用程序几十年来的构建方式,因此您肯定会看到以这种方式编写的代码,前者是一种较新的功能。
关于cobol - 当前显示的是哪张 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46350002/