Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309172
  • 博文数量: 40
  • 博客积分: 1
  • 博客等级: 民兵
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-31 11:19
个人简介

从事银行核心系统设计开发的程序猿

文章存档

2019年(1)

2018年(4)

2017年(11)

2016年(6)

2015年(18)

分类: 信息化

2015-05-31 15:38:21

数据区域DTAARA,是一小片存储对象,通常使用1-2k大小的CHAR类型。持久化的命名数据区域,可以在不同job间交互数据。在系统中使用了这种方式存放配置参数,方便做到不重启应用的动态刷新。另外还有几个特殊数据区域,常见的是*LDA,1k大小的job自有共享区域,可用于job内不同程序间的数据交互,起到全局空间的作用。*LDA不能持久化,随着job结束而消失,因此可以认为是一片job特有的内存,不需加锁访问,速度更快。

在程序中使用DTAARA比较简单,参照下面的例子。

C语言

  1. #include <xxdtaa.h> //读写数据区域使用的头文件
  2. ...
  3. _DTAA_NAME_T dtaa = {"MNAR ", "*LIBL "}; //定义命名数据区域的名称,如果是LDA,则为{"*LDA ", " "}
  4. QXXCHGDA(dtaa, DBG_START, sizeof(data), data); //从DBG_START位开始,写入字符串data内容到数据区域
  5. QXXRTVDA(dtaa, 1, sizeof(dtaa_st), (char*)dtaa_s); //从第一位开始获取数据区域内容,存放到自定义的dtaa_st结构变量dtaa_s中



RPG语言
*LDA的例子

  1. D*定义公共数据,使用*LDA,内容为TRAR,INHD,OTHD结构的组合
  2. DT_TRAR E DS EXTNAME(TRAR) QUALIFIED TEMPLATE
  3. DT_INHD E DS EXTNAME(INHD) QUALIFIED TEMPLATE
  4. DT_OTHD E DS EXTNAME(OTHD) QUALIFIED TEMPLATE
  5. DS_LDA UDS DTAARA(*LDA) QUALIFIED
  6. D TRAR LIKEDS(T_TRAR)
  7. D INHD LIKEDS(T_INHD)
  8. D OTHD LIKEDS(T_OTHD)
  9. ...
  10. C*读取LDA,并进行错误处理。LDA无需上锁。
  11. C IN(E) S_LDA
  12. C IF (%ERROR)
  13. C*读取失败
  14. C ENDIF
  15. ...
  16. C*写入LDA,并进行错误处理。LDA无需上锁。
  17. C OUT(E) S_LDA
  18. C IF %ERROR
  19. C*写入失败
  20. C ENDIF


命名DTAARA的例子

  1. D*总长度256字节的数据区域BTAR,内容为5P0的变量MAXJOBS
  2. DS_BTAR UDS 256 DTAARA('BTAR') QUALIFIED
  3. D MAXJOBS 5P 0
  4. ...
  5. C*从BTAR获取MAXJOBS值
  6. C *LOCK IN S_BTAR
  7. 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)


阅读(2452) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~