在第一节中曾讲到,每一个任务都有一个与之对应的EIB。CICS的终端信息正是通过EIB得到的。
需要注意的是,由于任务可以在不同的终端上启动,因此得到的终端信息也是不同的。也就是说,终端信息是基于任务而言的,这点同每一任务中EIB的惟一性是相对应的。
此处所说的终端信息,主要是指终端在CICS中的设备编号。终端编号是通过EIB中的信息EIBTRMID提供的。以下程序将直接通过EIBTRMID得到相应的终端设备编号,并从屏幕第二行的第一列开始将其输出:
IDENTIFICATION DIVISION.
PROGRAM-ID. TERMPGM1.
*
ENVIRONMENT DIVISION.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 MSG1 PIC X(80).
*
PROCEDURE DIVISION.
STRING ‘TERMINAL ID IS: ‘ EIBTRMID /*此处通过EIBTRMID得到终端设备编号*/
DELIMITED BY SIZE INTO MSG1
EXEC CICS SEND CONTROL CURSOR(80)
END-EXEC
EXEC CICS SEND FROM(MSG1)
LENGTH(20)
END-EXEC
EXEC CICS RETURN END-EXEC.
GOBACK.
不过,以上这种直接输出结果信息的方式并不能体现出CICS的交互功能,在实际中较为少见。通常情况下,实际的CICS程序往往是根据用户输入的请求而执行相应操作的。例如,以下程序将只在用户输入“TERM”的请求之后,方获取并显示相应终端信息:
IDENTIFICATION DIVISION.
PROGRAM-ID. TERMPGM2.
*
ENVIRONMENT DIVISION.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WKAREA.
05 LEN PIC S9(4) USAGE IS COMP.
05 ERR-CODE PIC S9(8) COMP.
01 INAREA.
05 TRANID PIC X(4).
05 FILLER PIC X.
05 REQUEST PIC X(4).
01 MSG2 PIC X(80).
*
PROCEDURE DIVISION.
MOVE 9 TO LEN.
EXEC CICS RECEIVE INTO(INAREA)
LENGTH(LEN)
RESP(ERR-CODE)
END-EXEC
IF ERR-CODE = DFHRESP(LENGERR)
MOVE ‘INPUT DATA TOO LONG: MAX IS 9 CHARS’
TO MSG2
EXEC CICS SEND CONTROL CURSOR(1760)
END-EXEC
EXEC CICS SEND FROM(MSG2)
LENGTH(40)
END-EXEC
EXEC CICS RETURN END-EXEC.
IF REQUEST = ‘TERM’
STRING ‘TERMINAL ID IS: ‘ EIBTRMID
DELIMITED BY SIZE INTO MSG2
EXEC CICS SEND CONTROL CURSOR(80)
END-EXEC
EXEC CICS SEND FROM(MSG2)
LENGTH(20)
END-EXEC
EXEC CICS RETURN END-EXEC.
GOBACK.
需要注意的是,将以上程序关联到交易中后,用户首先需要输入相应的交易编号以启动一个任务。因此,在以上代码定义的输入区域INAREA中包含两个输入变量。其中前一个变量TRANID对应输入的交易编号;后一个变量REQUEST对应输入的请求。
同时,在以上代码中存在两处RETURN命令。由于RETURN命令表示结束任务逻辑,将控制权移交CICS系统。因此,当以上程序运行时满足第一个条件,并执行第一个RETURN命令后,任务将直接结束。此时,程序将不会执行第一条RETURN命令之后的内容。