在COBOL中对MAP的应用,主要可分为发送MAP和接受MAP两种情况。其中发送MAP就是将MAP在CICS屏幕中显示出来。发送MAP时可选择只发送物理MAP还是只发送符号MAP。其中只发送物理MAP的代码如下:
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
MAPONLY /*此处指定只发送物理MAP*/
END-EXEC.
只发送符号MAP的代码如下:
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
DATAONLY /*此处指定只发送符号MAP*/
END-EXEC.
如果不指定“MAPONLY”和“DATAONLY”选项,CICS将把物理MAP和符号MAP合并发送。同时,在实际发送MAP中,通常还会指定一些其他选项,如清屏、释放存储空间、指定光标位置等。以下为通常对整个MAP进行发送的代码:
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
CURSOR(720)
ERASE
FREEKB
END-EXEC
对于MAP的接受,主要是用于接受用户在MAP中输入的数据。这些数据实际上存放在符号MAP的变量中。以下为接受MAP的代码,其中涉及到对接受时的异常捕获:
EXEC CICS RECEIVE MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
RESP(RCVERR)
END-EXEC
下面程序综合应用了MAP的发送和接受。当用户在MAP中输入完成数据时,该数据将高亮显示,同时输出相应提示信息。需要注意的是,此处使用了伪会话,但作为一个单独的程序,并没利用到参数传递的功能。假设该程序对应的交易为“TRMP”,则程序代码如下:
IDENTIFICATION DIVISION.
PROGRAM-ID. MAPPGM.
*
ENVIRONMENT DIVISION.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RCVERR PIC S9(8) COMP.
01 COM-FLDS.
05 T-CODE PIC X(10).
05 T-NAME PIC X(20).
COPY DFHAID.
COPY DFHBMSCA.
COPY MAPSETA.
LINKAGE SECTION.
01 DFHCOMMAREA.
05 C-CODE PIC X(10).
05 C-NAME PIC X(20).
*
PROCEDURE DIVISION.
IF EIBCALEN = 0
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
MAPONLY
ERASE
FREEKB
END-EXEC
EXEC CICS RETURN TRANSID(‘TRMP’)
COMMAREA(COM-FLDS)
LENGTH(30)
END-EXEC.
*
IF EIBAID = DFHCLEAR
MOVE LOW-VALUES TO TESTMAO
MOVE ‘CLEAR KEY PRESSED: SESSION ENDED’ TO MSGO
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
DATAONLY
FREEKB
END-EXEC
EXEC CICS RETURN END-EXEC.
*
IF EIBAID = DFHENTER
EXEC CICS RECEIVE MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
RESP(RCVERR)
END-EXEC
IF RCVERR = DFHRESP(MAPFAIL)
PERFORM 100-ERROR-ROUTINE.
MOVE CODEI TO CODEO
MOVE NAMEI TO NAMEO
MOVE DFHBMBRY TO CODEA
MOVE DFHBMBRY TO NAMEA
MOVE ‘SESSION COMPLETED!’ TO MSGO
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
DATAONLY
FREEKB
END-EXEC
EXEC CICS RETURN END-EXEC.
GOBACK.
*
100-ERROR-ROUTINE.
MOVE ‘PLS ENTER DATA’ TO MSGO
EXEC CICS SEND MAP(‘TESTMA’)
MAPSET(‘MAPSETA’)
DATAONLY
FREEKB
END-EXEC
EXEC CICS RETURN TRANSID(‘TRMP’)
COMMAREA(COM-FLDS)
LENGTH(30)
END-EXEC.