附加的CICS命令和编程方法
1. IC光标指针
间接光标指针
ATTRIB=(NORM,UNPROT,IC)如果有多个域含有IC,则最后一个域获得光标
直接光标指针 / 基于长度后缀
EXEC CICS SEND MAP(<映射名>) MAPSET(<包含这个映射的映射集名>) FROM(<映射的主变量,输出(O)型>) CURSOR[(<位置>)] END-EXEC.
位置是一个从屏幕左上角开始的数字,转换方式:(行数-1)x80+(列数-1) = 位置值;
如果CURSOR后面不指定位置,则对长度域(L后缀)为-1设置光标,如果有多个,则取第一个。
2. SEND MAP造成的屏幕属性变化表
MAP ONLY | DATA ONLY | NONE | |
设置为任意非Low-value值 | 设置到物理映射(Physical)设置 | 设置到新的符号映射设置 | 设置到新的符号映射设置 |
设置为Low-value值 | 设置到物理映射设置 | 保持不变 (最经济方案) | 设置到物理映射设置 |
不变 | 设置到物理映射设置 | 保持不变 | 设置到物理映射设置 |
Attribute Byte和Flag Byte位置一样,所以当用户清除一个域的时候并因此发生了0x80被设置到Flag Byte上,需要重新将Attribute Byte设置为Low-value。
3. 接收数据的优化
保存所有屏幕输入内容于通信区;在SEND MAP设置FRSET以关闭Modified Data Tags,这样当用户改了数据后MDT又会打开以说明修改位置; 收到后和通信区数据合并
4. 输入栏
IBM规定输入栏必须表示成下划线;当extended highlighting开启,可以使用真正的下划线;否则只能用下划线符,这是一种字符,所以程序需要对其进行特殊处理。
用法:
... DFHMDF POS=(??,??) LENGTH=?? ATTRIB=(NORM, UNPROT, ..) COLOR=?? HILIGHT=UNDERLINE如果使用下划线符underscore,即使用
... INITIAL='____'这样需要在发出和收入做字符替换,即空格和下划线之间的转换,以下是下划线被空格替换的例子:
INSPECT <变量名> REPLACE ALL '_' BY SPACE
5. 常用域变量的检查(Editing)
条件 | 检查方法 |
没有输入 | <名称>L = ZERO |
都是空格 | <名称>I = SPACE |
非数字 | 相应的判断子过程 |
非正 | <名称>I NOT > ZERO |
为零 | <名称>I = ZERO |
CICS-COBOL编程,通常从下往上检查,这样被显示的总是第一个错误
一般的检查代码的模式
MOVE ATTR-NO-HIGHLIGHT TO <域变量名>H ... // 清零高亮 IF <检查错误条件> MOVE ATTR-REVERSE TO <域变量名>H // 加反色 MOVE -1 TO <域变量名>L // 设光标 MOVE <消息> TO <消息域>O MOVE 'N' TO <有效数据指示变量> ...
6. SEND TEXT
发送字符数据,从左上角开始,用于调试或不需要指定映射集的简单显示。格式:
EXEC CICS SEND TEXT FROM(data-name) // 送指定变量中的内容 [ERASE] // 在送字符之前屏幕要清除 [FREEKB] // 如果指定在发送后解键盘锁,否则用户需要打RESET键解开键盘锁 END-EXEC
7. 时间日期
EXEC CICS FORMATTIME ABSTIME(data-name) // 15位 packed decimal [DATE(data-name)] // 8字节日期 [FULLDATE(data-name)] // 10字节年份展开到4数字 [MMDDYYYY(data-name)] [DDMMYYYY(data-name)] [YYYYMMDD(data-name)] [YYYYDDMM(data-name)] [YYYYDDD(data-name)] [DATESEP[(data-name |literal)] // 如果忽略,没有分割;如果不指定值,为'/' [DATEFORM(data-name)] // 6字节,CICS安装的指定格式 [DAYCOUNT(data-name)] // 从1900年1月1日 [DAYOFWEEK(data-name)] [DAYOFMONTH(data-name)] [MONTHOFYEAR(data-name)] [YEAR(data-name)] [TIME(data-name)[TIMESEP[(data-name | literal)]]] // 时间,8字节域承载hhmmss,24小时;分割不指定值则用':' END-EXEC
enjoy every minute of an appless, googless and oracless life