CICS的基本结构和命令
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符号映射)的变量包括
注,此处用比较接近的ABAP源码框显示COBOL代码
1 USERNMEI PIC ... // 输入 2 USERNMEO PIC ... // 输出,其实是和输入重叠的 3 USERNMEL PIC S9(4) COMP. // 长度; -1可以设光标 4 USERNMEF PIC X. // 0x80如果用户修改了输入域但没有录入数据;否则一般为Low-value 5 FILLER REDEFINES USERNMEF. 6 USERNMEA PIC X. // 可见属性字节A和标记字节F是重叠的,它是用来设置并送出MAP的 7 USERNMEC PIC X. // 色彩扩展属性,只有DSATTS=COLOR开启时才有 8 USEENMEH PIC X. // 高亮扩展属性,只有DSATTS=HILIGHT开启才有
关于程序发送MAP的一些模式,详见附加的CICS命令和编程方法
2. 典型的MAPSET实例
1 PRINT NOGEN // 表示开始,告诉汇编器不要打印展开后语句 2 GLMS6H1 DFHMSD TYPE=&SYSPARM, X // 整个MAPSET 3 LANG=COBOL, X // 用COBOL语言 4 MODE=INOUT, X 5 TERM=3270-2, X 6 CTRL=FREEKB, X 7 STORAGE=AUTO, X 8 // 这两行开启扩展属性使得能够用颜色等特性 9 DSATTS=(COLOR,HILIGHT), X 10 MAPATTS=(COLOR,HILIGHT), X 11 TIOAPFX=YES 12 *********************************************************************** 13 GLMS6H1 DFHMDI SIZE=(24,80), X // 覆盖整个界面 14 LINE=1, X 15 COLUMN=1 16 *********************************************************************** 17 DFHMDF POS=(1,1), X // 第2列开始 18 LENGTH=7, X // 长度7 19 ATTRB=(NORM,PROT), X // 只读;常规亮度 20 COLOR=BLUE, X // 内容 21 INITIAL='GLMS6H1' 22 DFHMDF POS=(1,20), X 23 LENGTH=20, X 24 ATTRB=(NORM,PROT), X 25 COLOR=GREEN, X 26 INITIAL='Customer Maintenance' 27 TRANID1 DFHMDF POS=(1,76), X 28 LENGTH=4, X 29 ATTRB=(NORM,PROT), X 30 COLOR=BLUE, X 31 INITIAL='GL6H' 32 *********************************************************************** 33 INSTR1 DFHMDF POS=(3,1), X 34 LENGTH=64, X 35 ATTRB=(NORM,PROT), X 36 COLOR=GREEN, X 37 INITIAL='Type a customer number. Then select an action X 38 and press Enter.' 39 *********************************************************************** 40 DFHMDF POS=(5,1), X 41 LENGTH=24, X 42 ATTRB=(NORM,PROT), X 43 COLOR=GREEN, X 44 INITIAL='Customer number. . . . .' 45 CUSTNO1 DFHMDF POS=(5,26), X 46 LENGTH=7, X 47 // UNPROT表示输入域,FSET表示MDT总开启于是数据总送回程序 48 49 ATTRB=(NORM,UNPROT,FSET,IC), X 50 COLOR=TURQUOISE, X 51 HILIGHT=UNDERLINE // 使用实际底线 52 DFHMDF POS=(5,34), X // 输入域结尾 53 LENGTH=1, X // 长度总为1 54 ATTRB=ASKIP // 总是跳转记号 55 *********************************************************************** 56 DFHMDF POS=(7,1), X 57 LENGTH=24, X 58 ATTRB=(NORM,PROT), X 59 COLOR=NEUTRAL, X 60 INITIAL='Action . . . . . . . . .' 61 ACTION DFHMDF POS=(7,26), X 62 LENGTH=1, X 63 ATTRB=(NORM,UNPROT,FSET), X 64 COLOR=TURQUOISE, X 65 HILIGHT=UNDERLINE 66 DFHMDF POS=(7,28), X 67 LENGTH=21, X 68 ATTRB=(NORM,PROT), X 69 COLOR=NEUTRAL, X 70 INITIAL='1. Add a new customer' 71 *********************************************************************** 72 DFHMDF POS=(8,28), X 73 LENGTH=30, X 74 ATTRB=(NORM,PROT), X 75 COLOR=NEUTRAL, X 76 INITIAL='2. Change an existing customer' 77 *********************************************************************** 78 DFHMDF POS=(9,28), X 79 LENGTH=30, X 80 ATTRB=(NORM,PROT), X 81 COLOR=NEUTRAL, X 82 INITIAL='3. Delete an existing customer' 83 *********************************************************************** 84 MSG1 DFHMDF POS=(23,1), X 85 LENGTH=79, X 86 COLOR=YELLOW, X 87 ATTRB=(BRT,PROT) // BRT表示高亮 88 DFHMDF POS=(24,1), X 89 LENGTH=20, X 90 ATTRB=(NORM,PROT), X 91 COLOR=BLUE, X 92 INITIAL='F3=Exit F12=Cancel' 93 DUMMY DFHMDF POS=(24,79), X 94 LENGTH=1, X 95 ATTRB=(DRK,PROT,FSET), X 96 INITIAL=' ' 97 *********************************************************************** 98 DFHMSD TYPE=FINAL // MAPSET结束 99 END // 汇编终止
3. 映射表交换
1 EXEC CICS 2 RECEIVE MAP('INQMAP1') // 映射名称 3 MAPSET('INQSET1') // 映射集名称 4 INTO(INQMAP1I) // 屏幕数据对应的域 5 END-EXEC.
映射表发送可见附加的CICS命令和编程方法
4. VSAM文件读取
1 EXEC CICS 2 READ FILE(filename) // VSAM文件名,在CICS中定义 3 INTO(data-name) // 将读得的记录放入变量 4 RIDFLD(data-name) // 含有记录ID的变量 5 [UPDATE] // 该记录用于更新(后接REWRITE/DELETE,就对这个记录操作) 6 [RESP(response-code)] // 返回响应值 7 END-EXEC
常见返回值条件测试
1 IF RESPONSE-CODE = DFHRESP(NORMAL) 2 IF RESPONSE-CODE = DFHRESP(NOTFND)
5. VSAM文件写入
添加记录
1 WRITE FILE(DATASET-NAME) 2 FROM(RECORD-NAME) 3 RIDFLD(ID) 4 RESP(RESPONSE-CODE)
覆盖到UPDATE模式READ的记录上
1 REWRITE FILE(DATASET-NAME) 2 FROM(RECORD) 3 RESP(RESPONSE-CODE)
常见返回条件:
IF RESONSE-CODE = DFHRESP(DUPREC)
6. VSAM文件记录删除
1 DELETE FILE(DATASET-NAME) RESP(RESPONSE-CODE)
7. 返回
1 EXEC CICS 2 RETURN TRANSID(INQ1) 3 COMMAREA(COMMUNICATION-AREA) // 将WORKING-STORAGE中的本次操作的数据再放回到跨执行区 4 END-EXEC.
8. 平行转移
1 EXEC CICS 2 XCTL PROGRAM('INVMENU') // 程序名,定义在COBOL的PROGRAM-ID,并在CICS同名注册 3 END-EXEC.
9. 进一级调用
1 EXEC CICS 2 LINK PROGRAM(program-name) // 程序名,定义在COBOL的PROGRAM-ID,并在CICS中同名注册 3 [COMMAREA(data-name)] // 同转移跨执行数据 4 [DATALENGTH(data-name | literal)] // 指定跨执行数据长度 5 END-EXEC
要不是看在CICS/COBOL有一把年纪了,否则这样的语言叫人见了就想抽它两耳刮子(ABAP?)
enjoy every minute of an appless, googless and oracless life