1. 映射表(Map/Mapset)的属性(Attribute)字节
1. 第一列总不会被实质内容占据;最多是属性字节。所以实质内容总最多从第二列开始。
2. 每个映射域均要以一个属性字节起始。
3. 输入域(UNPROT)还要以一个属性字节结束,而这个属性字节应当为ASKIP。
属性字节排布:
比特位置 | 功能 | 比特设置 |
0-1 | 根据2~7比特 | |
2-3 | 保护性和转移 | 00 = UNPROT ALPHANUM (左对齐) |
4-5 | 亮度 | 00 = 普通 |
6 | 必须为0 | |
7 | MDT | 1表示更改过 |
另有扩展属性,用于如颜色,高亮,输入预审等
一个MAP中的域(例如名叫USERNME)对应COBOL(Symbolic Map符号映射)的变量包括
USERNMEI PIC ... // 输入
USERNMEO PIC ... // 输出,其实是和输入重叠的
USERNMEL PIC S9(4) COMP. // 长度; -1可以设光标
USERNMEF PIC X. // 0x80如果用户修改了输入域但没有录入数据;否则一般为Low-value
FILLER REDEFINES USERNMEF.
USERNMEA PIC X. // 可见属性字节A和标记字节F是重叠的,它是用来设置并送出MAP的
USERNMEC PIC X. // 色彩扩展属性,只有DSATTS=COLOR开启时才有
USEENMEH PIC X. // 高亮扩展属性,只有DSATTS=HILIGHT开启才有
关于程序发送MAP的一些模式,详见附加的CICS命令和编程方法
2. 典型的MAPSET实例
PRINT NOGEN // 表示开始,告诉汇编器不要打印展开后语句
GLMS6H1 DFHMSD TYPE=&SYSPARM, X // 整个MAPSET
LANG=COBOL, X // 用COBOL语言
MODE=INOUT, X
TERM=3270-2, X
CTRL=FREEKB, X
STORAGE=AUTO, X
// 这两行开启扩展属性使得能够用颜色等特性
DSATTS=(COLOR,HILIGHT), X
MAPATTS=(COLOR,HILIGHT), X
TIOAPFX=YES
***********************************************************************
GLMS6H1 DFHMDI SIZE=(24,80), X // 覆盖整个界面
LINE=1, X
COLUMN=1
***********************************************************************
DFHMDF POS=(1,1), X // 第2列开始
LENGTH=7, X // 长度7
ATTRB=(NORM,PROT), X // 只读;常规亮度
COLOR=BLUE, X // 内容
INITIAL='GLMS6H1'
DFHMDF POS=(1,20), X
LENGTH=20, X
ATTRB=(NORM,PROT), X
COLOR=GREEN, X
INITIAL='Customer Maintenance'
TRANID1 DFHMDF POS=(1,76), X
LENGTH=4, X
ATTRB=(NORM,PROT), X
COLOR=BLUE, X
INITIAL='GL6H'
***********************************************************************
INSTR1 DFHMDF POS=(3,1), X
LENGTH=64, X
ATTRB=(NORM,PROT), X
COLOR=GREEN, X
INITIAL='Type a customer number. Then select an action X
and press Enter.'
***********************************************************************
DFHMDF POS=(5,1), X
LENGTH=24, X
ATTRB=(NORM,PROT), X
COLOR=GREEN, X
INITIAL='Customer number. . . . .'
CUSTNO1 DFHMDF POS=(5,26), X
LENGTH=7, X
// UNPROT表示输入域,FSET表示MDT总开启于是数据总送回程序
ATTRB=(NORM,UNPROT,FSET,IC), X
COLOR=TURQUOISE, X
HILIGHT=UNDERLINE // 使用实际底线
DFHMDF POS=(5,34), X // 输入域结尾
LENGTH=1, X // 长度总为1
ATTRB=ASKIP // 总是跳转记号
***********************************************************************
DFHMDF POS=(7,1), X
LENGTH=24, X
ATTRB=(NORM,PROT), X
COLOR=NEUTRAL, X
INITIAL='Action . . . . . . . . .'
ACTION DFHMDF POS=(7,26), X
LENGTH=1, X
ATTRB=(NORM,UNPROT,FSET), X
COLOR=TURQUOISE, X
HILIGHT=UNDERLINE
DFHMDF POS=(7,28), X
LENGTH=21, X
ATTRB=(NORM,PROT), X
COLOR=NEUTRAL, X
INITIAL='1. Add a new customer'
***********************************************************************
DFHMDF POS=(8,28), X
LENGTH=30, X
ATTRB=(NORM,PROT), X
COLOR=NEUTRAL, X
INITIAL='2. Change an existing customer'
***********************************************************************
DFHMDF POS=(9,28), X
LENGTH=30, X
ATTRB=(NORM,PROT), X
COLOR=NEUTRAL, X
INITIAL='3. Delete an existing customer'
***********************************************************************
MSG1 DFHMDF POS=(23,1), X
LENGTH=79, X
COLOR=YELLOW, X
ATTRB=(BRT,PROT) // BRT表示高亮
DFHMDF POS=(24,1), X
LENGTH=20, X
ATTRB=(NORM,PROT), X
COLOR=BLUE, X
INITIAL='F3=Exit F12=Cancel'
DUMMY DFHMDF POS=(24,79), X
LENGTH=1, X
ATTRB=(DRK,PROT,FSET), X
INITIAL=' '
***********************************************************************
DFHMSD TYPE=FINAL // MAPSET结束
END // 汇编终止
3. 映射表交换
EXEC CICS
RECEIVE MAP('INQMAP1') // 映射名称
MAPSET('INQSET1') // 映射集名称
INTO(INQMAP1I) // 屏幕数据对应的域
END-EXEC.
映射表发送可见附加的CICS命令和编程方法
4. VSAM文件读取
EXEC CICS
READ FILE(filename) // VSAM文件名,在CICS中定义
INTO(data-name) // 将读得的记录放入变量
RIDFLD(data-name) // 含有记录ID的变量
[UPDATE] // 该记录用于更新(后接REWRITE/DELETE,就对这个记录操作)
[RESP(response-code)] // 返回响应值
END-EXEC
常见返回值条件测试
IF RESPONSE-CODE = DFHRESP(NORMAL)
IF RESPONSE-CODE = DFHRESP(NOTFND)
5. VSAM文件写入
添加记录
WRITE FILE(DATASET-NAME)
FROM(RECORD-NAME)
RIDFLD(ID)
RESP(RESPONSE-CODE)
覆盖到UPDATE模式READ的记录上
REWRITE FILE(DATASET-NAME)
FROM(RECORD)
RESP(RESPONSE-CODE)
常见返回条件:
IF RESONSE-CODE = DFHRESP(DUPREC)
DELETE FILE(DATASET-NAME) RESP(RESPONSE-CODE)
7. 返回
EXEC CICS
RETURN TRANSID(INQ1)
COMMAREA(COMMUNICATION-AREA) // 将WORKING-STORAGE中的本次操作的数据再放回到跨执行区
END-EXEC.
8. 平行转移
EXEC CICS
XCTL PROGRAM('INVMENU') // 程序名,定义在COBOL的PROGRAM-ID,并在CICS同名注册
END-EXEC.
9. 进一级调用
EXEC CICS
LINK PROGRAM(program-name) // 程序名,定义在COBOL的PROGRAM-ID,并在CICS中同名注册
[COMMAREA(data-name)] // 同转移跨执行数据
[DATALENGTH(data-name | literal)] // 指定跨执行数据长度
END-EXEC
要不是看在CICS/COBOL有一把年纪了,否则这样的语言叫人见了就想抽它两耳刮子