数据区域DTAARA,是一小片存储对象,通常使用1-2k大小的CHAR类型。持久化的命名数据区域,可以在不同job间交互数据。在系统中使用了这种方式存放配置参数,方便做到不重启应用的动态刷新。另外还有几个特殊数据区域,常见的是*LDA,1k大小的job自有共享区域,可用于job内不同程序间的数据交互,起到全局空间的作用。*LDA不能持久化,随着job结束而消失,因此可以认为是一片job特有的内存,不需加锁访问,速度更快。
在程序中使用DTAARA比较简单,参照下面的例子。
C语言
- #include <xxdtaa.h> //读写数据区域使用的头文件
- ...
- _DTAA_NAME_T dtaa = {"MNAR ", "*LIBL "}; //定义命名数据区域的名称,如果是LDA,则为{"*LDA ", " "}
- QXXCHGDA(dtaa, DBG_START, sizeof(data), data); //从DBG_START位开始,写入字符串data内容到数据区域
- QXXRTVDA(dtaa, 1, sizeof(dtaa_st), (char*)dtaa_s); //从第一位开始获取数据区域内容,存放到自定义的dtaa_st结构变量dtaa_s中
RPG语言
*LDA的例子
- D*定义公共数据,使用*LDA,内容为TRAR,INHD,OTHD结构的组合
- DT_TRAR E DS EXTNAME(TRAR) QUALIFIED TEMPLATE
- DT_INHD E DS EXTNAME(INHD) QUALIFIED TEMPLATE
- DT_OTHD E DS EXTNAME(OTHD) QUALIFIED TEMPLATE
- DS_LDA UDS DTAARA(*LDA) QUALIFIED
- D TRAR LIKEDS(T_TRAR)
- D INHD LIKEDS(T_INHD)
- D OTHD LIKEDS(T_OTHD)
- ...
- C*读取LDA,并进行错误处理。LDA无需上锁。
- C IN(E) S_LDA
- C IF (%ERROR)
- C*读取失败
- C ENDIF
- ...
- C*写入LDA,并进行错误处理。LDA无需上锁。
- C OUT(E) S_LDA
- C IF %ERROR
- C*写入失败
- C ENDIF
命名DTAARA的例子
- D*总长度256字节的数据区域BTAR,内容为5P0的变量MAXJOBS
- DS_BTAR UDS 256 DTAARA('BTAR') QUALIFIED
- D MAXJOBS 5P 0
- ...
- C*从BTAR获取MAXJOBS值
- C *LOCK IN S_BTAR
- C UNLOCK S_BTAR
在IN读取命名数据区域时,可以用*LOCK选择是否加锁。加锁以后,访问数据区域的其他程序就只能读不能写。如果执行到不加*LOCK的OUT,那么写完即释放锁。如果OUT加了*LOCK,那么锁将会继续保持。使用UNLOCK可以直接在不写入的情况下解除锁。
CL及命令行
系统提供了几个命令来操作数据区域。
CRTDTAARA,创建命名数据区域(*LDA不需创建),创建时也可指定初始值,如CRTDTAARA DTAARA(CUSTOMER) TYPE(*CHAR) LEN(100) VALUE('INIT') TEXT(’Customer name area’)
DSPDTAARA,显示或打印数据区域的内容,如DSPDTAARA DTAARA(MYLIB/MYDTA)
RTVDTAARA,获取数据区域内容到CL变量,可以指定从第几位取多少位,如RTVDTAARA DTAARA(*LDA (5,2)) RTNVAR(&VAL)
CHGDTAARA,与获取类似,写入数据区域,如果字符串长度不足补空格,如CHGDTAARA DTAARA(*LDA (5,4)) VALUE('OK'),实际5-8位写入'OK '
DLTDTAARA,删除一个命名数据区域,如DLTDTAARA DTAARA(MYLIB/MYDTA)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/283313/viewspace-1679461/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/283313/viewspace-1679461/